/*		====================================================================
		                 マルチフォント表示プログラム
		====================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jstring.h>
#include <fmgraph.h>
#include <console.h>
#include <ctype.h>
#include "font5.h"
#include "jukugo5.h"

/*  --------- FONTDATA.EXE で作成した文字パターンの表示 -----------------*/
void MOJI_write
(char *buff, int len, char dot, char zenhan, int col, int sx, int sy)
{
	int	i,ndata,nbyte,k;
	
	switch(dot){
		case 16:	if(zenhan==1) nbyte= 16; 
					else nbyte=32;  
					break;
		case 24:	if(zenhan==1) nbyte= 36; 
					else nbyte=72;  
					break;
		case 32:	if(zenhan==1) nbyte= 64; 
					else nbyte=128; 
					break;
		case 48:	if(zenhan==1) nbyte= 144;
					else nbyte=288;
					break;
	}
	ndata= len /nbyte;
	k=dot*zenhan/2;
	for(i=0; i<ndata; i++){
		GDS_colorput( buff+i*nbyte,0,sx,sy,sx+k-1,sy+dot-1,col,DRAW_PSET);
		sx += k;
	}
}

/*	------- 24dotマルチフォント表示	---------------------------------------*/
int put_24multifont
		( uchar gamen, uint fontno, uchar *mojiretsu, uint col, int sx, int sy)
{
	uchar	pattern[300];
	uint	i,len,c,code;
	int		j;
	long	loff;
	
	len=strlen(mojiretsu);
	for(i=0; i<len; i++){
		j=nthctype(mojiretsu,i);
		switch(j){
			case CT_ANK:
				code=mojiretsu[i];
				loff=74l*code+2l;
				get_hankaku24_pattern(fontno, loff, pattern);
				GDS_colorput(pattern, gamen, sx, sy, sx+23, sy+23, col, 
																	DRAW_PSET);
				sx+=12;
				break;
			case CT_KJ1:
				break;
			case CT_KJ2:
				c=mojiretsu[i-1]*0x0100+mojiretsu[i];
				code=jis_to_flocate( jmstojis(c) );
				loff=74l*code+18l;
				get_zenkaku24_pattern(fontno, loff, pattern);
				GDS_colorput( pattern,gamen, sx, sy, sx+23, sy+23, col,
																	DRAW_PSET);
				sx+=24;
				break;
			case CT_ILGL:
				printf("不正な文字 %x があります.\n",mojiretsu[i]);
				return(1);
		}
	}
	return(0);
}

/*	24dot半角フォント取得	*/
int get_hankaku24_pattern(uint fontno, long loff, uchar *pattern)
{
	FILE 	*fp24hk;
	
	switch( fontno ){
		case 4:	fp24hk=fopen(maru24hk, "rb");	break;
		case 5:	fp24hk=fopen(goth24hk, "rb");	break;
		case 6:	fp24hk=fopen(kyou24hk, "rb");	break;
		case 7:	fp24hk=fopen(minn24hk, "rb");	break;
	}

	if( fp24hk==NULL ){	
		CON_init();
		GDS_cls();
		perror("24hk.font");
		exit(1);
	}

	fseek(fp24hk,loff,SEEK_SET);
	fread( pattern, 1,72, fp24hk );

	fclose(fp24hk);
	return(0);
}

/*	24dot全角フォント取得	*/
int get_zenkaku24_pattern(uint fontno, long loff, uchar *pattern)
{
	FILE 	*fp24;
	
	switch( fontno ){
		case 4:	fp24=fopen(maru24, "rb");	break;
		case 5:	fp24=fopen(goth24, "rb");	break;
		case 6:	fp24=fopen(kyou24, "rb");	break;
		case 7:	fp24=fopen(minn24, "rb");	break;
	}

	if( fp24==NULL ){
		CON_init();
		GDS_cls();
		perror("24.font");
		exit(1);
	}

	fseek(fp24,loff,SEEK_SET);
	fread( pattern, 1,72, fp24 );

	fclose(fp24);
	return(0);
}

