Пример #1
0
Файл: font.c Проект: FrMo/gravit
int loadFonts() {

    TTF_Font		*font = NULL;
    SDL_Surface		*fontSurface = NULL;
    SDL_Surface		*tmp = NULL;
    Uint32 saved_flags;
    Uint8  saved_alpha;
    static SDL_Color fontColour = {255,255,255};
    char letter[2];
    int i;
    char *p;

    letter[1] = 0;

    p = findFile(va("%s/%s", MISCDIR, video.fontFile));
    
    if (!p) {
        conAdd(LERR, "Could not open font");
        return 0;
    }

    font = TTF_OpenFont(p, video.fontSize);

    if (!font) {
        conAdd(LERR, "Could not open %s", p);
        return 0;
    }

    TTF_SetFontStyle(font, TTF_STYLE_NORMAL);
#ifdef TTF_HINTING_NORMAL
    TTF_SetFontHinting(font, TTF_HINTING_NORMAL);
#endif

    memset(fonts, 0, sizeof(fonts));
    fontHeight = 0;

    for (i = 32; i < 128; i++) {

        letter[0] = i;

        fontSurface = TTF_RenderText_Blended(font, letter, fontColour);

        if (!fontSurface) {

#ifdef WIN32
            MessageBox(NULL, TTF_GetError(), "gravit: font engine error", MB_OK);
#else
            printf("%s\n", TTF_GetError());
#endif
            TTF_CloseFont(font);
            return 0;

        }

        fonts[i].ow = fontSurface->w;
        fonts[i].oh = fontSurface->h;

        if (fonts[i].oh > fontHeight)
            fontHeight = (float)fonts[i].oh;

        fonts[i].w = gfxPowerOfTwo(fonts[i].ow);
        fonts[i].h = gfxPowerOfTwo(fonts[i].oh);

        if (fonts[i].w > fonts[i].h)
            fonts[i].h = fonts[i].w;
        if (fonts[i].h > fonts[i].w)
            fonts[i].w = fonts[i].h;

        tmp = SDL_CreateRGBSurface(SDL_SWSURFACE, fonts[i].w, fonts[i].h, 32,
#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks depend on byteorder */
			0x000000FF,
			0x0000FF00,
			0x00FF0000,
			0xFF000000);
#else
			0xFF000000,
			0x00FF0000,
			0x0000FF00,
			0x000000FF);
#endif

        if (!tmp) {

            TTF_CloseFont(font);
            SDL_FreeSurface(fontSurface);

            return 0;

        }


	/* Save the alpha blending attributes */
	saved_flags = fontSurface->flags & (SDL_SRCALPHA|SDL_RLEACCELOK);
#if SDL_VERSION_ATLEAST(1, 3, 0)
	SDL_GetSurfaceAlphaMod(fontSurface, &saved_alpha);
	SDL_SetSurfaceAlphaMod(fontSurface, 0xFF);
#else
	saved_alpha = fontSurface->format->alpha;
	if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
		SDL_SetAlpha(fontSurface, 0, 0);
	}
#endif

	/* copy to texture surface */
        if (SDL_BlitSurface(fontSurface, NULL, tmp, NULL)) {

            TTF_CloseFont(font);
            SDL_FreeSurface(tmp);
            SDL_FreeSurface(fontSurface);

            return 0;

        }

        glGenTextures(1, &fonts[i].id);
        glCheck();

        glBindTexture(GL_TEXTURE_2D, fonts[i].id);
        glCheck();

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fonts[i].w, fonts[i].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmp->pixels);
        glCheck();

        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glCheck();

        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glCheck();

        SDL_FreeSurface(tmp);
        SDL_FreeSurface(fontSurface);

    }

    TTF_CloseFont(font);

    return 1;


}
Пример #2
0
int loadFonts() {

	TTF_Font		*font = NULL;
	SDL_Surface		*fontSurface = NULL;
	SDL_Surface		*tmp = NULL;
	static SDL_Color fontColour = {255,255,255};
	char letter[2];
	int i;
	char *p;

	letter[1] = 0;

	p = va("%s/%s", MISCDIR, video.fontFile);
	
	if (!fileExists(p)) {
		conAdd(LERR, "Could not open %s", p);
		return 0;
	}

	font = TTF_OpenFont(p, video.fontSize);

	if (!font) {
		conAdd(LERR, "Could not open %s", p);
		return 0;
	}

	TTF_SetFontStyle(font, TTF_STYLE_NORMAL);

	memset(fonts, 0, sizeof(fonts));
	fontHeight = 0;

	for (i = 32; i < 128; i++) {

		letter[0] = i;

		fontSurface = TTF_RenderText_Solid(font, letter, fontColour);

		if (!fontSurface) {

			TTF_CloseFont(font);
			return 0;

		}

		fonts[i].ow = fontSurface->w;
		fonts[i].oh = fontSurface->h;

		if (fonts[i].oh > fontHeight)
			fontHeight = (float)fonts[i].oh;

		fonts[i].w = gfxPowerOfTwo(fonts[i].ow);
		fonts[i].h = gfxPowerOfTwo(fonts[i].oh);

		if (fonts[i].w > fonts[i].h)
			fonts[i].h = fonts[i].w;
		if (fonts[i].h > fonts[i].w)
			fonts[i].w = fonts[i].h;

		tmp = SDL_CreateRGBSurface(SDL_SWSURFACE, fonts[i].w, fonts[i].h, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000);

		if (!tmp) {

			TTF_CloseFont(font);
			SDL_FreeSurface(fontSurface);

			return 0;

		}

		if (SDL_BlitSurface(fontSurface, NULL, tmp, NULL)) {

			TTF_CloseFont(font);
			SDL_FreeSurface(tmp);
			SDL_FreeSurface(fontSurface);

			return 0;

		}

		glGenTextures(1, &fonts[i].id);
		glCheck();

		glBindTexture(GL_TEXTURE_2D, fonts[i].id);
		glCheck();

		glTexImage2D(GL_TEXTURE_2D, 0, 3, fonts[i].w, fonts[i].h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmp->pixels);
		glCheck();

		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glCheck();

		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glCheck();

		SDL_FreeSurface(tmp);
		SDL_FreeSurface(fontSurface);

	}

	TTF_CloseFont(font);

	return 1;


}