rendered paste body
module Font;
private import tango.io.Stdout;
private import derelict.opengl.gl;
private import derelict.sdl.sdl;
private import derelict.sdl.image;
private import Resource;
private import Image;
private import Model;
class Font : Resource
{
GLuint texture;
Point2D[][] uv;
//----------------------------
~this()
{
};
int load(char[] filename )
{
Stdout("Creating Font " ~filename~ "... \n");
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
Image texImage = new Image;
if ( texImage.load( filename ) )
{
glTexImage2D(GL_TEXTURE_2D, 0, texImage.iformat, texImage.w, texImage.h, 0, texImage.format, GL_UNSIGNED_BYTE, texImage.surface.pixels);
int letteramount = 15;
int maxlettersizex = cast(int)texImage.w/15;
int maxlettersizey = cast(int)texImage.h/15;
int letterstartxl = 0;
int letterstartxr = texImage.w;
int changed = 0;
Uint32 p = 0;
for (int y=0; y < letteramount; y++)
{
for (int x=0; x < letteramount; x++)
{
for (int x2=x*maxlettersizex; x2 < (x+1)*maxlettersizex; x2++)
{
for (int y2=y*maxlettersizey; y2 < (y+1)*maxlettersizey; y2++)
{
p = get_pixel(texImage.surface, 0, 0);
if (p!=0)
{
changed=1;
letterstartxl = x2; // -1?
y2 = texImage.h;
x2 = texImage.w;
};
};
};
for (int x2=(x+1)*maxlettersizex; x2 > x*maxlettersizex; x2--)
{
for (int y2=(y+1)*maxlettersizey; y2 > y*maxlettersizey; y2--)
{
p = get_pixel(texImage.surface, 0, 0);
if (p!=0)
{
changed=1;
letterstartxr = x2; // +1?
y2 = 0;
x2 = 0;
};
};
};
uv ~= new Point2D[1];
uv[uv.length-1] ~= new Point2D[4];
for (int i=0; i < uv[uv.length-1].length; i++)
uv[uv.length-1][i] = new Point2D();
uv[0][0].x = cast(float) letterstartxl;
uv[uv.length-1][0].y = y;
uv[uv.length-1][1].x = cast(float) letterstartxr;
uv[uv.length-1][1].y = y *maxlettersizey;
uv[uv.length-1][2].x = cast(float) letterstartxr;
uv[uv.length-1][2].y = (y+1) *maxlettersizey;
uv[uv.length-1][3].x = cast(float) letterstartxl;
uv[uv.length-1][3].y = (y+1) *maxlettersizey;
};
};
delete texImage;
Stdout("succesful\n\n");
}
else
{
delete texImage;
Stdout("error\n\n");
return 0;
};
return 0;
};
Uint32 get_pixel(SDL_Surface *surface, int x, int y)
{
int bpp = surface.format.BytesPerPixel;
Uint8 *p = cast(Uint8 *)surface.pixels + y * surface.pitch + x * bpp;
switch(bpp) {
case 1:
return *p;
case 2:
return *cast(Uint16 *)p;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;
case 4:
return *cast(Uint32 *)p;
default:
break;
}
return 0;
}
};