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.12 by root, Mon Aug 13 15:31:21 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
162static void 164static void
163draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y) 165draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y)
164{ 166{
165 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_); 167 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_);
166 glyph_info *g; 168 glyph_info *g;
167 float x1, y1, x2, y2;
168 169
169 if (glyph & PANGO_GLYPH_UNKNOWN_FLAG) 170 if (glyph & PANGO_GLYPH_UNKNOWN_FLAG)
170 { 171 {
171 glyph = pango_opengl_get_unknown_glyph (font); 172 glyph = pango_opengl_get_unknown_glyph (font);
172 173
188 g = g_slice_new (glyph_info); 189 g = g_slice_new (glyph_info);
189 190
190 _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info); 191 _pango_opengl_font_set_glyph_cache_destroy (font, (GDestroyNotify)free_glyph_info);
191 _pango_opengl_font_set_cache_glyph_data (font, glyph, g); 192 _pango_opengl_font_set_cache_glyph_data (font, glyph, g);
192 } 193 }
193
194 if (renderer->curtex)
195 glEnd ();
196 194
197 tc_get (&g->tex, bm.width, bm.height); 195 tc_get (&g->tex, bm.width, bm.height);
198 196
199 g->left = bm.left; 197 g->left = bm.left;
200 g->top = bm.top; 198 g->top = bm.top;
203 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride); 201 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride);
204 glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 202 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); 203 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); 204 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
207 glPixelStorei (GL_UNPACK_ALIGNMENT, 4); 205 glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
208
209 renderer->curtex = g->tex.name;
210 glBegin (GL_QUADS);
211 } 206 }
212 207
213 x += g->left; 208 x += g->left;
214 y -= g->top; 209 y -= g->top;
215 210
216 x1 = g->tex.x * (1. / TC_WIDTH );
217 y1 = g->tex.y * (1. / TC_HEIGHT);
218 x2 = g->tex.w * (1. / TC_WIDTH ) + x1;
219 y2 = g->tex.h * (1. / TC_HEIGHT) + y1;
220
221 if (g->tex.name != renderer->curtex) 211 if (g->tex.name != renderer->key.texname)
222 { 212 {
223 if (renderer->curtex)
224 glEnd ();
225
226 glBindTexture (GL_TEXTURE_2D, g->tex.name);
227 renderer->curtex = g->tex.name; 213 renderer->key.texname = g->tex.name;
228 214 renderer->arr = rc_array (renderer->rc, &renderer->key);
229 glBegin (GL_QUADS);
230 } 215 }
231 216
232 glTexCoord2f (x1, y1); glVertex2i (x , y ); 217 rc_glyph (renderer->arr, g->tex.x, g->tex.y, g->tex.w, g->tex.h, x, y);
233 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y );
234 glTexCoord2f (x2, y2); glVertex2i (x + g->tex.w, y + g->tex.h);
235 glTexCoord2f (x1, y2); glVertex2i (x , y + g->tex.h);
236} 218}
237 219
238static void 220static void
239draw_trapezoid (PangoRenderer *renderer_, 221draw_trapezoid (PangoRenderer *renderer_,
240 PangoRenderPart part, 222 PangoRenderPart part,
244 double y2, 226 double y2,
245 double x12, 227 double x12,
246 double x22) 228 double x22)
247{ 229{
248 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 230 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
231 rc_key_t key = renderer->key;
232 rc_array_t *arr;
249 233
250 if (renderer->curtex) 234 key.mode = GL_QUADS;
251 { 235 key.format = GL_V2F;
252 glEnd (); 236 key.texname = 0;
253 renderer->curtex = 0;
254 }
255 237
256 glDisable (GL_TEXTURE_2D); 238 arr = rc_array (renderer->rc, &key);
257 239
258 glBegin (GL_QUADS); 240 rc_v2f (arr, x11, y1);
259 glVertex2d (x11, y1); 241 rc_v2f (arr, x21, y1);
260 glVertex2d (x21, y1); 242 rc_v2f (arr, x22, y2);
261 glVertex2d (x22, y2); 243 rc_v2f (arr, x12, y2);
262 glVertex2d (x12, y2);
263 glEnd ();
264
265 glEnable (GL_TEXTURE_2D);
266} 244}
267 245
268void 246void
269pango_opengl_render_layout_subpixel (PangoLayout *layout, 247pango_opengl_render_layout_subpixel (PangoLayout *layout,
248 rc_t *rc,
270 int x, int y, 249 int x, int y,
271 float r, float g, float b, float a, 250 float r, float g, float b, float a,
272 int flags) 251 int flags)
273{ 252{
274 PangoContext *context; 253 PangoContext *context;
275 PangoFontMap *fontmap; 254 PangoFontMap *fontmap;
276 PangoRenderer *renderer; 255 PangoRenderer *renderer;
256 PangoOpenGLRenderer *gl;
277 257
278 context = pango_layout_get_context (layout); 258 context = pango_layout_get_context (layout);
279 fontmap = pango_context_get_font_map (context); 259 fontmap = pango_context_get_font_map (context);
280 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));
281
282 PANGO_OPENGL_RENDERER (renderer)->r = r; 261 gl = PANGO_OPENGL_RENDERER (renderer);
283 PANGO_OPENGL_RENDERER (renderer)->g = g; 262
284 PANGO_OPENGL_RENDERER (renderer)->b = b; 263 gl->rc = rc;
285 PANGO_OPENGL_RENDERER (renderer)->a = a; 264 gl->r = r;
286 PANGO_OPENGL_RENDERER (renderer)->flags = flags; 265 gl->g = g;
266 gl->b = b;
267 gl->a = a;
268 gl->flags = flags;
287 269
288 pango_renderer_draw_layout (renderer, layout, x, y); 270 pango_renderer_draw_layout (renderer, layout, x, y);
289} 271}
290 272
291void 273void
292pango_opengl_render_layout (PangoLayout *layout, 274pango_opengl_render_layout (PangoLayout *layout,
275 rc_t *rc,
293 int x, int y, 276 int x, int y,
294 float r, float g, float b, float a, 277 float r, float g, float b, float a,
295 int flags) 278 int flags)
296{ 279{
297 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 );
298} 283}
299 284
300static void 285static void
301pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 286pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
302{ 287{
288 memset (&renderer->key, 0, sizeof (rc_key_t));
289
303 renderer->r = 1.; 290 renderer->r = 1.;
304 renderer->g = 1.; 291 renderer->g = 1.;
305 renderer->b = 1.; 292 renderer->b = 1.;
306 renderer->a = 1.; 293 renderer->a = 1.;
307} 294}
308 295
309static void 296static void
310prepare_run (PangoRenderer *renderer, PangoLayoutRun *run) 297prepare_run (PangoRenderer *renderer, PangoLayoutRun *run)
311{ 298{
312 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer; 299 PangoOpenGLRenderer *gl = (PangoOpenGLRenderer *)renderer;
313 PangoColor *fg = 0; 300 PangoColor *fg = 0;
314 GSList *l; 301 GSList *l;
315 unsigned char r, g, b, a; 302 unsigned char r, g, b, a;
316 303
317 renderer->underline = PANGO_UNDERLINE_NONE; 304 renderer->underline = PANGO_UNDERLINE_NONE;
318 renderer->strikethrough = FALSE; 305 renderer->strikethrough = FALSE;
306
307 gl->key.mode = GL_QUADS;
308 gl->key.format = 0; // glyphs
309 gl->key.texname = 0;
319 310
320 for (l = run->item->analysis.extra_attrs; l; l = l->next) 311 for (l = run->item->analysis.extra_attrs; l; l = l->next)
321 { 312 {
322 PangoAttribute *attr = l->data; 313 PangoAttribute *attr = l->data;
323 314
346 g = fg->green * (255.f / 65535.f); 337 g = fg->green * (255.f / 65535.f);
347 b = fg->blue * (255.f / 65535.f); 338 b = fg->blue * (255.f / 65535.f);
348 } 339 }
349 else 340 else
350 { 341 {
351 r = glrenderer->r * 255.f; 342 r = gl->r * 255.f;
352 g = glrenderer->g * 255.f; 343 g = gl->g * 255.f;
353 b = glrenderer->b * 255.f; 344 b = gl->b * 255.f;
354 } 345 }
355 346
356 a = glrenderer->a * 255.f; 347 a = gl->a * 255.f;
357 348
358 if (glrenderer->flags & FLAG_INVERSE) 349 if (gl->flags & FLAG_INVERSE)
359 { 350 {
360 r ^= 0xffU; 351 r ^= 0xffU;
361 g ^= 0xffU; 352 g ^= 0xffU;
362 b ^= 0xffU; 353 b ^= 0xffU;
363 } 354 }
364 355
365 glColor4ub (r, g, b, a); 356 gl->key.r = r;
357 gl->key.g = g;
358 gl->key.b = b;
359 gl->key.a = a;
366} 360}
367 361
368static void 362static void
369draw_begin (PangoRenderer *renderer_) 363draw_begin (PangoRenderer *renderer_)
370{ 364{
371 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 365 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} 366}
383 367
384static void 368static void
385draw_end (PangoRenderer *renderer_) 369draw_end (PangoRenderer *renderer_)
386{ 370{
387 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 371 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} 372}
396 373
397static void 374static void
398pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass) 375pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass)
399{ 376{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines