All pastes #457751 Raw Edit

Something

public text v1 · immutable
#457751 ·published 2007-04-25 15:25 UTC
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;
    }


};