#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
void initSDL();
void eputc(int x, int y, Uint32 color, char code);
void cputc(int x, int y, Uint32 color, char *code);
void ecputs(int x, int y, Uint32 color, char *str);
void drawPixel(int x, int y, Uint32 color);
SDL_Surface *screen;
Uint32 color;
char *efont;
char *cfont;
FILE *efp,*cfp;
#define meme 20000
#define memc 200000
int main(){
efont = (char *)malloc(meme);
cfont = (char *)malloc(memc);
if(efont==NULL && cfont==NULL){
fprintf(stderr,"can't malloc memory\n");
exit(1);
}
efp = fopen("../asc_hzk/ASC-16/ASC16","r");
//cfp = fopen("/home/edemon/font_lib/16x16/HZK16C","r");
cfp = fopen("../asc_hzk/HZK-16/HZK16","r");
if(efp==NULL || cfp==NULL){
fprintf(stderr,"ASC16 or HZK16 is not found\n");
exit(1);
}
fread(efont,sizeof(char),meme,efp);
fread(cfont,sizeof(char),memc,cfp);
fclose(efp);
fclose(cfp);
initSDL();
color = SDL_MapRGB(screen->format,255,255,255);
SDL_FillRect(screen,&screen->clip_rect,color); /* set the screen color */
color = SDL_MapRGB(screen->format,0,0,0);
ecputs(200,20,color,"一 二 三 四 五");
SDL_UpdateRect(screen,0,0,0,0);
SDL_Delay(10000);
free(efont);
free(cfont);
return 0;
}
void initSDL(){
if(SDL_Init(SDL_INIT_VIDEO) < 0){
fprintf(stderr,"SDL init error: %s\n",SDL_GetError());
exit(1);
}
screen = SDL_SetVideoMode(640,480,16,SDL_SWSURFACE);
if(screen == NULL){
fprintf(stderr,"Error: %s\n",SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
}
void drawPixel(int x, int y, Uint32 color){
Uint16 *bufp;
if(SDL_MUSTLOCK(screen)){
if(SDL_LockSurface(screen) < 0){
return ;
}
}
bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
*bufp = color;
if(SDL_MUSTLOCK(screen)){
SDL_UnlockSurface(screen);
}
SDL_UpdateRect(screen,x,y,1,1);
}
void eputc(int x, int y, Uint32 color, char code){
int i, j;
char mask = 0x80;
char *ptr = efont+code*16;
for(i=0;i<16;i++){
for(j=0;j<8;j++){
if(ptr[i] & (mask>>j)) drawPixel(x+j,y+i,color);
}
}
}
void cputc(int x, int y, Uint32 color, char *code){
int i,j,k;
char mask = 0x80; /* 0xFF = 255 = 2^8-1, 0x80 = 16*8 = 2^7 */
char q, w;
char *ptr;
q = code[0]-0xA1;
w = code[1]-0xA1;
ptr = cfont+(q*94+w)*32;
for(i=0;i<16;i++){ /* 16 rows */
for(j=0;j<2;j++){ /* 2 cols, one col has 8 points, which is presented by 8 bits.*/
for(k=0;k<8;k++){ /* check 8 bits for every col */
if(ptr[2*i+j]&(mask>>k)) drawPixel(x+j*8+k,y+i,color);
}
}
}
}
void ecputs(int x, int y, Uint32 color, char *str){
char *ptr = str;
char code[2] = {0};
int len = strlen(str);
char mask = 0x80;
while(len > 0){
if(ptr[0]&mask){ /* Chinese character */
code[0] = ptr[0];
code[1] = ptr[1];
cputc(x,y,color,code);
len -= 2;
x += 16;
ptr += 2;
}
else { /* English character */
code[0] = ptr[0];
eputc(x,y,color,code[0]);
len--;
x += 8;
ptr++;
}
}
}