185 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{
 | 
						|
     Apophysis Copyright (C) 2001-2004 Mark Townsend
 | 
						|
     Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov
 | 
						|
     Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov
 | 
						|
     
 | 
						|
     Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov
 | 
						|
     Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne
 | 
						|
     Apophysis AV "Phoenix Edition" Copyright (C) 2021-2022 Alice V. Koryagina
 | 
						|
 | 
						|
     This program is free software; you can redistribute it and/or modify
 | 
						|
     it under the terms of the GNU General Public License as published by
 | 
						|
     the Free Software Foundation; either version 2 of the License, or
 | 
						|
     (at your option) any later version.
 | 
						|
 | 
						|
     This program is distributed in the hope that it will be useful,
 | 
						|
     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
     GNU General Public License for more details.
 | 
						|
 | 
						|
     You should have received a copy of the GNU General Public License
 | 
						|
     along with this program; if not, write to the Free Software
 | 
						|
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
}
 | 
						|
 | 
						|
unit GradientHlpr;
 | 
						|
 | 
						|
interface
 | 
						|
 | 
						|
uses
 | 
						|
  Graphics, Cmap;
 | 
						|
 | 
						|
type
 | 
						|
  TGradientHelper = class
 | 
						|
  private
 | 
						|
    //procedure RGBBlend(a, b: integer; var Palette: TColorMap);
 | 
						|
  public
 | 
						|
    function GetGradientBitmap(Index: integer; const hue_rotation: double): TBitmap;
 | 
						|
    function RandomGradient: TColorMap;
 | 
						|
  end;
 | 
						|
 | 
						|
var
 | 
						|
  GradientHelper: TGradientHelper;
 | 
						|
 | 
						|
implementation
 | 
						|
 | 
						|
uses
 | 
						|
  Global;
 | 
						|
 | 
						|
{ TGradientHelper }
 | 
						|
 | 
						|
function TGradientHelper.GetGradientBitmap(Index: integer; const hue_rotation: double): TBitmap;
 | 
						|
var
 | 
						|
  BitMap: TBitMap;
 | 
						|
  i, j: integer;
 | 
						|
  Row: pRGBTripleArray;
 | 
						|
  pal: TColorMap;
 | 
						|
begin
 | 
						|
  GetCMap(index, hue_rotation, pal);
 | 
						|
 | 
						|
  BitMap := TBitMap.create;
 | 
						|
  Bitmap.PixelFormat := pf24bit;
 | 
						|
  BitMap.Width := 256;
 | 
						|
  BitMap.Height := 2;
 | 
						|
 | 
						|
  for j := 0 to Bitmap.Height - 1 do begin
 | 
						|
    Row := Bitmap.Scanline[j];
 | 
						|
    for i := 0 to Bitmap.Width - 1 do begin
 | 
						|
      Row[i].rgbtRed := Pal[i][0];
 | 
						|
      Row[i].rgbtGreen := Pal[i][1];
 | 
						|
      Row[i].rgbtBlue := Pal[i][2];
 | 
						|
    end
 | 
						|
  end;
 | 
						|
 | 
						|
  Result := BitMap;
 | 
						|
end;
 | 
						|
 | 
						|
{//////////////////////////////////////////////////////////////////////////////}
 | 
						|
function TGradientHelper.RandomGradient: TColorMap;
 | 
						|
var
 | 
						|
  a, b, i, n, nodes: integer;
 | 
						|
  c: byte;
 | 
						|
  rgb: array[0..2] of double;
 | 
						|
  hsv: array[0..2] of double;
 | 
						|
  pal: TColorMap;
 | 
						|
begin
 | 
						|
  rgb[0] := 0;
 | 
						|
  rgb[1] := 0;
 | 
						|
  rgb[2] := 0;
 | 
						|
 | 
						|
  inc(MainSeed);
 | 
						|
  RandSeed := Mainseed;
 | 
						|
  nodes := random((MaxNodes - 1) - (MinNodes - 2)) + (MinNodes - 1);
 | 
						|
  n := 256 div nodes;
 | 
						|
  b := 0;
 | 
						|
  hsv[0] := 0.01 * (random(MaxHue - (MinHue - 1)) + MinHue);
 | 
						|
  hsv[1] := 0.01 * (random(MaxSat - (MinSat - 1)) + MinSat);
 | 
						|
  hsv[2] := 0.01 * (random(MaxLum - (MinLum - 1)) + MinLum);
 | 
						|
  hsv2rgb(hsv, rgb);
 | 
						|
  Pal[0][0] := Round(rgb[0] * 255);
 | 
						|
  Pal[0][1] := Round(rgb[1] * 255);
 | 
						|
  Pal[0][2] := Round(rgb[2] * 255);
 | 
						|
  c := 0;
 | 
						|
  repeat
 | 
						|
    a := b;
 | 
						|
    if EqualStripes then
 | 
						|
      b := b + n
 | 
						|
    else begin
 | 
						|
      inc(c);
 | 
						|
      if c = nodes then
 | 
						|
        b := 255
 | 
						|
      else begin
 | 
						|
        i := Random(256 - b);
 | 
						|
        b := b + i;
 | 
						|
      end;
 | 
						|
    end;
 | 
						|
    hsv[0] := 0.01 * (random(MaxHue - (MinHue - 1)) + MinHue);
 | 
						|
    hsv[1] := 0.01 * (random(MaxSat - (MinSat - 1)) + MinSat);
 | 
						|
    hsv[2] := 0.01 * (random(MaxLum - (MinLum - 1)) + MinLum);
 | 
						|
    hsv2rgb(hsv, rgb);
 | 
						|
    if b > 255 then b := 255;
 | 
						|
    Pal[b][0] := Round(rgb[0] * 255);
 | 
						|
    Pal[b][1] := Round(rgb[1] * 255);
 | 
						|
    Pal[b][2] := Round(rgb[2] * 255);
 | 
						|
    case randColorBlend of
 | 
						|
    0:  RGBBlend(a, b, pal);
 | 
						|
    1:  HSVBlend(a, b, pal);
 | 
						|
    else
 | 
						|
      for i := a + 1 to b - 1 do
 | 
						|
      begin
 | 
						|
        Pal[i][0] := Round(rgb[0] * 255);
 | 
						|
        Pal[i][1] := Round(rgb[1] * 255);
 | 
						|
        Pal[i][2] := Round(rgb[2] * 255);
 | 
						|
      end;
 | 
						|
    end;
 | 
						|
  until b = 255;
 | 
						|
  Result := Pal;
 | 
						|
end;
 | 
						|
 | 
						|
{//////////////////////////////////////////////////////////////////////////////}
 | 
						|
(*   // AV: how many duplicated code has this app...
 | 
						|
procedure TGradientHelper.RGBBlend(a, b: integer; var Palette: TColorMap);
 | 
						|
{ Linear blend between to indices of a palette }
 | 
						|
var
 | 
						|
  c, v: real;
 | 
						|
  vrange, range: real;
 | 
						|
  i: integer;
 | 
						|
begin
 | 
						|
  if a = b then
 | 
						|
  begin
 | 
						|
    Exit;
 | 
						|
  end;
 | 
						|
  range := b - a;
 | 
						|
  vrange := Palette[b mod 256][0] - Palette[a mod 256][0];
 | 
						|
  c := Palette[a mod 256][0];
 | 
						|
  v := vrange / range;
 | 
						|
  for i := (a + 1) to (b - 1) do
 | 
						|
  begin
 | 
						|
    c := c + v;
 | 
						|
    Palette[i mod 256][0] := Round(c);
 | 
						|
  end;
 | 
						|
  vrange := Palette[b mod 256][1] - Palette[a mod 256][1];
 | 
						|
  c := Palette[a mod 256][1];
 | 
						|
  v := vrange / range;
 | 
						|
  for i := a + 1 to b - 1 do
 | 
						|
  begin
 | 
						|
    c := c + v;
 | 
						|
    Palette[i mod 256][1] := Round(c);
 | 
						|
  end;
 | 
						|
  vrange := Palette[b mod 256][2] - Palette[a mod 256][2];
 | 
						|
  c := Palette[a mod 256][2];
 | 
						|
  v := vrange / range;
 | 
						|
  for i := a + 1 to b - 1 do
 | 
						|
  begin
 | 
						|
    c := c + v;
 | 
						|
    Palette[i mod 256][2] := Round(c);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
*)
 | 
						|
{//////////////////////////////////////////////////////////////////////////////}
 | 
						|
initialization
 | 
						|
  GradientHelper := TGradientHelper.create;
 | 
						|
finalization
 | 
						|
  GradientHelper.Free;
 | 
						|
end.
 |