hypercube-0.2.4
[polytopiary:hypercube.git] / palette.c
1 /* funky colour palettes */
2
3 #include <vga.h>
4 #include <vgagl.h>
5
6 #include "fixed.h"
7 #include "palette.h"
8
9 void rgb_zero(rgb *to) {
10     (*to)[0] = f_itof(0);
11     (*to)[1] = f_itof(0);
12     (*to)[2] = f_itof(0);
13 }
14
15 void rgb_one(rgb *to) {
16     (*to)[0] = f_itof(1);
17     (*to)[1] = f_itof(1);
18     (*to)[2] = f_itof(1);
19 }
20
21 void rgb_copy(rgb *to, rgb *from) {
22     (*to)[0] = (*from)[0];
23     (*to)[1] = (*from)[1];
24     (*to)[2] = (*from)[2];
25 }
26
27 void rgb_add(rgb *to, rgb *from) {
28     (*to)[0] += (*from)[0];
29     (*to)[1] += (*from)[1];
30     (*to)[2] += (*from)[2];
31 }
32
33 void rgb_mul(rgb *to, rgb *from) {
34     (*to)[0] = f_mul((*to)[0], (*from)[0]);
35     (*to)[1] = f_mul((*to)[1], (*from)[1]);
36     (*to)[2] = f_mul((*to)[2], (*from)[2]);
37 }
38
39 void rgb_sadd(rgb *to, fixed f) {
40     (*to)[0] = f_add((*to)[0], f);
41     (*to)[1] = f_add((*to)[1], f);
42     (*to)[2] = f_add((*to)[2], f);
43 }
44
45 void rgb_smul(rgb *to, fixed f) {
46     (*to)[0] = f_mul((*to)[0], f);
47     (*to)[1] = f_mul((*to)[1], f);
48     (*to)[2] = f_mul((*to)[2], f);
49 }
50
51 void rgb_sdiv(rgb *to, fixed f) {
52     (*to)[0] = f_div((*to)[0], f);
53     (*to)[1] = f_div((*to)[1], f);
54     (*to)[2] = f_div((*to)[2], f);
55 }
56
57 void rgb_normalize(rgb *to) {
58     fixed max;
59     int i;
60     max = 0;
61     for (i = 0; i < 3; i++) {
62         if ((*to)[i] > max) {
63             max = (*to)[i];
64         }
65     }
66     if (max) {
67         rgb_sdiv(to, max + 1);
68     }
69 }
70
71 void p_planar8bit(rgb256 *p, int a) {
72     int c, b, n;
73     rgb core[8];
74     rgb colour;
75     for (c = 0; c < 8; c++) {
76         core[c][0] = (128 + f_sin((c << 6) + a +   0)) >> 1;
77         core[c][1] = (128 + f_sin((c << 6) + a + 171)) >> 1;
78         core[c][2] = (128 + f_sin((c << 6) + a + 341)) >> 1;
79     }
80     for (c = 0; c < 256; c++) {
81         rgb_zero(&colour);
82         n = 0;
83         for (b = 0; b < 8; b++) {
84             if (c & (1<<b)) {
85                 rgb_add(&colour, &(core[b]));
86                 n++;
87             }
88         }
89         rgb_sdiv(&colour, 8);
90         rgb_copy(&((*p)[c]), &colour);
91     }
92 }
93
94 void p_set(rgb256 *p) {
95     int c;
96     for (c = 0; c < 256; c++) {
97         gl_setpalettecolor(c,
98             rgb_fto64((*p)[c][0]),
99             rgb_fto64((*p)[c][1]),
100             rgb_fto64((*p)[c][2])
101         );
102     }
103 }
104
105 /* EOF */