Subversion Repositories Kolibri OS

Rev

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, endo