source: branches/v2.9/JPGPROC/source/gbmsrc/_gbmtrun.c

Last change on this file was 2, checked in by stevenhl, 8 years ago

Import sources from cwmm-full.zip dated 2005-03-21

File size: 2.0 KB
Line 
1/*
2
3_gbmtrun.c - Calculate the quick 'closest-colour' lookup table for gbmtrunc.c
4
5*/
6
7#include <stdio.h>
8#include "gbm.h"
9
10/*...sVGA palette:0:*/
11static GBMRGB gbmrgb_vga[] =
12 {
13 0, 0, 0,
14 128, 0, 0,
15 0,128, 0,
16 128,128, 0,
17 0, 0,128,
18 128, 0,128,
19 0,128,128,
20 128,128,128,
21 204,204,204,
22 255, 0, 0,
23 0,255, 0,
24 255,255, 0,
25 0, 0,255,
26 255, 0,255,
27 0,255,255,
28 255,255,255,
29 };
30/*...e*/
31/*...scalc_nearest:0:*/
32/*
33This function, when given am RGB colour, finds the VGA palette entry closest
34to it. We deliberately bias away from the two grey palette entries.
35*/
36
37static byte calc_nearest(byte r, byte g, byte b)
38 {
39 long min_dist = 3L * 256L * 256L * 10L;
40 byte bi, bi_min;
41
42 for ( bi = 0; bi < 0x10; bi++ )
43 {
44 long b_dist = ((long) b - (long) gbmrgb_vga[bi].b);
45 long g_dist = ((long) g - (long) gbmrgb_vga[bi].g);
46 long r_dist = ((long) r - (long) gbmrgb_vga[bi].r);
47 long dist = r_dist * r_dist + g_dist * g_dist + b_dist * b_dist;
48
49 if ( dist < min_dist )
50 {
51 min_dist = dist;
52 bi_min = bi;
53 }
54 }
55 return ( bi_min );
56 }
57/*...e*/
58
59static char *dw_casings[] =
60 {
61 "\t%d,", "%d,", "%d,", "%d,", "%d,", "%d,", "%d,", "%d,",
62 "%d,", "%d,", "%d,", "%d,", "%d,", "%d,", "%d,", "%d,\n",
63 };
64
65int main(void)
66 {
67 byte r, r0, r1, g, g0, g1, b, b0, b1, i = 0;
68
69 printf("static byte quick_tab[16][16][16] =\n\t{\n");
70
71 for ( r = 0, r0 = 0, r1 = 15; r < 16; r++, r0 += 16, r1 += 16 )
72 for ( g = 0, g0 = 0, g1 = 15; g < 16; g++, g0 += 16, g1 += 16 )
73 for ( b = 0, b0 = 0, b1 = 15; b < 16; b++, b0 += 16, b1 += 16 )
74/*...sanalyse cube:32:*/
75{
76byte n = calc_nearest(r0, g0, b0);
77byte inx;
78
79if ( n == calc_nearest(r0, g0, b1) &&
80 n == calc_nearest(r0, g1, b0) &&
81 n == calc_nearest(r0, g1, b1) &&
82 n == calc_nearest(r1, g0, b0) &&
83 n == calc_nearest(r1, g0, b1) &&
84 n == calc_nearest(r1, g1, b0) &&
85 n == calc_nearest(r1, g1, b1) )
86 inx = n;
87else
88 inx = (byte) 0xff;
89printf(dw_casings[i++ & 15], (int) inx);
90}
91/*...e*/
92
93 printf("\t};\n");
94 return 0;
95 }
Note: See TracBrowser for help on using the repository browser.