rainero@prism.wrc.xerox.com (Emil Rainero) (12/14/90)
I have tried unsuccessfully to use the Palette Manager to dynamically create a custom palette and have the changes take effect. Could some kind soul post a code fragment (C or Pascal) that would create a 256 entry grayscale palette (or 256 random colors) and have the effect become visible on the display device. I have tried to use the Palette manager without using CLUT's or a resource based palette, but have been unsuccessful so far. Thanks in advance, Emil Rainero
orpheus@reed.UUCP (Aaron Semplers) (12/14/90)
The major problem I had with using the Palette Manager was my development
system, Think Pascal. Apparently, Think Pascal could not truly represent
unsigned integers. Since the RGBColor structure is based on them, I had to
write a SetRGBColor routine that would take a longint for each of the RGB
values, and subtract 65535 from it if it was over 32767.
It worked fairly well after that, although there are a few tricks to
it and I have never been able to get the palette to animate. I thought I
should post some of the code I used, because I have probably forgotten
some of the tricks by now. So here it is.
You know, I was editing the code to post it with this message,
and I became worried. I began to wonder if I would get flamed for it.
I didn't like that feeling very well, so here it is, as is. If there are
any major flaws in it, I would be interested in hearing about them,
but I'm just glad I got it to work.
orpheus@reed
"that was the river... this is the sea..."
{There are one or two simple utility routines in here that I thought were}
{too obvious to post, in hindsight. But if you want, I'll send 'em.}
Type
DisplayKind = (Monochrome, Grayscale, Color);
DisplayRecord = Record
Window: CWindowPeek;
Port: CWindowPtr;
World: GWorldPtr;
Center: Point;
Extents: Rect;
Kind: DisplayKind;
Mode: Integer;
Depth: Integer;
RGB: RGBColor;
Gray: Real;
Colors: CTabHandle;
Palette: PaletteHandle;
End;
Procedure PaletteConstruct;
Var
i: Longint;
c: RGBColor;
Entries: Integer;
Begin
With theDisplay Do
If (Kind = Color) Then
Begin
Palette := NewPalette(Mode, Nil, pmExplicit + pmTolerant, 0);
If Granted(Palette) Then
Begin
Entries := Mode - 2;
SetRGBColor(c, $FFFF, $FFFF, $FFFF);
SetEntryColor(Palette, 0, c);
Entries := Entries + 1;
For i := 1 To Entries Do
Begin
c := GrayToRGB(Percentage(i, Entries));
SetEntryColor(Palette, i, c);
End;
SetRGBColor(c, $0000, $0000, $0000);
SetEntryColor(Palette, Entries + 1, c);
RequestHandle(Colors, SizeOf(CTabHandle));
Palette2CTab(Palette, Colors);
{Note: I create the palette and color table before the window and}
{offscreen graphics world. I use NSetPalette to attach the palette}
{to the window, and pass the offscreen graphics world the color table.}
End;
End;
End;
Procedure PaletteDestruct;
Begin
With theDisplay Do
If Kind = Color Then
Begin
If Granted(Palette) Then
DisposePalette(Palette);
If Granted(Colors) Then
DisposCTable(Colors);
End;
RestoreDeviceClut(GetGDevice);
End;