From a4d8838546527a70b9365389022c730bbbfe8c24 Mon Sep 17 00:00:00 2001 From: carl Date: Sat, 22 May 1999 17:11:50 +0000 Subject: [PATCH] + SetAllPalette + SetPalette + GetPalette + GetDefaultPalette --- rtl/inc/graph/palette.inc | 147 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 rtl/inc/graph/palette.inc diff --git a/rtl/inc/graph/palette.inc b/rtl/inc/graph/palette.inc new file mode 100644 index 0000000000..b7c1891f37 --- /dev/null +++ b/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; } + +