annotate src/shape_stext.c @ 437:e73b3644d802

Fix bug of compute extents of sh_stext. Full extents sh_stext_t::extents should be initialized with extents of first style block if existed. But, it was not. So, it is fixed, now.
author Thinker K.F. Li <thinker@branda.to>
date Thu, 30 Jul 2009 15:42:43 +0800
parents c02d2aa2c45e
children 2437047b8bb8
rev   line source
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
1 #include <stdio.h>
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
2 #include <cairo.h>
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
3 #include <cairo-ft.h>
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
4 #include <fontconfig/fontconfig.h>
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
5 #include "mb_shapes.h"
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
6 #include "mb_tools.h"
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
7
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
8 #ifdef UNITTEST
425
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
9
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
10 #define NO_DOX(x) x
425
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
11 #define UT_FAKE(r, x, param) \
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
12 r x param {}
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
13
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
14 UT_FAKE(void, sh_stext_transform, (shape_t *shape));
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
15 UT_FAKE(void, sh_stext_draw, (shape_t *shape, cairo_t *cr));
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
16
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
17 typedef struct _ut_area {
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
18 co_aix x, y;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
19 co_aix w, h;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
20 } ut_area_t;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
21 #define area_t ut_area_t
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
22
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
23 typedef struct _ut_shape {
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
24 co_aix aggr[6];
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
25 void (*free)(struct _ut_shape *);
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
26 ut_area_t area;
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
27 } ut_shape_t;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
28 #define shape_t ut_shape_t
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
29
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
30 #undef sh_get_aggr_matrix
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
31 #define sh_get_aggr_matrix(sh) (sh)->aggr
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
32
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
33 #undef sh_get_area
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
34 #define sh_get_area(sh) (&(sh)->area)
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
35
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
36 #undef mb_obj_init
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
37 #define mb_obj_init(o, t)
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
38 #undef rdman_shape_man
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
39 #define rdman_shape_man(rdman, sh)
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
40
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
41 #define rdman_shape_stext_new ut_rdman_shape_stext_new
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
42 #define sh_stext_transform ut_sh_stext_transform
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
43 #define sh_stext_draw ut_sh_stext_draw
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
44 #define sh_stext_set_text ut_sh_stext_set_text
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
45 #define sh_stext_set_style ut_sh_stext_set_style
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
46
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
47 #undef cairo_get_scaled_font
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
48 #define cairo_get_scaled_font(cr) ((cairo_scaled_font_t *)NULL)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
49 #undef cairo_set_scaled_font
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
50 #define cairo_set_scaled_font(cr, scaled) ((cairo_scaled_font_t *)NULL)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
51 #undef cairo_scaled_font_reference
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
52 #define cairo_scaled_font_reference(x)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
53 #define MAX_MOVE 32
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
54 NO_DOX(static co_aix move_xys[MAX_MOVE][2]);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
55 NO_DOX(static int move_cnt = 0);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
56 #undef cairo_move_to
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
57 #define cairo_move_to(cr, x, y) \
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
58 do { \
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
59 move_xys[move_cnt][0] = x; \
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
60 move_xys[move_cnt++][1] = y; \
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
61 } while(0)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
62 #undef cairo_show_text
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
63 #define cairo_show_text(cr, txt)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
64 #undef cairo_scaled_font_destroy
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
65 #define cairo_scaled_font_destroy(scaled) \
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
66 if(scaled != NULL) cairo_scaled_font_destroy(scaled)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
67
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
68 #endif /* UNITTEST */
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
69
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
70 #ifndef ASSERT
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
71 #define ASSERT(x)
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
72 #endif
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
73 #define OK 0
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
74 #define ERR -1
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
75
407
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
76 /*! \page stext Simple Text
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
77 *
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
78 * A sh_stext_t is broken into fragments. Each fragment comprises the text
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
79 * and the styles applied on the fragement. The styles determines font face
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
80 * used to show the text. The fragment of text with styles is called
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
81 * styled block.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
82 */
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
83
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
84 /*! \defgroup fontconfig_freetype Fontconfig and FreeType Layer.
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
85 *
411
1633551e495d Add doc
Thinker K.F. Li <thinker@branda.to>
parents: 410
diff changeset
86 * This layer implements a font provider to rest of the system.
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
87 * It bases on fontconfig and FreeType supporting of Cairo.
411
1633551e495d Add doc
Thinker K.F. Li <thinker@branda.to>
parents: 410
diff changeset
88 * If you want to provide stext with technologies other than fontconfig and
1633551e495d Add doc
Thinker K.F. Li <thinker@branda.to>
parents: 410
diff changeset
89 * FreeType, just replace this layer with the implmenetation that you want.
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
90 *
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
91 * @{
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
92 */
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
93 /*! \brief Stakeholder of scaled font.
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
94 *
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
95 * It is actually a cairo_scaled_font_t, now. But, it should not be
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
96 * noticed by out-siders. Only \ref fontconfig_freetype
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
97 * should known it.
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
98 */
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
99 typedef struct _mb_scaled_font mb_scaled_font_t;
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
100
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
101 /*! \brief Stakeholder of scaled font.
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
102 *
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
103 * Although, mb_text_extents_t is defined as a cairo_scaled_font_t, but
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
104 * programmers should assume it is opague.
407
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
105 *
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
106 * An extents is the span of showing a fragement of text on the output device.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
107 * It includes x and y advance of cursor after showinng the text.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
108 * The cursor maybe not really existed. But, the advance is computed as
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
109 * the cursor existed. It also includes width and height of the text.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
110 * The bearing of a styled block is the left-top corner of the bounding box.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
111 * The bounding box of a styled block is the minimal rectangle, on the
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
112 * output device, that can contain the text. The bearing is related to
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
113 * the base line for an extents.
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
114 */
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
115 typedef cairo_text_extents_t mb_text_extents_t;
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
116
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
117 #define MBE_GET_X_ADV(ext) ((ext)->x_advance)
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
118 #define MBE_GET_Y_ADV(ext) ((ext)->y_advance)
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
119 #define MBE_GET_X_BEARING(ext) ((ext)->x_bearing)
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
120 #define MBE_GET_Y_BEARING(ext) ((ext)->y_bearing)
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
121 #define MBE_GET_WIDTH(ext) ((ext)->width)
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
122 #define MBE_GET_HEIGHT(ext) ((ext)->height)
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
123 #define MBE_SET_X_ADV(ext, v) do { ((ext)->x_advance) = v; } while(0)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
124 #define MBE_SET_Y_ADV(ext, v) do { ((ext)->y_advance) = v; } while(0)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
125 #define MBE_SET_X_BEARING(ext, v) do { ((ext)->x_bearing) = v; } while(0)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
126 #define MBE_SET_Y_BEARING(ext, v) do { ((ext)->y_bearing) = v; } while(0)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
127 #define MBE_SET_WIDTH(ext, v) do { ((ext)->width) = v; } while(0)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
128 #define MBE_SET_HEIGHT(ext, v) do { ((ext)->height) = v; } while(0)
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
129
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
130 /*! \brief Find out a font pattern.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
131 *
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
132 * This function use fontconfig to decide a font file in pattern. It can
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
133 * replaced by other mechanism if you think it is not what you want.
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
134 *
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
135 * \param slant make font prune if it it non-zero.
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
136 * \param weight make font normal if it is 100.
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
137 */
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
138 static
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
139 FcPattern *query_font_pattern(const char *family, int slant, int weight) {
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
140 FcPattern *ptn, *p, *fn_ptn;
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
141 FcValue val;
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
142 FcConfig *cfg;
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
143 FcBool r;
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
144 FcResult result;
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
145 static int slant_map[] = { /* from MB_FONT_SLANT_* to FC_SLANT_* */
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
146 FC_SLANT_ROMAN,
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
147 FC_SLANT_ROMAN,
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
148 FC_SLANT_ITALIC,
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
149 FC_SLANT_OBLIQUE};
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
150
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
151 cfg = FcConfigGetCurrent();
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
152 ptn = FcPatternCreate();
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
153 p = FcPatternCreate();
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
154 if(ptn == NULL || p == NULL)
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
155 goto err;
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
156
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
157 val.type = FcTypeString;
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
158 val.u.s = family;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
159 FcPatternAdd(ptn, "family", val, FcTrue);
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
160
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
161 val.type = FcTypeInteger;
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
162 val.u.i = slant_map[slant];
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
163 FcPatternAdd(ptn, "slant", val, FcTrue);
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
164
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
165 val.type = FcTypeInteger;
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
166 val.u.i = weight;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
167 FcPatternAdd(ptn, "weight", val, FcTrue);
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
168
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
169 r = FcConfigSubstituteWithPat(cfg, ptn, NULL, FcMatchPattern);
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
170 if(!r)
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
171 goto err;
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
172
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
173 r = FcConfigSubstituteWithPat(cfg, p, ptn, FcMatchFont);
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
174 if(!r)
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
175 goto err;
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
176
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
177 FcDefaultSubstitute(p);
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
178
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
179 fn_ptn = FcFontMatch(cfg, p, &result);
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
180
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
181 /* It is supposed to return FcResultMatch. But, it is no, now.
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
182 * I don't know why. Someone should figure out the issue.
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
183 */
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
184 #if 0
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
185 if(result != FcResultMatch) {
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
186 printf("%d %d\n", result, FcResultMatch);
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
187 goto err;
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
188 }
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
189 #endif
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
190 if(fn_ptn == NULL)
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
191 goto err;
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
192
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
193 FcPatternDestroy(ptn);
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
194 FcPatternDestroy(p);
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
195
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
196 return fn_ptn;
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
197
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
198 err:
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
199 if(ptn)
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
200 FcPatternDestroy(ptn);
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
201 if(p)
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
202 FcPatternDestroy(p);
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
203 return NULL;
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
204
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
205 }
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
206
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
207 /*! \brief Find out a font face for a pattern specified.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
208 *
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
209 * The pattern, here, is a vector of family, slant, and weight.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
210 * This function base on fontconfig and cairo FreeType font supporting.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
211 * You can replace this function with other font mechanisms.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
212 */
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
213 static
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
214 mb_font_face_t *query_font_face(const char *family, int slant, int weight) {
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
215 cairo_font_face_t *cface;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
216 FcPattern *ptn;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
217
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
218 ptn = query_font_pattern(family, slant, weight);
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
219 cface = cairo_ft_font_face_create_for_pattern(ptn);
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
220 FcPatternDestroy(ptn);
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
221
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
222 return (mb_font_face_t *)cface;
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
223 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
224
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
225 static
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
226 void free_font_face(mb_font_face_t *face) {
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
227 ASSERT(face == NULL);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
228
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
229 cairo_font_face_destroy((cairo_font_face_t *)face);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
230 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
231
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
232 /*! \brief This is scaled font for specified size and extent.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
233 *
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
234 * Font face only specified which font would be used to draw text
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
235 * message. But, it also need to scale glyphs to specified size and
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
236 * rotation. This function return a scaled font specified by a
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
237 * matrix that transform glyph from design space of the font to
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
238 * user space of cairo surface.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
239 */
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
240 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
241 mb_scaled_font_t *make_scaled_font_face_matrix(mb_font_face_t *face,
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
242 co_aix *matrix) {
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
243 cairo_scaled_font_t *scaled_font;
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
244 cairo_matrix_t font_matrix;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
245 static cairo_matrix_t id = {
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
246 1, 0,
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
247 0, 1,
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
248 0, 0
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
249 };
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
250 static cairo_font_options_t *opt = NULL;
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
251
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
252 ASSERT(matrix != NULL);
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
253
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
254 if(opt == NULL) {
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
255 opt = cairo_font_options_create();
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
256 if(opt == NULL)
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
257 return NULL;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
258 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
259
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
260 font_matrix.xx = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
261 font_matrix.xy = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
262 font_matrix.x0 = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
263 font_matrix.yx = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
264 font_matrix.yy = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
265 font_matrix.y0 = *matrix;
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
266 scaled_font = cairo_scaled_font_create((cairo_font_face_t *)face,
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
267 &font_matrix,
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
268 &id, opt);
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
269
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
270 return (mb_scaled_font_t *)scaled_font;
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
271 }
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
272
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
273 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
274 void scaled_font_free(mb_scaled_font_t *scaled_font) {
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
275 cairo_scaled_font_destroy((cairo_scaled_font_t *)scaled_font);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
276 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
277
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
278 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
279 void compute_text_extents(mb_scaled_font_t *scaled_font, const char *txt,
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
280 mb_text_extents_t *extents) {
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
281 cairo_scaled_font_text_extents((cairo_scaled_font_t *)scaled_font,
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
282 txt,
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
283 (cairo_text_extents_t *)extents);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
284 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
285
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
286 static
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
287 mb_text_extents_t *mb_text_extents_new(void) {
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
288 cairo_text_extents_t *extents;
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
289
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
290 extents = (cairo_text_extents_t *)malloc(sizeof(cairo_text_extents_t));
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
291 return extents;
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
292 }
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
293
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
294 static
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
295 void mb_text_extents_free(mb_text_extents_t *extents) {
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
296 free(extents);
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
297 }
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
298
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
299 static
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
300 void draw_text_scaled(cairo_t *cr, const char *txt, int tlen,
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
301 mb_scaled_font_t *scaled, co_aix x, co_aix y) {
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
302 cairo_scaled_font_t *saved_scaled;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
303 int total_tlen;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
304 const char *buf;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
305
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
306 total_tlen = strlen(txt);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
307 if(total_tlen > tlen)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
308 buf = strndup(txt, tlen);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
309 else
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
310 buf = txt;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
311
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
312 saved_scaled = cairo_get_scaled_font(cr);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
313 cairo_scaled_font_reference(saved_scaled);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
314 cairo_set_scaled_font(cr, (cairo_scaled_font_t *)scaled);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
315
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
316 cairo_move_to(cr, x, y);
436
c02d2aa2c45e Fig the bug that sh_stext can not show text with right color.
Thinker K.F. Li <thinker@branda.to>
parents: 433
diff changeset
317 cairo_text_path(cr, buf);
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
318
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
319 cairo_set_scaled_font(cr, saved_scaled);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
320 cairo_scaled_font_destroy(saved_scaled);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
321
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
322 if(total_tlen > tlen)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
323 free((char *)buf);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
324 }
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
325
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
326 /* @} */
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
327
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
328 /*! \brief Query and return a font face for a specified attribute vector.
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
329 *
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
330 * Programmers use mb_font_face_t to specify fonts used to show a
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
331 * block of text on the output device. They can get mb_font_face_t with
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
332 * this function. The objects return by mb_font_face_query() should be
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
333 * freed with mb_font_face_free() when they are not more used.
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
334 *
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
335 * \param family is the name of a font family (times).
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
336 * \param slant is one of \ref MB_FONT_SLANTS.
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
337 * \param weight decides if a font is thin or heavy.
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
338 */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
339 mb_font_face_t *mb_font_face_query(redraw_man_t *rdman,
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
340 const char *family,
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
341 int slant,
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
342 int weight) {
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
343 return query_font_face(family, slant, weight);
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
344 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
345
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
346 void mb_font_face_free(mb_font_face_t *face) {
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
347 ASSERT(face != NULL);
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
348 free_font_face(face);
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
349 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
350
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
351 DARRAY(scaled_fonts_lst, mb_scaled_font_t *);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
352 DARRAY_DEFINE(scaled_fonts_lst, mb_scaled_font_t *);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
353 DARRAY(style_blks_lst, mb_style_blk_t);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
354 DARRAY_DEFINE_ADV(style_blks_lst, mb_style_blk_t);
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
355 DARRAY(extents_lst, mb_text_extents_t);
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
356 DARRAY_DEFINE_ADV(extents_lst, mb_text_extents_t);
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
357
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
358 /*! \brief A simple implementation of text shape.
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
359 *
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
360 */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
361 typedef struct _sh_stext {
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
362 shape_t shape;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
363 const char *txt; /*!< \brief Text to be showed */
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
364 style_blks_lst_t style_blks;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
365 co_aix x, y;
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
366 co_aix dx, dy;
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
367 scaled_fonts_lst_t scaled_fonts;
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
368 mb_text_extents_t extents;
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
369 extents_lst_t sub_exts;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
370 } sh_stext_t;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
371
419
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
372 static
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
373 void _rdman_shape_stext_free(shape_t *shape) {
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
374 sh_stext_t *txt_o = (sh_stext_t *)shape;
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
375 int i;
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
376
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
377 DARRAY_DESTROY(&txt_o->style_blks);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
378
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
379 for(i = 0; i < txt_o->scaled_fonts.num; i++)
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
380 scaled_font_free(txt_o->scaled_fonts.ds[i]);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
381 DARRAY_DESTROY(&txt_o->scaled_fonts);
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
382 DARRAY_DESTROY(&txt_o->sub_exts);
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
383
419
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
384 if(txt_o->txt)
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
385 free((void *)txt_o->txt);
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
386
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
387 free(txt_o);
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
388 }
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
389
429
9d5506968efb Change the interface of rdman_shape_stext_new().
Thinker K.F. Li <thinker@branda.to>
parents: 427
diff changeset
390 shape_t *rdman_shape_stext_new(redraw_man_t *rdman, const char *txt,
9d5506968efb Change the interface of rdman_shape_stext_new().
Thinker K.F. Li <thinker@branda.to>
parents: 427
diff changeset
391 co_aix x, co_aix y) {
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
392 sh_stext_t *txt_o;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
394 ASSERT(txt != NULL);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
395
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
396 txt_o = (sh_stext_t *)malloc(sizeof(sh_stext_t));
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
397 if(txt_o == NULL)
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
398 return NULL;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
399
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
400 memset(&txt_o->shape, 0, sizeof(shape_t));
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
401 mb_obj_init(txt_o, MBO_STEXT);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
402
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
403 txt_o->txt = strdup(txt);
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
404 DARRAY_INIT(&txt_o->style_blks);
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
405 txt_o->x = x;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
406 txt_o->y = y;
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
407 DARRAY_INIT(&txt_o->scaled_fonts);
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
408 DARRAY_INIT(&txt_o->sub_exts);
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
409
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
410 if(txt_o->txt == NULL) {
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
411 free(txt_o);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
412 txt_o = NULL;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
413 }
419
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
414
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
415 txt_o->shape.free = _rdman_shape_stext_free;
418
af6adacbed07 Make sh_stext object managed by rdman.
Thinker K.F. Li <thinker@branda.to>
parents: 417
diff changeset
416
af6adacbed07 Make sh_stext object managed by rdman.
Thinker K.F. Li <thinker@branda.to>
parents: 417
diff changeset
417 rdman_shape_man(rdman, (shape_t *)txt_o);
af6adacbed07 Make sh_stext object managed by rdman.
Thinker K.F. Li <thinker@branda.to>
parents: 417
diff changeset
418
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
419 return (shape_t *)txt_o;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
420 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
421
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
422 static
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
423 int compute_utf8_chars_sz(const char *txt, int n_chars) {
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
424 int i;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
425 const char *p = txt;
415
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
426 const char *v;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
427
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
428 for(i = 0; i < n_chars && *p; i++) {
415
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
429 if(!(*p & 0x80)) /* single byte */
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
430 p++;
415
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
431 else if((*p & 0xe0) == 0xc0) /* 2 bytes */
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
432 p += 2;
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
433 else if((*p & 0xf0) == 0xe0) /* 3 bytes */
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
434 p += 3;
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
435 else if((*p & 0xf8) == 0xf0) /* 4 bytes */
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
436 p += 4;
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
437 else
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
438 return ERR;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
439 }
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
440 if(i < n_chars)
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
441 return ERR;
415
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
442
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
443 for(v = txt; v != p; v++)
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
444 if(*v == '\x0')
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
445 return ERR;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
446
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
447 return p - txt;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
448 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
449
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
450 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
451 mb_scaled_font_t *make_scaled_font_face(sh_stext_t *txt_o,
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
452 mb_font_face_t *face,
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
453 co_aix shift_x, co_aix shift_y,
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
454 co_aix font_sz) {
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
455 co_aix matrix[6], scaled_matrix[6];
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
456 co_aix *aggr;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
457 mb_scaled_font_t *scaled;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
458
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
459 aggr = sh_get_aggr_matrix((shape_t *)txt_o);
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
460 matrix[0] = font_sz;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
461 matrix[1] = 0;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
462 matrix[2] = shift_x;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
463 matrix[3] = 0;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
464 matrix[4] = font_sz;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
465 matrix[5] += shift_y;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
466 matrix_mul(aggr, matrix, scaled_matrix);
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
467
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
468 scaled = make_scaled_font_face_matrix(face, scaled_matrix);
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
469
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
470 return scaled;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
471 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
472
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
473 /*! \brief Extend an extents from another sub-extents.
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
474 *
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
475 * A styled text is styled by several styled blocks, so extents of
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
476 * blocks should be computed separated, collected, and aggreagated
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
477 * into a full extents.
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
478 */
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
479 static
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
480 void extent_extents(mb_text_extents_t *full, mb_text_extents_t *sub) {
437
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
481 co_aix f_rbx, f_rby; /* rb stands for right bottom */
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
482 co_aix s_rbx, s_rby;
414
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
483 co_aix s_xbr, s_ybr;
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
484 co_aix new_x_adv, new_y_adv;
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
485
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
486 f_rbx = MBE_GET_X_BEARING(full) + MBE_GET_WIDTH(full);
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
487 f_rby = MBE_GET_Y_BEARING(full) + MBE_GET_HEIGHT(full);
414
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
488 s_xbr = MBE_GET_X_BEARING(sub) + MBE_GET_X_ADV(full);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
489 s_ybr = MBE_GET_Y_BEARING(sub) + MBE_GET_Y_ADV(full);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
490 s_rbx = s_xbr + MBE_GET_WIDTH(sub);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
491 s_rby = s_ybr + MBE_GET_HEIGHT(sub);
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
492
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
493 /* set bearing */
414
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
494 if(MBE_GET_X_BEARING(full) > s_xbr)
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
495 MBE_SET_X_BEARING(full, s_xbr);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
496 if(MBE_GET_Y_BEARING(full) > s_ybr)
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
497 MBE_SET_Y_BEARING(full, s_ybr);
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
498
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
499 /* set width/height */
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
500 if(f_rbx < s_rbx)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
501 MBE_SET_WIDTH(full, s_rbx - MBE_GET_X_BEARING(full));
414
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
502 else
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
503 MBE_SET_WIDTH(full, f_rbx - MBE_GET_X_BEARING(full));
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
504 if(f_rby < s_rby)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
505 MBE_SET_HEIGHT(full, s_rby - MBE_GET_Y_BEARING(full));
414
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
506 else
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
507 MBE_SET_HEIGHT(full, f_rby - MBE_GET_Y_BEARING(full));
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
508
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
509 /* set x/y advance */
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
510 new_x_adv = MBE_GET_X_ADV(full) + MBE_GET_X_ADV(sub);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
511 new_y_adv = MBE_GET_Y_ADV(full) + MBE_GET_Y_ADV(sub);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
512 MBE_SET_X_ADV(full, new_x_adv);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
513 MBE_SET_Y_ADV(full, new_y_adv);
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
514 }
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
515
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
516 /*! \brief Compute extents of a stext object according style blocks.
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
517 *
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
518 * It create scaled fonts for style blocks, compute their extents,
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
519 * and compute where they should be draw acoording advance of style
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
520 * blocks before a style block.
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
521 *
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
522 * The scaled font that is created by this function for style blocks
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
523 * are drawed at origin. So, extents of these blocks are also based
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
524 * on that the text are drawed at origin of user space. But,
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
525 * aggreagated extents (sh_stext_t::extents) accounts x/y advances
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
526 * to create correct extents for full text string with style blocks.
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
527 *
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
528 * This function assumes texts are always drawed at 0, 0. So,
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
529 * transform function should adjust x and y bearing corresponding
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
530 * x, y of text to compute area.
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
531 */
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
532 static
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
533 void compute_styled_extents_n_scaled_font(sh_stext_t *txt_o) {
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
534 mb_style_blk_t *blk;
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
535 style_blks_lst_t *style_blks;
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
536 int blk_txt_len;
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
537 mb_scaled_font_t *scaled;
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
538 scaled_fonts_lst_t *scaled_fonts;
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
539 extents_lst_t *sub_exts;
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
540 mb_text_extents_t *sub;
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
541 char *txt, saved;
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
542 int i, nscaled;
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
543
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
544 scaled_fonts = &txt_o->scaled_fonts;
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
545 for(i = 0; i < scaled_fonts->num; i++)
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
546 scaled_font_free(scaled_fonts->ds[i]);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
547 DARRAY_CLEAN(scaled_fonts);
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
548
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
549 style_blks = &txt_o->style_blks;
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
550 blk = style_blks->ds;
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
551
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
552 sub_exts = &txt_o->sub_exts;
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
553 DARRAY_CLEAN(sub_exts);
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
554 extents_lst_adv(sub_exts, style_blks->num);
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
555
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
556 txt = (char *)txt_o->txt;
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
557 for(i = 0; i < style_blks->num; i++) {
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
558 scaled = make_scaled_font_face(txt_o, blk->face,
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
559 0, 0, blk->font_sz);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
560 ASSERT(scaled != NULL);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
561 scaled_fonts_lst_add(scaled_fonts, scaled);
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
562 sub = sub_exts->ds + i;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
563
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
564 blk_txt_len = compute_utf8_chars_sz(txt, blk->n_chars);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
565 ASSERT(blk_txt_len != ERR);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
566
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
567 saved = txt[blk_txt_len];
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
568 txt[blk_txt_len] = 0;
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
569 compute_text_extents(scaled, txt, sub);
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
570 txt[blk_txt_len] = saved;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
571
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
572 blk++;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
573 txt += blk_txt_len;
437
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
574 }
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
575
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
576 if(style_blks->num > 0) {
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
577 sub = sub_exts->ds;
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
578 memcpy(&txt_o->extents, sub, sizeof(mb_text_extents_t));
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
579 for(i = 1; i < style_blks->num; i++) {
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
580 sub = sub_exts->ds + i;
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
581 extent_extents(&txt_o->extents, sub);
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
582 }
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
583 } else
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
584 memset(&txt_o->extents, sizeof(mb_text_extents_t), 0);
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
585 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
586
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
587 /*
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
588 * What we have to do in sh_stext_transform() is
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
589 * - computing bounding box for the text,
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
590 * - computing offset x,y for the text of style blocks,
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
591 * - free old scaled fonts, and
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
592 * - making scaled fonts for style blocks.
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
593 *
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
594 * Extents of style blocks are computed with x,y at 0,0.
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
595 * So, we should add x,y, after transforming by the aggreagated matrix,
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
596 * to output area.
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
597 */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
598 void sh_stext_transform(shape_t *shape) {
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
599 sh_stext_t *txt_o = (sh_stext_t *)shape;
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
600 area_t *area;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
601 mb_text_extents_t *ext;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
602 co_aix *aggr;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
603
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
604 ASSERT(txt_o != NULL);
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
605
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
606 aggr = sh_get_aggr_matrix(shape);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
607
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
608 txt_o->dx = txt_o->x;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
609 txt_o->dy = txt_o->y;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
610 matrix_trans_pos(aggr, &txt_o->dx, &txt_o->dy);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
611
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
612 compute_styled_extents_n_scaled_font(txt_o);
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
613 ext = &txt_o->extents;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
614
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
615 area = sh_get_area(shape);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
616 area->x = MBE_GET_X_BEARING(ext) + txt_o->dx;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
617 area->y = MBE_GET_Y_BEARING(ext) + txt_o->dy;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
618 area->w = MBE_GET_WIDTH(ext);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
619 area->h = MBE_GET_HEIGHT(ext);
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
620 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
621
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
622 void sh_stext_draw(shape_t *shape, cairo_t *cr) {
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
623 sh_stext_t *txt_o = (sh_stext_t *)shape;
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
624 co_aix x, y;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
625 const char *txt;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
626 scaled_fonts_lst_t *scaled_fonts;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
627 mb_scaled_font_t *scaled;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
628 style_blks_lst_t *style_blks;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
629 mb_style_blk_t *blk;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
630 mb_text_extents_t *ext;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
631 int blk_txt_len;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
632 int i;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
633
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
634 ASSERT(txt_o != NULL);
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
635
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
636 x = txt_o->dx;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
637 y = txt_o->dy;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
638 txt = txt_o->txt;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
639 scaled_fonts = &txt_o->scaled_fonts;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
640 style_blks = &txt_o->style_blks;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
641 ext = txt_o->sub_exts.ds;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
642
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
643 for(i = 0; i < scaled_fonts->num; i++) {
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
644 scaled = scaled_fonts->ds[i];
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
645 blk = style_blks->ds + i;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
646 blk_txt_len = compute_utf8_chars_sz(txt, blk->n_chars);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
647 draw_text_scaled(cr, txt, blk_txt_len, scaled, x, y);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
648
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
649 x += MBE_GET_X_ADV(ext);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
650 y += MBE_GET_Y_ADV(ext);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
651 txt += blk_txt_len;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
652 }
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
653 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
654
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
655 int sh_stext_set_text(shape_t *shape, const char *txt) {
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
656 sh_stext_t *txt_o = (sh_stext_t *)shape;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
657 char *new_txt;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
658 int sz;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
659
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
660 ASSERT(txt_o != NULL);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
661 ASSERT(txt != NULL);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
662
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
663 sz = strlen(txt) + 1;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
664 new_txt = (char *)realloc((void *)txt_o->txt, sz);
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
665 if(new_txt == NULL)
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
666 return ERR;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
667
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
668 memcpy(new_txt, txt, sz);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
669 txt_o->txt = new_txt;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
670
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
671 return OK;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
672 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
673
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
674 int sh_stext_set_style(shape_t *shape,
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
675 const mb_style_blk_t *blks,
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
676 int nblks) {
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
677 sh_stext_t *txt_o = (sh_stext_t *)shape;
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
678 style_blks_lst_t *style_blks;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
679 mb_style_blk_t *new_blks;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
680 int sz;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
681
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
682 ASSERT(txt_o != NULL);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
683 ASSERT(nblks >= 0);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
684
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
685 style_blks = &txt_o->style_blks;
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
686 DARRAY_CLEAN(style_blks);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
687 style_blks_lst_adv(style_blks, nblks);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
688
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
689 memcpy(style_blks->ds,
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
690 blks, nblks * sizeof(mb_style_blk_t));
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
691
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
692 return OK;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
693 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
694
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
695 #ifdef UNITTEST
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
696
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
697 #include <CUnit/Basic.h>
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
698
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
699 static
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
700 void test_query_font_face(void) {
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
701 mb_font_face_t *face;
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
702 cairo_status_t status;
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
703
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
704 face = query_font_face("serif", MB_FONT_SLANT_ROMAN, 100);
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
705 CU_ASSERT(face != NULL);
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
706 status = cairo_font_face_status((cairo_font_face_t *)face);
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
707 CU_ASSERT(status == CAIRO_STATUS_SUCCESS);
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
708
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
709 free_font_face(face);
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
710 }
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
711
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
712 static
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
713 void test_make_scaled_font_face_matrix(void) {
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
714 co_aix matrix[6] = {5, 0, 0, 0, 5, 0};
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
715 mb_font_face_t *face;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
716 mb_scaled_font_t *scaled;
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
717 cairo_status_t status;
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
718
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
719 face = query_font_face("serif", MB_FONT_SLANT_ROMAN, 100);
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
720 CU_ASSERT(face != NULL);
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
721 status = cairo_font_face_status((cairo_font_face_t *)face);
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
722 CU_ASSERT(status == CAIRO_STATUS_SUCCESS);
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
723
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
724 scaled = make_scaled_font_face_matrix(face, matrix);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
725 CU_ASSERT(scaled != NULL);
420
485c563514f4 Casting pointer to cease warning messages.
Thinker K.F. Li <thinker@branda.to>
parents: 419
diff changeset
726 status = cairo_scaled_font_status((cairo_scaled_font_t *)scaled);
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
727 CU_ASSERT(status == CAIRO_STATUS_SUCCESS);
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
728
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
729 scaled_font_free(scaled);
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
730 free_font_face(face);
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
731 }
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
732
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
733 static
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
734 void test_compute_text_extents(void) {
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
735 co_aix matrix[6] = {10, 0, 0, 0, 10, 0};
423
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
736 co_aix x_adv1, x_adv2;
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
737 co_aix x_bearing1, x_bearing2;
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
738 mb_font_face_t *face;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
739 mb_scaled_font_t *scaled;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
740 mb_text_extents_t ext;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
741
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
742 face = query_font_face("serif", MB_FONT_SLANT_ROMAN, 100);
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
743 CU_ASSERT(face != NULL)
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
744 scaled = make_scaled_font_face_matrix(face, matrix);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
745 CU_ASSERT(scaled != NULL);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
746
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
747 compute_text_extents(scaled, "test", &ext);
414
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
748 CU_ASSERT(MBE_GET_HEIGHT(&ext) >= 5 && MBE_GET_HEIGHT(&ext) <= 12);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
749 CU_ASSERT(MBE_GET_WIDTH(&ext) >= 16 && MBE_GET_WIDTH(&ext) <= 48);
423
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
750 x_adv1 = MBE_GET_X_ADV(&ext);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
751 x_bearing1 = MBE_GET_X_BEARING(&ext);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
752 scaled_font_free(scaled);
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
753
423
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
754 matrix[2] = 5;
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
755 scaled = make_scaled_font_face_matrix(face, matrix);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
756 CU_ASSERT(scaled != NULL);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
757
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
758 compute_text_extents(scaled, "test", &ext);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
759 CU_ASSERT(MBE_GET_HEIGHT(&ext) >= 5 && MBE_GET_HEIGHT(&ext) <= 12);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
760 CU_ASSERT(MBE_GET_WIDTH(&ext) >= 16 && MBE_GET_WIDTH(&ext) <= 48);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
761 x_adv2 = MBE_GET_X_ADV(&ext);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
762 x_bearing2 = MBE_GET_X_BEARING(&ext);
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
763 scaled_font_free(scaled);
423
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
764
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
765 CU_ASSERT(x_adv1 == x_adv2);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
766 CU_ASSERT((x_bearing1 + 5) == x_bearing2);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
767
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
768 free_font_face(face);
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
769 }
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
770
414
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
771 static
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
772 void test_extent_extents(void) {
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
773 mb_text_extents_t ext1, ext2;
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
774
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
775 MBE_SET_WIDTH(&ext1, 20);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
776 MBE_SET_HEIGHT(&ext1, 10);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
777 MBE_SET_X_BEARING(&ext1, 1);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
778 MBE_SET_Y_BEARING(&ext1, -8);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
779 MBE_SET_X_ADV(&ext1, 21);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
780 MBE_SET_Y_ADV(&ext1, -3);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
781
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
782 MBE_SET_WIDTH(&ext2, 30);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
783 MBE_SET_HEIGHT(&ext2, 11);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
784 MBE_SET_X_BEARING(&ext2, 2);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
785 MBE_SET_Y_BEARING(&ext2, -11);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
786 MBE_SET_X_ADV(&ext2, 32);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
787 MBE_SET_Y_ADV(&ext2, -5);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
788
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
789 extent_extents(&ext1, &ext2);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
790
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
791 CU_ASSERT(MBE_GET_WIDTH(&ext1) == 52);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
792 CU_ASSERT(MBE_GET_HEIGHT(&ext1) == 16);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
793 CU_ASSERT(MBE_GET_X_BEARING(&ext1) == 1);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
794 CU_ASSERT(MBE_GET_Y_BEARING(&ext1) == -14);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
795 CU_ASSERT(MBE_GET_X_ADV(&ext1) == 53);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
796 CU_ASSERT(MBE_GET_Y_ADV(&ext1) == -8);
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
797 }
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
798
415
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
799 static
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
800 void test_compute_utf8_chars_sz(void) {
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
801 const char *str = "\xe4\xb8\xad\xe6\x96\x87test\xe6\xb8\xac\xe8\xa9\xa6";
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
802 int sz;
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
803
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
804 sz = compute_utf8_chars_sz(str, 4);
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
805 CU_ASSERT(sz == 8);
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
806
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
807 sz = compute_utf8_chars_sz(str, 9);
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
808 CU_ASSERT(sz == ERR);
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
809 }
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
810
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
811 static
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
812 void test_compute_styled_extents_n_scaled_font(void) {
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
813 sh_stext_t *txt_o;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
814 co_aix *aggr;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
815 mb_style_blk_t blks[2];
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
816 mb_font_face_t *face;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
817 mb_text_extents_t *ext;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
818 int r;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
819
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
820 txt_o = (sh_stext_t *)rdman_shape_stext_new((redraw_man_t *)NULL,
429
9d5506968efb Change the interface of rdman_shape_stext_new().
Thinker K.F. Li <thinker@branda.to>
parents: 427
diff changeset
821 "Hello World", 10, 15);
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
822 CU_ASSERT(txt_o != NULL);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
823
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
824 aggr = txt_o->shape.aggr;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
825 aggr[0] = 1;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
826 aggr[1] = 0;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
827 aggr[2] = 0;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
828 aggr[3] = 0;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
829 aggr[4] = 1;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
830 aggr[5] = 0;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
831
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
832 face = query_font_face("serif", MB_FONT_SLANT_ROMAN, 100);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
833 CU_ASSERT(face != NULL);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
834
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
835 blks[0].n_chars = 5;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
836 blks[0].face = face;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
837 blks[0].font_sz = 10;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
838
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
839 blks[1].n_chars = 4;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
840 blks[1].face = face;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
841 blks[1].font_sz = 15.5;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
842
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
843 r = sh_stext_set_style((shape_t *)txt_o, blks, 2);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
844 CU_ASSERT(r == OK);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
845
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
846 compute_styled_extents_n_scaled_font(txt_o);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
847
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
848 ext = &txt_o->extents;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
849 CU_ASSERT(MBE_GET_HEIGHT(ext) > 11);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
850 CU_ASSERT(MBE_GET_HEIGHT(ext) < 20);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
851 CU_ASSERT(MBE_GET_WIDTH(ext) > 36);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
852 CU_ASSERT(MBE_GET_WIDTH(ext) < 72);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
853 CU_ASSERT(MBE_GET_X_ADV(ext) > 36);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
854 CU_ASSERT(MBE_GET_X_ADV(ext) < 72);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
855 CU_ASSERT(MBE_GET_Y_ADV(ext) == 0);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
856
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
857 _rdman_shape_stext_free((shape_t *)txt_o);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
858 free_font_face(face);
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
859 }
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
860
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
861 static
433
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
862 void test_compute_styled_extents_n_scaled_font_rotate(void) {
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
863 sh_stext_t *txt_o;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
864 co_aix *aggr;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
865 mb_style_blk_t blks[2];
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
866 mb_font_face_t *face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
867 mb_text_extents_t *ext;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
868 int r;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
869
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
870 txt_o = (sh_stext_t *)rdman_shape_stext_new((redraw_man_t *)NULL,
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
871 "Hello World", 10, 15);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
872 CU_ASSERT(txt_o != NULL);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
873
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
874 aggr = txt_o->shape.aggr;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
875 aggr[0] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
876 aggr[1] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
877 aggr[2] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
878 aggr[3] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
879 aggr[4] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
880 aggr[5] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
881
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
882 face = query_font_face("serif", MB_FONT_SLANT_ROMAN, 100);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
883 CU_ASSERT(face != NULL);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
884
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
885 blks[0].n_chars = 5;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
886 blks[0].face = face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
887 blks[0].font_sz = 10;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
888
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
889 blks[1].n_chars = 4;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
890 blks[1].face = face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
891 blks[1].font_sz = 15.5;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
892
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
893 r = sh_stext_set_style((shape_t *)txt_o, blks, 2);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
894 CU_ASSERT(r == OK);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
895
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
896 compute_styled_extents_n_scaled_font(txt_o);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
897
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
898 ext = &txt_o->extents;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
899 CU_ASSERT(MBE_GET_HEIGHT(ext) > 47);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
900 CU_ASSERT(MBE_GET_HEIGHT(ext) < 92);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
901 CU_ASSERT(MBE_GET_WIDTH(ext) > 36);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
902 CU_ASSERT(MBE_GET_WIDTH(ext) < 72);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
903 CU_ASSERT(MBE_GET_X_ADV(ext) > 36);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
904 CU_ASSERT(MBE_GET_X_ADV(ext) < 72);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
905 CU_ASSERT(MBE_GET_Y_ADV(ext) > 36);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
906 CU_ASSERT(MBE_GET_Y_ADV(ext) < 72);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
907
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
908 _rdman_shape_stext_free((shape_t *)txt_o);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
909 free_font_face(face);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
910 }
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
911
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
912 static
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
913 void test_sh_stext_transform(void) {
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
914 sh_stext_t *txt_o;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
915 mb_style_blk_t blks[2];
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
916 co_aix *aggr;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
917 mb_font_face_t *face;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
918 area_t *area;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
919 int r;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
920
429
9d5506968efb Change the interface of rdman_shape_stext_new().
Thinker K.F. Li <thinker@branda.to>
parents: 427
diff changeset
921 txt_o = (sh_stext_t *)rdman_shape_stext_new(NULL, "hello world", 100, 50);
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
922 CU_ASSERT(txt_o != NULL);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
923
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
924 aggr = txt_o->shape.aggr;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
925 aggr[0] = 2;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
926 aggr[1] = 0;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
927 aggr[2] = 0;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
928 aggr[3] = 0;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
929 aggr[4] = 1;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
930 aggr[5] = 0;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
931
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
932 face = query_font_face("serif", MB_FONT_SLANT_ROMAN, 100);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
933 CU_ASSERT(face != NULL);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
934
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
935 blks[0].n_chars = 5;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
936 blks[0].face = face;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
937 blks[0].font_sz = 10;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
938
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
939 blks[1].n_chars = 4;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
940 blks[1].face = face;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
941 blks[1].font_sz = 15.5;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
942
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
943 r = sh_stext_set_style((shape_t *)txt_o, blks, 2);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
944 CU_ASSERT(r == OK);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
945
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
946 sh_stext_transform((shape_t *)txt_o);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
947
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
948 area = sh_get_area((shape_t *)txt_o);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
949 CU_ASSERT(area->x >= 200 && area->x < 220);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
950 CU_ASSERT(area->y >= 40 && area->y < 50);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
951 CU_ASSERT(area->w >= 80 && area->w < 120);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
952 CU_ASSERT(area->h >= 8 && area->h < 12);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
953
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
954 _rdman_shape_stext_free((shape_t *)txt_o);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
955 free_font_face(face);
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
956 }
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
957
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
958 static
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
959 void test_sh_stext_draw(void) {
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
960 sh_stext_t *txt_o;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
961 mb_style_blk_t blks[2];
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
962 co_aix *aggr;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
963 mb_font_face_t *face;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
964 area_t *area;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
965 int r;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
966
429
9d5506968efb Change the interface of rdman_shape_stext_new().
Thinker K.F. Li <thinker@branda.to>
parents: 427
diff changeset
967 txt_o = (sh_stext_t *)rdman_shape_stext_new(NULL, "hello world", 100, 50);
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
968 CU_ASSERT(txt_o != NULL);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
969
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
970 aggr = txt_o->shape.aggr;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
971 aggr[0] = 2;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
972 aggr[1] = 0;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
973 aggr[2] = 0;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
974 aggr[3] = 0;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
975 aggr[4] = 1;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
976 aggr[5] = 0;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
977
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
978 face = query_font_face("serif", MB_FONT_SLANT_ROMAN, 100);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
979 CU_ASSERT(face != NULL);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
980
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
981 blks[0].n_chars = 5;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
982 blks[0].face = face;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
983 blks[0].font_sz = 10;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
984
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
985 blks[1].n_chars = 6;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
986 blks[1].face = face;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
987 blks[1].font_sz = 15.5;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
988
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
989 r = sh_stext_set_style((shape_t *)txt_o, blks, 2);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
990 CU_ASSERT(r == OK);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
991
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
992 sh_stext_transform((shape_t *)txt_o);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
993
433
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
994 move_cnt = 0;
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
995 sh_stext_draw((shape_t *)txt_o, NULL);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
996 CU_ASSERT(move_cnt == 2);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
997 CU_ASSERT(move_xys[0][0] == 200);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
998 CU_ASSERT(move_xys[0][1] == 50);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
999 CU_ASSERT(move_xys[1][0] >= 240 && move_xys[1][0] < 270);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
1000 CU_ASSERT(move_xys[1][1] == 50);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
1001
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
1002 _rdman_shape_stext_free((shape_t *)txt_o);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
1003 free_font_face(face);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
1004 }
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
1005
433
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1006 static
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1007 void test_sh_stext_draw_rotate(void) {
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1008 sh_stext_t *txt_o;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1009 mb_style_blk_t blks[2];
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1010 co_aix *aggr;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1011 mb_font_face_t *face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1012 area_t *area;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1013 int r;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1014
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1015 txt_o = (sh_stext_t *)rdman_shape_stext_new(NULL, "hello world", 100, 50);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1016 CU_ASSERT(txt_o != NULL);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1017
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1018 aggr = txt_o->shape.aggr;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1019 aggr[0] = 2;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1020 aggr[1] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1021 aggr[2] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1022 aggr[3] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1023 aggr[4] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1024 aggr[5] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1025
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1026 face = query_font_face("serif", MB_FONT_SLANT_ROMAN, 100);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1027 CU_ASSERT(face != NULL);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1028
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1029 blks[0].n_chars = 5;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1030 blks[0].face = face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1031 blks[0].font_sz = 10;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1032
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1033 blks[1].n_chars = 6;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1034 blks[1].face = face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1035 blks[1].font_sz = 15.5;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1036
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1037 r = sh_stext_set_style((shape_t *)txt_o, blks, 2);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1038 CU_ASSERT(r == OK);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1039
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1040 sh_stext_transform((shape_t *)txt_o);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1041
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1042 move_cnt = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1043 sh_stext_draw((shape_t *)txt_o, NULL);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1044 CU_ASSERT(move_cnt == 2);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1045 CU_ASSERT(move_xys[0][0] == 200);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1046 CU_ASSERT(move_xys[0][1] == 150);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1047 CU_ASSERT(move_xys[1][0] >= 240 && move_xys[1][0] < 270);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1048 CU_ASSERT(move_xys[1][1] >= 170 && move_xys[1][1] < 185);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1049
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1050 _rdman_shape_stext_free((shape_t *)txt_o);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1051 free_font_face(face);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1052 }
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1053
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1054 #include <CUnit/Basic.h>
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1055 CU_pSuite get_stext_suite(void) {
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1056 CU_pSuite suite;
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1057
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1058 suite = CU_add_suite("Suite_stext", NULL, NULL);
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
1059 CU_ADD_TEST(suite, test_query_font_face);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
1060 CU_ADD_TEST(suite, test_make_scaled_font_face_matrix);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
1061 CU_ADD_TEST(suite, test_compute_text_extents);
414
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
1062 CU_ADD_TEST(suite, test_extent_extents);
415
fef1b8076041 Make compute_utf8_chars_sz to compute length of n UTF 8 characters correctly.
Thinker K.F. Li <thinker@branda.to>
parents: 414
diff changeset
1063 CU_ADD_TEST(suite, test_compute_utf8_chars_sz);
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
1064 CU_ADD_TEST(suite, test_compute_styled_extents_n_scaled_font);
433
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1065 CU_ADD_TEST(suite, test_compute_styled_extents_n_scaled_font_rotate);
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
1066 CU_ADD_TEST(suite, test_sh_stext_transform);
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
1067 CU_ADD_TEST(suite, test_sh_stext_draw);
433
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
1068 CU_ADD_TEST(suite, test_sh_stext_draw_rotate);
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1069
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1070 return suite;
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1071 }
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1072
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
1073 #endif /* UNITTEST */