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