Browse Source

+ SetAllPalette
+ SetPalette
+ GetPalette
+ GetDefaultPalette

carl 26 years ago
parent
commit
a4d8838546
1 changed files with 147 additions and 0 deletions
  1. 147 0
      rtl/inc/graph/palette.inc

+ 147 - 0
rtl/inc/graph/palette.inc

@@ -0,0 +1,147 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 1993,99 by the Free Pascal development team
+
+    This include implements the different palette manipulation
+    routines.
+
+    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.
+
+ **********************************************************************}
+
+{CONST
+  DefaultPalette : PaletteType =
+  (255;                         }
+var
+  DefaultColors : PaletteType;
+
+  procedure SetAllPalette(var Palette:PaletteType);
+   var
+    i: longint;
+    Size: longint;
+   begin
+     Size:=Palette.Size;  { number of entries...}
+     { first determine if we are not trying to }
+     { change too much colors...               }
+     if Palette.Size > PaletteSize then
+      begin
+        _GraphResult := grError;
+        exit;
+      end;
+     Dec(Size); { Color arrays are indexed according to zero }
+     for i:=0 to Size do
+      begin
+        { skip if RGB values are -1 , as stated in the TP manual }
+        if (Palette.Colors[i].Red <> -1) and (Palette.Colors[i].Green <> -1)
+           and (Palette.Colors[i].Blue <> -1) then
+              SetRGBPalette(i,
+                Palette.Colors[i].Red,
+                Palette.Colors[i].Green,
+                Palette.Colors[i].Blue);
+      end;
+   end;
+
+  {********************************************************}
+  { Procedure SetPalette()                                 }
+  {--------------------------------------------------------}
+  { This routine changes the colorNum to the default       }
+  { palette entry specified in the second parameter.       }
+  { For example, SetPalette(0, Lightcyan) makes the        }
+  { 0th palette entry to the default Light Cyan Color .    }
+  {********************************************************}
+   Procedure SetPalette(ColorNum: word; Color: shortint);
+    begin
+      { Check if we can actually change that palette color }
+      if ColorNum > PaletteSize then
+        Begin
+          _GraphResult := grError;
+          exit;
+        end
+      else
+      { Check if the max. default color is reached...}
+      if Color > EGAWhite then
+        begin
+          _GraphResult := grError;
+          exit;
+        end;
+      SetRGBPalette(ColorNum,
+          DefaultColors.Colors[Color].Red,
+          DefaultColors.Colors[Color].Green,
+          DefaultColors.Colors[Color].Blue);
+    end;
+
+
+    procedure GetPalette(var Palette: PaletteType);
+      var
+        i: longint;
+        size : longint;
+      begin
+        Palette.Size := PaletteSize;
+        { index at zero }
+        size := PaletteSize - 1;
+        for i:=0 to size do
+          GetRGBPalette(i,
+             Palette.Colors[i].Red,
+             Palette.Colors[i].Green,
+             Palette.Colors[i].Blue);
+      end;
+
+    function GetPaletteSize: integer;
+     begin
+       GetPaletteSize := PaletteSize;
+     end;
+
+    procedure GetDefaultPalette(var Palette: PaletteType);
+      begin
+        move(DefaultColors, Palette, sizeof(DefaultColors));
+        { The default palette always has 256 entries, but in reality }
+        { it depends on the number of colors possible.               }
+        Palette.Size := PaletteSize;
+      end;
+
+{
+procedure SetRGBPalette(ColorNum,RedValue,GreenValue,BlueValue:integer);
+begin
+  asm
+    movw  $0x3c8,%DX
+    movb  ColorNum,%al
+    outb  %AL,%DX
+    incw  %DX
+    movb  RedValue,%al
+    shrb  $2,%al
+    outb  %AL,%DX
+    movb  GreenValue,%al
+    shrb  $2,%al
+    outb  %AL,%DX
+    movb  BlueValue,%al
+    shrb  $2,%al
+    outb  %AL,%DX
+  end;
+end;
+
+procedure GetRGBPalette(ColorNum:byte; var RedValue,GreenValue,BlueValue:byte);
+begin
+  asm
+    movw  $0x3c7,%DX
+    movb  ColorNum,%ax
+    outb  %AL,%DX
+    addw  $2,%DX
+    xorl  %eax,%eax
+    inb   %DX,%AL
+    shlb  $2,%al
+    movb  %al,RedValue
+    inb   %DX,%AL
+    shlb  $2,%al
+    movb  %al,GreenValue
+    inb   %DX,%AL
+    shlb  $2,%al
+    movb  %al,BlueValue
+  end;
+end; }
+
+