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.3 by root, Tue Jul 4 23:56:34 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
188 189
189 _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info); 190 _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info);
190 _pango_opengl_font_set_cache_glyph_data (font, glyph, g); 191 _pango_opengl_font_set_cache_glyph_data (font, glyph, g);
191 } 192 }
192 193
194 if (renderer->curtex)
195 glEnd ();
196
193 tc_get (&g->tex, bm.width, bm.height); 197 tc_get (&g->tex, bm.width, bm.height);
194 198
195 g->left = bm.left; 199 g->left = bm.left;
196 g->top = bm.top; 200 g->top = bm.top;
197
198 if (renderer->curtex)
199 {
200 glEnd ();
201 renderer->curtex = 0;
202 }
203 201
204 glBindTexture (GL_TEXTURE_2D, g->tex.name); 202 glBindTexture (GL_TEXTURE_2D, g->tex.name);
205 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride); 203 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride);
206 glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 204 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
207 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);
208 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); 206 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
209 glPixelStorei (GL_UNPACK_ALIGNMENT, 4); 207 glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
208
209 renderer->curtex = g->tex.name;
210 glBegin (GL_QUADS);
210 } 211 }
211 212
212 x += g->left; 213 x += g->left;
213 y -= g->top; 214 y -= g->top;
214 215
222 if (renderer->curtex) 223 if (renderer->curtex)
223 glEnd (); 224 glEnd ();
224 225
225 glBindTexture (GL_TEXTURE_2D, g->tex.name); 226 glBindTexture (GL_TEXTURE_2D, g->tex.name);
226 renderer->curtex = g->tex.name; 227 renderer->curtex = g->tex.name;
228
227 glBegin (GL_QUADS); 229 glBegin (GL_QUADS);
228 } 230 }
229 231
230 glTexCoord2f (x1, y1); glVertex2i (x , y ); 232 glTexCoord2f (x1, y1); glVertex2i (x , y );
231 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y ); 233 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y );
253 255
254 glDisable (GL_TEXTURE_2D); 256 glDisable (GL_TEXTURE_2D);
255 257
256 glBegin (GL_QUADS); 258 glBegin (GL_QUADS);
257 glVertex2d (x11, y1); 259 glVertex2d (x11, y1);
258 glVertex2d (x12, y1); 260 glVertex2d (x21, y1);
259 glVertex2d (x22, y2); 261 glVertex2d (x22, y2);
260 glVertex2d (x21, y2); 262 glVertex2d (x12, y2);
261 glEnd (); 263 glEnd ();
262 264
263 glEnable (GL_TEXTURE_2D); 265 glEnable (GL_TEXTURE_2D);
264} 266}
265 267
266void 268void
267pango_opengl_render_layout_subpixel (PangoLayout *layout, 269pango_opengl_render_layout_subpixel (PangoLayout *layout,
268 int x, int y, 270 int x, int y,
269 float r, float g, float b, float a) 271 float r, float g, float b, float a,
272 int flags)
270{ 273{
271 PangoContext *context; 274 PangoContext *context;
272 PangoFontMap *fontmap; 275 PangoFontMap *fontmap;
273 PangoRenderer *renderer; 276 PangoRenderer *renderer;
274 277
278 281
279 PANGO_OPENGL_RENDERER (renderer)->r = r; 282 PANGO_OPENGL_RENDERER (renderer)->r = r;
280 PANGO_OPENGL_RENDERER (renderer)->g = g; 283 PANGO_OPENGL_RENDERER (renderer)->g = g;
281 PANGO_OPENGL_RENDERER (renderer)->b = b; 284 PANGO_OPENGL_RENDERER (renderer)->b = b;
282 PANGO_OPENGL_RENDERER (renderer)->a = a; 285 PANGO_OPENGL_RENDERER (renderer)->a = a;
286 PANGO_OPENGL_RENDERER (renderer)->flags = flags;
283 287
284 pango_renderer_draw_layout (renderer, layout, x, y); 288 pango_renderer_draw_layout (renderer, layout, x, y);
285} 289}
286 290
287void 291void
288pango_opengl_render_layout (PangoLayout *layout, 292pango_opengl_render_layout (PangoLayout *layout,
289 int x, int y, 293 int x, int y,
290 float r, float g, float b, float a) 294 float r, float g, float b, float a,
295 int flags)
291{ 296{
292 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);
293} 298}
294 299
295static void 300static void
296pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 301pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
297{ 302{
305prepare_run (PangoRenderer *renderer, PangoLayoutRun *run) 310prepare_run (PangoRenderer *renderer, PangoLayoutRun *run)
306{ 311{
307 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer; 312 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer;
308 PangoColor *fg = 0; 313 PangoColor *fg = 0;
309 GSList *l; 314 GSList *l;
315 unsigned char r, g, b, a;
310 316
311 renderer->underline = PANGO_UNDERLINE_NONE; 317 renderer->underline = PANGO_UNDERLINE_NONE;
312 renderer->strikethrough = FALSE; 318 renderer->strikethrough = FALSE;
313 319
314 for (l = run->item->analysis.extra_attrs; l; l = l->next) 320 for (l = run->item->analysis.extra_attrs; l; l = l->next)
333 break; 339 break;
334 } 340 }
335 } 341 }
336 342
337 if (fg) 343 if (fg)
338 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 }
339 else 349 else
340 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);
341} 366}
342 367
343static void 368static void
344draw_begin (PangoRenderer *renderer_) 369draw_begin (PangoRenderer *renderer_)
345{ 370{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines