📄 genfont.c
字号:
/* * Copyright (c) 1999, 2000 Greg Haerr <greg@censoft.com> * * Screen Driver Utilities * * Microwindows Proportional Font Routines (proportional font format) * * This file contains the generalized low-level font/text * drawing routines. Both fixed and proportional fonts are * supported, with fixed pitch structure allowing much smaller * font files. */#include <stdio.h>#include "device.h"#include "genfont.h"/* Make compiler happy */#if HAVE_KSC5601_SUPPORTextern unsigned short convert_ksc_to_johab( unsigned char CH, unsigned char CL);extern int get_han_image(int mc, char *retmap );#endif/* compiled in fonts*/extern MWCFONT font_rom8x16, font_rom8x8;extern MWCFONT font_winFreeSansSerif11x13;extern MWCFONT font_winFreeSystem14x16;extern MWCFONT font_winSystem14x16;extern MWCFONT font_winMSSansSerif11x13;extern MWCFONT font_winTerminal8x12;extern MWCFONT font_helvB10, font_helvB12, font_helvR10;extern MWCFONT font_X5x7, font_X6x13;extern MWCFONT font_SigmaOSD1_18x23;extern MWCFONT font_SigmaOSD1_27x36;/* handling routines for MWCOREFONT*/static MWFONTPROCS fontprocs = { MWTF_ASCII, /* routines expect ascii*/ gen_getfontinfo, gen_gettextsize, gen_gettextbits, gen_unloadfont, corefont_drawtext, NULL, /* setfontsize*/ NULL, /* setfontrotation*/ NULL, /* setfontattr*/};/* first font is default font if no match*/MWCOREFONT gen_fonts[NUMBER_FONTS] = {#if HAVEMSFONTS {&fontprocs, 0, 0, 0, MWFONT_SYSTEM_VAR, &font_winSystem14x16}, {&fontprocs, 0, 0, 0, MWFONT_GUI_VAR, &font_winMSSansSerif11x13}, {&fontprocs, 0, 0, 0, MWFONT_OEM_FIXED, &font_winTerminal8x12}, {&fontprocs, 0, 0, 0, MWFONT_SYSTEM_FIXED, &font_X6x13}#else {&fontprocs, 0, 0, 0, MWFONT_SYSTEM_VAR, &font_SigmaOSD1_18x23}, {&fontprocs, 0, 0, 0, MWFONT_GUI_VAR, &font_SigmaOSD1_27x36} //{&fontprocs, 0, 0, 0, MWFONT_SYSTEM_VAR, &font_winFreeSystem14x16}, //{&fontprocs, 0, 0, 0, MWFONT_GUI_VAR, &font_winFreeSansSerif11x13}, //{&fontprocs, 0, 0, 0, MWFONT_OEM_FIXED, &font_rom8x16}, //{&fontprocs, 0, 0, 0, MWFONT_SYSTEM_FIXED, &font_X6x13}#endif};/* * Generalized low level get font info routine. This * routine works with fixed and proportional fonts. */MWBOOLgen_getfontinfo(PMWFONT pfont, PMWFONTINFO pfontinfo){ PMWCFONT pf = ((PMWCOREFONT)pfont)->cfont; int i; pfontinfo->maxwidth = pf->maxwidth; pfontinfo->height = pf->height; pfontinfo->baseline = pf->ascent; pfontinfo->firstchar = pf->firstchar; pfontinfo->lastchar = pf->firstchar + pf->size - 1; pfontinfo->fixed = pf->width == NULL? TRUE: FALSE; for(i=0; i<256; ++i) { if(pf->width == NULL) pfontinfo->widths[i] = pf->maxwidth; else { if(i<pf->firstchar || i >= pf->firstchar+pf->size) pfontinfo->widths[i] = 0; else pfontinfo->widths[i] = pf->width[i-pf->firstchar]; } } return TRUE;}/* * Generalized low level routine to calc bounding box for text output. * Handles both fixed and proportional fonts. Passed ascii string. */voidgen_gettextsize(PMWFONT pfont, const void *text, int cc, MWCOORD *pwidth, MWCOORD *pheight, MWCOORD *pbase){ PMWCFONT pf = ((PMWCOREFONT)pfont)->cfont; const unsigned char * str = text; unsigned int c; int width; if(pf->width == NULL) width = cc * pf->maxwidth; else { width = 0; while(--cc >= 0) { c = *str++;#if HAVE_BIG5_SUPPORT /* chinese big5 decoding*/ if (c >= 0xA1 && c <= 0xF9 && cc >= 1 && ((*str >= 0x40 && *str <= 0x7E) || (*str >= 0xA1 && *str <= 0xFE)) ) { --cc; ++str; width += 12; /* FIXME*/ } else#endif#if HAVE_GB2312_SUPPORT /* chinese gb2312 decoding*/ if (c >= 0xA1 && c < 0xF8 && cc >= 1 && *str >= 0xA1 && *str < 0xFF) { --cc; ++str; width += 12; /* FIXME*/ } else#endif#if HAVE_KSC5601_SUPPORT /* Korean KSC5601 decoding */ if (c >= 0xA1 && c <= 0xFE && cc >= 1 && (*str >= 0xA1 && *str <= 0xFE)) { --cc; ++str; width += 16; /* FIXME*/ } else#endif if(c >= pf->firstchar && c < pf->firstchar+pf->size) width += pf->width[c - pf->firstchar]; } } *pwidth = width; *pheight = pf->height; *pbase = pf->ascent;}/* * Generalized low level routine to get the bitmap associated * with a character. Handles fixed and proportional fonts. */voidgen_gettextbits(PMWFONT pfont, int ch, MWIMAGEBITS *retmap, MWCOORD *pwidth, MWCOORD *pheight, MWCOORD *pbase){ PMWCFONT pf = ((PMWCOREFONT)pfont)->cfont; int n, count, width; MWIMAGEBITS * bits;#if HAVE_BIG5_SUPPORT /* decode chinese big5*/ int CH = ((unsigned int)ch) >> 8, CL = ((unsigned int)ch) & 0xFF; if (CH >= 0xA1 && CH <= 0xF9 && ((CL >= 0x40 && CL <= 0x7E) || (CL >= 0xA1 && CL <= 0xFE)) ) { int Pos; /* != ((CH - 0xA1) * 94 + (CL - 0xA1)) * 18; */ int i; extern unsigned char JMT_BIG5_12X12_FONT_BITMAP[]; int seq; { seq=0; /* ladd=loby-(if(loby<127)?64:98) */ CL/*c2*/-=(CL/*c2*/<127?64:98); /* hadd=(hiby-164)*157 */ if (CH/*c1*/>=0xa4) /* standard font */ { seq=(((CH/*c1*/-164)*157)+CL/*c2*/); if (seq>=5809) seq-=408; } /* hadd=(hiby-161)*157 */ if (CH/*c1*/<=0xa3) /* special font */ seq=(((CH/*c1*/-161)*157)+CL/*c2*/)+13094; } Pos=seq*18; *pwidth = width = 12; *pheight = 12; *pbase = 0; for (i = 0; i < 6; i++) { unsigned char *DstBitmap = ((unsigned char *)retmap) + i * 4; unsigned char *FontBitmap = JMT_BIG5_12X12_FONT_BITMAP + Pos + i * 3; DstBitmap[0] = FontBitmap[1]; DstBitmap[1] = FontBitmap[0]; DstBitmap[2] = FontBitmap[1] << 4; DstBitmap[3] = FontBitmap[2]; } return; }#endif /* HAVE_BIG5_SUPPORT*/#if HAVE_GB2312_SUPPORT /* decode chinese gb2312*/ int CH = ((unsigned int)ch) >> 8, CL = ((unsigned int)ch) & 0xFF; if (CH >= 0xA1 && CH < 0xF8 && CL >= 0xA1 && CL < 0xFF) { int Pos = ((CH - 0xA1) * 94 + (CL - 0xA1)) * 18; int i; extern unsigned char GUO_GB2312_12X12_FONT_BITMAP[]; *pwidth = width = 12; *pheight = 12; *pbase = 0; for (i = 0; i < 6; i++) { unsigned char *DstBitmap = ((unsigned char *)retmap) + i * 4; unsigned char *FontBitmap = GUO_GB2312_12X12_FONT_BITMAP + Pos + i * 3; DstBitmap[0] = FontBitmap[1]; DstBitmap[1] = FontBitmap[0]; DstBitmap[2] = FontBitmap[1] << 4; DstBitmap[3] = FontBitmap[2]; } return; }#endif /* HAVE_GB2312_SUPPORT*/#if HAVE_KSC5601_SUPPORT int CH = ((unsigned int)ch) >> 8, CL = ((unsigned int)ch) & 0xFF; int mc; if ( CH>= 0xA1 && CH<= 0xFE && (CL >= 0xA1 && CL <= 0xFE)) { mc = convert_ksc_to_johab( CH, CL); if ( mc ) get_han_image(mc, retmap ); /* Fix me */ *pwidth = width = 16; *pheight = 16; *pbase = 0; return; }#endif /* if char not in font, map to first character by default*/ if(ch < pf->firstchar || ch >= pf->firstchar+pf->size) ch = pf->firstchar; ch -= pf->firstchar; /* get font bitmap depending on fixed pitch or not*/ bits = pf->bits + (pf->offset? pf->offset[ch]: (pf->height * ch)); width = pf->width ? pf->width[ch] : pf->maxwidth; count = MWIMAGE_WORDS(width) * pf->height; for(n=0; n<count; ++n) *retmap++ = *bits++; /* return width depending on fixed pitch or not*/ *pwidth = width; *pheight = pf->height; *pbase = pf->ascent;}voidgen_unloadfont(PMWFONT pfont){ /* builtins can't be unloaded*/}#if NOTUSED/* * Generalized low level text draw routine, called only * if no clipping is required */voidgen_drawtext(PMWFONT pfont,PSD psd,MWCOORD x,MWCOORD y,const void *text, int n,MWPIXELVAL fg){ PMWCFONT pf = ((PMWCOREFONT)pfont)->cfont; const unsigned char * str = text; MWCOORD width; /* width of character */ MWCOORD height; /* height of character */ IMAGEBITS bitmap[MAX_CHAR_HEIGHT*MAX_CHAR_WIDTH/MWIMAGE_BITSPERIMAGE]; /* x, y is bottom left corner*/ y -= pf->height - 1; while (n-- > 0) { pfont->GetTextBits(pfont, *s++, bitmap, &width, &height); gen_drawbitmap(psd, x, y, width, height, bitmap, fg); x += width; }}/* * Generalized low level bitmap output routine, called * only if no clipping is required. Only the set bits * in the bitmap are drawn, in the foreground color. */voidgen_drawbitmap(PSD psd,MWCOORD x, MWCOORD y, MWCOORD width, MWCOORD height, MWIMAGEBITS *table, PIXELVAL fgcolor){ MWCOORD minx; MWCOORD maxx; MWIMAGEBITS bitvalue; /* bitmap word value */ int bitcount; /* number of bits left in bitmap word */ minx = x; maxx = x + width - 1; bitcount = 0; while (height > 0) { if (bitcount <= 0) { bitcount = MWIMAGE_BITSPERIMAGE; bitvalue = *table++; } if (MWIMAGE_TESTBIT(bitvalue)) psd->DrawPixel(psd, x, y, fgcolor); bitvalue = MWIMAGE_SHIFTBIT(bitvalue); --bitcount; if (x++ == maxx) { x = minx; ++y; --height; bitcount = 0; } }}#endif /* NOTUSED*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -