Subversion Repositories Kolibri OS

Rev

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

  1. --PALETTE: Expand Colors v1.0
  2. --by Richard Fhager
  3. --http://hem.fyristorg.com/dawnbringer/
  4. -- Email: dawnbringer@hem.utfors.se
  5. -- MSN:   annassar@hotmail.com
  6. --
  7. -- Copyright 2010 Richard Fhager
  8. --
  9. -- This program is free software; you can redistribute it and/or
  10. -- modify it under the terms of the GNU General Public License
  11. -- as published by the Free Software Foundation; version 2
  12. -- of the License. See <http://www.gnu.org/licenses/>
  13.  
  14.  
  15. -- Continously fill the greatest void in the area of the color-cube enclosed by (or along ramps of) initial colors
  16. -- This algorithm will create lines of allowed colors (all ranges) in 3d colorspace and the pick
  17. -- new colors from the most void areas (on any line). Almost like a Median-cut in reverse.
  18. --
  19. -- Rather than filling the colorcube symmetrically it adds intermediate colors to the existing ones.
  20. --
  21. -- Running this script on the C64 16-color palette might be educational
  22. --
  23. --
  24. --   Source cols#, Expand to #,
  25. --   Ex: 15-31 means that palette colors 0-15 is expanded to 16 new colors placed at slots 16-31
  26. --
  27. --    Spread mode: OFF - New colors will conform to the contrast & saturation of original colors
  28. --                       (new colors will stay on the ramps possible from the original colors)
  29. --
  30. --                 ON - New colors will expand their variance by each new addition (mostly notable when adding many new colors)
  31. --                      Will add range lines/ramps to all new colors from old ones, but keep within max/min values of the
  32. --                      original colors. 15-bit mode will dampen the spread towards extreme colors (if starting with low contrast)
  33. --
  34. --  15-bit colors: Higher color-resolution, 32768 possible colors rather than the 4096 of 12bit. Slower but perhaps better.
  35. --
  36.  
  37. SHADES = 16 -- Going 24bit will probably be too slow and steal too much memory, so start with 12bit (4096 colors) for now
  38.  
  39. ini = 0
  40. exp = 255
  41.  
  42. OK,ini,exp,linemode,fbit = inputbox("Expand Colors (0-255):",
  43.                            "Source Cols #: 1-254",    15,  1,254,0,
  44.                            "Expand to #: 2-255",       31,  2,255,0,
  45.                            "Spread mode",       0,  0,1,0,
  46.                            "15-bit colors (slow)", 0,  0,1,0  
  47. );
  48.  
  49. if (fbit == 1) then SHADES = 32; end
  50.  
  51.  
  52.  
  53. function initColorCube(sha)
  54.   ary = {}
  55.   for z = 0, sha-1, 1 do
  56.    ary[z+1] = {}
  57.    for y = 0, sha-1, 1 do
  58.     ary[z+1][y+1] = {}
  59.       for x = 0, sha-1, 1 do
  60.         ary[z+1][y+1][x+1] = {false,0}
  61.       end
  62.    end
  63.   end
  64.   return ary
  65. end
  66.  
  67. -- Gravity model (think of colors as stars of equal mass/brightness in a 3d space)
  68. function addColor2Cube(cube,sha,r,g,b)
  69.   star = 1000000
  70.   fade = 1000
  71.  
  72.   cube[r+1][g+1][b+1] = {false,star}
  73.  
  74.   for z = 0, sha-1, 1 do
  75.    for y = 0, sha-1, 1 do
  76.     for x = 0, sha-1, 1 do
  77.  
  78.       d = fade / ( (x-b)^2 + (y-g)^2 + (z-r)^2 )
  79.  
  80.       cube[z+1][y+1][x+1][2] = cube[z+1][y+1][x+1][2] + d
  81.  
  82.   end;end;end
  83. end
  84.  
  85.  
  86. -- Create new allowed colorlines in colorspace (ramps from which colors can be picked)
  87. function enableRangeColorsInCube(cube,sha,r1,g1,b1,r2,g2,b2)
  88.  
  89.     local div,r,g,b
  90.     div = 256 / sha
  91.     rs = (r2 - r1) / sha / div
  92.     gs = (g2 - g1) / sha / div
  93.     bs = (b2 - b1) / sha / div
  94.  
  95.     for n = 0, sha-1, 1 do
  96.  
  97.      r = math.floor(r1/div + rs * n)
  98.      g = math.floor(g1/div + gs * n)
  99.      b = math.floor(b1/div + bs * n)
  100.  
  101.      cube[r+1][g+1][b+1][1] = true
  102.  
  103.     end
  104. end
  105.  
  106.  
  107. function findVoid(cube,sha)
  108.   weakest = 999999999999
  109.    weak_i = {-1,-1,-1}
  110.   for z = 0, sha-1, 1 do
  111.    for y = 0, sha-1, 1 do
  112.     for x = 0, sha-1, 1 do
  113.  
  114.       c = cube[z+1][y+1][x+1]
  115.       if c[1] == true then
  116.         w = c[2]
  117.         if w <= weakest then weakest = w; weak_i = {z,y,x}; end
  118.       end
  119.    
  120.   end;end;end
  121.   return weak_i[1],weak_i[2],weak_i[3]
  122. end
  123.  
  124. --
  125.  
  126. if OK == true then
  127.  
  128.   cube = initColorCube(SHADES)
  129.  
  130.   -- Define allowed colorspace
  131.   for y = 0, ini-1, 1 do
  132.     r1,g1,b1 = getcolor(y)
  133.     for x = y+1, ini, 1 do
  134.       r2,g2,b2 = getcolor(x)
  135.       enableRangeColorsInCube(cube,SHADES,r1,g1,b1,r2,g2,b2)
  136.     end
  137.   end
  138.  
  139.   div = 256 / SHADES
  140.  
  141.   -- Fill cube with initial colors
  142.   for n = 0, ini, 1 do
  143.     r,g,b = getcolor(n)
  144.     addColor2Cube(cube,SHADES,math.floor(r/div),math.floor(g/div),math.floor(b/div))
  145.   end
  146.  
  147.  
  148.   for n = ini+1, exp, 1 do
  149.     r,g,b = findVoid(cube,SHADES)
  150.  
  151.     if (r == -1) then messagebox("Report:","No more colors can be found, exit at "..n); break; end
  152.  
  153.     mult = 255 / (SHADES - 1)
  154.     setcolor(n, r*mult,g*mult,b*mult)  
  155.  
  156.     if linemode == 1 then
  157.        -- Add lines from new color to all old  
  158.        for x = 0, n-1, 1 do
  159.           r2,g2,b2 = getcolor(x)
  160.           enableRangeColorsInCube(cube,SHADES,r*mult,g*mult,b*mult,r2,g2,b2) -- uses 24bit values rgb
  161.        end
  162.     end
  163.    
  164.     addColor2Cube(cube,SHADES,r,g,b) -- rgb is in 'shade' format here
  165.    
  166.   end
  167.  
  168. end
  169.  
  170.  
  171.  
  172.