Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1427355
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类: LINUX

2006-05-26 10:33:15

#include
#include
#include "SDL.h"
#include "font.h"

unsigned char *eFONT;
unsigned char *cFONT;
unsigned char *wbTAB;

/* ----------------------------- */
void font_load(char *font,char *filename,unsigned int size)
{
  FILE *fp;
  if((fp=fopen(filename,"r"))==NULL){
    printf("Can't open file: %s !\n",filename);
    exit(1);
  }
  fread(font,sizeof(char),size,fp);
  fclose(fp);
}
/* ----------------------------- */
void font_init(void)
{
  eFONT=(char *)malloc(4096);
  cFONT=(char *)malloc(267616);
  wbTAB=(char *)malloc(65316);
  if(eFONT==NULL || cFONT==NULL || wbTAB==NULL){
    printf("Can't not malloc memory!\n");exit(1);
  }
  font_load(eFONT,"./font/asc16",4096);
  font_load(cFONT,"./font/hzk16",267616);
  font_load(wbTAB,"./cin/wubi.tab",65316);
}
/* ------------------------------ */
void font_free(void)
{
  if(eFONT!=NULL)free(eFONT);
  if(cFONT!=NULL)free(cFONT);
  if(wbTAB!=NULL)free(wbTAB);
}
/* ------------------------------ */
void putpixel(SDL_Surface *surface,int x,int y,Uint32 color)
{
  Uint16 *bufp;
  if(SDL_MUSTLOCK(surface)){
    if(SDL_LockSurface(surface)<0)return;
  }
  bufp=(Uint16 *)surface->pixels+y*surface->pitch/2+x;
  *bufp=color;
  SDL_UpdateRect(surface,x,y,1,1);
  if(SDL_MUSTLOCK(surface)){
    SDL_UnlockSurface(surface);
  }
}
/* ------------------------------ */
void cputchar(SDL_Surface *surface,int x,int y,Uint32 color,char *code)
{
  int i,j,k;
  unsigned char mask=0x80;
  unsigned char q,w;
  char *ptr;
  q=code[0]-0xa0;
  w=code[1]-0xa0;
  ptr=cFONT+((q-1)*94+(w-1))*32;
  for(i=0;i<16;i++){
    for(j=0;j<2;j++){
      for(k=0;k<8;k++){
        if(ptr[i*2+j]&(mask>>k))putpixel(surface,x+j*8+k,y+i,color);
      }
    }
  }
}
/* ------------------------------ */
void cputchar2x(SDL_Surface *surface,int x,int y,Uint32 color,char *code)
{
  int i,j,k;
  int xx,yy;
  unsigned char mask=0x80;
  unsigned char q,w;
  char *ptr;
  q=code[0]-0xa0;
  w=code[1]-0xa0;
  ptr=cFONT+((q-1)*94+(w-1))*32;
  for(i=0;i<16;i++){
    for(j=0;j<2;j++){
      for(k=0;k<8;k++){
        if(!(ptr[i*2+j]&(mask>>k)))continue;
        xx=(x+j*8+k)*2;yy=(y+i)*2;
        putpixel(surface,xx,yy,color);putpixel(surface,xx+1,yy,color);
        putpixel(surface,xx,yy+1,color);putpixel(surface,xx+1,yy+1,color);
      }
    }
  }
}
/* ------------------------------ */
void eputchar(SDL_Surface *surface,int x,int y,Uint32 color,char code)
{
  int i,j;
  unsigned char mask=0x80;
  char *ptr;
  ptr=eFONT+code*16;
  for(i=0;i<16;i++){
    for(j=0;j<8;j++){
      if(ptr[i]&(mask>>j))putpixel(surface,x+j,y+i,color);
    }
  }
}
/* ------------------------------ */
void eputchar2x(SDL_Surface *surface,int x,int y,Uint32 color,char code)
{
  int i,j;
  int xx,yy;
  unsigned char mask=0x80;
  char *ptr;
  ptr=eFONT+code*16;
  for(i=0;i<16;i++){
    for(j=0;j<8;j++){
      if(ptr[i]&(mask>>j)){
        xx=(x+j)*2;yy=(y+i)*2;
        putpixel(surface,xx,yy,color);putpixel(surface,xx+1,yy,color);
        putpixel(surface,xx,yy+1,color);putpixel(surface,xx+1,yy+1,color);
      }
    }
  }
}
/* ------------------------------ */
void ecprint(SDL_Surface *surface,int x,int y,Uint32 color,char *str)
{
  char *ptr;
  char code[2];
  unsigned char l;
  unsigned char mask=0x80;
  ptr=str;
  l=strlen(str);
  while(l>0){
    if(ptr[0]&mask){
      code[0]=ptr[0];
      code[1]=ptr[1];
      cputchar(surface,x,y,color,code);
      x+=16;
      ptr+=2;
      l-=2;
    }
    else {
      code[0]=ptr[0];
      eputchar(surface,x,y,color,code[0]);
      x+=8;
      ptr++;
      l--;
    }
  }
}
/* ------------------------------ */
void ecprint2x(SDL_Surface *surface,int x,int y,Uint32 color,char *str)
{
  char *ptr;
  char code[2];
  unsigned char l;
  unsigned char mask=0x80;
  ptr=str;
  l=strlen(str);
  while(l>0){
    if(ptr[0]&mask){
      code[0]=ptr[0];
      code[1]=ptr[1];
      cputchar2x(surface,x,y,color,code);
      x+=16;
      ptr+=2;
      l-=2;
    }
    else {
      code[0]=ptr[0];
      eputchar2x(surface,x,y,color,code[0]);
      x+=8;
      ptr++;
      l--;
    }
  }
}
/* ------------------------------ */

 
 
 
// font.h
extern unsigned char *eFONT;
extern unsigned char *cFONT;
extern unsigned char *wbTAB;
void font_load(char *font,char *filename,unsigned int size);
void font_init(void);
void font_free(void);
void putpixel(SDL_Surface *surface,int x,int y,Uint32 color);
void cputchar(SDL_Surface *surface,int x,int y,Uint32 color,char *code);
void cputchar2x(SDL_Surface *surface,int x,int y,Uint32 color,char *code);
void eputchar(SDL_Surface *surface,int x,int y,Uint32 color,char code);
void eputchar2x(SDL_Surface *surface,int x,int y,Uint32 color,char code);
void ecprint(SDL_Surface *surface,int x,int y,Uint32 color,char *str);
void ecprint2x(SDL_Surface *surface,int x,int y,Uint32 color,char *str);
 
阅读(1228) | 评论(0) | 转发(0) |
0

上一篇:汉字的显示

下一篇:五笔打字

给主人留下些什么吧!~~