2004년 9월 15일 수요일

Color table

C로 만드는 색상표 소스.


#include "../common/common.h"
#include "../common/gif.h"

int l, r, n, cb,cw;
double dx, dy, mx, my;

void SetBox (class GIFIMAGEMAP *gif, int _r, int _g, int _b) {
    char str[30];
    int i, c;
   
    if (n < r) {
        mx += dx;
        my += dy/2;
        n++;
    } else if (n < r*2) {
        my += dy;
        n++;
    } else if (n < r*3) {
        mx -= dx;
        my += dy/2;
        n++;
    } else if (n < r*4) {
        mx -= dx;
        my -= dy/2;
        n++;
    } else if (n < r*5) {
        my -= dy;
        n++;
    } else if (n < r*6) {
        mx += dx;
        my -= dy/2;
        n++;
        if (n == r*6) {
            r++;
            n = 0;
            my -= dy;
        }
    } else {
        r++;
        n = 0;
        my -= dy;
    }
   
    _r *= 51;
    _g *= 51;
    _b *= 51;
    c = gif->SetColorRGB (_r,_g,_b);
    for (i=-int(dy/2); i<dy/2; i++) {
        gif->Line (mx-l, my, mx-l/2, my+i, c);
        gif->Line (mx+l, my, mx+l/2, my+i, c);
    }
    gif->Bar (mx-l/2, my-dy/2, mx+l/2, my+dy/2, c);
   
    gif->Line (mx-l, my, mx-l/2, my-dy/2, cb);
    gif->Line (mx-l, my, mx-l/2, my+dy/2, cb);
    gif->Line (mx+l, my, mx+l/2, my-dy/2, cb);
    gif->Line (mx+l, my, mx+l/2, my+dy/2, cb);
    gif->Line (mx-l/2, my-dy/2, mx+l/2, my-dy/2, cb);
    gif->Line (mx-l/2, my+dy/2, mx+l/2, my+dy/2, cb);
   
    sprintf (str, "%02X%02X%02X", _r,_g,_b);
    if (_r*76+_g*150+_b*29 < 38250) c = cw;
    else c = cb;
    gif->TextOutBig (mx-21, my-12, str, c, 7);
    gif->TextOutBig (mx-20, my-12, str, c, 7);
    sprintf (str, "%d.%d.%d", _r,_g,_b);
    gif->TextOut (mx-strlen(str)*3, my+4, str, c);
}

void main () {
    FILE *fp;
    class GIFIMAGEMAP gif;
    int c, i;
    char s[2];
    char code[] = {
    4,4,4, 5,5,5, 0,0,0, 1,1,1, 2,2,2, 3,3,3,
    5,4,3, 5,4,4, 5,3,4, 5,4,5, 4,3,5, 4,4,5, 3,4,5, 4,5,5, 3,5,4, 4,5,4, 4,5,3, 5,5,4,
    4,3,2, 4,3,3, 5,3,3, 4,2,3, 4,3,4, 5,3,5, 3,2,4, 3,3,4, 3,3,5, 2,3,4, 3,4,4, 3,5,5, 2,4,3, 3,4,3, 3,5,3, 3,4,2, 4,4,3, 5,5,3,
    3,2,1, 3,2,2, 4,2,2, 5,2,2, 3,1,2, 3,2,3, 4,2,4, 5,2,5, 2,1,3, 2,2,3, 2,2,4, 2,2,5, 1,2,3, 2,3,3, 2,4,4, 2,5,5, 1,3,2, 2,3,2, 2,4,2, 2,5,2, 2,3,1, 3,3,2, 4,4,2, 5,5,2,
    2,1,0, 2,1,1, 3,1,1, 4,1,1, 5,1,1, 2,0,1, 2,1,2, 3,1,3, 4,1,4, 5,1,5, 1,0,2, 1,1,2, 1,1,3, 1,1,4, 1,1,5, 0,1,2, 1,2,2, 1,3,3, 1,4,4, 1,5,5, 0,2,1, 1,2,1, 1,3,1, 1,4,1, 1,5,1, 1,2,0, 2,2,1, 3,3,1, 4,4,1, 5,5,1,
    4,2,0, 1,0,0, 2,0,0, 3,0,0, 4,0,0, 5,0,0, 4,0,2, 1,0,1, 2,0,2, 3,0,3, 4,0,4, 5,0,5, 2,0,4, 0,0,1, 0,0,2, 0,0,3, 0,0,4, 0,0,5, 0,2,4, 0,1,1, 0,2,2, 0,3,3, 0,4,4, 0,5,5, 0,4,2, 0,1,0, 0,2,0, 0,3,0, 0,4,0, 0,5,0, 2,4,0, 1,1,0, 2,2,0, 3,3,0, 4,4,0, 5,5,0,
    5,3,1, 5,3,2, 4,2,1, 3,1,0, 3,0,1, 4,1,2, 5,2,3, 5,1,3, 5,2,4, 4,1,3, 3,0,2, 2,0,3, 3,1,4, 4,2,5, 3,1,5, 3,2,5, 2,1,4, 1,0,3, 0,1,3, 1,2,4, 2,3,5, 1,3,5, 2,4,5, 1,3,4, 0,2,3, 0,3,2, 1,4,3, 2,5,4, 1,5,3, 2,5,3, 1,4,2, 0,3,1, 1,3,0, 2,4,1, 3,5,2, 3,5,1, 4,5,2, 3,4,1, 2,3,0, 3,2,0, 4,3,1, 5,4,2,
    5,2,0, 5,1,0, 5,2,1, 4,1,0, 4,0,1, 5,1,2, 5,0,1, 5,0,2, 5,0,3, 5,0,4, 5,1,4, 4,0,3, 3,0,4, 4,1,5, 4,0,5, 3,0,5, 2,0,5, 1,0,5, 2,1,5, 1,0,4, 0,1,4, 1,2,5, 0,1,5, 0,2,5, 0,3,5, 0,4,5, 1,4,5, 0,3,4, 0,4,3, 1,5,4, 0,5,4, 0,5,3, 0,5,2, 0,5,1, 1,5,2, 0,4,1, 1,4,0, 2,5,1, 1,5,0, 2,5,0, 3,5,0, 4,5,0, 4,5,1, 3,4,0, 4,3,0, 5,4,1, 5,4,0, 5,3,0
    };
   
    l = 42;
    r = n = 0;
    dx = 1.5*l;
    dy = 1.732050807568877*l;
    mx = 650.0;
    my = 700.0;
   
    gif.CreateCanvas (1300, 1400);
    cb = gif.SetColor (0x000000);
    cw = gif.SetColor (0xFFFFFF);
   
    // 216
    for (i=0; i<sizeof(code)/3; i++)
        SetBox (&gif, code[i*3],code[i*3+1],code[i*3+2]);
    for (i=0; i<54; i++)
        SetBox (&gif, 0,0,0);
   
    fp = fopen ("hi.gif", "wb");
    gif.PrintCanvas (fp);
    fclose (fp);
   
    gif.DistroyCanvas ();
}