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.8 by root, Sat Aug 11 11:32:29 2007 UTC vs.
Revision 1.12 by root, Mon Aug 13 15:31:21 2007 UTC

164static void 164static void
165draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y) 165draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y)
166{ 166{
167 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_); 167 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_);
168 glyph_info *g; 168 glyph_info *g;
169 float x1, y1, x2, y2;
170 169
171 if (glyph & PANGO_GLYPH_UNKNOWN_FLAG) 170 if (glyph & PANGO_GLYPH_UNKNOWN_FLAG)
172 { 171 {
173 glyph = pango_opengl_get_unknown_glyph (font); 172 glyph = pango_opengl_get_unknown_glyph (font);
174 173
207 } 206 }
208 207
209 x += g->left; 208 x += g->left;
210 y -= g->top; 209 y -= g->top;
211 210
212 x1 = g->tex.x * (1. / TC_WIDTH );
213 y1 = g->tex.y * (1. / TC_HEIGHT);
214 x2 = g->tex.w * (1. / TC_WIDTH ) + x1;
215 y2 = g->tex.h * (1. / TC_HEIGHT) + y1;
216
217 if (g->tex.name != renderer->key.texname) 211 if (g->tex.name != renderer->key.texname)
218 { 212 {
219 renderer->key.texname = g->tex.name; 213 renderer->key.texname = g->tex.name;
220 renderer->arr = rc_array (renderer->rc, &renderer->key); 214 renderer->arr = rc_array (renderer->rc, &renderer->key);
221 } 215 }
222 216
223 rc_t2f_v3f (renderer->arr, x1, y1, x , y , 0); 217 rc_glyph (renderer->arr, g->tex.x, g->tex.y, g->tex.w, g->tex.h, x, y);
224 rc_t2f_v3f (renderer->arr, x2, y1, x + g->tex.w, y , 0);
225 rc_t2f_v3f (renderer->arr, x2, y2, x + g->tex.w, y + g->tex.h, 0);
226 rc_t2f_v3f (renderer->arr, x1, y2, x , y + g->tex.h, 0);
227} 218}
228 219
229static void 220static void
230draw_trapezoid (PangoRenderer *renderer_, 221draw_trapezoid (PangoRenderer *renderer_,
231 PangoRenderPart part, 222 PangoRenderPart part,
252 rc_v2f (arr, x12, y2); 243 rc_v2f (arr, x12, y2);
253} 244}
254 245
255void 246void
256pango_opengl_render_layout_subpixel (PangoLayout *layout, 247pango_opengl_render_layout_subpixel (PangoLayout *layout,
248 rc_t *rc,
257 int x, int y, 249 int x, int y,
258 float r, float g, float b, float a, 250 float r, float g, float b, float a,
259 int flags) 251 int flags)
260{ 252{
261 PangoContext *context; 253 PangoContext *context;
266 context = pango_layout_get_context (layout); 258 context = pango_layout_get_context (layout);
267 fontmap = pango_context_get_font_map (context); 259 fontmap = pango_context_get_font_map (context);
268 renderer = _pango_opengl_font_map_get_renderer (PANGO_OPENGL_FONT_MAP (fontmap)); 260 renderer = _pango_opengl_font_map_get_renderer (PANGO_OPENGL_FONT_MAP (fontmap));
269 gl = PANGO_OPENGL_RENDERER (renderer); 261 gl = PANGO_OPENGL_RENDERER (renderer);
270 262
271 gl->rc = rc_alloc (); 263 gl->rc = rc;
272 gl->r = r; 264 gl->r = r;
273 gl->g = g; 265 gl->g = g;
274 gl->b = b; 266 gl->b = b;
275 gl->a = a; 267 gl->a = a;
276 gl->flags = flags; 268 gl->flags = flags;
277 269
278 pango_renderer_draw_layout (renderer, layout, x, y); 270 pango_renderer_draw_layout (renderer, layout, x, y);
279
280 rc_free (gl->rc);
281} 271}
282 272
283void 273void
284pango_opengl_render_layout (PangoLayout *layout, 274pango_opengl_render_layout (PangoLayout *layout,
275 rc_t *rc,
285 int x, int y, 276 int x, int y,
286 float r, float g, float b, float a, 277 float r, float g, float b, float a,
287 int flags) 278 int flags)
288{ 279{
289 pango_opengl_render_layout_subpixel (layout, x * PANGO_SCALE, y * PANGO_SCALE, r, g, b, a, flags); 280 pango_opengl_render_layout_subpixel (
281 layout, rc, x * PANGO_SCALE, y * PANGO_SCALE, r, g, b, a, flags
282 );
290} 283}
291 284
292static void 285static void
293pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 286pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
294{ 287{
301} 294}
302 295
303static void 296static void
304prepare_run (PangoRenderer *renderer, PangoLayoutRun *run) 297prepare_run (PangoRenderer *renderer, PangoLayoutRun *run)
305{ 298{
306 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer; 299 PangoOpenGLRenderer *gl = (PangoOpenGLRenderer *)renderer;
307 PangoColor *fg = 0; 300 PangoColor *fg = 0;
308 GSList *l; 301 GSList *l;
309 unsigned char r, g, b, a; 302 unsigned char r, g, b, a;
310 303
311 renderer->underline = PANGO_UNDERLINE_NONE; 304 renderer->underline = PANGO_UNDERLINE_NONE;
312 renderer->strikethrough = FALSE; 305 renderer->strikethrough = FALSE;
313 306
314 glrenderer->key.mode = GL_QUADS; 307 gl->key.mode = GL_QUADS;
315 glrenderer->key.format = GL_T2F_V3F; 308 gl->key.format = 0; // glyphs
316 glrenderer->key.texname = 0; 309 gl->key.texname = 0;
317 310
318 for (l = run->item->analysis.extra_attrs; l; l = l->next) 311 for (l = run->item->analysis.extra_attrs; l; l = l->next)
319 { 312 {
320 PangoAttribute *attr = l->data; 313 PangoAttribute *attr = l->data;
321 314
344 g = fg->green * (255.f / 65535.f); 337 g = fg->green * (255.f / 65535.f);
345 b = fg->blue * (255.f / 65535.f); 338 b = fg->blue * (255.f / 65535.f);
346 } 339 }
347 else 340 else
348 { 341 {
349 r = glrenderer->r * 255.f; 342 r = gl->r * 255.f;
350 g = glrenderer->g * 255.f; 343 g = gl->g * 255.f;
351 b = glrenderer->b * 255.f; 344 b = gl->b * 255.f;
352 } 345 }
353 346
354 a = glrenderer->a * 255.f; 347 a = gl->a * 255.f;
355 348
356 if (glrenderer->flags & FLAG_INVERSE) 349 if (gl->flags & FLAG_INVERSE)
357 { 350 {
358 r ^= 0xffU; 351 r ^= 0xffU;
359 g ^= 0xffU; 352 g ^= 0xffU;
360 b ^= 0xffU; 353 b ^= 0xffU;
361 } 354 }
362 355
363 glrenderer->key.r = r; 356 gl->key.r = r;
364 glrenderer->key.g = g; 357 gl->key.g = g;
365 glrenderer->key.b = b; 358 gl->key.b = b;
366 glrenderer->key.a = a; 359 gl->key.a = a;
367} 360}
368 361
369static void 362static void
370draw_begin (PangoRenderer *renderer_) 363draw_begin (PangoRenderer *renderer_)
371{ 364{
372 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 365 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
373
374 glEnable (GL_TEXTURE_2D);
375 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
376 glEnable (GL_BLEND);
377 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
378 GL_ONE , GL_ONE_MINUS_SRC_ALPHA);
379 glEnable (GL_ALPHA_TEST);
380 glAlphaFunc (GL_GREATER, 0.01f);
381} 366}
382 367
383static void 368static void
384draw_end (PangoRenderer *renderer_) 369draw_end (PangoRenderer *renderer_)
385{ 370{
386 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 371 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
387
388 rc_draw (renderer->rc);
389
390 glDisable (GL_ALPHA_TEST);
391 glDisable (GL_BLEND);
392 glDisable (GL_TEXTURE_2D);
393} 372}
394 373
395static void 374static void
396pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass) 375pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass)
397{ 376{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines