struct text_run
{
SCBlock *scblock; /* If macro, this is \macro */
- SCBlock *rscblock; /* The block with the actual text */
PangoFontDescription *fontdesc;
double col[4];
};
/* For anything other than PARA_TYPE_TEXT
* (for text paragraphs, these things are in the runs) */
SCBlock *scblock;
- SCBlock *rscblock;
/* For PARA_TYPE_IMAGE */
char *filename;
return 0;
}
- if ( run->rscblock == NULL ) {
- fprintf(stderr, _("NULL rscblock in run_text_len\n"));
+ if ( run->scblock == NULL ) {
+ fprintf(stderr, _("NULL scblock in run_text_len\n"));
return 0;
}
- if ( sc_block_contents(run->rscblock) == NULL ) {
- fprintf(stderr, _("NULL rscblock contents in run_text_len\n"));
+ if ( sc_block_contents(run->scblock) == NULL ) {
+ fprintf(stderr, _("NULL scblock contents in run_text_len\n"));
return 0;
}
- return strlen(sc_block_contents(run->rscblock));
+ return strlen(sc_block_contents(run->scblock));
}
size_t run_len;
guint16 r, g, b;
- run_text = sc_block_contents(para->runs[i].rscblock);
+ run_text = sc_block_contents(para->runs[i].scblock);
run_len = strlen(run_text);
attr = pango_attr_font_desc_new(para->runs[i].fontdesc);
}
-void add_run(Paragraph *para, SCBlock *scblock, SCBlock *rscblock,
+void add_run(Paragraph *para, SCBlock *scblock,
PangoFontDescription *fdesc, double col[4])
{
struct text_run *runs_new;
para->runs = runs_new;
para->runs[para->n_runs].scblock = scblock;
- para->runs[para->n_runs].rscblock = rscblock;
para->runs[para->n_runs].fontdesc = pango_font_description_copy(fdesc);
para->runs[para->n_runs].col[0] = col[0];
para->runs[para->n_runs].col[1] = col[1];
}
-Paragraph *create_paragraph(struct frame *fr, SCBlock *bl, SCBlock *rbl)
+Paragraph *create_paragraph(struct frame *fr, SCBlock *bl)
{
Paragraph **paras_new;
Paragraph *pnew;
* However, this can easily be changed */
pnew->type = PARA_TYPE_TEXT;
pnew->scblock = bl;
- pnew->rscblock = rbl;
pnew->n_runs = 0;
pnew->runs = NULL;
pnew->layout = NULL;
}
-Paragraph *add_callback_para(struct frame *fr, SCBlock *bl, SCBlock *rbl,
- double w, double h,
+Paragraph *add_callback_para(struct frame *fr, SCBlock *bl, double w, double h,
SCCallbackDrawFunc draw_func,
SCCallbackClickFunc click_func, void *bvp,
void *vp)
if ( (fr->n_paras > 0) && (fr->paras[fr->n_paras-1]->empty) ) {
pnew = fr->paras[fr->n_paras-1];
} else {
- pnew = create_paragraph(fr, bl, rbl);
+ pnew = create_paragraph(fr, bl);
if ( pnew == NULL ) {
fprintf(stderr, _("Failed to add callback paragraph\n"));
return NULL;
pnew->type = PARA_TYPE_CALLBACK;
pnew->scblock = bl;
- pnew->rscblock = rbl;
pnew->cb_w = w;
pnew->cb_h = h;
pnew->draw_func = draw_func;
}
-void add_image_para(struct frame *fr, SCBlock *scblock, SCBlock *rscblock,
+void add_image_para(struct frame *fr, SCBlock *scblock,
const char *filename,
ImageStore *is, double w, double h, int editable)
{
if ( (fr->n_paras > 0) && (fr->paras[fr->n_paras-1]->empty) ) {
pnew = fr->paras[fr->n_paras-1];
} else {
- pnew = create_paragraph(fr, scblock, rscblock);
+ pnew = create_paragraph(fr, scblock);
if ( pnew == NULL ) {
fprintf(stderr, _("Failed to add image paragraph\n"));
return;
pnew->type = PARA_TYPE_IMAGE;
pnew->scblock = scblock;
- pnew->rscblock = rscblock;
pnew->filename = strdup(filename);
pnew->image_w = w;
pnew->image_h = h;
if ( para->type != PARA_TYPE_TEXT ) return;
- if ( para->scblock != para->rscblock ) {
- fprintf(stderr, _("Need to add run, but paragraph not editable\n"));
- return;
- }
-
if ( para->scblock != NULL ) {
bl = sc_block_prepend(para->scblock, fr->scblocks);
}
para->scblock = bl;
- para->rscblock = bl;
- add_run(para, bl, bl, fr->fontdesc, fr->col);
+ add_run(para, bl, fr->fontdesc, fr->col);
wrap_paragraph(para, NULL, fr->w - fr->pad_l - fr->pad_r, 0, 0);
}
return 0;
}
- if ( sc_block_contents(run->rscblock) == NULL ) {
+ if ( sc_block_contents(run->scblock) == NULL ) {
fprintf(stderr, _("pos_trail_to_offset: No contents "
"(%p name=%s, options=%s)\n"),
run->scblock, sc_block_name(run->scblock),
}
/* Get the text for the run */
- run_text = sc_block_contents(run->rscblock);
+ run_text = sc_block_contents(run->scblock);
/* Turn the paragraph offset into a run offset */
para_offset_of_run = get_paragraph_offset(para, nrun);
para = fr->paras[cp.para];
- if ( para->scblock != para->rscblock ) {
- fprintf(stderr, _("Paragraph is not editable.\n"));
- return 0;
- }
-
if ( para->type != PARA_TYPE_TEXT ) {
fprintf(stderr, _("Paragraph is not text.\n"));
return 0;
return 0;
}
- return (para->runs[run].scblock == para->runs[run].rscblock);
+ return 1;
}
size_t run_offs;
run = ¶->runs[nrun];
run_offs = offs - get_paragraph_offset(para, nrun);
- sc_insert_text(run->rscblock, run_offs, t);
+ sc_insert_text(run->scblock, run_offs, t);
}
}
-static SCBlock *pos_to_rscblock(struct frame *fr, struct edit_pos p)
-{
- int run;
- size_t paraoffs;
- Paragraph *para;
-
- para = fr->paras[p.para];
-
- if ( para->type != PARA_TYPE_TEXT ) {
- return NULL;
- }
-
- paraoffs = pos_trail_to_offset(para, p.pos, p.trail);
-
- run = which_run(para, paraoffs);
- assert(run < para->n_runs);
-
- return para->runs[run].rscblock;
-}
-
-
-
static SCBlock *pos_to_scblock(struct frame *fr, struct edit_pos p,
enum para_type *type)
{
*run = 0;
return fr->paras[i];
}
- if ( fr->paras[i]->rscblock == bl ) {
- *run = 0;
- return fr->paras[i];
- }
/* Check all runs */
for ( j=0; j<fr->paras[i]->n_runs; j++ ) {
- if ( fr->paras[i]->runs[j].rscblock == bl ) {
- *run = j;
- return fr->paras[i];
- }
if ( fr->paras[i]->runs[j].scblock == bl ) {
*run = j;
return fr->paras[i];
{
int i;
SCBlock *p1scblock, *p2scblock;
- SCBlock *p1rscblock, *p2rscblock;
enum para_type type1, type2;
size_t p2offs;
SCBlock *scblock;
/* Find SC positions for start and end */
p1scblock = pos_to_scblock(fr, p1, &type1);
p2scblock = pos_to_scblock(fr, p2, &type2);
- p1rscblock = pos_to_rscblock(fr, p1);
- p2rscblock = pos_to_rscblock(fr, p2);
p2offs = pos_to_offset(fr, p2);
wrap_end = p2.para;
printf(" offs %li\n", (long int)p1offs);
if ( p1offs != 0 ) {
printf("Partial delete\n");
- printf("contents '%s'\n", sc_block_contents(p1rscblock));
+ printf("contents '%s'\n", sc_block_contents(p1scblock));
printf("from offs %li\n", (long int)p1offs);
- scblock_delete_text(p1rscblock, p1offs, -1);
+ scblock_delete_text(p1scblock, p1offs, -1);
} else {
printf("Deleting the whole text SCBlock\n");
sc_block_delete(&fr->scblocks, p1scblock);
if ( type2 == PARA_TYPE_TEXT ) {
size_t len;
printf(" offs %li\n", (long int)p2offs);
- if ( sc_block_contents(p2rscblock) != NULL ) {
- len = strlen(sc_block_contents(p2rscblock));
+ if ( sc_block_contents(p2scblock) != NULL ) {
+ len = strlen(sc_block_contents(p2scblock));
} else {
len = 0;
}
NULL);
} else if ( p2offs > 0 ) {
printf("Partial delete\n");
- printf("contents '%s'\n", sc_block_contents(p2rscblock));
+ printf("contents '%s'\n", sc_block_contents(p2scblock));
printf("up to offs %li\n", (long int)p2offs);
- scblock_delete_text(p2rscblock, 0, p2offs);
+ scblock_delete_text(p2scblock, 0, p2offs);
} /* else do nothing */
} else {
printf("Deleting the whole non-text SCBlock\n");
printf(_("%i runs:\n"), p->n_runs);
for ( i=0; i<p->n_runs; i++ ) {
- printf(_(" Run %2i: SCBlock %p/%p %s '%s'\n"),
- i, p->runs[i].scblock, p->runs[i].rscblock,
+ printf(_(" Run %2i: SCBlock %p %s '%s'\n"),
+ i, p->runs[i].scblock,
pango_font_description_to_string(p->runs[i].fontdesc),
- sc_block_contents(p->runs[i].rscblock));
+ sc_block_contents(p->runs[i].scblock));
}
} else if ( p->type == PARA_TYPE_IMAGE ) {
end = sc_block_append(np, NULL, NULL, strdup(""), NULL);
pnew->n_runs = 0;
- add_run(pnew, end, end, fr->fontdesc, fr->col);
+ add_run(pnew, end, fr->fontdesc, fr->col);
pnew->scblock = end;
- pnew->rscblock = end;
wrap_paragraph(pnew, pc, fr->w - fr->pad_l - fr->pad_r, 0, 0);
/* Split the run (and SCBlock) into two */
double col[4] = {0,0,0,0};
struct text_run *rn;
- int macro = 0;
printf("Splitting run %i. Before:\n", run);
show_para(para);
- add_run(para, NULL, NULL, NULL, col);
+ add_run(para, NULL, NULL, col);
/* -2 here because add_run increased para->n_runs by 1 */
memmove(¶->runs[run+2], ¶->runs[run+1],
(para->n_runs - run - 2)*sizeof(struct text_run));
rr = ¶->runs[run]; /* Because add_run realloced the runs */
rn = ¶->runs[run+1];
- if ( rr->rscblock != rr->scblock) {
- macro = 1;
- }
-
- rn->rscblock = sc_block_split(rr->rscblock, run_offs);
-
- if ( !macro ) {
- /* Literal text block */
- rn->scblock = rn->rscblock;
- } else {
- /* Macro block */
- rn->scblock = rr->scblock;
- }
+ rn->scblock = sc_block_split(rr->scblock, run_offs);
rn->fontdesc = pango_font_description_copy(rr->fontdesc);
rn->col[0] = rr->col[0];
for ( i=run+1; i<para->n_runs; i++ ) {
double col[4] = {0,0,0,0};
printf("Moving run %i to pos %i\n", i, pnew->n_runs);
- add_run(pnew, NULL, NULL, NULL, col);
+ add_run(pnew, NULL, NULL, col);
pnew->runs[pnew->n_runs-1] = para->runs[i];
}
pnew->scblock = pnew->runs[0].scblock;
- pnew->rscblock = pnew->runs[0].rscblock;
/* Truncate the first paragraph at the appropriate position */
para->n_runs = run+1;
show_para(pnew);
/* Add a \newpara after the end of the first paragraph's SC */
- nnp = sc_block_append(rr->rscblock, strdup("newpara"), NULL, NULL, NULL);
+ nnp = sc_block_append(rr->scblock, strdup("newpara"), NULL, NULL, NULL);
set_newline_at_end(pnew, get_newline_at_end(para));
set_newline_at_end(para, nnp);
}
-SCBlock *para_rscblock(Paragraph *para)
-{
- return para->rscblock;
-}
-
-
enum para_type para_type(Paragraph *para)
{
return para->type;
}
-int para_debug_run_info(Paragraph *para, int i, SCBlock **scblock,
- SCBlock **rscblock)
+int para_debug_run_info(Paragraph *para, int i, SCBlock **scblock)
{
if ( para->type != PARA_TYPE_TEXT ) return 1;
if ( i >= para->n_runs ) return 1;
*scblock = para->runs[i].scblock;
- *rscblock = para->runs[i].rscblock;
return 0;
}
double w, h;
int r;
void *bvp;
- SCBlock *rbl;
-
- rbl = bl;
if ( strcmp(cbl->names[i], name) != 0 ) continue;
r = cbl->box_funcs[i](scin, bl, &w, &h, &bvp, cbl->vps[i]);
struct sc_state *st = &scin->state[scin->j];
Paragraph *pnew;
pnew = add_callback_para(sc_interp_get_frame(scin),
- bl, rbl, w, h,
+ bl, w, h,
cbl->draw_funcs[i],
cbl->click_funcs[i],
bvp, cbl->vps[i]);
}
-static void add_newpara(struct frame *fr, SCBlock *bl, SCBlock *mrb)
+static void add_newpara(struct frame *fr, SCBlock *bl)
{
Paragraph *last_para;
/* The block after the \newpara will always be the first one of the
* next paragraph, by definition, even if it's \f or another \newpara */
- create_paragraph(fr, sc_block_next(mrb), sc_block_next(bl));
+ create_paragraph(fr, sc_block_next(bl));
}
PangoFontDescription *fontdesc;
double *col;
struct sc_state *st = &scin->state[scin->j];
- SCBlock *rbl;
Paragraph *para;
/* Empty block? */
fontdesc = sc_interp_get_fontdesc(scin);
col = sc_interp_get_fgcol(scin);
- rbl = bl;
-
para = last_para(fr);
if ( (para == NULL) || (para_type(para) != PARA_TYPE_TEXT) ) {
/* Last paragraph is not text.
* or: no paragraphs yet.
* Either way: Create the first one */
- para = create_paragraph(fr, bl, rbl);
+ para = create_paragraph(fr, bl);
}
set_para_alignment(para, st->alignment);
- add_run(para, bl, rbl, fontdesc, col);
+ add_run(para, bl, fontdesc, col);
set_para_spacing(para, st->paraspace);
return 0;
if ( parse_image_options(options, sc_interp_get_frame(scin),
&w, &h, &filename) == 0 )
{
- SCBlock *rbl = bl;
- add_image_para(sc_interp_get_frame(scin), bl, rbl,
+ add_image_para(sc_interp_get_frame(scin), bl,
filename, scin->is, w, h, 1);
free(filename);
} else {
} else if ( strcmp(name, "newpara")==0 ) {
struct frame *fr = sc_interp_get_frame(scin);
- SCBlock *rbl = bl;
- add_newpara(fr, bl, rbl);
+ add_newpara(fr, bl);
} else {
return 0;