/*----------文字変換 -----------------------------------------------------*/
void MOJI_zentohan(uint dot, uchar *pattern)
{
	uint	i,j,k,c1,c2,c3,c4;
	uchar 	ch,temp[300];
	
	for(i=0; i<dot; i++){
		for(j=0; j<(dot/8); j++){
			k=(dot/8)*i+j;
			ch=( pattern[k] | (pattern[k] << 1) );
			if( (ch & 0x80)==0x80 )	c1=1000; else c1=0;
			if( (ch & 0x20)==0x20 )	c2=100; else c2=0;
			if( (ch & 0x08)==0x08 )	c3=10; else c3=0;
			if( (ch & 0x02)==0x02 )	c4=1; else c4=0;
			
			switch( c1+c2+c3+c4 ){
				case    0:	temp[k]=0x00;	break;
				case    1:	temp[k]=0x01;	break;
				case   10:	temp[k]=0x02;	break;
				case   11:	temp[k]=0x03;	break;
				case  100:	temp[k]=0x04;	break;
				case  101:	temp[k]=0x05;	break;
				case  110:	temp[k]=0x06;	break;
				case  111:	temp[k]=0x07;	break;
				case 1000:	temp[k]=0x08;	break;
				case 1001:	temp[k]=0x09;	break;
				case 1010:	temp[k]=0x0a;	break;
				case 1011:	temp[k]=0x0b;	break;
				case 1100:	temp[k]=0x0c;	break;
				case 1101:	temp[k]=0x0d;	break;
				case 1110:	temp[k]=0x0e;	break;
				case 1111:	temp[k]=0x0f;	break;
			}
		}
	}	
	j=0;
	for(i=0; i<(dot*dot/8); i+=2){
		pattern[j]=(unsigned char)(temp[i]*0x10)+temp[i+1];
		j++;
	}
}

/*JIS漢字コードをフォントデータの位置に変換
	｢お気軽BASIC｣永倉一之著 SOFTBANK社 を参考にしました。*/
uint  jis_to_flocate( uint k )
{
	uint	code=0;
	
 	if( k >= 0x2121 && k <=0x2220 ) code=	  k-0x2121;
 	if( k >= 0x2221 && k <=0x222E ) code=  94+k-0x2221;
 	if( k >= 0x223A && k <=0x2279 ) code= 119+k-0x223A;
 	if( k >= 0x2330 && k <=0x2339 ) code= 203+k-0x2330;
 	if( k >= 0x2341 && k <=0x235A ) code= 220+k-0x2341;
 	if( k >= 0x2361 && k <=0x237A ) code= 252+k-0x2361;
 	if( k >= 0x2421 && k <=0x2474 ) code= 282+k-0x2421;
 	if( k >= 0x2521 && k <=0x2576 ) code= 376+k-0x2521;
 	if( k >= 0x2621 && k <=0x2638 ) code= 470+k-0x2621;
 	if( k >= 0x2641 && k <=0x2658 ) code= 502+k-0x2641;
 	if( k >= 0x2721 && k <=0x2741 ) code= 564+k-0x2721;
 	if( k >= 0x2751 && k <=0x2771 ) code= 612+k-0x2751;
 	if( k >= 0x2321 && k <=0x2326 ) code= 897+k-0x2321;
 	if( k >= 0x2327 && k <=0x232F ) code= 906+k-0x2327;
 	if( k >= 0x233A && k <=0x233E ) code= 915+k-0x233A;
 	if( k >= 0x2660 && k <=0x267B ) code=1130+k-0x2660;
	   	 if( k >= 0x5021 ) code=4418+k-0x5021-162*( (k-0x5000)/0x100 );
 	else if( k >= 0x3021 ) code=1410+k-0x3021-162*( (k-0x3000)/0x100 );

	return(code);
}
