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.8 by root, Sat Aug 11 11:32:29 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
288 pango_renderer_draw_layout (renderer, layout, x, y); 278 pango_renderer_draw_layout (renderer, layout, x, y);
279
280 rc_free (gl->rc);
289} 281}
290 282
291void 283void
292pango_opengl_render_layout (PangoLayout *layout, 284pango_opengl_render_layout (PangoLayout *layout,
293 int x, int y, 285 int x, int y,
298} 290}
299 291
300static void 292static void
301pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 293pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
302{ 294{
295 memset (&renderer->key, 0, sizeof (rc_key_t));
296
303 renderer->r = 1.; 297 renderer->r = 1.;
304 renderer->g = 1.; 298 renderer->g = 1.;
305 renderer->b = 1.; 299 renderer->b = 1.;
306 renderer->a = 1.; 300 renderer->a = 1.;
307} 301}
314 GSList *l; 308 GSList *l;
315 unsigned char r, g, b, a; 309 unsigned char r, g, b, a;
316 310
317 renderer->underline = PANGO_UNDERLINE_NONE; 311 renderer->underline = PANGO_UNDERLINE_NONE;
318 renderer->strikethrough = FALSE; 312 renderer->strikethrough = FALSE;
313
314 glrenderer->key.mode = GL_QUADS;
315 glrenderer->key.format = GL_T2F_V3F;
316 glrenderer->key.texname = 0;
319 317
320 for (l = run->item->analysis.extra_attrs; l; l = l->next) 318 for (l = run->item->analysis.extra_attrs; l; l = l->next)
321 { 319 {
322 PangoAttribute *attr = l->data; 320 PangoAttribute *attr = l->data;
323 321
360 r ^= 0xffU; 358 r ^= 0xffU;
361 g ^= 0xffU; 359 g ^= 0xffU;
362 b ^= 0xffU; 360 b ^= 0xffU;
363 } 361 }
364 362
365 glColor4ub (r, g, b, a); 363 glrenderer->key.r = r;
364 glrenderer->key.g = g;
365 glrenderer->key.b = b;
366 glrenderer->key.a = a;
366} 367}
367 368
368static void 369static void
369draw_begin (PangoRenderer *renderer_) 370draw_begin (PangoRenderer *renderer_)
370{ 371{
371 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 372 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
372
373 renderer->curtex = 0;
374 373
375 glEnable (GL_TEXTURE_2D); 374 glEnable (GL_TEXTURE_2D);
376 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 375 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
377 glEnable (GL_BLEND); 376 glEnable (GL_BLEND);
378 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 377 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
384static void 383static void
385draw_end (PangoRenderer *renderer_) 384draw_end (PangoRenderer *renderer_)
386{ 385{
387 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 386 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
388 387
389 if (renderer->curtex) 388 rc_draw (renderer->rc);
390 glEnd ();
391 389
392 glDisable (GL_ALPHA_TEST); 390 glDisable (GL_ALPHA_TEST);
393 glDisable (GL_BLEND); 391 glDisable (GL_BLEND);
394 glDisable (GL_TEXTURE_2D); 392 glDisable (GL_TEXTURE_2D);
395} 393}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines