summaryrefslogtreecommitdiff
path: root/src/lib/evas/common/evas_text_utils.h
blob: e54046dbf28997a3d75a932f4ebd94d7001d3257 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#ifndef _EVAS_TEXT_UTILS_H
# define _EVAS_TEXT_UTILS_H

typedef struct _Evas_Text_Props      Evas_Text_Props;
// special case props
typedef struct _Evas_Text_Props_One  Evas_Text_Props_One;

typedef struct _Evas_Text_Props_Info Evas_Text_Props_Info;
typedef struct _Evas_Font_Array_Data Evas_Font_Array_Data;
typedef struct _Evas_Font_Array      Evas_Font_Array;
typedef struct _Evas_Font_Glyph_Info Evas_Font_Glyph_Info;

typedef enum
{
   EVAS_TEXT_PROPS_MODE_NONE = 0,
   EVAS_TEXT_PROPS_MODE_SHAPE
} Evas_Text_Props_Mode;

# include "evas_font_ot.h"
# include "language/evas_bidi_utils.h"
# include "language/evas_language_utils.h"

/* Used for showing "malformed" or missing chars */
#define REPLACEMENT_CHAR 0xFFFD

typedef struct _Evas_Glyph Evas_Glyph;
typedef struct _Evas_Glyph_Array Evas_Glyph_Array;

struct _Evas_Glyph_Array
{
   Eina_Inarray *array;
   void *fi;
   unsigned int refcount;
};

struct _Evas_Text_Props
{
   Evas_Text_Props_Info *info; // 8/4
   Evas_Glyph_Array *glyphs; // 8/4
   void *font_instance; // 8/4
   /* Start and len represent the start offset and the length in the
    * glyphs_info and ot_data fields, they are both internal */
   // i only wonder if generation needs 32bits... :)
   int generation; // 4
//   Evas_BiDi_Props bidi; // 4 // bidi.dir == enum
//   Evas_Script_Type script; // 4 // enum
//   Eina_Bool changed : 1; // 1
//   Eina_Bool prepare : 1;
//   // +3 pad
// ** the below saves 8 bytes (72 -> 64 on 64bit)
   Evas_BiDi_Direction bidi_dir : 2; // 2 (enough for values)
   Evas_Script_Type script : 7; // cont (enough for values)
   Eina_Bool changed : 1; // cont (bool)
   Eina_Bool prepare : 1; // cont (bool)
   // we have space here for at LEAST 5 bits (round up to 2 bytes) but due
   // to common padding we actually can add 5 + 16 (21) more bits for free
   Eina_Bool szlen_mode : 5; // use 5 of he 21 bits
// this can go here as the above is nicely aligned....
   // this is really big... 32 bytes. MOSt of the time the following...
   // start == text_offset == 0 AND len == text_len == smallish value (8 or
   // 16 bit is enough to store it most of the time).
   size_t start; // 8/4
   size_t len; // 8/4
   size_t text_offset; // 8/4 /* The text offset from the start of the info */
   size_t text_len; // 8/4 /* The length of the original text */
};

#define EVAS_TP_SZLEN_FULL 0
#define EVAS_TP_SZLEN_ONE 1

// special case textprop for ONE char! should use this for textgrid but
// we have to modify every bit of code that usea a textprop to go thru a
// getter or setter etc. etc.
struct _Evas_Text_Props_One
{
   Evas_Text_Props_Info *info; // 8/4
   Evas_Glyph_Array *glyphs; // 8/4
   void *font_instance; // 8/4
   /* Start and len represent the start offset and the length in the
    * glyphs_info and ot_data fields, they are both internal */
   // i only wonder if generation needs 32bits... :)
   int generation; // 4
//   Evas_BiDi_Props bidi; // 4 // bidi.dir == enum
//   Evas_Script_Type script; // 4 // enum
//   Eina_Bool changed : 1; // 1
//   Eina_Bool prepare : 1;
//   // +3 pad
// ** the below saves 8 bytes (72 -> 64 on 64bit)
   Evas_BiDi_Direction bidi_dir : 2; // 2 (enough for values)
   Evas_Script_Type script : 7; // cont (enough for values)
   Eina_Bool changed : 1; // cont (bool)
   Eina_Bool prepare : 1; // cont (bool)
   // we have space here for at LEAST 5 bits (round up to 2 bytes) but due
   // to common padding we actually can add 5 + 16 (21) more bits for free
   Eina_Bool szlen_mode : 5; // use 5 of he 21 bits
};

struct _Evas_Text_Props_Info
{
   Evas_Font_Glyph_Info *glyph; // 8/4
   Evas_Font_OT_Info *ot; // 8/4
   unsigned int refcount; // 4
};

struct _Evas_Font_Array_Data
{
   struct {
      unsigned char r, g, b, a;
   } color;
   int x;
   Evas_Glyph_Array *glyphs;
};

struct _Evas_Font_Array
{
   Eina_Inarray *array;
   unsigned int refcount;
};

/* Sorted in visual order when created */
struct _Evas_Font_Glyph_Info
{
   unsigned int index; // 4 /* Should conform to FT */
#if 1
   // done with shorts to save space... if we need 32k or bigger glyphs and
   // relative layout info... worry then.
   Evas_Coord pen_after; // 4
   short x_bear, y_bear, width; // 6
#else   
   Evas_Coord x_bear; // 4
   /* This one is rarely used, only in draw, in which we already get the glyph
    * so it doesn't really save time. Leaving it here just so no one will
    * add it thinking it was accidentally skipped */
   Evas_Coord y_bear; // 4
   Evas_Coord width; // 4
   Evas_Coord pen_after; // 4
#endif   
};

void
evas_common_font_glyphs_ref(Evas_Glyph_Array *array);
void
evas_common_font_glyphs_unref(Evas_Glyph_Array *array);

void
evas_common_font_fonts_ref(Evas_Font_Array *array);
void
evas_common_font_fonts_unref(Evas_Font_Array *array);

void
evas_common_text_props_bidi_set(Evas_Text_Props *props,
      Evas_BiDi_Paragraph_Props *bidi_par_props, size_t start);

void
evas_common_text_props_script_set(Evas_Text_Props *props, Evas_Script_Type scr);

EAPI Eina_Bool
evas_common_text_props_content_create(void *_fi, const Eina_Unicode *text,
      Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props,
      size_t par_pos, int len, Evas_Text_Props_Mode mode);

void
evas_common_text_props_content_copy_and_ref(Evas_Text_Props *dst,
      const Evas_Text_Props *src);

void
evas_common_text_props_content_ref(Evas_Text_Props *props);

void
evas_common_text_props_content_nofree_unref(Evas_Text_Props *props);

void
evas_common_text_props_content_unref(Evas_Text_Props *props);

EAPI int
evas_common_text_props_cluster_next(const Evas_Text_Props *props, int pos);

EAPI int
evas_common_text_props_cluster_prev(const Evas_Text_Props *props, int pos);

EAPI int
evas_common_text_props_index_find(const Evas_Text_Props *props, int _cutoff);

EAPI Eina_Bool
evas_common_text_props_split(Evas_Text_Props *base, Evas_Text_Props *ext,
      int cutoff);
EAPI void
evas_common_text_props_merge(Evas_Text_Props *item1, const Evas_Text_Props *item2);

/* Common to Textblock and Filters */
Eina_Bool evas_common_format_color_parse(const char *str, int slen, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a);

#endif