172 |
return self; |
return self; |
173 |
} |
} |
174 |
|
|
175 |
static void |
static int inline |
176 |
_draw_bitmap (const FT_Bitmap *bitmap, FT_Int left, FT_Int top) |
_texture_size (int size) |
177 |
|
{ |
178 |
|
NSCParameterAssert (size > 0); |
179 |
|
|
180 |
|
int texture_size = 2; |
181 |
|
while (texture_size < size) |
182 |
|
texture_size = texture_size << 1; |
183 |
|
|
184 |
|
return texture_size; |
185 |
|
} |
186 |
|
|
187 |
|
static void inline |
188 |
|
_generate_texture (const FT_Bitmap *bitmap) |
189 |
{ |
{ |
190 |
NSCParameterAssert (bitmap); |
NSCParameterAssert (bitmap); |
191 |
NSCParameterAssert (bitmap->pixel_mode == FT_PIXEL_MODE_GRAY); |
NSCParameterAssert (bitmap->pixel_mode == FT_PIXEL_MODE_GRAY); |
192 |
NSCParameterAssert (bitmap->num_grays == 256); |
NSCParameterAssert (bitmap->num_grays == 256); |
193 |
NSCParameterAssert (bitmap->palette_mode == 0); |
NSCParameterAssert (bitmap->palette_mode == 0); |
194 |
|
NSCParameterAssert (bitmap->width == bitmap->pitch); /* FIXME */ |
195 |
|
|
196 |
glPixelStorei (GL_UNPACK_ALIGNMENT, 1); |
glPixelStorei (GL_UNPACK_ALIGNMENT, 1); |
197 |
|
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
198 |
|
|
199 |
|
glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, |
200 |
|
_texture_size (bitmap->width), |
201 |
|
_texture_size (bitmap->rows), 0, |
202 |
|
GL_ALPHA, GL_UNSIGNED_BYTE, NULL); |
203 |
|
|
204 |
|
glTexSubImage2D (GL_TEXTURE_2D, 0, |
205 |
|
0, 0, bitmap->width, bitmap->rows, |
206 |
|
GL_ALPHA, GL_UNSIGNED_BYTE, bitmap->buffer); |
207 |
|
} |
208 |
|
|
209 |
GLubyte flipped_bitmap[bitmap->width * bitmap->rows]; |
static void inline |
210 |
int row; |
_draw_bitmap (const FT_Bitmap *bitmap, FT_Int left, FT_Int top) |
211 |
for (row = 0; row < bitmap->rows; row++) |
{ |
212 |
{ |
NSCParameterAssert (bitmap); |
213 |
memcpy (&flipped_bitmap[(bitmap->rows - row - 1) * bitmap->width], |
|
214 |
&bitmap->buffer[row * bitmap->pitch], |
_generate_texture (bitmap); |
215 |
bitmap->width * sizeof (GLubyte)); |
|
216 |
} |
glPushMatrix(); |
217 |
|
glTranslatef (left, top, 0); |
218 |
|
|
|
glEnable (GL_BLEND); |
|
219 |
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
220 |
glRasterPos2i (left, top); |
glEnable (GL_TEXTURE_2D); |
221 |
glDrawPixels (bitmap->width, bitmap->rows, |
glEnable (GL_BLEND); |
222 |
GL_ALPHA, GL_UNSIGNED_BYTE, flipped_bitmap); |
|
223 |
|
double x_ratio = (double)bitmap->width/ (double)_texture_size(bitmap->width); |
224 |
|
double y_ratio = (double)bitmap->rows / (double)_texture_size(bitmap->rows); |
225 |
|
|
226 |
|
glBegin (GL_POLYGON); |
227 |
|
glTexCoord2f (0.0, y_ratio); glVertex2f (0.0, 0.0); |
228 |
|
glTexCoord2f (x_ratio, y_ratio); glVertex2f (bitmap->width, 0.0); |
229 |
|
glTexCoord2f (x_ratio, 0.0); glVertex2f (bitmap->width, bitmap->rows); |
230 |
|
glTexCoord2f (0.0, 0.0); glVertex2f (0.0, bitmap->rows); |
231 |
|
glEnd (); |
232 |
|
|
233 |
glDisable (GL_BLEND); |
glDisable (GL_BLEND); |
234 |
|
glDisable (GL_TEXTURE_2D); |
235 |
|
|
236 |
|
glPopMatrix(); |
237 |
} |
} |
238 |
|
|
239 |
|
|