annotate src/shape_stext.c @ 412:a456e267279a

Test cases for shape_stext. Even not all testcases are passed, but it is still there waiting to be done.
author Thinker K.F. Li <thinker@branda.to>
date Fri, 24 Jul 2009 22:23:51 +0800
parents 1633551e495d
children 35712e4bad0e
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"
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
6
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
7 #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
8 #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
9 #endif
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
10 #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
11 #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
12
407
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
13 /*! \page stext Simple Text
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
14 *
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
15 * A sh_stext_t is broken into fragments. Each fragment comprises the text
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
16 * and the styles applied on the fragement. The styles determines font face
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
17 * used to show the text. The fragment of text with styles is called
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
18 * styled block.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
19 */
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
20
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
21 /*! \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
22 *
411
1633551e495d Add doc
Thinker K.F. Li <thinker@branda.to>
parents: 410
diff changeset
23 * 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
24 * It bases on fontconfig and FreeType supporting of Cairo.
411
1633551e495d Add doc
Thinker K.F. Li <thinker@branda.to>
parents: 410
diff changeset
25 * If you want to provide stext with technologies other than fontconfig and
1633551e495d Add doc
Thinker K.F. Li <thinker@branda.to>
parents: 410
diff changeset
26 * 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
27 *
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
28 * @{
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
29 */
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
30 /*! \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
31 *
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
32 * 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
33 * 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
34 * should known it.
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
35 */
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
36 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
37
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
38 /*! \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
39 *
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
40 * 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
41 * programmers should assume it is opague.
407
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
42 *
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
43 * An extents is the span of showing a fragement of text on the output device.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
44 * It includes x and y advance of cursor after showinng the text.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
45 * The cursor maybe not really existed. But, the advance is computed as
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
46 * the cursor existed. It also includes width and height of the text.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
47 * The bearing of a styled block is the left-top corner of the bounding box.
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
48 * The bounding box of a styled block is the minimal rectangle, on the
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
49 * output device, that can contain the text. The bearing is related to
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
50 * 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
51 */
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
52 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
53
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
54 #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
55 #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
56 #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
57 #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
58 #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
59 #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
60 #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
61 #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
62 #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
63 #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
64 #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
65 #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
66
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
67 /*! \brief Find out a font pattern.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
68 *
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
69 * This function use fontconfig to decide a font file in pattern. It can
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
70 * 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
71 *
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
72 * \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
73 * \param weight make font normal if it is 100.
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
74 */
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
75 static
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
76 FcPattern *query_font_pattern(const char *family, int slant, int weight) {
394
b3d5ce48670a Use fontconfig to find out a font for a family/slant/weight pattern
Thinker K.F. Li <thinker@branda.to>
parents: 393
diff changeset
77 FcPattern *ptn, *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
78 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
79 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
80 FcBool 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
81 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
82 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
83 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
84 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
85 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
86
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
87 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
88 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
89 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
90 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
91 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
92
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
93 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
94 val.u.s = family;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
95 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
96
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
97 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
98 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
99 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
100
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
101 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
102 val.u.i = weight;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
103 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
104
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
105 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
106 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
107 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
108
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
109 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
110 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
111 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
112
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
113 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
114
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
115 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
116
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
117 return 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
118
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
119 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
120 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
121 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
122 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
123 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
124 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
125
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
126 }
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
127
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
128 /*! \brief Find out a font face for a pattern specified.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
129 *
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
130 * The pattern, here, is a vector of family, slant, and weight.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
131 * This function base on fontconfig and cairo FreeType font supporting.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
132 * You can replace this function with other font mechanisms.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
133 */
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
134 static
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
135 mb_font_face_t *query_font_face(const char *family, int slant, int weight) {
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
136 cairo_font_face_t *cface;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
137 FcPattern *ptn;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
138
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
139 ptn = query_font_pattern(family, slant, weight);
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
140 cface = cairo_ft_font_face_create_for_pattern(ptn);
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
141 FcPatternDestroy(ptn);
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
142
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
143 return (mb_font_face_t *)cface;
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
144 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
145
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
146 static
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
147 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
148 ASSERT(face == NULL);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
149
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
150 cairo_font_face_destroy((cairo_font_face_t *)face);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
151 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
152
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
153 /*! \brief This is scaled font for specified size and extent.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
154 *
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
155 * Font face only specified which font would be used to draw text
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
156 * message. But, it also need to scale glyphs to specified size and
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
157 * rotation. This function return a scaled font specified by a
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
158 * matrix that transform glyph from design space of the font to
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
159 * user space of cairo surface.
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
160 */
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
161 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
162 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
163 co_aix *matrix) {
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
164 cairo_scaled_font_t *scaled_font;
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
165 cairo_matrix_t font_matrix;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
166 static cairo_matrix_t id = {
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
167 1, 0,
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
168 0, 1,
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
169 0, 0
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
170 };
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
171 static cairo_font_options_t *opt = NULL;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
172
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
173 ASSERT(matrix != NULL);
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
174
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
175 if(opt == NULL) {
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
176 opt = cairo_font_options_create();
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
177 if(opt == NULL)
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
178 return NULL;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
179 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
180
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
181 font_matrix.xx = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
182 font_matrix.xy = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
183 font_matrix.x0 = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
184 font_matrix.yx = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
185 font_matrix.yy = *matrix++;
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
186 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
187 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
188 &font_matrix,
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
189 &id, opt);
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
190
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
191 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
192 }
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
193
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
194 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
195 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
196 cairo_scaled_font_destroy((cairo_scaled_font_t *)scaled_font);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
197 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
198
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
199 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
200 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
201 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
202 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
203 txt,
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
204 (cairo_text_extents_t *)extents);
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
205 }
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
206
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
207 static
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
208 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
209 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
210
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
211 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
212 return extents;
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
213 }
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
214
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
215 static
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
216 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
217 free(extents);
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
218 }
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
219
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
220 /* @} */
395
d30b575a4ad4 Add fontconfig layer
Thinker K.F. Li <thinker@branda.to>
parents: 394
diff changeset
221
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
222 /*! \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
223 *
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
224 * 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
225 * 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
226 * 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
227 * 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
228 *
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
229 * \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
230 * \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
231 * \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
232 */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
233 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
234 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
235 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
236 int weight) {
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
237 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
238 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
239
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
240 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
241 ASSERT(face != NULL);
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
242 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
243 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
244
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
245 /*! \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
246 *
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
247 */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
248 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
249 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
250 const char *txt; /*!< \brief Text to be showed */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
251 const mb_style_blk_t *style_blks; /*!< \brief Style of text */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
252 int nblks; /*!< \brief Number 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
253 int max_nblks;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
254 co_aix x, y;
396
7fe0b1ee92b6 Add extents supporting into Fontconfig and FreeType Layer
Thinker K.F. Li <thinker@branda.to>
parents: 395
diff changeset
255 mb_scaled_font_t **scaled_fonts;
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
256 mb_text_extents_t extents;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
257 } 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
258
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
259 shape_t *rdman_shape_stext_new(redraw_man_t *rdman, co_aix x, co_aix y,
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
260 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
261 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
262
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
263 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
264
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
265 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
266 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
267 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
268
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
269 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
270 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
271
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
272 txt_o->txt = strdup(txt);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
273 txt_o->style_blks = NULL;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
274 txt_o->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
275 txt_o->max_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
276 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
277 txt_o->y = y;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
278 txt_o->scaled_fonts = NULL;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
279
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
280 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
281 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
282 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
283 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
284
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
285 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
286 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
287
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
288 static
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
289 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
290 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
291 const char *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
292
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
293 for(i = 0; i < n_chars && *p; 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
294 if(*p++ & 0x80)
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
295 continue; /* single byte */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
296 /* multi-bytes */
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
297 while(*p && ((*p & 0xc0) == 0x80))
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
298 p++;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
299 }
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
300 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
301 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
302
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
303 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
304 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
305
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
306 static
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
307 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
308 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
309 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
310 co_aix font_sz) {
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
311 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
312 co_aix *aggr;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
313 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
314
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
315 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
316 matrix[0] = font_sz;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
317 matrix[1] = 0;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
318 matrix[2] = shift_x;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
319 matrix[3] = 0;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
320 matrix[4] = font_sz;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
321 matrix[5] += shift_y;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
322 matrix_mul(aggr, matrix, scaled_matrix);
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
323
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
324 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
325
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
326 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
327 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
328
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
329 /*! \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
330 *
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
331 * 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
332 * 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
333 * into a full extents.
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
334 */
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
335 static
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
336 void extent_extents(mb_text_extents_t *full, mb_text_extents_t *sub) {
407
92a459a1c5aa more comment
Thinker K.F. Li <thinker@branda.to>
parents: 403
diff changeset
337 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
338 co_aix s_rbx, s_rby;
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
339
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
340 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
341 f_rby = MBE_GET_Y_BEARING(full) + MBE_GET_HEIGHT(full);
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
342 s_rbx = MBE_GET_X_BEARING(sub) + MBE_GET_WIDTH(sub);
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
343 s_rby = MBE_GET_Y_BEARING(sub) + MBE_GET_HEIGHT(sub);
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
344
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
345 /* set bearing */
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
346 if(MBE_GET_X_BEARING(full) > MBE_GET_X_BEARING(sub))
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
347 MBE_SET_X_BEARING(full, MBE_GET_X_BEARING(sub));
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
348 if(MBE_GET_Y_BEARING(full) > MBE_GET_Y_BEARING(sub))
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
349 MBE_SET_Y_BEARING(full, MBE_GET_Y_BEARING(sub));
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
350
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
351 /* set width/height */
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
352 if(f_rbx < s_rbx)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
353 MBE_SET_WIDTH(full, s_rbx - MBE_GET_X_BEARING(full));
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
354 if(f_rby < s_rby)
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
355 MBE_SET_HEIGHT(full, s_rby - MBE_GET_Y_BEARING(full));
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
356 }
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
357
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
358 /*! \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
359 *
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
360 * 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
361 * 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
362 * blocks before a style block.
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
363 */
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
364 static
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
365 void compute_styled_extents_n_scaled_font(sh_stext_t *txt_o) {
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
366 mb_text_extents_t sub_extents;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
367 const mb_style_blk_t *blk;
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
368 int blk_txt_len;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
369 mb_scaled_font_t **scaled_font;
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
370 char *txt, saved;
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
371 co_aix shift_x, 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
372 int i;
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
373
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
374 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
375
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
376 blk = txt_o->style_blks;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
377 scaled_font = txt_o->scaled_fonts;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
378 txt = (char *)txt_o->txt;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
379 for(i = 0; i < txt_o->nblks; i++) {
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
380 shift_x = txt_o->x + MBE_GET_X_ADV(&txt_o->extents);
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
381 shift_y = txt_o->y + MBE_GET_Y_ADV(&txt_o->extents);
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
382
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
383 *scaled_font = make_scaled_font_face(txt_o, blk->face,
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
384 shift_x, shift_y, blk->font_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
385 ASSERT(*scaled_font != NULL);
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
386
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
387 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
388 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
389
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
390 saved = txt[blk_txt_len];
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
391 txt[blk_txt_len] = 0;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
392 compute_text_extents(*scaled_font, txt, &sub_extents);
397
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
393 txt[blk_txt_len] = saved;
55f38c2cdb8f Refactor function of computing text extents
Thinker K.F. Li <thinker@branda.to>
parents: 396
diff changeset
394
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
395 extent_extents(&txt_o->extents, &sub_extents);
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
396
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
397 scaled_font++;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
398 blk++;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
399 txt += blk_txt_len;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
400 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
401 }
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 /*
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
404 * 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
405 * - 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
406 * - 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
407 * - 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
408 * - making scaled fonts for 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
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 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
411 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
412
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
413 ASSERT(txt_o != NULL);
403
aee0f66b1154 Compute extents of a styled text
Thinker K.F. Li <thinker@branda.to>
parents: 397
diff changeset
414 compute_styled_extents_n_scaled_font(txt_o);
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
415 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
416
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
417 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
418 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
419
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
420 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
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
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 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
424 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
425 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
426 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
427
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
428 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
429 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
430
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
431 sz = strlen(txt) + 1;
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
432 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
433 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
434 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
435
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
436 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
437 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
438
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
439 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
440 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
441
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
442 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
443 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
444 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
445 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
446 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
447 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
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 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
450 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
451
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
452 if(nblks > txt_o->max_nblks) {
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
453 sz = nblks * sizeof(mb_style_blk_t);
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
454 new_blks = (mb_style_blk_t *)realloc((void *)txt_o->style_blks, 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
455 if(new_blks == NULL)
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
456 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
457
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
458 txt_o->style_blks = 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
459 txt_o->max_nblks = nblks;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
460 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
461
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
462 memcpy(txt_o->style_blks, blks, nblks * sizeof(mb_style_blk_t));
393
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
463 txt_o->nblks = nblks;
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
464
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
465 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
466 }
27774b93521e Add sh_stext_t to implement a simple version of text shape.
Thinker K.F. Li <thinker@branda.to>
parents:
diff changeset
467
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
468 #ifdef UNITTEST
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
469
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
470 #include <CUnit/Basic.h>
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
471
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
472 static
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
473 void test_query_font_face(void) {
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
474 mb_font_face_t *face;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
475
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
476 face = query_font_face("serif", 0, 100);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
477 CU_ASSERT(face != NULL);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
478 mb_font_face_free(face);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
479 }
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
480
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
481 static
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
482 void test_make_scaled_font_face_matrix(void) {
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
483 co_aix matrix[6] = {5, 0, 0, 5, 0, 0};
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
484 mb_font_face_t *face;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
485 mb_scaled_font_t *scaled;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
486
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
487 face = query_font_face("serif", 0, 100);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
488 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
489 CU_ASSERT(scaled != NULL);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
490 scaled_font_free(scaled);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
491 }
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
492
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
493 static
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
494 void test_compute_text_extents(void) {
412
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
495 co_aix matrix[6] = {0.2, 0, 0, 0, 0.2, 0};
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
496 mb_font_face_t *face;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
497 mb_scaled_font_t *scaled;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
498 mb_text_extents_t ext;
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
499
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
500 face = query_font_face("serif", 0, 100);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
501 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
502 CU_ASSERT(scaled != NULL);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
503
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
504 compute_text_extents(scaled, "test", &ext);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
505 CU_ASSERT(ext.height == 5);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
506 CU_ASSERT(ext.width == 20);
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
507
a456e267279a Test cases for shape_stext.
Thinker K.F. Li <thinker@branda.to>
parents: 411
diff changeset
508 scaled_font_free(scaled);
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
509 }
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
510
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
511 #include <CUnit/Basic.h>
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
512 CU_pSuite get_stext_suite(void) {
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
513 CU_pSuite suite;
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
514
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
515 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
516 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
517 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
518 CU_ADD_TEST(suite, test_compute_text_extents);
410
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
519 CU_ADD_TEST(suite, test_compute_text_extents);
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
520
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
521 return suite;
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
522 }
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
523
1a923ea699c1 shape_stext.c, now, is unittested.
Thinker K.F. Li <thinker@branda.to>
parents: 407
diff changeset
524 #endif /* UNITTEST */