掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
単色のビットマップファイルを16色に変更するためには (ID:69431)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
/*******************************************************************/ /* << メモリ内部で図形を作成しビットマップファイルに保存 > */ /*******************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #define FIG_TMP_BUFF_SIZE 0x4000 int HorizonBytes; int XmaxRange; int YmaxRange; int FigureBuffType=1; unsigned char FigTmpBuff[FIG_TMP_BUFF_SIZE]; unsigned char *FigureBuff; unsigned char ShiftTable[] ={0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; unsigned char LeftMaskTable[] ={0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01}; unsigned char RightMaskTable[]={0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF}; unsigned char ReverseTable[]={ 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF }; unsigned char BitMapFont8x8[][8]={ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /* など */ }; int figinit(int, int); void figfree(void); void figreset(void); int putbmp(char *); void swapif(int *, int *); int checkrange(int, int); void hvcheckrange(int, int *, int *, int *); void putpixel(int, int); void hline(int, int, int); void vline(int, int, int); void line(int, int, int, int); /*----- 図形作成用メモリ確保 -----*/ int figinit(int xdot, int ydot) { HorizonBytes=((((xdot+7)>>3)+3)/4)*4; XmaxRange=xdot-1; YmaxRange=ydot-1; if(FIG_TMP_BUFF_SIZE>=HorizonBytes*ydot) { FigureBuff=FigTmpBuff; return 0; } else { if((unsigned char *)NULL!=(FigureBuff=(unsigned char *)calloc(HorizonBytes*ydot, sizeof(unsigned char)))) { FigureBuffType=0; return 0; } else return 1; } } /*----- 図形作成用メモリ解放 -----*/ void figfree() { if(!FigureBuffType) free(FigureBuff); } /*----- 図形作成用メモリ内容クリア -----*/ void figreset() { memset(FigureBuff, 0x00, HorizonBytes*(YmaxRange+1)); } /*----- BMPファイル作成 -----*/ int putbmp(char *filename) { #define BF_OFF_BITS (54+4*2) FILE *fw; unsigned char buff[BF_OFF_BITS]; if((FILE *)NULL==(fw=fopen(filename, "wb"))) return 1; buff[0]='B'; /* bfType */ buff[1]='M'; /* bfSize */ *(unsigned long *)(buff+2)=((unsigned long)HorizonBytes)*((unsigned long)YmaxRange+1L)+(unsigned long)BF_OFF_BITS; buff[6]=buff[7]=buff[8]=buff[9]=0; *(unsigned long *)(buff+10)=(unsigned long)BF_OFF_BITS; /* bfOffBits */ *(unsigned long *)(buff+14)=40L; /* biSize */ *(long *)(buff+18)=(long)XmaxRange+1L; /* biWidth */ *(long *)(buff+22)=(long)YmaxRange+1L; /* biHeight */ *(int *)(buff+26)=1; *(int *)(buff+28)=1; /* biBitCount */ *(unsigned long *)(buff+30)=*(unsigned long *)(buff+34)=0L; *(long *)(buff+38)=*(long *)(buff+42)=0L; *(unsigned long *)(buff+46)=*(unsigned long *)(buff+50)=0L; buff[54]=0xFF; buff[55]=0xFF; buff[56]=0xFF; buff[57]=0; buff[58]=0x00; buff[59]=0x00; buff[60]=0x00; buff[61]=0; if(BF_OFF_BITS!=fwrite(buff, sizeof(char), BF_OFF_BITS, fw)) { fclose(fw); unlink(filename); return 2; } if((unsigned)(HorizonBytes*(YmaxRange+1))==fwrite(FigureBuff, sizeof(char), HorizonBytes*(YmaxRange+1), fw)) { fclose(fw); return 0; } else { fclose(fw); unlink(filename); return 2; } } /*----- 2値を小さい順に並べる -----*/ void swapif(int *a, int *b) { if(*a>*b) { *b^=*a; *a^=*b; *b^=*a; } } /*----- 座標が画面の範囲かチェック -----*/ int checkrange(int px, int py) { return (px>=0)&&(px<=XmaxRange)&&(py>=0)&&(py<=YmaxRange); } /*----- 水平線及び垂直線の座標が画面の範囲かチェック -----*/ void hvcheckrange(int mode, int *x1, int *y1, int *xy) { if(*x1<0) *x1=0; else if(*x1>XmaxRange) *x1=XmaxRange; if(*y1<0) *y1=0; else if(*y1>YmaxRange) *y1=YmaxRange; if(!mode) { if(*xy<0) *xy=0; else if(*xy>XmaxRange) *xy=XmaxRange; } else { if(*xy<0) *xy=0; else if(*xy>YmaxRange) *xy=YmaxRange; } } /*----- 点を打つ -----*/ void putpixel(int px, int py) { if(checkrange(px, py)) *(FigureBuff+py*HorizonBytes+(px>>3))|=(0x80>>(px&0x07)); } /*----- 水平線を引く -----*/ void hline(int sx, int sy, int ex) { register i, dx; int x1, x2; unsigned char maskL, maskR; unsigned char *aplane; swapif(&sx, &ex); hvcheckrange(0, &sx, &sy, &ex); x1=sx>>3; x2=ex>>3; dx=x2-x1; maskL=LeftMaskTable[sx&0x07]; maskR=RightMaskTable[ex&0x07]; aplane=FigureBuff+sy*HorizonBytes+x1; if(0==dx) *aplane|=maskL&maskR; else { *aplane|=maskL; aplane++; for(i=1; i<dx; i++) *aplane++=0xFF; *aplane|=maskR; } } /*----- 垂直線を引く -----*/ void vline(int sx, int sy, int ey) { register py; unsigned char src; unsigned char *aplane; swapif(&sy, &ey); hvcheckrange(1, &sx, &sy, &ey); src=ShiftTable[sx&0x07]; aplane=FigureBuff+sy*HorizonBytes+(sx>>3); for(py=sy; py<=ey; py++) { *aplane|=src; aplane+=HorizonBytes; } } /*----- 直線を引く -----*/ void line(int x1, int y1, int x2, int y2) { register i, s; int px, py, sx, sy, dx, dy; if(x1==x2) vline(x1, y1, y2); else if(y1==y2) hline(x1, y1, x2); else { px=x1; py=y1; sx=(x2>px)?1:-1; sy=(y2>py)?1:-1; dx=abs(x2-px); dy=abs(y2-py); if(dx>dy) { s=dx>>1; for(i=0; i<=dx; i++) { putpixel(px, py); s+=dy; if(s>dx) { s-=dx; py+=sy; } px+=sx; } } else { s=dy>>1; for(i=0; i<=dy; i++) { putpixel(px, py); s+=dx; if(s>dy) { s-=dy; px+=sx; } py+=sy; } } } } 見づらいかもしれませんが、すみません。 分からないことがいくつかあります。 ①unsigned char ReverseTable[]= 定義の意味と、配列の値について ②src=ShiftTable[sx&0x07]; &0x07について ③*(FigureBuff+py*HorizonBytes+(px>>3))|=(0x80>>(px&0x07)); シフトするのはどんな意味があるのでしょうか? ④16色に変換することが出来そうでしょうか?
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.