123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2003 by the Free Pascal development team
- TFPPalette implementation.
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- 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.
- **********************************************************************}
- { TFPPalette }
- constructor TFPPalette.create (ACount : integer);
- begin
- inherited create;
- if aCount > 0 then
- getmem (FData, sizeof(TFPColor)*ACount)
- else
- FData := nil;
- FCapacity := ACount;
- SetCount (0);
- end;
- destructor TFPPalette.destroy;
- begin
- if FCapacity > 0 then
- freemem (FData);
- inherited;
- end;
- procedure TFPPalette.Build (Img : TFPCustomImage);
- var x,y : integer;
- begin
- if (Img.Palette <> self) then
- begin
- Count := 0;
- for x := 0 to img.width-1 do
- for y := 0 to img.height-1 do
- IndexOf(img[x,y]);
- end;
- end;
- procedure TFPPalette.Copy(APalette: TFPPalette);
- var
- x: integer;
- begin
- if (APalette <> Self) then
- begin
- Self.Clear;
- for x := 0 to APalette.Count - 1 do
- Add(APalette.Color[x])
- end;
- end;
- procedure TFPPalette.Merge (pal : TFPPalette);
- var r : integer;
- begin
- for r := 0 to pal.count-1 do
- IndexOf (pal[r]);
- end;
- procedure TFPPalette.CheckIndex (index:integer);
- begin
- if (index >= FCount) or (index < 0) then
- FPImgError (StrInvalidIndex,[ErrorText[StrPalette],index]);
- end;
- function TFPPalette.Add (const Value:TFPColor) : integer;
- begin
- result := FCount;
- inc (FCount);
- if FCount > FCapacity then
- EnlargeData;
- FData^[result] := Value;
- end;
- procedure TFPPalette.SetColor (index:integer; const Value:TFPColor);
- begin
- if index = FCount then
- Add (Value)
- else
- begin
- CheckIndex (index);
- FData^[index] := Value;
- end;
- end;
- function TFPPalette.GetColor (index:integer) : TFPColor;
- begin
- CheckIndex (index);
- result := FData^[index];
- end;
- function TFPPalette.GetCount : integer;
- begin
- result := FCount;
- end;
- procedure TFPPalette.EnlargeData;
- var old : integer;
- NewData : PFPColorArray;
- begin
- old := FCapacity;
- if FCapacity <= 16 then
- FCapacity := 32
- else if FCapacity <= 128 then
- FCapacity := 256
- else
- // MG: changed to exponential growth
- inc (FCapacity, FCapacity);
- GetMem (NewData, sizeof(TFPColor)*FCapacity);
- if old > 0 then
- begin
- move (FData^[0], NewData^[0], sizeof(TFPColor)*FCount);
- FreeMem (FData);
- end;
- FData := NewData;
- end;
- procedure TFPPalette.SetCount (Value:integer);
- var
- O : integer;
- begin
- if Value <> FCount then
- begin
- if Value > FCapacity then
- begin
- FCapacity := Value+8;
- Reallocmem(FData,sizeof(TFPColor)*FCapacity);
- end;
- for o := FCount to Value-1 do
- FData^[o] := colBlack;
- FCount := Value;
- end;
- end;
- procedure TFPPalette.SetCapacity (ind : Integer);
- var o : Integer;
- begin
- if ind<count then ind:=count;
- if ind<>fcapacity then
- begin
- fcapacity:=ind;
- Reallocmem(FData,sizeof(TFPColor)*FCapacity);
- end;
- if ind>count then
- begin
- for o := FCount to ind-1 do
- FData^[o] := colBlack;
- end;
- end;
- function TFPPalette.IndexOf (const AColor:TFPColor) : integer;
- begin
- result := FCount;
- repeat
- dec (result);
- until (result < 0) or (FData^[result]=AColor);
- if result < 0 then
- result := Add (AColor);
- end;
- procedure TFPPalette.Clear;
- begin
- SetCount (0);
- end;
- { Functions to create standard palettes, by Giulio Bernardi 2005 }
- { A simple 1 bit black and white palette }
- function CreateBlackAndWhitePalette : TFPPalette;
- var fppal : TFPPalette;
- Col : TFPColor;
- begin
- fppal:=TFPPalette.Create(2);
- Col.Alpha:=AlphaOpaque;
- Col.Red:=$FFFF; Col.Green:=$FFFF; Col.Blue:=$FFFF;
- fppal.Color[0]:=Col;
- Col.Red:=$0000; Col.Green:=$0000; Col.Blue:=$0000;
- fppal.Color[1]:=Col;
- Result:=fppal;
- end;
- { The "standard" netscape 216-color palette (aka: web safe palette) }
- function CreateWebSafePalette : TFPPalette;
- var Col : TFPColor;
- i : integer;
- fppal : TFPPalette;
- begin
- fppal:=TFPPalette.Create(216);
- Col.Alpha:=AlphaOpaque;
- i:=0;
- Col.Red:=$FFFF;
- while true do
- begin
- Col.Green:=$FFFF;
- while true do
- begin
- Col.Blue:=$FFFF;
- while true do
- begin
- fppal.Color[i]:=Col;
- if Col.Blue=0 then break;
- dec(Col.Blue,$3333);
- end;
- if Col.Green=0 then break;
- dec(Col.Green,$3333);
- end;
- if Col.Red=0 then break;
- dec(Col.Red,$3333);
- end;
- Result:=fppal;
- end;
- { A grayscale palette. Not very useful. }
- function CreateGrayScalePalette : TFPPalette;
- var Col : TFPColor;
- i : integer;
- fppal : TFPPalette;
- begin
- fppal:=TFPPalette.Create(256);
- Col.Alpha:=AlphaOpaque;
- for i:=0 to $FF do
- begin
- Col.Red:=i;
- Col.Red:=(Col.Red shl 8) + Col.Red;
- Col.Green:=Col.Red;
- Col.Blue:=Col.Red;
- fppal.Color[i]:=Col;
- end;
- Result:=fppal;
- end;
- { Standard VGA 16 color palette. }
- function CreateVGAPalette : TFPPalette;
- var fppal : TFPPalette;
- begin
- fppal:=TFPPalette.Create(16);
- fppal.Color[0]:=colBlack;
- fppal.Color[1]:=colNavy;
- fppal.Color[2]:=colBlue;
- fppal.Color[3]:=colMaroon;
- fppal.Color[4]:=colPurple;
- fppal.Color[5]:=colDkGreen;
- fppal.Color[6]:=colRed;
- fppal.Color[7]:=colTeal;
- fppal.Color[8]:=colFuchsia;
- fppal.Color[9]:=colOlive;
- fppal.Color[10]:=colGray;
- fppal.Color[11]:=colLime;
- fppal.Color[12]:=colAqua;
- fppal.Color[13]:=colSilver;
- fppal.Color[14]:=colYellow;
- fppal.Color[15]:=colWhite;
- Result:=fppal;
- end;
|