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.15 by root, Sun Jan 13 08:31:45 2008 UTC vs.
Revision 1.19 by root, Sun Nov 18 00:52:22 2018 UTC

60 if (size > alloc) 60 if (size > alloc)
61 { 61 {
62 size = (size + 4095) & ~4095; 62 size = (size + 4095) & ~4095;
63 free (buffer); 63 free (buffer);
64 alloc = size; 64 alloc = size;
65 buffer = malloc (size); 65 buffer = (char *)malloc (size);
66 } 66 }
67 67
68 return buffer; 68 return buffer;
69} 69}
70 70
90 glyph->width = width; 90 glyph->width = width;
91 glyph->height = height; 91 glyph->height = height;
92 glyph->top = top; 92 glyph->top = top;
93 glyph->left = left; 93 glyph->left = left;
94 94
95 glyph->bitmap = temp_buffer (width * height); 95 glyph->bitmap = (uint8_t *)temp_buffer (width * height);
96 memset (glyph->bitmap, 0, glyph->stride * height); 96 memset (glyph->bitmap, 0, glyph->stride * height);
97 97
98 for (i = width; i--; ) 98 for (i = width; i--; )
99 glyph->bitmap [i] = glyph->bitmap [i + (height - 1) * glyph->stride] = 0xff; 99 glyph->bitmap [i] = glyph->bitmap [i + (height - 1) * glyph->stride] = 0xff;
100 100
159{ 159{
160 tc_put (&g->tex); 160 tc_put (&g->tex);
161 g_slice_free (glyph_info, g); 161 g_slice_free (glyph_info, g);
162} 162}
163 163
164static int apple_nvidia_bug_workaround;
165
166static void
167apple_nvidia_bug (int enable)
168{
169 apple_nvidia_bug_workaround = enable;
170}
171
172static void
173tex_update (int name, int x, int y, int w, int stride, int h, void *bm)
174{
175 glBindTexture (GL_TEXTURE_2D, name);
176
177 if (!apple_nvidia_bug_workaround)
178 {
179 glPixelStorei (GL_UNPACK_ROW_LENGTH, stride);
180 /*glPixelStorei (GL_UNPACK_ALIGNMENT, 1); expected cfplus default */
181 glTexSubImage2D (GL_TEXTURE_2D, 0, x, y, w, h, GL_ALPHA, GL_UNSIGNED_BYTE, bm);
182 /*glPixelStorei (GL_UNPACK_ALIGNMENT, 4);*/
183 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
184 }
185 else
186 {
187 /* starting with 10.5.5 (or 10.5.6), pple's nvidia driver corrupts textures */
188 /* when glTexSubImage is used, so do it the horribly slow way, */
189 /* reading/patching/uploading the full texture one each change */
190 int r;
191
192 glGetTexImage (GL_TEXTURE_2D, 0, GL_ALPHA, GL_UNSIGNED_BYTE, tc_temptile);
193
194 for (r = 0; r < h; ++r)
195 memcpy (tc_temptile + (y + r) * TC_WIDTH + x, (char *)bm + r * stride, w);
196
197 glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, TC_WIDTH, TC_HEIGHT, 0, GL_ALPHA, GL_UNSIGNED_BYTE, tc_temptile);
198 }
199}
200
164static void 201static void
165draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y) 202draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y)
166{ 203{
167 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_); 204 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_);
168 glyph_info *g; 205 glyph_info *g;
173 210
174 if (glyph == PANGO_GLYPH_EMPTY) 211 if (glyph == PANGO_GLYPH_EMPTY)
175 glyph = PANGO_GLYPH_UNKNOWN_FLAG; 212 glyph = PANGO_GLYPH_UNKNOWN_FLAG;
176 } 213 }
177 214
178 g = _pango_opengl_font_get_cache_glyph_data (font, glyph); 215 g = (glyph_info *)_pango_opengl_font_get_cache_glyph_data (font, glyph);
179 216
180 if (!g || g->generation != tc_generation) 217 if (!g || g->generation != tc_generation)
181 { 218 {
182 Glyph bm; 219 Glyph bm;
183 font_render_glyph (&bm, font, glyph); 220 font_render_glyph (&bm, font, glyph);
196 g->top = bm.top; 233 g->top = bm.top;
197 234
198 tc_get (&g->tex, bm.width, bm.height); 235 tc_get (&g->tex, bm.width, bm.height);
199 236
200 if (bm.width && bm.height) 237 if (bm.width && bm.height)
201 { 238 tex_update (g->tex.name, g->tex.x, g->tex.y, bm.width, bm.stride, bm.height, bm.bitmap);
202 glBindTexture (GL_TEXTURE_2D, g->tex.name);
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);
208 }
209 } 239 }
210 240
211 x += g->left; 241 x += g->left;
212 y -= g->top; 242 y -= g->top;
213 243
311 gl->key.format = 0; // glyphs 341 gl->key.format = 0; // glyphs
312 gl->key.texname = 0; 342 gl->key.texname = 0;
313 343
314 for (l = run->item->analysis.extra_attrs; l; l = l->next) 344 for (l = run->item->analysis.extra_attrs; l; l = l->next)
315 { 345 {
316 PangoAttribute *attr = l->data; 346 PangoAttribute *attr = (PangoAttribute *)l->data;
317 347
318 switch (attr->klass->type) 348 switch (attr->klass->type)
319 { 349 {
320 case PANGO_ATTR_UNDERLINE: 350 case PANGO_ATTR_UNDERLINE:
321 renderer->underline = ((PangoAttrInt *)attr)->value; 351 renderer->underline = (PangoUnderline)((PangoAttrInt *)attr)->value;
322 break; 352 break;
323 353
324 case PANGO_ATTR_STRIKETHROUGH: 354 case PANGO_ATTR_STRIKETHROUGH:
325 renderer->strikethrough = ((PangoAttrInt *)attr)->value; 355 renderer->strikethrough = ((PangoAttrInt *)attr)->value;
326 break; 356 break;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines