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.7 by root, Sat Aug 11 11:28:03 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 (x1, y1, x , y , 0);
233 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y ); 224 rc_t2f_v3f (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 (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 (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 (x11, y1);
259 glVertex2d (x11, y1); 250 rc_v2f (x21, y1);
260 glVertex2d (x21, y1); 251 rc_v2f (x22, y2);
261 glVertex2d (x22, y2); 252 rc_v2f (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,
298} 285}
299 286
300static void 287static void
301pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 288pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
302{ 289{
290 memset (&renderer->key, 0, sizeof (rc_key_t));
291
303 renderer->r = 1.; 292 renderer->r = 1.;
304 renderer->g = 1.; 293 renderer->g = 1.;
305 renderer->b = 1.; 294 renderer->b = 1.;
306 renderer->a = 1.; 295 renderer->a = 1.;
307} 296}
314 GSList *l; 303 GSList *l;
315 unsigned char r, g, b, a; 304 unsigned char r, g, b, a;
316 305
317 renderer->underline = PANGO_UNDERLINE_NONE; 306 renderer->underline = PANGO_UNDERLINE_NONE;
318 renderer->strikethrough = FALSE; 307 renderer->strikethrough = FALSE;
308
309 renderer->key.mode = GL_QUADS;
310 renderer->key.format = GL_T2F_V2F;
311 renderer->key.texname = 0;
319 312
320 for (l = run->item->analysis.extra_attrs; l; l = l->next) 313 for (l = run->item->analysis.extra_attrs; l; l = l->next)
321 { 314 {
322 PangoAttribute *attr = l->data; 315 PangoAttribute *attr = l->data;
323 316
360 r ^= 0xffU; 353 r ^= 0xffU;
361 g ^= 0xffU; 354 g ^= 0xffU;
362 b ^= 0xffU; 355 b ^= 0xffU;
363 } 356 }
364 357
365 glColor4ub (r, g, b, a); 358 renderer->key.r = r;
359 renderer->key.g = g;
360 renderer->key.b = b;
361 renderer->key.a = a;
366} 362}
367 363
368static void 364static void
369draw_begin (PangoRenderer *renderer_) 365draw_begin (PangoRenderer *renderer_)
370{ 366{
371 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 367 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
372
373 renderer->curtex = 0;
374 368
375 glEnable (GL_TEXTURE_2D); 369 glEnable (GL_TEXTURE_2D);
376 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 370 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
377 glEnable (GL_BLEND); 371 glEnable (GL_BLEND);
378 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, 372 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
384static void 378static void
385draw_end (PangoRenderer *renderer_) 379draw_end (PangoRenderer *renderer_)
386{ 380{
387 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 381 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
388 382
389 if (renderer->curtex) 383 rc_draw (renderer->rc);
390 glEnd ();
391 384
392 glDisable (GL_ALPHA_TEST); 385 glDisable (GL_ALPHA_TEST);
393 glDisable (GL_BLEND); 386 glDisable (GL_BLEND);
394 glDisable (GL_TEXTURE_2D); 387 glDisable (GL_TEXTURE_2D);
395} 388}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines