Mercurial > MadButterfly
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 } |