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.6 by root, Sun Aug 13 15:14:17 2006 UTC vs.
Revision 1.9 by root, Sat Aug 11 11:41:24 2007 UTC

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 int flags;
41 GLuint curtex; // current texture 41 rc_t *rc; // rendercache
42 rc_key_t key; // current render key
43 rc_array_t *arr;
42}; 44};
43 45
44G_DEFINE_TYPE (PangoOpenGLRenderer, pango_opengl_renderer, PANGO_TYPE_RENDERER) 46G_DEFINE_TYPE (PangoOpenGLRenderer, pango_opengl_renderer, PANGO_TYPE_RENDERER)
45 47
46typedef struct 48typedef struct
189 191
190 _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info); 192 _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info);
191 _pango_opengl_font_set_cache_glyph_data (font, glyph, g); 193 _pango_opengl_font_set_cache_glyph_data (font, glyph, g);
192 } 194 }
193 195
194 if (renderer->curtex)
195 glEnd ();
196
197 tc_get (&g->tex, bm.width, bm.height); 196 tc_get (&g->tex, bm.width, bm.height);
198 197
199 g->left = bm.left; 198 g->left = bm.left;
200 g->top = bm.top; 199 g->top = bm.top;
201 200
203 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride); 202 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride);
204 glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 203 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
205 glTexSubImage2D (GL_TEXTURE_2D, 0, g->tex.x, g->tex.y, bm.width, bm.height, GL_ALPHA, GL_UNSIGNED_BYTE, bm.bitmap); 204 glTexSubImage2D (GL_TEXTURE_2D, 0, g->tex.x, g->tex.y, bm.width, bm.height, GL_ALPHA, GL_UNSIGNED_BYTE, bm.bitmap);
206 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); 205 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
207 glPixelStorei (GL_UNPACK_ALIGNMENT, 4); 206 glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
208
209 renderer->curtex = g->tex.name;
210 glBegin (GL_QUADS);
211 } 207 }
212 208
213 x += g->left; 209 x += g->left;
214 y -= g->top; 210 y -= g->top;
215 211
216 x1 = g->tex.x * (1. / TC_WIDTH ); 212 x1 = g->tex.x * (1. / TC_WIDTH );
217 y1 = g->tex.y * (1. / TC_HEIGHT); 213 y1 = g->tex.y * (1. / TC_HEIGHT);
218 x2 = g->tex.w * (1. / TC_WIDTH ) + x1; 214 x2 = g->tex.w * (1. / TC_WIDTH ) + x1;
219 y2 = g->tex.h * (1. / TC_HEIGHT) + y1; 215 y2 = g->tex.h * (1. / TC_HEIGHT) + y1;
220 216
221 if (g->tex.name != renderer->curtex) 217 if (g->tex.name != renderer->key.texname)
222 { 218 {
223 if (renderer->curtex)
224 glEnd ();
225
226 glBindTexture (GL_TEXTURE_2D, g->tex.name);
227 renderer->curtex = g->tex.name; 219 renderer->key.texname = g->tex.name;
228 220 renderer->arr = rc_array (renderer->rc, &renderer->key);
229 glBegin (GL_QUADS);
230 } 221 }
231 222
232 glTexCoord2f (x1, y1); glVertex2i (x , y ); 223 rc_t2f_v3f (renderer->arr, x1, y1, x , y , 0);
233 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y ); 224 rc_t2f_v3f (renderer->arr, x2, y1, x + g->tex.w, y , 0);
234 glTexCoord2f (x2, y2); glVertex2i (x + g->tex.w, y + g->tex.h); 225 rc_t2f_v3f (renderer->arr, x2, y2, x + g->tex.w, y + g->tex.h, 0);
235 glTexCoord2f (x1, y2); glVertex2i (x , y + g->tex.h); 226 rc_t2f_v3f (renderer->arr, x1, y2, x , y + g->tex.h, 0);
236} 227}
237 228
238static void 229static void
239draw_trapezoid (PangoRenderer *renderer_, 230draw_trapezoid (PangoRenderer *renderer_,
240 PangoRenderPart part, 231 PangoRenderPart part,
244 double y2, 235 double y2,
245 double x12, 236 double x12,
246 double x22) 237 double x22)
247{ 238{
248 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 239 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
240 rc_key_t key = renderer->key;
241 rc_array_t *arr;
249 242
250 if (renderer->curtex) 243 key.mode = GL_QUADS;
251 { 244 key.format = GL_V2F;
252 glEnd (); 245 key.texname = 0;
253 renderer->curtex = 0;
254 }
255 246
256 glDisable (GL_TEXTURE_2D); 247 arr = rc_array (renderer->rc, &key);
257 248
258 glBegin (GL_QUADS); 249 rc_v2f (arr, x11, y1);
259 glVertex2d (x11, y1); 250 rc_v2f (arr, x21, y1);
260 glVertex2d (x21, y1); 251 rc_v2f (arr, x22, y2);
261 glVertex2d (x22, y2); 252 rc_v2f (arr, x12, y2);
262 glVertex2d (x12, y2);
263 glEnd ();
264
265 glEnable (GL_TEXTURE_2D);
266} 253}
267 254
268void 255void
269pango_opengl_render_layout_subpixel (PangoLayout *layout, 256pango_opengl_render_layout_subpixel (PangoLayout *layout,
270 int x, int y, 257 int x, int y,
272 int flags) 259 int flags)
273{ 260{
274 PangoContext *context; 261 PangoContext *context;
275 PangoFontMap *fontmap; 262 PangoFontMap *fontmap;
276 PangoRenderer *renderer; 263 PangoRenderer *renderer;
264 PangoOpenGLRenderer *gl;
277 265
278 context = pango_layout_get_context (layout); 266 context = pango_layout_get_context (layout);
279 fontmap = pango_context_get_font_map (context); 267 fontmap = pango_context_get_font_map (context);
280 renderer = _pango_opengl_font_map_get_renderer (PANGO_OPENGL_FONT_MAP (fontmap)); 268 renderer = _pango_opengl_font_map_get_renderer (PANGO_OPENGL_FONT_MAP (fontmap));
281
282 PANGO_OPENGL_RENDERER (renderer)->r = r; 269 gl = PANGO_OPENGL_RENDERER (renderer);
283 PANGO_OPENGL_RENDERER (renderer)->g = g; 270
284 PANGO_OPENGL_RENDERER (renderer)->b = b; 271 gl->rc = rc_alloc ();
285 PANGO_OPENGL_RENDERER (renderer)->a = a; 272 gl->r = r;
286 PANGO_OPENGL_RENDERER (renderer)->flags = flags; 273 gl->g = g;
274 gl->b = b;
275 gl->a = a;
276 gl->flags = flags;
287 277
278 glEnable (GL_TEXTURE_2D);
279 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
280 glEnable (GL_BLEND);
281 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
282 GL_ONE , GL_ONE_MINUS_SRC_ALPHA);
283 glEnable (GL_ALPHA_TEST);
284 glAlphaFunc (GL_GREATER, 0.01f);
285
288 pango_renderer_draw_layout (renderer, layout, x, y); 286 pango_renderer_draw_layout (renderer, layout, x, y);
287
288 rc_draw (gl->rc);
289
290 glDisable (GL_ALPHA_TEST);
291 glDisable (GL_BLEND);
292 glDisable (GL_TEXTURE_2D);
293
294 rc_free (gl->rc);
289} 295}
290 296
291void 297void
292pango_opengl_render_layout (PangoLayout *layout, 298pango_opengl_render_layout (PangoLayout *layout,
293 int x, int y, 299 int x, int y,
298} 304}
299 305
300static void 306static void
301pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 307pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
302{ 308{
309 memset (&renderer->key, 0, sizeof (rc_key_t));
310
303 renderer->r = 1.; 311 renderer->r = 1.;
304 renderer->g = 1.; 312 renderer->g = 1.;
305 renderer->b = 1.; 313 renderer->b = 1.;
306 renderer->a = 1.; 314 renderer->a = 1.;
307} 315}
308 316
309static void 317static void
310prepare_run (PangoRenderer *renderer, PangoLayoutRun *run) 318prepare_run (PangoRenderer *renderer, PangoLayoutRun *run)
311{ 319{
312 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer; 320 PangoOpenGLRenderer *gl = (PangoOpenGLRenderer *)renderer;
313 PangoColor *fg = 0; 321 PangoColor *fg = 0;
314 GSList *l; 322 GSList *l;
315 unsigned char r, g, b, a; 323 unsigned char r, g, b, a;
316 324
317 renderer->underline = PANGO_UNDERLINE_NONE; 325 renderer->underline = PANGO_UNDERLINE_NONE;
318 renderer->strikethrough = FALSE; 326 renderer->strikethrough = FALSE;
327
328 gl->key.mode = GL_QUADS;
329 gl->key.format = GL_T2F_V3F;
330 gl->key.texname = 0;
319 331
320 for (l = run->item->analysis.extra_attrs; l; l = l->next) 332 for (l = run->item->analysis.extra_attrs; l; l = l->next)
321 { 333 {
322 PangoAttribute *attr = l->data; 334 PangoAttribute *attr = l->data;
323 335
346 g = fg->green * (255.f / 65535.f); 358 g = fg->green * (255.f / 65535.f);
347 b = fg->blue * (255.f / 65535.f); 359 b = fg->blue * (255.f / 65535.f);
348 } 360 }
349 else 361 else
350 { 362 {
351 r = glrenderer->r * 255.f; 363 r = gl->r * 255.f;
352 g = glrenderer->g * 255.f; 364 g = gl->g * 255.f;
353 b = glrenderer->b * 255.f; 365 b = gl->b * 255.f;
354 } 366 }
355 367
356 a = glrenderer->a * 255.f; 368 a = gl->a * 255.f;
357 369
358 if (glrenderer->flags & FLAG_INVERSE) 370 if (gl->flags & FLAG_INVERSE)
359 { 371 {
360 r ^= 0xffU; 372 r ^= 0xffU;
361 g ^= 0xffU; 373 g ^= 0xffU;
362 b ^= 0xffU; 374 b ^= 0xffU;
363 } 375 }
364 376
365 glColor4ub (r, g, b, a); 377 gl->key.r = r;
378 gl->key.g = g;
379 gl->key.b = b;
380 gl->key.a = a;
366} 381}
367 382
368static void 383static void
369draw_begin (PangoRenderer *renderer_) 384draw_begin (PangoRenderer *renderer_)
370{ 385{
371 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 386 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
372
373 renderer->curtex = 0;
374
375 glEnable (GL_TEXTURE_2D);
376 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
377 glEnable (GL_BLEND);
378 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
379 GL_ONE , GL_ONE_MINUS_SRC_ALPHA);
380 glEnable (GL_ALPHA_TEST);
381 glAlphaFunc (GL_GREATER, 0.01f);
382} 387}
383 388
384static void 389static void
385draw_end (PangoRenderer *renderer_) 390draw_end (PangoRenderer *renderer_)
386{ 391{
387 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 392 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
388
389 if (renderer->curtex)
390 glEnd ();
391
392 glDisable (GL_ALPHA_TEST);
393 glDisable (GL_BLEND);
394 glDisable (GL_TEXTURE_2D);
395} 393}
396 394
397static void 395static void
398pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass) 396pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass)
399{ 397{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines