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.3 by root, Tue Jul 4 23:56:34 2006 UTC vs.
Revision 1.15 by root, Sun Jan 13 08:31:45 2008 UTC

35 35
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 GLuint curtex; // current texture 40 int flags;
41 rc_t *rc; // rendercache
42 rc_key_t key; // current render key
43 rc_array_t *arr;
41}; 44};
42 45
43G_DEFINE_TYPE (PangoOpenGLRenderer, pango_opengl_renderer, PANGO_TYPE_RENDERER) 46G_DEFINE_TYPE (PangoOpenGLRenderer, pango_opengl_renderer, PANGO_TYPE_RENDERER)
44 47
45typedef struct 48typedef struct
161static void 164static void
162draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y) 165draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y)
163{ 166{
164 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_); 167 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_);
165 glyph_info *g; 168 glyph_info *g;
166 float x1, y1, x2, y2;
167 169
168 if (glyph & PANGO_GLYPH_UNKNOWN_FLAG) 170 if (glyph & PANGO_GLYPH_UNKNOWN_FLAG)
169 { 171 {
170 glyph = pango_opengl_get_unknown_glyph (font); 172 glyph = pango_opengl_get_unknown_glyph (font);
171 173
178 if (!g || g->generation != tc_generation) 180 if (!g || g->generation != tc_generation)
179 { 181 {
180 Glyph bm; 182 Glyph bm;
181 font_render_glyph (&bm, font, glyph); 183 font_render_glyph (&bm, font, glyph);
182 184
183 if (g) 185 if (!g)
184 g->generation = tc_generation;
185 else
186 { 186 {
187 g = g_slice_new (glyph_info); 187 g = g_slice_new (glyph_info);
188 188
189 _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);
190 _pango_opengl_font_set_cache_glyph_data (font, glyph, g); 190 _pango_opengl_font_set_cache_glyph_data (font, glyph, g);
191 } 191 }
192 192
193 tc_get (&g->tex, bm.width, bm.height); 193 g->generation = tc_generation;
194 194
195 g->left = bm.left; 195 g->left = bm.left;
196 g->top = bm.top; 196 g->top = bm.top;
197 197
198 if (renderer->curtex) 198 tc_get (&g->tex, bm.width, bm.height);
199
200 if (bm.width && bm.height)
199 { 201 {
200 glEnd (); 202 glBindTexture (GL_TEXTURE_2D, g->tex.name);
201 renderer->curtex = 0; 203 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride);
204 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);
206 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
207 glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
202 } 208 }
203
204 glBindTexture (GL_TEXTURE_2D, g->tex.name);
205 glPixelStorei (GL_UNPACK_ROW_LENGTH, bm.stride);
206 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
207 glTexSubImage2D (GL_TEXTURE_2D, 0, g->tex.x, g->tex.y, bm.width, bm.height, GL_ALPHA, GL_UNSIGNED_BYTE, bm.bitmap);
208 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
209 glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
210 } 209 }
211 210
212 x += g->left; 211 x += g->left;
213 y -= g->top; 212 y -= g->top;
214 213
215 x1 = g->tex.x * (1. / TC_WIDTH );
216 y1 = g->tex.y * (1. / TC_HEIGHT);
217 x2 = g->tex.w * (1. / TC_WIDTH ) + x1;
218 y2 = g->tex.h * (1. / TC_HEIGHT) + y1;
219
220 if (g->tex.name != renderer->curtex) 214 if (g->tex.name != renderer->key.texname)
221 { 215 {
222 if (renderer->curtex)
223 glEnd ();
224
225 glBindTexture (GL_TEXTURE_2D, g->tex.name);
226 renderer->curtex = g->tex.name; 216 renderer->key.texname = g->tex.name;
227 glBegin (GL_QUADS); 217 renderer->arr = rc_array (renderer->rc, &renderer->key);
228 } 218 }
229 219
230 glTexCoord2f (x1, y1); glVertex2i (x , y ); 220 rc_glyph (renderer->arr, g->tex.x, g->tex.y, g->tex.w, g->tex.h, x, y);
231 glTexCoord2f (x2, y1); glVertex2i (x + g->tex.w, y );
232 glTexCoord2f (x2, y2); glVertex2i (x + g->tex.w, y + g->tex.h);
233 glTexCoord2f (x1, y2); glVertex2i (x , y + g->tex.h);
234} 221}
235 222
236static void 223static void
237draw_trapezoid (PangoRenderer *renderer_, 224draw_trapezoid (PangoRenderer *renderer_,
238 PangoRenderPart part, 225 PangoRenderPart part,
242 double y2, 229 double y2,
243 double x12, 230 double x12,
244 double x22) 231 double x22)
245{ 232{
246 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 233 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
234 rc_key_t key = renderer->key;
235 rc_array_t *arr;
247 236
248 if (renderer->curtex) 237 key.mode = GL_QUADS;
249 { 238 key.format = GL_V2F;
250 glEnd (); 239 key.texname = 0;
251 renderer->curtex = 0;
252 }
253 240
254 glDisable (GL_TEXTURE_2D); 241 arr = rc_array (renderer->rc, &key);
255 242
256 glBegin (GL_QUADS); 243 rc_v2f (arr, x11, y1);
257 glVertex2d (x11, y1); 244 rc_v2f (arr, x21, y1);
258 glVertex2d (x12, y1); 245 rc_v2f (arr, x22, y2);
259 glVertex2d (x22, y2); 246 rc_v2f (arr, x12, y2);
260 glVertex2d (x21, y2);
261 glEnd ();
262
263 glEnable (GL_TEXTURE_2D);
264} 247}
265 248
266void 249void
267pango_opengl_render_layout_subpixel (PangoLayout *layout, 250pango_opengl_render_layout_subpixel (PangoLayout *layout,
251 rc_t *rc,
268 int x, int y, 252 int x, int y,
269 float r, float g, float b, float a) 253 float r, float g, float b, float a,
254 int flags)
270{ 255{
271 PangoContext *context; 256 PangoContext *context;
272 PangoFontMap *fontmap; 257 PangoFontMap *fontmap;
273 PangoRenderer *renderer; 258 PangoRenderer *renderer;
259 PangoOpenGLRenderer *gl;
274 260
275 context = pango_layout_get_context (layout); 261 context = pango_layout_get_context (layout);
276 fontmap = pango_context_get_font_map (context); 262 fontmap = pango_context_get_font_map (context);
277 renderer = _pango_opengl_font_map_get_renderer (PANGO_OPENGL_FONT_MAP (fontmap)); 263 renderer = _pango_opengl_font_map_get_renderer (PANGO_OPENGL_FONT_MAP (fontmap));
278
279 PANGO_OPENGL_RENDERER (renderer)->r = r; 264 gl = PANGO_OPENGL_RENDERER (renderer);
280 PANGO_OPENGL_RENDERER (renderer)->g = g; 265
281 PANGO_OPENGL_RENDERER (renderer)->b = b; 266 gl->rc = rc;
282 PANGO_OPENGL_RENDERER (renderer)->a = a; 267 gl->r = r;
268 gl->g = g;
269 gl->b = b;
270 gl->a = a;
271 gl->flags = flags;
283 272
284 pango_renderer_draw_layout (renderer, layout, x, y); 273 pango_renderer_draw_layout (renderer, layout, x, y);
285} 274}
286 275
287void 276void
288pango_opengl_render_layout (PangoLayout *layout, 277pango_opengl_render_layout (PangoLayout *layout,
278 rc_t *rc,
289 int x, int y, 279 int x, int y,
290 float r, float g, float b, float a) 280 float r, float g, float b, float a,
281 int flags)
291{ 282{
292 pango_opengl_render_layout_subpixel (layout, x * PANGO_SCALE, y * PANGO_SCALE, r, g, b, a); 283 pango_opengl_render_layout_subpixel (
284 layout, rc, x * PANGO_SCALE, y * PANGO_SCALE, r, g, b, a, flags
285 );
293} 286}
294 287
295static void 288static void
296pango_opengl_renderer_init (PangoOpenGLRenderer *renderer) 289pango_opengl_renderer_init (PangoOpenGLRenderer *renderer)
297{ 290{
291 memset (&renderer->key, 0, sizeof (rc_key_t));
292
298 renderer->r = 1.; 293 renderer->r = 1.;
299 renderer->g = 1.; 294 renderer->g = 1.;
300 renderer->b = 1.; 295 renderer->b = 1.;
301 renderer->a = 1.; 296 renderer->a = 1.;
302} 297}
303 298
304static void 299static void
305prepare_run (PangoRenderer *renderer, PangoLayoutRun *run) 300prepare_run (PangoRenderer *renderer, PangoLayoutRun *run)
306{ 301{
307 PangoOpenGLRenderer *glrenderer = (PangoOpenGLRenderer *)renderer; 302 PangoOpenGLRenderer *gl = (PangoOpenGLRenderer *)renderer;
308 PangoColor *fg = 0; 303 PangoColor *fg = 0;
309 GSList *l; 304 GSList *l;
305 unsigned char r, g, b, a;
310 306
311 renderer->underline = PANGO_UNDERLINE_NONE; 307 renderer->underline = PANGO_UNDERLINE_NONE;
312 renderer->strikethrough = FALSE; 308 renderer->strikethrough = FALSE;
309
310 gl->key.mode = GL_QUADS;
311 gl->key.format = 0; // glyphs
312 gl->key.texname = 0;
313 313
314 for (l = run->item->analysis.extra_attrs; l; l = l->next) 314 for (l = run->item->analysis.extra_attrs; l; l = l->next)
315 { 315 {
316 PangoAttribute *attr = l->data; 316 PangoAttribute *attr = l->data;
317 317
333 break; 333 break;
334 } 334 }
335 } 335 }
336 336
337 if (fg) 337 if (fg)
338 glColor4f (fg->red / 65535., fg->green / 65535., fg->blue / 65535., glrenderer->a); 338 {
339 r = fg->red * (255.f / 65535.f);
340 g = fg->green * (255.f / 65535.f);
341 b = fg->blue * (255.f / 65535.f);
342 }
339 else 343 else
340 glColor4f (glrenderer->r, glrenderer->g, glrenderer->b, glrenderer->a); 344 {
345 r = gl->r * 255.f;
346 g = gl->g * 255.f;
347 b = gl->b * 255.f;
348 }
349
350 a = gl->a * 255.f;
351
352 if (gl->flags & FLAG_INVERSE)
353 {
354 r ^= 0xffU;
355 g ^= 0xffU;
356 b ^= 0xffU;
357 }
358
359 gl->key.r = r;
360 gl->key.g = g;
361 gl->key.b = b;
362 gl->key.a = a;
341} 363}
342 364
343static void 365static void
344draw_begin (PangoRenderer *renderer_) 366draw_begin (PangoRenderer *renderer_)
345{ 367{
346 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 368 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
347
348 renderer->curtex = 0;
349
350 glEnable (GL_TEXTURE_2D);
351 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
352 glEnable (GL_BLEND);
353 gl_BlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
354 GL_ONE , GL_ONE_MINUS_SRC_ALPHA);
355 glEnable (GL_ALPHA_TEST);
356 glAlphaFunc (GL_GREATER, 0.01f);
357} 369}
358 370
359static void 371static void
360draw_end (PangoRenderer *renderer_) 372draw_end (PangoRenderer *renderer_)
361{ 373{
362 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_; 374 PangoOpenGLRenderer *renderer = (PangoOpenGLRenderer *)renderer_;
363
364 if (renderer->curtex)
365 glEnd ();
366
367 glDisable (GL_ALPHA_TEST);
368 glDisable (GL_BLEND);
369 glDisable (GL_TEXTURE_2D);
370} 375}
371 376
372static void 377static void
373pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass) 378pango_opengl_renderer_class_init (PangoOpenGLRendererClass *klass)
374{ 379{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines