Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5305 | codemaster | 1 | ; $$$$$$$$$$$$$$$$$$$ ABAKIS $$$$$$$$$$$$$$$$$$$$$ |
2 | ; *************** STAR^2 SOFTWARE **************** |
||
3 | ; ?????????????????? COLOR.INC ??????????????????? |
||
4 | |||
5 | COLOR fix integer |
||
6 | PIXEL fix integer |
||
7 | |||
8 | ; rgb r, g, b |
||
9 | ; get.rgb c, &r, &g, &b |
||
10 | ; set.rgb &c, r, g, b |
||
11 | |||
12 | ; mix a, b, n ; alpha combination |
||
13 | ; lightness c, n ; adjust light/darkness. n=+/- |
||
14 | ; colorize a, b, n ; in/decrease r/g/b |
||
15 | ; grayscale c ; convert to grayscale |
||
16 | ; inversion c ; invert |
||
17 | ; channelize a, b ; split r/g/b channel |
||
18 | |||
19 | ; PAL1 = I (2) |
||
20 | ; PAL2 = II (4) |
||
21 | ; PAL4 = IIII (16) |
||
22 | ; PAL8 = IIIIIIII (256) |
||
23 | ; PAL10 = IIIIIIIIII (1K, 1024) |
||
24 | ; PAL12 = IIIIIIIIIIII (4K, 4096) |
||
25 | ; RGB15 = X.RRRRR.GGGGG.BBBBB (32768, 32K) |
||
26 | ; RGB16 = RRRRR.GGGGGG.BBBBB (65535, 64K) |
||
27 | ; RGB24 = R8.G8.B8 (16777216, 16M) |
||
28 | ; RGB32 = A8.R8.G8.B8 (same with alpha) |
||
29 | |||
30 | ; "standard" colors |
||
31 | |||
32 | numeric BLACK=0, WHITE=0FFFFFFh,\ |
||
33 | RED=0FF0000h, GREEN=0FF00h, BLUE=0FFh,\ |
||
34 | CYAN=BLUE+GREEN, MAGENTA=RED+BLUE,\ |
||
35 | YELLOW=RED+GREEN, GRAY32=202020h,\ |
||
36 | GRAY64=404040h, GRAY128=808080h,\ |
||
37 | GRAY192=0C0C0C0h, GRAY224=0E0E0E0h,\ |
||
38 | GRAY=808080h, GRAY25=404040h,\ |
||
39 | GRAY50=GRAY, GRAY75=0C0C0C0h |
||
40 | |||
41 | ; personally selected "cool colors". includes |
||
42 | ; nature colors for custom brushes/textures - |
||
43 | ; grass, dirt, etc |
||
44 | |||
45 | numeric \ |
||
46 | RED.CHERRY=720E21h, FIRE.RED=821100h,\ |
||
47 | RED.ROSE=7B0024h, DARK.RED=470707h,\ |
||
48 | POWER.BLUE=0B008Ah, ROYAL.BLUE=140357h,\ |
||
49 | BEACH.BLUE=0362C1h, DARK.BLUE=070720h,\ |
||
50 | ICE.BLUE=8ACAE2h, SKY.BLUE=0A3A3F9h,\ |
||
51 | CLOUD.BLUE=11A3F5h, BABY.BLUE=4F77FFh,\ |
||
52 | LILAC=0DA4FE7h, PURPLE=700E7Fh,\ |
||
53 | VIOLET=08C047Ah, DARK.VIOLET=2D0327h,\ |
||
54 | LIME.GREEN=8CE007h, SEA.GREEN=72CC90h,\ |
||
55 | LEAF.GREEN=7EBB1Dh, GRASS.GREEN=507B11h,\ |
||
56 | DARK.GREEN=0B1F0Fh, EMERALD.GREEN=1C3E14h,\ |
||
57 | PINK=0FF67A0h, PASTEL.PINK=0F7A7CFh,\ |
||
58 | ROSE.PINK=0FB57A0h, PINK.FLESH=0FBD7BDh,\ |
||
59 | FLESH=0FCEEDEh, MEDIUM.FLESH=0EF9F5Dh,\ |
||
60 | DARK.FLESH=0E87D2Eh, LIGHT.BROWN=0C77237h,\ |
||
61 | DARK.BROWN=4D2207h, ORANGE.BROWN=0B04700h,\ |
||
62 | RED.BROWN=782712h, SAND=0D1A877h,\ |
||
63 | COOL.GRAY=837B9Bh, LILAC.GRAY=0E1ABFFh,\ |
||
64 | METAL.GRAY=0AEBEBEh, LIGHT.GRAY=0E7E7E7h |
||
65 | |||
66 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
67 | |||
68 | ; construct RGB 24/32BPP. assumes 0-255 |
||
69 | |||
70 | function rgb, r, g, b |
||
71 | . r0=r, r0<<16, r1=g, r1<<8,\ |
||
72 | r0|r1, r2=b, r0|r2 |
||
73 | endf |
||
74 | |||
75 | macro rgbm r, g, b { |
||
76 | . r0=r, r0<<16, r1=g, r1<<8,\ |
||
77 | r0|r1, r0|b |
||
78 | } |
||
79 | |||
80 | ; with truncation. ensure 0-255 |
||
81 | |||
82 | function rgbc, r, g, b |
||
83 | . r0=r, r0&0FFh, r0<<16,\ |
||
84 | r1=g, r1&0FFh, r1<<8, r0|r1,\ |
||
85 | r2=b, r2&0FFh, r0|r2 |
||
86 | endf |
||
87 | |||
88 | ; extract rgb components from color |
||
89 | ; parameters: c, &r, &g, &b. addresses |
||
90 | |||
91 | function get.rgb, c, r, g, b |
||
92 | . r0=c,\ |
||
93 | r1=r0, r1>>16, r1&0FFh, r2=r, [r2]=r1,\ |
||
94 | r1=r0, r1>>8, r1&0FFh, r2=g, [r2]=r1,\ |
||
95 | r1=r0, r1&0FFh, r2=b, [r2]=r1 |
||
96 | endf |
||
97 | |||
98 | ; set rgb of color. parameters: &c, r, g, b. |
||
99 | ; c is address |
||
100 | |||
101 | function set.rgb, c, r, g, b |
||
102 | rgbm r, g, b |
||
103 | . r1=c, [r1]=r0 |
||
104 | endf |
||
105 | |||
106 | ;;;;;;;;;;;;;;;;;;; CLIP RGB ;;;;;;;;;;;;;;;;;;;;; |
||
107 | |||
108 | ; clip RGB components, 0-255. if c |
||
109 | ; if c>max, c=max. all parameters are address |
||
110 | |||
111 | function clip.c, c |
||
112 | . r0=c, r0=[r0] |
||
113 | if r0<0, r0=0 |
||
114 | else.if r0>255 |
||
115 | r0=255 |
||
116 | end |
||
117 | . r2=c, [r2]=r0 |
||
118 | endf |
||
119 | |||
120 | function clip.rgb, r, g, b |
||
121 | clip.c r |
||
122 | clip.c g |
||
123 | clip.c b |
||
124 | endf |
||
125 | |||
126 | ;;;;;;;;;;;;;;;;;;;;; ALPHA ;;;;;;;;;;;;;;;;;;;;;; |
||
127 | |||
128 | ; mix a, b, n - alpha blend/combination. |
||
129 | ; n=0-255. (((s-d)*n)/256)+d |
||
130 | |||
131 | function mix, a, b, n |
||
132 | locals sr, sg, sb, dr, dg, db |
||
133 | . r0=a, r2=b,\ |
||
134 | r1=r0, r1>>16, r1&0FFh, sr=r1,\ |
||
135 | r1=r0, r1>>8, r1&0FFh, sg=r1,\ |
||
136 | r1=r0, r1&0FFh, sb=r1,\ |
||
137 | r1=r2, r1>>16, r1&0FFh, dr=r1,\ |
||
138 | r1=r2, r1>>8, r1&0FFh, dg=r1,\ |
||
139 | r1=r2, r1&0FFh, db=r1,\ |
||
140 | r0=sr, r0-dr, r0*n, r0>>8, r0+dr,\ |
||
141 | r1=sg, r1-dg, r1*n, r1>>8, r1+dg,\ |
||
142 | r2=sb, r2-db, r2*n, r2>>8, r2+db,\ |
||
143 | r0<<16, r1<<8, r0|r1, r0|r2 |
||
144 | endf |
||
145 | |||
146 | ; mix25/50/75 a, b, n - much faster |
||
147 | ; if alpha is constant 25%/50%/75% |
||
148 | ; ((a&0FEFEFEh)>>1)|((b&0FEFEFEh)>>1) |
||
149 | |||
150 | macro mix50 a, b { |
||
151 | . r0=a, r2=b, r1=0FEFEFEh,\ |
||
152 | r0&r1, r0>>1, r2&r1, r2>>1, r0|r2 |
||
153 | } |
||
154 | |||
155 | function mix25, a, b |
||
156 | mix50 a, b |
||
157 | mix50 r0, b |
||
158 | endf |
||
159 | |||
160 | function mix75, a, b |
||
161 | mix50 a, b |
||
162 | mix50 a, r0 |
||
163 | endf |
||
164 | |||
165 | ;;;;;;;;;;;;;;;; COLOR OPERATIONS ;;;;;;;;;;;;;;;; |
||
166 | |||
167 | macro operation name, [ps] { |
||
168 | common |
||
169 | function name, ps |
||
170 | locals r, g, b |
||
171 | . r0=&r, r1=&g, r2=&b |
||
172 | get.rgb c, r0, r1, r2 |
||
173 | ; ... |
||
174 | } |
||
175 | |||
176 | macro endo { |
||
177 | ; ... |
||
178 | . r0=&r, r1=&g, r2=&b |
||
179 | clip.rgb r0, r1, r2 |
||
180 | rgb r, g, b |
||
181 | endf |
||
182 | } |
||
183 | |||
184 | ; adjust light/darkness. n=+/- |
||
185 | |||
186 | operation lightness, c, n |
||
187 | . r1=n, r+r1, g+r1, b+r1 |
||
188 | endo |
||
189 | |||
190 | ; in/decrease r/g/b |
||
191 | |||
192 | operation colorize, c, x, n |
||
193 | . r1=n |
||
194 | if x=RED, r+r1, g-r1, b-r1 |
||
195 | else.if x=GREEN, r-r1, g+r1, b-r1 |
||
196 | else.if x=BLUE, r-r1, g-r1, b+r1 |
||
197 | end |
||
198 | endo |
||
199 | |||
200 | ; convert to grayscale. algorithm: |
||
201 | ; g=(r+g+b)/3, rgb(g,g,g). no "endo" |
||
202 | ; after. r0=return. note: n/3 = |
||
203 | ; (n*155h)>>10 |
||
204 | |||
205 | operation grayscale, c |
||
206 | . r0=r, r0+g, r0+b, r0*155h,\ |
||
207 | r0>>>10, r1=r0, r1<<8, r0|r1,\ |
||
208 | r1<<8, r0|r1 |
||
209 | endf |
||
210 | |||
211 | ; invert color: c=255-c |
||
212 | |||
213 | operation inversion, c |
||
214 | . \ |
||
215 | r1=255, r1-r, r0=&r, [r0]=r1,\ |
||
216 | r1=255, r1-g, r0=&g, [r0]=r1,\ |
||
217 | r1=255, r1-b, r0=&b, [r0]=r1 |
||
218 | endo |
||
219 | |||
220 | ; split rgb channel: a=&~b. for 3D |
||
221 | ; anaglyph images with R/B glasses |
||
222 | |||
223 | function channelize, a, b |
||
224 | . r0=a, r1=b, not r1, r0&r1 |
||
225 | endf |
||
226 | |||
227 | purge operation, endo8,><8,>8,><8,>8,><8,>16,><16,>0,>8,><8,>16,\ |