Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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<min, c=min.
  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