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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines