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; } };