📄 font_hzk.c
字号:
if(AFont[hzk_id(pf)].pFont == NULL) /* check font cache*/ { /* Allocate system memory for ASCII font.*/ if( !(AFont[hzk_id(pf)].pFont = (char *)malloc(pf->AFont.size)) ) { printf ("Allocate memory for ASCII HZK font failure.\n"); free(CFont[hzk_id(pf)].pFont); CFont[hzk_id(pf)].pFont = NULL; return FALSE; } /* Load ASCII font information to the near memory.*/ printf ("hzk_createfont: loading '%s'\n", pf->AFont.file ); if(!(fp = fopen(AFont[hzk_id(pf)].file, "rb"))) { printf ("Error.\nThe ASCII HZK font file can not be found!\n"); return FALSE; } if(fread(AFont[hzk_id(pf)].pFont, sizeof(char), pf->AFont.size, fp) < pf->AFont.size) { printf ("Error in reading ASCII HZK font file!\n"); fclose(fp); return FALSE; } fclose(fp); AFont[hzk_id(pf)].use_count=0; } afont_address = AFont[hzk_id(pf)].pFont; pf->afont_address = AFont[hzk_id(pf)].pFont; pf->AFont.pFont = AFont[hzk_id(pf)].pFont; AFont[hzk_id(pf)].use_count++; return TRUE;}/* This function unload system font from memory.*/static void UnloadFont( PMWHZKFONT pf ){ CFont[hzk_id(pf)].use_count--; AFont[hzk_id(pf)].use_count--; if (!CFont[hzk_id(pf)].use_count) { free(pf->CFont.pFont); free(pf->AFont.pFont); CFont[hzk_id(pf)].pFont = NULL; AFont[hzk_id(pf)].pFont = NULL; }}inthzk_init(PSD psd){ /* FIXME: *.KU file should be opened and * read in here...*/ return 1;}PMWHZKFONThzk_createfont(const char *name, MWCOORD height, int attr){ PMWHZKFONT pf; if(strcmp(name,"HZKFONT")!=0 && strcmp(name,"HZXFONT")!=0) return FALSE; /*printf("hzk_createfont(%s,%d)\n",name,height);*/ use_big5=name[2]-'K'; /* allocate font structure*/ pf = (PMWHZKFONT)calloc(sizeof(MWHZKFONT), 1); if (!pf) return NULL; pf->fontprocs = &hzk_procs; pf->fontsize = height; pf->fontrotation = 0; pf->fontattr = attr; if(height==12) { afont_width = 6; cfont_width = 12; font_height = 12; pf->afont_width = 6; pf->cfont_width = 12; pf->font_height = 12; } else { afont_width = 8; cfont_width = 16; font_height = 16; pf->afont_width = 8; pf->cfont_width = 16; pf->font_height = 16; } /* Load the font library to the system memory.*/ if(!LoadFont(pf)) return FALSE; return pf;}int IsBig5(int i){ if ((i>=0xa140 && i<=0xa3bf) || /* a140-a3bf(!a3e0) */ (i>=0xa440 && i<=0xc67e) || /* a440-c67e */ (i>=0xc6a1 && i<=0xc8d3) || /* c6a1-c8d3(!c8fe) */ (i>=0xc940 && i<=0xf9fe)) /* c940-f9fe */ return 1; else return 0;}/* * following several function is used in hzk_drawtext */static int getnextchar(char* s, unsigned char* cc){ if( s[0] == '\0') return 0; cc[0] = (unsigned char)(*s); cc[1] = (unsigned char)(*(s + 1)); if (use_big5) { if( IsBig5( (int) ( (cc[0] << 8) + cc[1]) ) ) return 1; } else { if( ((unsigned char)cc[0] > 0xa0) && ((unsigned char)cc[1] > 0xa0) ) return 1; } cc[1] = '\0'; return 1;}static voidexpandcchar(PMWHZKFONT pf, int bg, int fg, unsigned char* c, MWPIXELVAL* bitmap){ int i=0; int c1, c2, seq; int x,y; unsigned char *font; int b = 0; /* keep gcc happy with b = 0 - MW */ int pixelsize; pixelsize=sizeof(MWPIXELVAL); c1 = c[0]; c2 = c[1]; if (use_big5) { seq=0; /* ladd=loby-(if(loby<127)?64:98)*/ c2-=(c2<127?64:98); /* hadd=(hiby-164)*157*/ if (c1>=0xa4) /* standard font*/ { seq=(((c1-164)*157)+c2); if (seq>=5809) seq-=408; } /* hadd=(hiby-161)*157*/ if (c1<=0xa3) /* special font*/ seq=(((c1-161)*157)+c2)+13094; } else seq=((c1 - 161)*94 + c2 - 161); font = pf->cfont_address + ((seq) * (pf->font_height * ((pf->cfont_width + 7) / 8))); for (y = 0; y < pf->font_height; y++) for (x = 0; x < pf->cfont_width; x++) { if (x % 8 == 0) b = *font++; if (b & (128 >> (x % 8))) /* pixel */ bitmap[i++]=fg; else bitmap[i++]=bg; } }static void expandchar(PMWHZKFONT pf, int bg, int fg, int c, MWPIXELVAL* bitmap){ int i=0; int x,y; unsigned char *font; int pixelsize; int b = 0; /* keep gcc happy with b = 0 - MW */ pixelsize=sizeof(MWPIXELVAL); font = pf->afont_address + c * (pf->font_height * ((pf->afont_width + 7) / 8)); for (y = 0; y < pf->font_height; y++) for (x = 0; x < pf->afont_width; x++) { if (x % 8 == 0) b = *font++; if (b & (128 >> (x % 8))) /* pixel */ bitmap[i++]=fg; else bitmap[i++]=bg; }}/* * Draw ASCII text string using HZK type font */static voidhzk_drawtext(PMWFONT pfont, PSD psd, MWCOORD ax, MWCOORD ay, const void *text, int cc, MWTEXTFLAGS flags){ PMWHZKFONT pf=(PMWHZKFONT)pfont; unsigned char c[2]; MWPIXELVAL *bitmap; unsigned char s1[3]; char *s,*sbegin; s=(char *)text; if(cc==1) { s1[0]=*((unsigned char*)text); s1[1]=0x0; s1[2]=0x0; s=s1; } sbegin=s; bitmap = (MWPIXELVAL *)ALLOCA(pf->cfont_width * pf->font_height * sizeof(MWPIXELVAL)); while( getnextchar(s, c) ) { if( c[1] != '\0') { expandcchar(pf, gr_background,gr_foreground, c, bitmap); /* Now draw the bitmap ... */ if (flags&MWTF_TOP) GdArea(psd,ax, ay, pf->cfont_width, pf->font_height, bitmap, MWPF_PIXELVAL); else GdArea(psd,ax, ay-pf->font_height+2, pf->cfont_width, pf->font_height, bitmap, MWPF_PIXELVAL); s += 2; ax += pf->cfont_width; } else { expandchar(pf, gr_background,gr_foreground, c[0], bitmap); /* Now draw the bitmap ... */ if (flags&MWTF_TOP) GdArea(psd,ax, ay, pf->afont_width, pf->font_height, bitmap, MWPF_PIXELVAL); else GdArea(psd,ax, ay-pf->font_height+2, pf->afont_width, pf->font_height, bitmap, MWPF_PIXELVAL); s += 1; ax += pf->afont_width; } if(s>=sbegin+cc)break; } FREEA(bitmap);}/* * Return information about a specified font. */static MWBOOLhzk_getfontinfo(PMWFONT pfont, PMWFONTINFO pfontinfo){ PMWHZKFONT pf=(PMWHZKFONT)pfont; int i; pfontinfo->height = pf->font_height; pfontinfo->maxwidth = pf->cfont_width; pfontinfo->baseline = pf->font_height - 2; /* FIXME: calculate these properly: */ pfontinfo->linespacing = pfontinfo->height; pfontinfo->descent = pfontinfo->height - pfontinfo->baseline; pfontinfo->maxascent = pfontinfo->baseline; pfontinfo->maxdescent = pfontinfo->descent; pfontinfo->firstchar = 0; pfontinfo->lastchar = 0; pfontinfo->fixed = TRUE; for(i=0; i<=256; i++) pfontinfo->widths[i] = pf->afont_width; return TRUE;}static voidhzk_gettextsize(PMWFONT pfont, const void *text, int cc, MWTEXTFLAGS flags, MWCOORD *pwidth, MWCOORD *pheight, MWCOORD *pbase){ PMWHZKFONT pf=(PMWHZKFONT)pfont; unsigned char c[2]; char *s,*sbegin; unsigned char s1[3]; int ax=0; s=(char *)text; if(cc==0) { *pwidth = 0; *pheight = pf->font_height; *pbase = pf->font_height-2; } if(cc==1) { s1[0]=*((unsigned char*)text); s1[1]=0x0; s1[2]=0x0; s=s1; } sbegin=s; while( getnextchar(s, c) ) { if( c[1] != '\0') { s += 2; ax += pf->cfont_width; } else { s += 1; ax += pf->afont_width; } if(s>=sbegin+cc) { /*printf("s=%x,sbegin=%x,cc=%x\n",s,sbegin,cc);*/ break; } } /*printf("ax=%d,\n",ax);*/ *pwidth = ax; *pheight = pf->font_height; *pbase = pf->font_height-2;}static voidhzk_destroyfont(PMWFONT pfont){ PMWHZKFONT pf=(PMWHZKFONT)pfont; UnloadFont(pf); free(pf);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -