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.16 by root, Thu Nov 26 07:19:11 2009 UTC

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 char *apple_nvidia_bug_buf;
165
166static void
167apple_nvidia_bug (int enable)
168{
169 g_slice_free1 (TC_WIDTH * TC_HEIGHT, apple_nvidia_bug_buf);
170 apple_nvidia_bug_buf = enable ? g_slice_alloc (TC_WIDTH * TC_HEIGHT) : 0;
171}
172
173static void
174tex_update (int name, int x, int y, int w, int stride, int h, void *bm)
175{
176 glBindTexture (GL_TEXTURE_2D, name);
177
178 if (!apple_nvidia_bug_buf)
179 {
180 glPixelStorei (GL_UNPACK_ROW_LENGTH, stride);
181 glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
182 glTexSubImage2D (GL_TEXTURE_2D, 0, x, y, w, h, GL_ALPHA, GL_UNSIGNED_BYTE, bm);
183 glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
184 glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
185 }
186 else
187 {
188 /* starting with 10.5.5 (or 10.5.6), pple's nvidia driver corrupts textures */
189 /* when glTexSubImage is used, so do it the horribly slow way, */
190 /* reading/patching/uploading the full texture one each change */
191 int r;
192
193 glGetTexImage (GL_TEXTURE_2D, 0, GL_ALPHA, GL_UNSIGNED_BYTE, apple_nvidia_bug_buf);
194
195 for (r = 0; r < h; ++r)
196 memcpy ((char *)apple_nvidia_bug_buf + (y + r) * TC_WIDTH + x, (char *)bm + r * stride, w);
197
198 glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, TC_WIDTH, TC_HEIGHT, 0, GL_ALPHA, GL_UNSIGNED_BYTE, apple_nvidia_bug_buf);
199 }
200}
201
164static void 202static void
165draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y) 203draw_glyph (PangoRenderer *renderer_, PangoFont *font, PangoGlyph glyph, double x, double y)
166{ 204{
167 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_); 205 PangoOpenGLRenderer *renderer = PANGO_OPENGL_RENDERER (renderer_);
168 glyph_info *g; 206 glyph_info *g;
196 g->top = bm.top; 234 g->top = bm.top;
197 235
198 tc_get (&g->tex, bm.width, bm.height); 236 tc_get (&g->tex, bm.width, bm.height);
199 237
200 if (bm.width && bm.height) 238 if (bm.width && bm.height)
201 { 239 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 } 240 }
210 241
211 x += g->left; 242 x += g->left;
212 y -= g->top; 243 y -= g->top;
213 244

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines