aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/debugger.c29
-rw-r--r--src/frame.c19
-rw-r--r--src/frame.h4
3 files changed, 52 insertions, 0 deletions
diff --git a/src/debugger.c b/src/debugger.c
index a1bc0cd..58c78ed 100644
--- a/src/debugger.c
+++ b/src/debugger.c
@@ -87,6 +87,29 @@ static const char *str_type(enum para_type t)
}
}
+static void debug_text_para(Paragraph *para, cairo_t *cr, double *ypos,
+ PangoFontDescription *fontdesc)
+{
+ int i, nrun;
+ char tmp[256];
+
+ nrun = para_debug_num_runs(para);
+ snprintf(tmp, 255, " %i runs", nrun);
+ plot_text(cr, ypos, fontdesc, tmp);
+
+ for ( i=0; i<nrun; i++ ) {
+ size_t scblock_offs, para_offs, len;
+ SCBlock *scblock;
+ if ( para_debug_run_info(para, i, &len, &scblock, &scblock_offs, &para_offs) ) {
+ plot_text(cr, ypos, fontdesc, "Error");
+ } else {
+ snprintf(tmp, 255, " Run %i: len %li, SCBlock %p offs %li, para offs %li",
+ i, len, scblock, scblock_offs, para_offs);
+ plot_text(cr, ypos, fontdesc, tmp);
+ }
+ }
+}
+
static gboolean draw_sig(GtkWidget *da, cairo_t *cr, struct debugwindow *dbgw)
{
@@ -114,11 +137,17 @@ static gboolean draw_sig(GtkWidget *da, cairo_t *cr, struct debugwindow *dbgw)
plot_text(cr, &ypos, fontdesc, tmp);
for ( i=0; i<dbgw->fr->n_paras; i++ ) {
+
enum para_type t = para_type(dbgw->fr->paras[i]);
+
plot_hr(cr, &ypos, width);
snprintf(tmp, 255, "Paragraph %i: type %s", i, str_type(t));
plot_text(cr, &ypos, fontdesc, tmp);
+ if ( t == PARA_TYPE_TEXT ) {
+ debug_text_para(dbgw->fr->paras[i], cr, &ypos, fontdesc);
+ }
+
}
pango_font_description_free(fontdesc);
diff --git a/src/frame.c b/src/frame.c
index 136ff0f..480b4e7 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -1395,3 +1395,22 @@ enum para_type para_type(Paragraph *para)
{
return para->type;
}
+
+int para_debug_num_runs(Paragraph *para)
+{
+ if ( para->type != PARA_TYPE_TEXT ) return 0;
+ return para->n_runs;
+}
+
+int para_debug_run_info(Paragraph *para, int i, size_t *len, SCBlock **scblock,
+ size_t *scblock_offs, size_t *para_offs)
+{
+ if ( para->type != PARA_TYPE_TEXT ) return 1;
+ if ( i >= para->n_runs ) return 1;
+
+ *len = para->runs[i].len_bytes;
+ *scblock_offs = para->runs[i].scblock_offs_bytes;
+ *para_offs = para->runs[i].para_offs_bytes;
+ *scblock = para->runs[i].scblock;
+ return 0;
+}
diff --git a/src/frame.h b/src/frame.h
index 8e2ffe3..ed997ef 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -199,4 +199,8 @@ extern void merge_paragraphs(struct frame *fr, int para);
extern enum para_type para_type(Paragraph *para);
extern SCBlock *para_scblock(Paragraph *para);
+extern int para_debug_num_runs(Paragraph *para);
+extern int para_debug_run_info(Paragraph *para, int i, size_t *len, SCBlock **scblock,
+ size_t *scblock_offs, size_t *para_offs);
+
#endif /* FRAME_H */