ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/pango-render.c
(Generate patch)

Comparing deliantra/Deliantra-Client/pango-render.c (file contents):
Revision 1.1 by root, Tue Jul 4 23:23:32 2006 UTC vs.
Revision 1.6 by root, Sun Aug 13 15:14:17 2006 UTC

35 35
36struct _PangoOpenGLRenderer 36struct _PangoOpenGLRenderer
37{ 37{
38 PangoRenderer parent_instance; 38 PangoRenderer parent_instance;
39 float r, g, b, a; // modulate 39 float r, g, b, a; // modulate
40 int flags;
40 GLuint curtex; // current texture 41 GLuint curtex; // current texture
41}; 42};
42 43
43G_DEFINE_TYPE (PangoOpenGLRenderer, pango_opengl_renderer, PANGO_TYPE_RENDERER) 44G_DEFINE_TYPE (PangoOpenGLRenderer, pango_opengl_renderer, PANGO_TYPE_RENDERER)
44 45
100} 101}
101 102
102static void 103static void
103font_render_glyph (Glyph *glyph, PangoFont *font, int glyph_index) 104font_render_glyph (Glyph *glyph, PangoFont *font, int glyph_index)
104{ 105{
106 FT_Face face;
107
105 if (glyph_index & PANGO_GLYPH_UNKNOWN_FLAG) 108 if (glyph_index & PANGO_GLYPH_UNKNOWN_FLAG)
106 { 109 {
107 PangoFontMetrics *metrics; 110 PangoFontMetrics *metrics;
108 111
109 if (!font) 112 if (!font)
120 pango_font_metrics_unref (metrics); 123 pango_font_metrics_unref (metrics);
121 124
122 return; 125 return;
123 } 126 }
124 127
125 FT_Face face = pango_opengl_font_get_face (font); 128 face = pango_opengl_font_get_face (font);
126 129
127 if (face) 130 if (face)
128 { 131 {
129 PangoOpenGLFont *glfont = (PangoOpenGLFont *)font; 132 PangoOpenGLFont *glfont = (PangoOpenGLFont *)font;
130 133
144} 147}
145 148
146typedef struct glyph_info { 149typedef struct glyph_info {
147 tc_area tex; 150 tc_area tex;
148 int left, top; 151 int left, top;
152 int generation;
149} glyph_info; 153} glyph_info;
150 154
151static void 155static void
152free_glyph_info (glyph_info *g) 156free_glyph_info (glyph_info *g)
153{ 157{
157 161
158static void 162static void
159draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y) 163draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y)
160{ 164{
161 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_); 165 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_);
166 glyph_info *g;
167 float x1, y1, x2, y2;
162 168
163 if (glyph & PANGO_GLYPH_UNKNOWN_FLAG) 169 if (glyph & PANGO_GLYPH_UNKNOWN_FLAG)
164 { 170 {
165 glyph = pango_opengl_get_unknown_glyph (font); 171 glyph = pango_opengl_get_unknown_glyph (font);
166 172
167 if (glyph == PANGO_GLYPH_EMPTY) 173 if (glyph == PANGO_GLYPH_EMPTY)
168 glyph = PANGO_GLYPH_UNKNOWN_FLAG; 174 glyph = PANGO_GLYPH_UNKNOWN_FLAG;
169 } 175 }
170 176
171 glyph_info *g = _pango_opengl_font_get_cache_glyph_data (font, glyph); 177 g = _pango_opengl_font_get_cache_glyph_data (font, glyph);
172 178
173 if (!g) 179 if (!g || g->generation != tc_generation)
174 { 180 {
175 Glyph bm; 181 Glyph bm;
176 font_render_glyph (&bm, font, glyph); 182 font_render_glyph (&bm, font, glyph);
177 183
184 if (g)
185 g->generation = tc_generation;
186 else
187 {
178 g = g_slice_new (glyph_info); 188 g = g_slice_new (glyph_info);
189
190 _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info);
191 _pango_opengl_font_set_cache_glyph_data (font, glyph, g);
192 }
193
194 if (renderer->curtex)
195 glEnd ();
179 196
180 tc_get (&g->tex, bm.width, bm.height); 197 tc_get (&g->tex, bm.width, bm.height);
181 198
182 g->left = bm.left; 199 g->left = bm.left;
183 g->top = bm.top; 200 g->top = bm.top;
184
185 if (renderer->curtex)
186 {
187 glEnd ();
188 renderer->curtex = 0;
189 }
190 201
191 glBindTexture (GL_TEXTURE_2D, g->tex.name); 202 glBindTexture (GL_TEXTURE_2D, g->tex.name);
192 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride); 203 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride);
193 glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 204 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
194 glTexSubImage2D (GL_TEXTURE_2D, 0, g->tex.x, g->tex.y, bm.width, bm.height, GL_ALPHA, GL_UNSIGNED_BYTE, bm.bitmap); 205 glTexSubImage2D (GL_TEXTURE_2D, 0, g->tex.x, g->tex.y, bm.width, bm.height, GL_ALPHA, GL_UNSIGNED_BYTE, bm.bitmap);
195 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); 206 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
196 glPixelStorei (GL_UNPACK_ALIGNMENT, 4); 207 glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
197 208
198 _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info); 209 renderer->curtex = g->tex.name;
199 _pango_opengl_font_set_cache_glyph_data (font, glyph, g); 210 glBegin (GL_QUADS);
200 } 211 }
201 212
202 x += g->left; 213 x += g->left;
203 y -= g->top; 214 y -= g->top;
204 215
205 float x1 = g->tex.x * (1. / TC_WIDTH ); 216 x1 = g->tex.x * (1. / TC_WIDTH );
206 float y1 = g->tex.y * (1. / TC_HEIGHT); 217 y1 = g->tex.y * (1. / TC_HEIGHT);
207 float x2 = g->tex.w * (1. / TC_WIDTH ) + x1; 218 x2 = g->tex.w * (1. / TC_WIDTH ) + x1;
208 float y2 = g->tex.h * (1. / TC_HEIGHT) + y1; 219 y2 = g->tex.h * (1. / TC_HEIGHT) + y1;
209 220
210 if (g->tex.name != renderer->curtex) 221 if (g->tex.name != renderer->curtex)
211 { 222 {
212 if (renderer->curtex) 223 if (renderer->curtex)
213 glEnd (); 224 glEnd ();
214 225
215 glBindTexture (GL_TEXTURE_2D, g->tex.name); 226 glBindTexture (GL_TEXTURE_2D, g->tex.name);
216 renderer->curtex = g->tex.name; 227 renderer->curtex = g->tex.name;
228
217 glBegin (GL_QUADS); 229 glBegin (GL_QUADS);
218 } 230 }
219 231
220 glTexCoord2f (x1, y1); glVertex2i (x , y ); 232 glTexCoord2f (x1, y1); glVertex2i (x , y );
221 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y ); 233 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y );
243 255
244 glDisable (GL_TEXTURE_2D); 256 glDisable (GL_TEXTURE_2D);
245 257
246 glBegin (GL_QUADS); 258 glBegin (GL_QUADS);
247 glVertex2d (x11, y1); 259 glVertex2d (x11, y1);
248 glVertex2d (x12, y1); 260 glVertex2d (x21, y1);
249 glVertex2d (x22, y2); 261 glVertex2d (x22, y2);
250 glVertex2d (x21, y2); 262 glVertex2d (x12, y2);
251 glEnd (); 263 glEnd ();
252 264
253 glEnable (GL_TEXTURE_2D); 265 glEnable (GL_TEXTURE_2D);
254} 266}
255 267
256void 268void
257pango_opengl_render_layout_subpixel (PangoLayout *layout, 269pango_opengl_render_layout_subpixel (PangoLayout *layout,
258 int x, int y, 270 int x, int y,
259 float r, float g, float b, float a) 271 float r, float g, float b, float a,
272 int flags)
260{ 273{
261 PangoContext *context; 274 PangoContext *context;
262 PangoFontMap *fontmap; 275 PangoFontMap *fontmap;
263 PangoRenderer *renderer; 276 PangoRenderer *renderer;
264 277
268 281
269 PANGO_OPENGL_RENDERER (renderer)->r = r; 282 PANGO_OPENGL_RENDERER (renderer)->r = r;
270 PANGO_OPENGL_RENDERER (renderer)->g = g; 283 PANGO_OPENGL_RENDERER (renderer)->g = g;
271 PANGO_OPENGL_RENDERER (renderer)->b = b; 284 PANGO_OPENGL_RENDERER (renderer)->b = b;
272 PANGO_OPENGL_RENDERER (renderer)->a = a; 285 PANGO_OPENGL_RENDERER (renderer)->a = a;
286 PANGO_OPENGL_RENDERER (renderer)->flags = flags;
273 287
274 pango_renderer_draw_layout (renderer, layout, x, y); 288 pango_renderer_draw_layout (renderer, layout, x, y);
275} 289}
276 290
277void 291void
278pango_opengl_render_layout (PangoLayout *layout, 292pango_opengl_render_layout (PangoLayout *layout,
279 int x, int y, 293 int x, int y,
280 float r, float g, float b, float a) 294 float r, float g, float b, float a,
295 int flags)
281{ 296{
282 pango_opengl_render_layout_subpixel (layout, x * PANGO_SCALE, y * PANGO_SCALE, r, g, b, a); 297 pango_opengl_render_layout_subpixel (layout, x * PANGO_SCALE, y * PANGO_SCALE, r, g, b, a, flags);
283} 298}
284 299
285static void 300static void
286pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 301pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
287{ 302{
295prepare_run (PangoRenderer *renderer, PangoLayoutRun *run) 310prepare_run (PangoRenderer *renderer, PangoLayoutRun *run)
296{ 311{
297 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer; 312 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer;
298 PangoColor *fg = 0; 313 PangoColor *fg = 0;
299 GSList *l; 314 GSList *l;
315 unsigned char r, g, b, a;
300 316
301 renderer->underline = PANGO_UNDERLINE_NONE; 317 renderer->underline = PANGO_UNDERLINE_NONE;
302 renderer->strikethrough = FALSE; 318 renderer->strikethrough = FALSE;
303 319
304 for (l = run->item->analysis.extra_attrs; l; l = l->next) 320 for (l = run->item->analysis.extra_attrs; l; l = l->next)
323 break; 339 break;
324 } 340 }
325 } 341 }
326 342
327 if (fg) 343 if (fg)
328 glColor4f (fg->red / 65535., fg->green / 65535., fg->blue / 65535., glrenderer->a); 344 {
345 r = fg->red * (255.f / 65535.f);
346 g = fg->green * (255.f / 65535.f);
347 b = fg->blue * (255.f / 65535.f);
348 }
329 else 349 else
330 glColor4f (glrenderer->r, glrenderer->g, glrenderer->b, glrenderer->a); 350 {
351 r = glrenderer->r * 255.f;
352 g = glrenderer->g * 255.f;
353 b = glrenderer->b * 255.f;
354 }
355
356 a = glrenderer->a * 255.f;
357
358 if (glrenderer->flags & FLAG_INVERSE)
359 {
360 r ^= 0xffU;
361 g ^= 0xffU;
362 b ^= 0xffU;
363 }
364
365 glColor4ub (r, g, b, a);
331} 366}
332 367
333static void 368static void
334draw_begin (PangoRenderer *renderer_) 369draw_begin (PangoRenderer *renderer_)
335{ 370{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines