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.2 by root, Tue Jul 4 23:44:23 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
146} 147}
147 148
148typedef struct glyph_info { 149typedef struct glyph_info {
149 tc_area tex; 150 tc_area tex;
150 int left, top; 151 int left, top;
152 int generation;
151} glyph_info; 153} glyph_info;
152 154
153static void 155static void
154free_glyph_info (glyph_info *g) 156free_glyph_info (glyph_info *g)
155{ 157{
172 glyph = PANGO_GLYPH_UNKNOWN_FLAG; 174 glyph = PANGO_GLYPH_UNKNOWN_FLAG;
173 } 175 }
174 176
175 g = _pango_opengl_font_get_cache_glyph_data (font, glyph); 177 g = _pango_opengl_font_get_cache_glyph_data (font, glyph);
176 178
177 if (!g) 179 if (!g || g->generation != tc_generation)
178 { 180 {
179 Glyph bm; 181 Glyph bm;
180 font_render_glyph (&bm, font, glyph); 182 font_render_glyph (&bm, font, glyph);
181 183
184 if (g)
185 g->generation = tc_generation;
186 else
187 {
182 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 ();
183 196
184 tc_get (&g->tex, bm.width, bm.height); 197 tc_get (&g->tex, bm.width, bm.height);
185 198
186 g->left = bm.left; 199 g->left = bm.left;
187 g->top = bm.top; 200 g->top = bm.top;
188
189 if (renderer->curtex)
190 {
191 glEnd ();
192 renderer->curtex = 0;
193 }
194 201
195 glBindTexture (GL_TEXTURE_2D, g->tex.name); 202 glBindTexture (GL_TEXTURE_2D, g->tex.name);
196 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride); 203 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride);
197 glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 204 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
198 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);
199 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); 206 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
200 glPixelStorei (GL_UNPACK_ALIGNMENT, 4); 207 glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
201 208
202 _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info); 209 renderer->curtex = g->tex.name;
203 _pango_opengl_font_set_cache_glyph_data (font, glyph, g); 210 glBegin (GL_QUADS);
204 } 211 }
205 212
206 x += g->left; 213 x += g->left;
207 y -= g->top; 214 y -= g->top;
208 215
216 if (renderer->curtex) 223 if (renderer->curtex)
217 glEnd (); 224 glEnd ();
218 225
219 glBindTexture (GL_TEXTURE_2D, g->tex.name); 226 glBindTexture (GL_TEXTURE_2D, g->tex.name);
220 renderer->curtex = g->tex.name; 227 renderer->curtex = g->tex.name;
228
221 glBegin (GL_QUADS); 229 glBegin (GL_QUADS);
222 } 230 }
223 231
224 glTexCoord2f (x1, y1); glVertex2i (x , y ); 232 glTexCoord2f (x1, y1); glVertex2i (x , y );
225 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y ); 233 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y );
247 255
248 glDisable (GL_TEXTURE_2D); 256 glDisable (GL_TEXTURE_2D);
249 257
250 glBegin (GL_QUADS); 258 glBegin (GL_QUADS);
251 glVertex2d (x11, y1); 259 glVertex2d (x11, y1);
252 glVertex2d (x12, y1); 260 glVertex2d (x21, y1);
253 glVertex2d (x22, y2); 261 glVertex2d (x22, y2);
254 glVertex2d (x21, y2); 262 glVertex2d (x12, y2);
255 glEnd (); 263 glEnd ();
256 264
257 glEnable (GL_TEXTURE_2D); 265 glEnable (GL_TEXTURE_2D);
258} 266}
259 267
260void 268void
261pango_opengl_render_layout_subpixel (PangoLayout *layout, 269pango_opengl_render_layout_subpixel (PangoLayout *layout,
262 int x, int y, 270 int x, int y,
263 float r, float g, float b, float a) 271 float r, float g, float b, float a,
272 int flags)
264{ 273{
265 PangoContext *context; 274 PangoContext *context;
266 PangoFontMap *fontmap; 275 PangoFontMap *fontmap;
267 PangoRenderer *renderer; 276 PangoRenderer *renderer;
268 277
272 281
273 PANGO_OPENGL_RENDERER (renderer)->r = r; 282 PANGO_OPENGL_RENDERER (renderer)->r = r;
274 PANGO_OPENGL_RENDERER (renderer)->g = g; 283 PANGO_OPENGL_RENDERER (renderer)->g = g;
275 PANGO_OPENGL_RENDERER (renderer)->b = b; 284 PANGO_OPENGL_RENDERER (renderer)->b = b;
276 PANGO_OPENGL_RENDERER (renderer)->a = a; 285 PANGO_OPENGL_RENDERER (renderer)->a = a;
286 PANGO_OPENGL_RENDERER (renderer)->flags = flags;
277 287
278 pango_renderer_draw_layout (renderer, layout, x, y); 288 pango_renderer_draw_layout (renderer, layout, x, y);
279} 289}
280 290
281void 291void
282pango_opengl_render_layout (PangoLayout *layout, 292pango_opengl_render_layout (PangoLayout *layout,
283 int x, int y, 293 int x, int y,
284 float r, float g, float b, float a) 294 float r, float g, float b, float a,
295 int flags)
285{ 296{
286 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);
287} 298}
288 299
289static void 300static void
290pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 301pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
291{ 302{
299prepare_run (PangoRenderer *renderer, PangoLayoutRun *run) 310prepare_run (PangoRenderer *renderer, PangoLayoutRun *run)
300{ 311{
301 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer; 312 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer;
302 PangoColor *fg = 0; 313 PangoColor *fg = 0;
303 GSList *l; 314 GSList *l;
315 unsigned char r, g, b, a;
304 316
305 renderer->underline = PANGO_UNDERLINE_NONE; 317 renderer->underline = PANGO_UNDERLINE_NONE;
306 renderer->strikethrough = FALSE; 318 renderer->strikethrough = FALSE;
307 319
308 for (l = run->item->analysis.extra_attrs; l; l = l->next) 320 for (l = run->item->analysis.extra_attrs; l; l = l->next)
327 break; 339 break;
328 } 340 }
329 } 341 }
330 342
331 if (fg) 343 if (fg)
332 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 }
333 else 349 else
334 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);
335} 366}
336 367
337static void 368static void
338draw_begin (PangoRenderer *renderer_) 369draw_begin (PangoRenderer *renderer_)
339{ 370{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines