comparison src/shape_stext.c @ 426:aa320386072c

Keep sub-extents for style blocks. The extents for style blocks are needed by sh_stext_draw().
author Thinker K.F. Li <thinker@branda.to>
date Tue, 28 Jul 2009 15:11:42 +0800
parents 09a66063b25d
children 8f900da42eed
comparison
equal deleted inserted replaced
425:09a66063b25d 426:aa320386072c
301 301
302 DARRAY(scaled_fonts_lst, mb_scaled_font_t *); 302 DARRAY(scaled_fonts_lst, mb_scaled_font_t *);
303 DARRAY_DEFINE(scaled_fonts_lst, mb_scaled_font_t *); 303 DARRAY_DEFINE(scaled_fonts_lst, mb_scaled_font_t *);
304 DARRAY(style_blks_lst, mb_style_blk_t); 304 DARRAY(style_blks_lst, mb_style_blk_t);
305 DARRAY_DEFINE_ADV(style_blks_lst, mb_style_blk_t); 305 DARRAY_DEFINE_ADV(style_blks_lst, mb_style_blk_t);
306 DARRAY(extents_lst, mb_text_extents_t);
307 DARRAY_DEFINE_ADV(extents_lst, mb_text_extents_t);
306 308
307 /*! \brief A simple implementation of text shape. 309 /*! \brief A simple implementation of text shape.
308 * 310 *
309 */ 311 */
310 typedef struct _sh_stext { 312 typedef struct _sh_stext {
313 style_blks_lst_t style_blks; 315 style_blks_lst_t style_blks;
314 co_aix x, y; 316 co_aix x, y;
315 co_aix dx, dy; 317 co_aix dx, dy;
316 scaled_fonts_lst_t scaled_fonts; 318 scaled_fonts_lst_t scaled_fonts;
317 mb_text_extents_t extents; 319 mb_text_extents_t extents;
320 extents_lst_t sub_exts;
318 } sh_stext_t; 321 } sh_stext_t;
319 322
320 static 323 static
321 void _rdman_shape_stext_free(shape_t *shape) { 324 void _rdman_shape_stext_free(shape_t *shape) {
322 sh_stext_t *txt_o = (sh_stext_t *)shape; 325 sh_stext_t *txt_o = (sh_stext_t *)shape;
325 DARRAY_DESTROY(&txt_o->style_blks); 328 DARRAY_DESTROY(&txt_o->style_blks);
326 329
327 for(i = 0; i < txt_o->scaled_fonts.num; i++) 330 for(i = 0; i < txt_o->scaled_fonts.num; i++)
328 scaled_font_free(txt_o->scaled_fonts.ds[i]); 331 scaled_font_free(txt_o->scaled_fonts.ds[i]);
329 DARRAY_DESTROY(&txt_o->scaled_fonts); 332 DARRAY_DESTROY(&txt_o->scaled_fonts);
333 DARRAY_DESTROY(&txt_o->sub_exts);
330 334
331 if(txt_o->txt) 335 if(txt_o->txt)
332 free((void *)txt_o->txt); 336 free((void *)txt_o->txt);
333 337
334 free(txt_o); 338 free(txt_o);
350 txt_o->txt = strdup(txt); 354 txt_o->txt = strdup(txt);
351 DARRAY_INIT(&txt_o->style_blks); 355 DARRAY_INIT(&txt_o->style_blks);
352 txt_o->x = x; 356 txt_o->x = x;
353 txt_o->y = y; 357 txt_o->y = y;
354 DARRAY_INIT(&txt_o->scaled_fonts); 358 DARRAY_INIT(&txt_o->scaled_fonts);
359 DARRAY_INIT(&txt_o->sub_exts);
355 360
356 if(txt_o->txt == NULL) { 361 if(txt_o->txt == NULL) {
357 free(txt_o); 362 free(txt_o);
358 txt_o = NULL; 363 txt_o = NULL;
359 } 364 }
475 * transform function should adjust x and y bearing corresponding 480 * transform function should adjust x and y bearing corresponding
476 * x, y of text to compute area. 481 * x, y of text to compute area.
477 */ 482 */
478 static 483 static
479 void compute_styled_extents_n_scaled_font(sh_stext_t *txt_o) { 484 void compute_styled_extents_n_scaled_font(sh_stext_t *txt_o) {
480 mb_text_extents_t sub_extents;
481 mb_style_blk_t *blk; 485 mb_style_blk_t *blk;
482 style_blks_lst_t *style_blks; 486 style_blks_lst_t *style_blks;
483 int blk_txt_len; 487 int blk_txt_len;
484 mb_scaled_font_t *scaled; 488 mb_scaled_font_t *scaled;
485 scaled_fonts_lst_t *scaled_fonts; 489 scaled_fonts_lst_t *scaled_fonts;
490 extents_lst_t *sub_exts;
491 mb_text_extents_t *sub;
486 char *txt, saved; 492 char *txt, saved;
487 int i, nscaled; 493 int i, nscaled;
488 494
489 memset(&txt_o->extents, sizeof(mb_text_extents_t), 0); 495 memset(&txt_o->extents, sizeof(mb_text_extents_t), 0);
490 496
493 scaled_font_free(scaled_fonts->ds[i]); 499 scaled_font_free(scaled_fonts->ds[i]);
494 DARRAY_CLEAN(scaled_fonts); 500 DARRAY_CLEAN(scaled_fonts);
495 501
496 style_blks = &txt_o->style_blks; 502 style_blks = &txt_o->style_blks;
497 blk = style_blks->ds; 503 blk = style_blks->ds;
504
505 sub_exts = &txt_o->sub_exts;
506 DARRAY_CLEAN(sub_exts);
507 extents_lst_adv(sub_exts, style_blks->num);
498 508
499 txt = (char *)txt_o->txt; 509 txt = (char *)txt_o->txt;
500 for(i = 0; i < style_blks->num; i++) { 510 for(i = 0; i < style_blks->num; i++) {
501 scaled = make_scaled_font_face(txt_o, blk->face, 511 scaled = make_scaled_font_face(txt_o, blk->face,
502 0, 0, blk->font_sz); 512 0, 0, blk->font_sz);
503 ASSERT(scaled != NULL); 513 ASSERT(scaled != NULL);
504 scaled_fonts_lst_add(scaled_fonts, scaled); 514 scaled_fonts_lst_add(scaled_fonts, scaled);
515 sub = sub_exts->ds + i;
505 516
506 blk_txt_len = compute_utf8_chars_sz(txt, blk->n_chars); 517 blk_txt_len = compute_utf8_chars_sz(txt, blk->n_chars);
507 ASSERT(blk_txt_len != ERR); 518 ASSERT(blk_txt_len != ERR);
508 519
509 saved = txt[blk_txt_len]; 520 saved = txt[blk_txt_len];
510 txt[blk_txt_len] = 0; 521 txt[blk_txt_len] = 0;
511 compute_text_extents(scaled, txt, &sub_extents); 522 compute_text_extents(scaled, txt, sub);
512 txt[blk_txt_len] = saved; 523 txt[blk_txt_len] = saved;
513 524
514 extent_extents(&txt_o->extents, &sub_extents); 525 extent_extents(&txt_o->extents, sub);
515 526
516 blk++; 527 blk++;
517 txt += blk_txt_len; 528 txt += blk_txt_len;
518 } 529 }
519 } 530 }