annotate src/shape_stext.c @ 489:23c7667b3ec0 Android_Skia

Fix a potential bug when destroy a rdman. When a rdman is dirty, free shapes and coords works specially. Objects are append to a free list. They are not real freed until rdman being clean. redraw_man_destroy() free shapes and coords with free functions of them. If rdman is dirty when destroy it, objects would be leaked. The changeset make rdman clean before free shapes and coords to make objects being freed correctly.
author Thinker K.F. Li <thinker@branda.to>
date Sun, 22 Nov 2009 20:41:27 +0800
parents 744c64eb3182
children 5781b2485e38
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>
475
744c64eb3182 Since cairo-ft.h is not used, removes it.
Thinker K.F. Li <thinker@branda.to>
parents: 473
diff changeset
2 #include <string.h>
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
3 #include "mb_graph_engine.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
4 #include "mb_shapes.h"
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
5 #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
6
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
7 #ifdef UNITTEST
425
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
8
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
9 #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
10 #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
11 r x param {}
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
12
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
13 UT_FAKE(void, sh_stext_transform, (shape_t *shape));
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
14 UT_FAKE(void, sh_stext_draw, (shape_t *shape, mbe_t *cr));
425
09a66063b25d Fix issue of missed function for unittest.
Thinker K.F. Li <thinker@branda.to>
parents: 424
diff changeset
15
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
16 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
17 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
18 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
19 } 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
20 #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
21
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
22 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
23 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
24 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
25 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
26 } 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
27 #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
28
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
29 #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
30 #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
31
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
32 #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
33 #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
34
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
35 #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
36 #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
37 #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
38 #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
39
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
40 #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
41 #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
42 #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
43 #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
44 #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
45
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
46 #undef mbe_get_scaled_font
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
47 #define mbe_get_scaled_font(cr) ((mbe_scaled_font_t *)NULL)
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
48 #undef mbe_set_scaled_font
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
49 #define mbe_set_scaled_font(cr, scaled) ((mbe_scaled_font_t *)NULL)
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
50 #undef mbe_scaled_font_reference
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
51 #define mbe_scaled_font_reference(x)
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
52 #define MAX_MOVE 32
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
53 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
54 NO_DOX(static int move_cnt = 0);
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
55 #undef mbe_move_to
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
56 #define mbe_move_to(cr, x, y) \
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
57 do { \
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
58 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
59 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
60 } while(0)
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
61 #undef mbe_scaled_font_destroy
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
62 #define mbe_scaled_font_destroy(scaled)
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
63 #undef mbe_text_path
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
64 #define mbe_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
65
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
66 #endif /* UNITTEST */
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
67
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
68 #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
69 #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
70 #endif
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 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
72 #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
73
407
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
74 /*! \page stext Simple Text
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
75 *
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
76 * 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
77 * 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
78 * 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
79 * styled block.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
80 */
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
81
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
82 /*! \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
83 *
411
1633551e495d Add doc
Thinker K.F. Li <thinker@branda.to>
parents: 410
diff changeset
84 * 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
85 * It bases on fontconfig and FreeType supporting of Cairo.
411
1633551e495d Add doc
Thinker K.F. Li <thinker@branda.to>
parents: 410
diff changeset
86 * 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
87 * 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
88 *
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
89 * @{
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 /*! \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
92 *
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
93 * It is actually a mbe_scaled_font_t, now. But, it should not be
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
94 * 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
95 * should known it.
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
96 */
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
97 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
98
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
99 /*! \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
100 *
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
101 * Although, mb_text_extents_t is defined as a mbe_scaled_font_t, but
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
102 * programmers should assume it is opague.
407
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
103 *
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
104 * 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
105 * 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
106 * 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
107 * 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
108 * 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
109 * 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
110 * 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
111 * 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
112 */
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
113 typedef mbe_text_extents_t mb_text_extents_t;
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 #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
116 #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
117 #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
118 #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
119 #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
120 #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
121 #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
122 #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
123 #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
124 #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
125 #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
126 #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
127
465
d8181696b689 Move functions into graphic engine layers.
Thinker K.F. Li <thinker@branda.to>
parents: 450
diff changeset
128 static mb_font_face_t *
d8181696b689 Move functions into graphic engine layers.
Thinker K.F. Li <thinker@branda.to>
parents: 450
diff changeset
129 query_font_face(const char *family, int slant, int weight) {
d8181696b689 Move functions into graphic engine layers.
Thinker K.F. Li <thinker@branda.to>
parents: 450
diff changeset
130 return (mb_font_face_t *)mbe_query_font_face(family, slant, weight);
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
131 }
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
132
465
d8181696b689 Move functions into graphic engine layers.
Thinker K.F. Li <thinker@branda.to>
parents: 450
diff changeset
133 static void
d8181696b689 Move functions into graphic engine layers.
Thinker K.F. Li <thinker@branda.to>
parents: 450
diff changeset
134 free_font_face(mb_font_face_t *face) {
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
135 ASSERT(face == NULL);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
136
465
d8181696b689 Move functions into graphic engine layers.
Thinker K.F. Li <thinker@branda.to>
parents: 450
diff changeset
137 mbe_free_font_face((mbe_font_face_t *)face);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
138 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
139
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
140 /*! \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
141 *
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
142 * 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
143 * 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
144 * 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
145 * 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
146 * user space of cairo surface.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
147 */
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
148 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
149 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
150 co_aix *matrix) {
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
151 mbe_scaled_font_t *scaled_font;
473
ba64f928542b Remove mbe_matrix_t type.
Thinker K.F. Li <thinker@branda.to>
parents: 470
diff changeset
152 static co_aix id[6] = { 1, 0, 0,
ba64f928542b Remove mbe_matrix_t type.
Thinker K.F. Li <thinker@branda.to>
parents: 470
diff changeset
153 0, 1, 0 };
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
154
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
155 ASSERT(matrix != NULL);
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
156
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
157 scaled_font = mbe_scaled_font_create((mbe_font_face_t *)face,
473
ba64f928542b Remove mbe_matrix_t type.
Thinker K.F. Li <thinker@branda.to>
parents: 470
diff changeset
158 matrix, &id);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
159
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
160 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
161 }
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
162
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
163 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
164 void scaled_font_free(mb_scaled_font_t *scaled_font) {
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
165 mbe_scaled_font_destroy((mbe_scaled_font_t *)scaled_font);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
166 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
167
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
168 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
169 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
170 mb_text_extents_t *extents) {
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
171 mbe_scaled_font_text_extents((mbe_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
172 txt,
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
173 (mbe_text_extents_t *)extents);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
174 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
175
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
176 static
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
177 mb_text_extents_t *mb_text_extents_new(void) {
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
178 mbe_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
179
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
180 extents = (mbe_text_extents_t *)malloc(sizeof(mbe_text_extents_t));
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
181 return extents;
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
182 }
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
183
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
184 static
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
185 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
186 free(extents);
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
187 }
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
188
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
189 static
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
190 void draw_text_scaled(mbe_t *cr, const char *txt, int tlen,
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
191 mb_scaled_font_t *scaled, co_aix x, co_aix y) {
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
192 mbe_scaled_font_t *saved_scaled;
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
193 int total_tlen;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
194 const char *buf;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
195
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
196 total_tlen = strlen(txt);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
197 if(total_tlen > tlen)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
198 buf = strndup(txt, tlen);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
199 else
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
200 buf = txt;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
201
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
202 saved_scaled = mbe_get_scaled_font(cr);
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
203 mbe_scaled_font_reference(saved_scaled);
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
204 mbe_set_scaled_font(cr, (mbe_scaled_font_t *)scaled);
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
205
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
206 mbe_move_to(cr, x, y);
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
207 mbe_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
208
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
209 mbe_set_scaled_font(cr, saved_scaled);
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
210 mbe_scaled_font_destroy(saved_scaled);
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
211
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
212 if(total_tlen > tlen)
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
213 free((char *)buf);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
214 }
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
215
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
216 /* @} */
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
217
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
218 /*! \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
219 *
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
220 * 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
221 * 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
222 * 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
223 * 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
224 *
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
225 * \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
226 * \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
227 * \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
228 */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
229 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
230 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
231 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
232 int weight) {
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
233 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
234 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
235
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
236 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
237 ASSERT(face != NULL);
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
238 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
239 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
240
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
241 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
242 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
243 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
244 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
245 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
246 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
247
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
248 /*! \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
249 *
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
250 */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
251 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
252 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
253 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
254 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
255 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
256 co_aix dx, dy;
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
257 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
258 mb_text_extents_t extents;
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
259 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
260 } 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
261
419
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
262 static
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
263 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
264 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
265 int i;
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
266
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
267 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
268
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
269 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
270 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
271 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
272 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
273
419
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
274 if(txt_o->txt)
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
275 free((void *)txt_o->txt);
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
276
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
277 free(txt_o);
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
278 }
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
279
429
9d5506968efb Change the interface of rdman_shape_stext_new().
Thinker K.F. Li <thinker@branda.to>
parents: 427
diff changeset
280 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
281 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
282 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
283
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
284 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
285
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
286 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
287 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
288 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
289
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
290 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
291 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
292
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
293 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
294 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
295 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
296 txt_o->y = y;
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
297 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
298 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
299
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
300 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
301 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
302 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
303 }
419
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
304
7c921fda21be Set free function for sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 418
diff changeset
305 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
306
af6adacbed07 Make sh_stext object managed by rdman.
Thinker K.F. Li <thinker@branda.to>
parents: 417
diff changeset
307 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
308
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
309 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
310 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
311
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
312 static
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
313 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
314 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
315 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
316 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
317
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
318 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
319 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
320 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
321 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
322 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
323 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
324 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
325 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
326 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
327 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
328 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
329 }
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
330 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
331 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
332
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
333 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
334 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
335 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
336
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
337 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
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
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
340 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
341 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
342 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
343 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
344 co_aix font_sz) {
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
345 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
346 co_aix *aggr;
446
2437047b8bb8 Fix bug of propertional shifting of sh_stext_t.
Thinker K.F. Li <thinker@branda.to>
parents: 437
diff changeset
347 co_aix noshift_aggr[6];
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
348 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
349
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
350 aggr = sh_get_aggr_matrix((shape_t *)txt_o);
446
2437047b8bb8 Fix bug of propertional shifting of sh_stext_t.
Thinker K.F. Li <thinker@branda.to>
parents: 437
diff changeset
351 memcpy(noshift_aggr, aggr, sizeof(co_aix) * 6);
2437047b8bb8 Fix bug of propertional shifting of sh_stext_t.
Thinker K.F. Li <thinker@branda.to>
parents: 437
diff changeset
352 noshift_aggr[2] = 0;
2437047b8bb8 Fix bug of propertional shifting of sh_stext_t.
Thinker K.F. Li <thinker@branda.to>
parents: 437
diff changeset
353 noshift_aggr[5] = 0;
2437047b8bb8 Fix bug of propertional shifting of sh_stext_t.
Thinker K.F. Li <thinker@branda.to>
parents: 437
diff changeset
354
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
355 matrix[0] = font_sz;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
356 matrix[1] = 0;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
357 matrix[2] = shift_x;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
358 matrix[3] = 0;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
359 matrix[4] = font_sz;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
360 matrix[5] += shift_y;
446
2437047b8bb8 Fix bug of propertional shifting of sh_stext_t.
Thinker K.F. Li <thinker@branda.to>
parents: 437
diff changeset
361 matrix_mul(noshift_aggr, matrix, scaled_matrix);
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
362
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
363 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
364
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
365 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
366 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
367
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
368 /*! \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
369 *
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
370 * 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
371 * 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
372 * into a full extents.
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
373 */
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
374 static
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
375 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
376 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
377 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
378 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
379 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
380
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
381 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
382 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
383 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
384 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
385 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
386 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
387
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
388 /* 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
389 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
390 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
391 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
392 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
393
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
394 /* set width/height */
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
395 if(f_rbx < s_rbx)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
396 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
397 else
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
398 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
399 if(f_rby < s_rby)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
400 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
401 else
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
402 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
403
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
404 /* 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
405 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
406 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
407 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
408 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
409 }
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
410
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
411 /*! \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
412 *
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
413 * 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
414 * 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
415 * 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
416 *
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
417 * 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
418 * 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
419 * 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
420 * 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
421 * 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
422 *
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
423 * 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
424 * 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
425 * 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
426 */
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
427 static
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
428 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
429 mb_style_blk_t *blk;
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
430 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
431 int blk_txt_len;
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
432 mb_scaled_font_t *scaled;
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
433 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
434 extents_lst_t *sub_exts;
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
435 mb_text_extents_t *sub;
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
436 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
437 int i, nscaled;
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
438
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
439 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
440 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
441 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
442 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
443
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
444 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
445 blk = style_blks->ds;
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
446
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
447 sub_exts = &txt_o->sub_exts;
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
448 DARRAY_CLEAN(sub_exts);
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
449 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
450
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
451 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
452 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
453 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
454 0, 0, blk->font_sz);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
455 ASSERT(scaled != NULL);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
456 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
457 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
458
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
459 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
460 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
461
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
462 saved = txt[blk_txt_len];
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
463 txt[blk_txt_len] = 0;
426
aa320386072c Keep sub-extents for style blocks.
Thinker K.F. Li <thinker@branda.to>
parents: 425
diff changeset
464 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
465 txt[blk_txt_len] = saved;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
466
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
467 blk++;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
468 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
469 }
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
470
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
471 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
472 sub = sub_exts->ds;
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
473 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
474 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
475 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
476 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
477 }
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
478 } else
e73b3644d802 Fix bug of compute extents of sh_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 436
diff changeset
479 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
480 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
481
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
482 /*
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
483 * 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
484 * - 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
485 * - 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
486 * - 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
487 * - 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
488 *
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
489 * 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
490 * 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
491 * 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
492 */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
493 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
494 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
495 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
496 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
497 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
498
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
499 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
500
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
501 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
502
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
503 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
504 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
505 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
506
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
507 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
508 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
509
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
510 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
511 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
512 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
513 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
514 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
515 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
516
448
16116d84bc5e Replace Cairo with a abstract layer mb_graph_engine.
Thinker K.F. Li <thinker@branda.to>
parents: 447
diff changeset
517 void sh_stext_draw(shape_t *shape, mbe_t *cr) {
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
518 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
519 co_aix x, y;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
520 const char *txt;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
521 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
522 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
523 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
524 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
525 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
526 int blk_txt_len;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
527 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
528
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
529 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
530
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
531 x = txt_o->dx;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
532 y = txt_o->dy;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
533 txt = txt_o->txt;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
534 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
535 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
536 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
537
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
538 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
539 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
540 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
541 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
542 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
543
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
544 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
545 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
546 txt += blk_txt_len;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
547 }
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
548 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
549
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
550 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
551 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
552 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
553 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
554
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
555 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
556 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
557
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
558 sz = strlen(txt) + 1;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
559 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
560 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
561 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
562
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
563 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
564 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
565
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
566 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
567 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
568
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
569 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
570 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
571 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
572 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
573 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
574 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
575 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
576
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
577 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
578 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
579
422
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
580 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
581 DARRAY_CLEAN(style_blks);
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
582 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
583
c6c0d017dc8e Use DARRAY to manage variable length list
Thinker K.F. Li <thinker@branda.to>
parents: 421
diff changeset
584 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
585 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
586
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
587 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
588 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
589
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
590 #ifdef UNITTEST
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
591
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
592 #include <CUnit/Basic.h>
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
593
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
594 static
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
595 void test_query_font_face(void) {
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
596 mb_font_face_t *face;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
597
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
598 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
599 CU_ASSERT(face != NULL);
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
600
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
601 free_font_face(face);
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
602 }
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
603
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
604 static
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
605 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
606 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
607 mb_font_face_t *face;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
608 mb_scaled_font_t *scaled;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
609
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
610 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
611 CU_ASSERT(face != NULL);
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
612
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
613 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
614 CU_ASSERT(scaled != NULL);
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
615
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
616 scaled_font_free(scaled);
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
617 free_font_face(face);
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
618 }
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
619
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
620 static
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
621 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
622 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
623 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
624 co_aix x_bearing1, x_bearing2;
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
625 mb_font_face_t *face;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
626 mb_scaled_font_t *scaled;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
627 mb_text_extents_t ext;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
628
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
629 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
630 CU_ASSERT(face != NULL)
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
631 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
632 CU_ASSERT(scaled != NULL);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
633
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
634 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
635 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
636 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
637 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
638 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
639 scaled_font_free(scaled);
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
640
423
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
641 matrix[2] = 5;
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
642 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
643 CU_ASSERT(scaled != NULL);
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
644
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
645 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
646 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
647 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
648 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
649 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
650 scaled_font_free(scaled);
423
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
651
3ba48126c49c Check bearing and advance of text_extents.
Thinker K.F. Li <thinker@branda.to>
parents: 422
diff changeset
652 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
653 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
654
413
35712e4bad0e Make shape_stext.c pass test cases.
Thinker K.F. Li <thinker@branda.to>
parents: 412
diff changeset
655 free_font_face(face);
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
656 }
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
657
414
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
658 static
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
659 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
660 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
661
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
662 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
663 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
664 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
665 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
666 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
667 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
668
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
669 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
670 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
671 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
672 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
673 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
674 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
675
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
676 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
677
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
678 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
679 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
680 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
681 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
682 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
683 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
684 }
bbf036c315be Fix extent_extents to make it pass the test case.
Thinker K.F. Li <thinker@branda.to>
parents: 413
diff changeset
685
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
686 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
687 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
688 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
689 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
690
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
691 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
692 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
693
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
694 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
695 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
696 }
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
697
421
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
698 static
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
699 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
700 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
701 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
702 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
703 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
704 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
705 int r;
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
706
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
707 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
708 "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
709 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
710
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
711 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
712 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
713 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
714 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
715 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
716 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
717 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
718
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
719 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
720 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
721
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
722 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
723 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
724 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
725
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
726 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
727 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
728 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
729
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
730 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
731 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
732
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
733 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
734
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
735 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
736 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
737 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
738 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
739 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
740 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
741 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
742 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
743
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
744 _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
745 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
746 }
1e48453bb282 Make compute_styled_extents_n_scaled_font() pass the test.
Thinker K.F. Li <thinker@branda.to>
parents: 420
diff changeset
747
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
748 static
433
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
749 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
750 sh_stext_t *txt_o;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
751 co_aix *aggr;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
752 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
753 mb_font_face_t *face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
754 mb_text_extents_t *ext;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
755 int r;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
756
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
757 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
758 "Hello World", 10, 15);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
759 CU_ASSERT(txt_o != NULL);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
760
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
761 aggr = txt_o->shape.aggr;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
762 aggr[0] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
763 aggr[1] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
764 aggr[2] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
765 aggr[3] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
766 aggr[4] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
767 aggr[5] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
768
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
769 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
770 CU_ASSERT(face != NULL);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
771
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
772 blks[0].n_chars = 5;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
773 blks[0].face = face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
774 blks[0].font_sz = 10;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
775
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
776 blks[1].n_chars = 4;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
777 blks[1].face = face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
778 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
779
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
780 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
781 CU_ASSERT(r == OK);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
782
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
783 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
784
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
785 ext = &txt_o->extents;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
786 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
787 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
788 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
789 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
790 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
791 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
792 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
793 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
794
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
795 _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
796 free_font_face(face);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
797 }
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
798
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
799 static
424
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
800 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
801 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
802 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
803 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
804 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
805 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
806 int r;
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
807
429
9d5506968efb Change the interface of rdman_shape_stext_new().
Thinker K.F. Li <thinker@branda.to>
parents: 427
diff changeset
808 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
809 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
810
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
811 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
812 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
813 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
814 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
815 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
816 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
817 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
818
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
819 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
820 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
821
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
822 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
823 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
824 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
825
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
826 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
827 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
828 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
829
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
830 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
831 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
832
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
833 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
834
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
835 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
836 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
837 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
838 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
839 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
840
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
841 _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
842 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
843 }
585baa462778 Make sh_stext_transform() pass first test case for him.
Thinker K.F. Li <thinker@branda.to>
parents: 423
diff changeset
844
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
845 static
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
846 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
847 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
848 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
849 co_aix *aggr;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
850 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
851 area_t *area;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
852 int r;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
853
429
9d5506968efb Change the interface of rdman_shape_stext_new().
Thinker K.F. Li <thinker@branda.to>
parents: 427
diff changeset
854 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
855 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
856
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
857 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
858 aggr[0] = 2;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
859 aggr[1] = 0;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
860 aggr[2] = 0;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
861 aggr[3] = 0;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
862 aggr[4] = 1;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
863 aggr[5] = 0;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
864
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
865 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
866 CU_ASSERT(face != NULL);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
867
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
868 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
869 blks[0].face = face;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
870 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
871
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
872 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
873 blks[1].face = face;
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
874 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
875
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
876 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
877 CU_ASSERT(r == OK);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
878
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
879 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
880
433
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
881 move_cnt = 0;
427
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
882 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
883 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
884 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
885 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
886 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
887 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
888
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
889 _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
890 free_font_face(face);
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
891 }
8f900da42eed Make sh_text_draw() passes first test case.
Thinker K.F. Li <thinker@branda.to>
parents: 426
diff changeset
892
433
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
893 static
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
894 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
895 sh_stext_t *txt_o;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
896 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
897 co_aix *aggr;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
898 mb_font_face_t *face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
899 area_t *area;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
900 int r;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
901
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
902 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
903 CU_ASSERT(txt_o != NULL);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
904
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
905 aggr = txt_o->shape.aggr;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
906 aggr[0] = 2;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
907 aggr[1] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
908 aggr[2] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
909 aggr[3] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
910 aggr[4] = 1;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
911 aggr[5] = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
912
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
913 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
914 CU_ASSERT(face != NULL);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
915
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
916 blks[0].n_chars = 5;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
917 blks[0].face = face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
918 blks[0].font_sz = 10;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
919
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
920 blks[1].n_chars = 6;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
921 blks[1].face = face;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
922 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
923
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
924 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
925 CU_ASSERT(r == OK);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
926
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
927 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
928
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
929 move_cnt = 0;
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
930 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
931 CU_ASSERT(move_cnt == 2);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
932 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
933 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
934 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
935 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
936
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
937 _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
938 free_font_face(face);
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
939 }
099941c3becf Test cases for ratation on sh_stext
Thinker K.F. Li <thinker@branda.to>
parents: 429
diff changeset
940
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
941 #include <CUnit/Basic.h>
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
942 CU_pSuite get_stext_suite(void) {
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
943 CU_pSuite suite;
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
944
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
945 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
946 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
947 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
948 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
949 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
950 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
951 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
952 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
953 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
954 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
955 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
956
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
957 return suite;
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
958 }
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
959
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
960 #endif /* UNITTEST */