nuclear@0: /* nuclear@0: Copyright 2004 John Tsiombikas nuclear@0: nuclear@1: This file is part of gbasys, a library for GameBoy Advance development. nuclear@0: nuclear@0: This program is free software; you can redistribute it and/or modify nuclear@0: it under the terms of the GNU General Public License as published by nuclear@0: the Free Software Foundation; either version 2 of the License, or nuclear@0: (at your option) any later version. nuclear@0: nuclear@0: This program is distributed in the hope that it will be useful, nuclear@0: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@0: GNU General Public License for more details. nuclear@0: nuclear@0: You should have received a copy of the GNU General Public License nuclear@0: along with this program; if not, write to the Free Software nuclear@0: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA nuclear@0: */ nuclear@0: nuclear@1: #include "config.h" nuclear@0: #include nuclear@0: #include "font.h" nuclear@0: #include "gfx.h" nuclear@0: nuclear@0: #if defined(CONFIG_FONT_8X16) nuclear@0: #define DEFAULT_FONT &font_8x16 nuclear@0: #elif defined(CONFIG_FONT_8X8) nuclear@0: #define DEFAULT_FONT &font_8x8 nuclear@0: #else /* no font compiled in */ nuclear@0: #define DEFAULT_FONT 0 nuclear@0: #endif /* CONFIG_FONT_8X16 */ nuclear@0: nuclear@0: /* active font */ nuclear@0: static struct font *font = DEFAULT_FONT; nuclear@0: nuclear@0: /* active color */ nuclear@0: static unsigned short fg_color = 0xffff; nuclear@0: static unsigned short bg_color = 0; nuclear@0: nuclear@0: /* transparent background */ nuclear@0: static unsigned char bg_transparent = 1; nuclear@0: nuclear@0: /* ---- state manipulation ---- */ nuclear@0: void set_font(struct font *fnt) { nuclear@0: font = fnt; nuclear@0: } nuclear@0: nuclear@0: struct font *get_font(void) { nuclear@0: return font; nuclear@0: } nuclear@0: nuclear@0: void set_text_color(unsigned short fg, unsigned short bg) { nuclear@0: fg_color = fg; nuclear@0: bg_color = bg; nuclear@0: } nuclear@0: nuclear@0: void set_text_writebg(int enable) { nuclear@0: bg_transparent = !enable; nuclear@0: } nuclear@0: nuclear@0: struct pixel_buffer *get_glyph(unsigned char c, unsigned short fg, unsigned short bg, int bpp) { nuclear@0: static struct pixel_buffer glyph; nuclear@0: nuclear@0: if(glyph.x != font->x || glyph.y != font->y || glyph.bpp != bpp) { nuclear@0: glyph.x = font->x; nuclear@0: glyph.y = font->y; nuclear@0: glyph.bpp = bpp; nuclear@0: free(glyph.pixels); nuclear@0: if(!(glyph.pixels = malloc(glyph.x * glyph.y * (bpp >> 3)))) { nuclear@0: return 0; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: if(bpp == 16) { nuclear@0: int i, j; nuclear@0: unsigned short *dptr = glyph.pixels; nuclear@0: const unsigned char *bit_ptr = (unsigned char*)font->bitmap + font->y * (int)c; nuclear@0: int sz = glyph.x * glyph.y; nuclear@0: nuclear@0: for(i=0, j=0; i> j++)) ? fg : bg; nuclear@0: nuclear@0: if(j > 7) { nuclear@0: j = 0; nuclear@0: bit_ptr++; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: return &glyph; nuclear@0: } nuclear@0: nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int draw_glyph(unsigned char c, int x, int y, struct pixel_buffer *pbuf) { nuclear@0: struct pixel_buffer *glyph; nuclear@0: nuclear@0: if(!(glyph = get_glyph(c, fg_color, bg_color, pbuf->bpp))) return -1; nuclear@1: nuclear@0: if(pbuf->bpp == 16) { nuclear@0: int i, j; nuclear@0: unsigned short *dptr = (unsigned short*)pbuf->pixels + y * pbuf->x + x; nuclear@0: unsigned short *sptr = glyph->pixels; nuclear@0: int advance = pbuf->x - glyph->x; nuclear@0: nuclear@0: for(j=0; jy; j++) { nuclear@0: for(i=0; ix; i++) { nuclear@0: if(bg_transparent && *sptr == bg_color) { nuclear@0: dptr++; nuclear@0: sptr++; nuclear@0: } else { nuclear@0: *dptr++ = *sptr++; nuclear@0: } nuclear@0: } nuclear@0: dptr += advance; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: /* low level string rendering */ nuclear@0: int draw_string(const char *str, int x, int y, struct pixel_buffer *pbuf) { nuclear@0: while(*str) { nuclear@0: if(draw_glyph(*str++, x, y, pbuf) == -1) return -1; nuclear@0: x += font->x; nuclear@0: } nuclear@0: return 0; nuclear@0: }