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.7 by root, Sat Aug 11 11:28:03 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 (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 (x2, y1, x + g->tex.w, y , 0);
225 rc_t2f_v3f (x2, y2, x + g->tex.w, y + g->tex.h, 0);
226 rc_t2f_v3f (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,
244 key.format = GL_V2F; 235 key.format = GL_V2F;
245 key.texname = 0; 236 key.texname = 0;
246 237
247 arr = rc_array (renderer->rc, &key); 238 arr = rc_array (renderer->rc, &key);
248 239
249 rc_v2f (x11, y1); 240 rc_v2f (arr, x11, y1);
250 rc_v2f (x21, y1); 241 rc_v2f (arr, x21, y1);
251 rc_v2f (x22, y2); 242 rc_v2f (arr, x22, y2);
252 rc_v2f (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;
262 PangoFontMap *fontmap; 254 PangoFontMap *fontmap;
263 PangoRenderer *renderer; 255 PangoRenderer *renderer;
256 PangoOpenGLRenderer *gl;
264 257
265 context = pango_layout_get_context (layout); 258 context = pango_layout_get_context (layout);
266 fontmap = pango_context_get_font_map (context); 259 fontmap = pango_context_get_font_map (context);
267 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));
268
269 PANGO_OPENGL_RENDERER (renderer)->r = r; 261 gl = PANGO_OPENGL_RENDERER (renderer);
270 PANGO_OPENGL_RENDERER (renderer)->g = g; 262
271 PANGO_OPENGL_RENDERER (renderer)->b = b; 263 gl->rc = rc;
272 PANGO_OPENGL_RENDERER (renderer)->a = a; 264 gl->r = r;
273 PANGO_OPENGL_RENDERER (renderer)->flags = flags; 265 gl->g = g;
266 gl->b = b;
267 gl->a = a;
268 gl->flags = flags;
274 269
275 pango_renderer_draw_layout (renderer, layout, x, y); 270 pango_renderer_draw_layout (renderer, layout, x, y);
276} 271}
277 272
278void 273void
279pango_opengl_render_layout (PangoLayout *layout, 274pango_opengl_render_layout (PangoLayout *layout,
275 rc_t *rc,
280 int x, int y, 276 int x, int y,
281 float r, float g, float b, float a, 277 float r, float g, float b, float a,
282 int flags) 278 int flags)
283{ 279{
284 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 );
285} 283}
286 284
287static void 285static void
288pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 286pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
289{ 287{
296} 294}
297 295
298static void 296static void
299prepare_run (PangoRenderer *renderer, PangoLayoutRun *run) 297prepare_run (PangoRenderer *renderer, PangoLayoutRun *run)
300{ 298{
301 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer; 299 PangoOpenGLRenderer *gl = (PangoOpenGLRenderer *)renderer;
302 PangoColor *fg = 0; 300 PangoColor *fg = 0;
303 GSList *l; 301 GSList *l;
304 unsigned char r, g, b, a; 302 unsigned char r, g, b, a;
305 303
306 renderer->underline = PANGO_UNDERLINE_NONE; 304 renderer->underline = PANGO_UNDERLINE_NONE;
307 renderer->strikethrough = FALSE; 305 renderer->strikethrough = FALSE;
308 306
309 renderer->key.mode = GL_QUADS; 307 gl->key.mode = GL_QUADS;
310 renderer->key.format = GL_T2F_V2F; 308 gl->key.format = 0; // glyphs
311 renderer->key.texname = 0; 309 gl->key.texname = 0;
312 310
313 for (l = run->item->analysis.extra_attrs; l; l = l->next) 311 for (l = run->item->analysis.extra_attrs; l; l = l->next)
314 { 312 {
315 PangoAttribute *attr = l->data; 313 PangoAttribute *attr = l->data;
316 314
339 g = fg->green * (255.f / 65535.f); 337 g = fg->green * (255.f / 65535.f);
340 b = fg->blue * (255.f / 65535.f); 338 b = fg->blue * (255.f / 65535.f);
341 } 339 }
342 else 340 else
343 { 341 {
344 r = glrenderer->r * 255.f; 342 r = gl->r * 255.f;
345 g = glrenderer->g * 255.f; 343 g = gl->g * 255.f;
346 b = glrenderer->b * 255.f; 344 b = gl->b * 255.f;
347 } 345 }
348 346
349 a = glrenderer->a * 255.f; 347 a = gl->a * 255.f;
350 348
351 if (glrenderer->flags & FLAG_INVERSE) 349 if (gl->flags & FLAG_INVERSE)
352 { 350 {
353 r ^= 0xffU; 351 r ^= 0xffU;
354 g ^= 0xffU; 352 g ^= 0xffU;
355 b ^= 0xffU; 353 b ^= 0xffU;
356 } 354 }
357 355
358 renderer->key.r = r; 356 gl->key.r = r;
359 renderer->key.g = g; 357 gl->key.g = g;
360 renderer->key.b = b; 358 gl->key.b = b;
361 renderer->key.a = a; 359 gl->key.a = a;
362} 360}
363 361
364static void 362static void
365draw_begin (PangoRenderer *renderer_) 363draw_begin (PangoRenderer *renderer_)
366{ 364{
367 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 365 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
368
369 glEnable (GL_TEXTURE_2D);
370 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
371 glEnable (GL_BLEND);
372 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
373 GL_ONE , GL_ONE_MINUS_SRC_ALPHA);
374 glEnable (GL_ALPHA_TEST);
375 glAlphaFunc (GL_GREATER, 0.01f);
376} 366}
377 367
378static void 368static void
379draw_end (PangoRenderer *renderer_) 369draw_end (PangoRenderer *renderer_)
380{ 370{
381 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 371 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
382
383 rc_draw (renderer->rc);
384
385 glDisable (GL_ALPHA_TEST);
386 glDisable (GL_BLEND);
387 glDisable (GL_TEXTURE_2D);
388} 372}
389 373
390static void 374static void
391pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass) 375pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass)
392{ 376{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines