Mercurial > hg > dmlib
view dmtext_bm.c @ 66:f18ad054a695
Oops, some function arguments were reversed.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 01 Oct 2012 11:52:42 +0300 |
parents | 03375aa0ef2b |
children | a791146e3094 |
line wrap: on
line source
/* * DMLib * -- Bitmap and TTF text & font support * Programmed and designed by Matti 'ccr' Hamalainen * (C) Copyright 2012 Tecnic Software productions (TNSP) */ #include "dmtext.h" void dmDrawBMTextConst(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt) { const char *ptr = fmt; DMScaledBlitFunc blit = dmGetScaledBlitFunc(font->glyphs[0]->format, screen->format, mode); while (*ptr) { char ch = *ptr++; if (isprint(ch) && ch != ' ' && ch != '\t') { SDL_Surface *glyph = font->glyphs[(unsigned char) ch]; blit(glyph, xc, yc, glyph->w, glyph->h, screen); xc += glyph->w; } else xc += font->width; } } void dmDrawBMTextVA(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt, va_list ap) { char *tmp = dm_strdup_vprintf(fmt, ap); if (tmp != NULL) { dmDrawBMTextConst(screen, font, mode, xc, yc, tmp); dmFree(tmp); } } void dmDrawBMText(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt, ...) { va_list ap; va_start(ap, fmt); dmDrawBMTextVA(screen, font, mode, xc, yc, fmt, ap); va_end(ap); } DMBitmapFont *dmNewBitmapFont(int nglyphs) { DMBitmapFont *font = dmMalloc0(sizeof(DMBitmapFont)); if (font == NULL) return NULL; font->nglyphs = nglyphs; font->glyphs = dmCalloc(nglyphs, sizeof(SDL_Surface *)); return font; } int dmFreeBitmapFont(DMBitmapFont *font) { int i; if (font == NULL) return DMERR_NULLPTR; for (i = 0; i < font->nglyphs; i++) { if (font->glyphs[i] != NULL) { SDL_FreeSurface(font->glyphs[i]); font->glyphs[i] = NULL; } } dmFree(font); return DMERR_OK; } int dmLoadBitmapFont(DMResource *res, DMBitmapFont **pfont) { return DMERR_OK; } int dmCreateBitmapFontFromImage(SDL_Surface *image, int width, int height, DMBitmapFont **pfont) { int glyph, xc, yc, xglyphs, yglyphs; DMBitmapFont *font; if (image->w < width || width < 4 || image->h < height || height < 4) return DMERR_INVALID_ARGS; xglyphs = image->w / width; yglyphs = image->h / height; if ((font = dmNewBitmapFont(xglyphs * yglyphs)) == NULL) return DMERR_MALLOC; font->width = width; font->height = height; glyph = 0; for (yc = 0; yc < yglyphs; yc++) for (xc = 0; xc < xglyphs; xc++) { SDL_Surface *bmp = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, image->format->BitsPerPixel, image->format->Rmask, image->format->Gmask, image->format->Bmask, image->format->Amask); if (bmp == NULL) { dmFreeBitmapFont(font); return DMERR_MALLOC; } font->glyphs[glyph++] = bmp; } *pfont = font; return DMERR_OK; }