• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 379
  • Last Modified:

Reading RGB Palette Information

I would like to be able to read in the RGB palette information for all 256 colours in turbo pascal 7.0 for dos. I would like to store the Red, Green, and Blue values for each colour to an array so that i may save it to a file.  I would rather not use asembly language do to this for this is myfinal prodject for computer class.  If someone knows who to do this or knows of a function or procedure to do this, it would be greatly appreciate if you droped me a line.
0
Corey080698
Asked:
Corey080698
  • 6
  • 2
  • 2
1 Solution
 
VIBESPROCommented:
What do you mean?  Do you want to put the colour to the screen or into a variable, or something else? I don't exactly understand what you want to do.
0
 
scrapdogCommented:
You have to use ports, but you do not necessarily have to use assembly language.  Pascal has the Port array to allow you to access the ports.
0
 
scrapdogCommented:
Port[$3C8]:= ColourNumber;
Port[$3C9]:= R;
Port[$3C9]:= G;
Port[$3C9]:= B;

0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
VIBESPROCommented:
Hey SCRAPDOG, read the question again.  He 'rather not use asembly language or ports'!
0
 
Corey080698Author Commented:
Edited text of question
0
 
Corey080698Author Commented:
Your right VIBESPRO, I would rather not use asembly language or ports...but if thats the best way...i guess i'd have to...
0
 
scrapdogCommented:
VIBESPRO:  I read the question.  

You CAN'T.
0
 
scrapdogCommented:
If you want, I can write a function that will make it easier for you.
0
 
scrapdogCommented:
uses crt;   {only for the delay procedure}

type
  TRGBColor = record
                red, green, blue :byte;
              end;
  TRGBArray = array[0..255] of TRGBColor;

procedure SetPaletteColor(index :byte; color :TRGBColor);
begin
  Port[$3c6] := $ff;  {sets palette mask}
  Port[$3c8] := color; {set palette index}
  Port[$3c9] := color.r;  
  Port[$3c9] := color.g;
  Port[$3c9] := color.b;
end;

function GetPaletteColor(index :byte) :TRGBColor;
var
  Color :TRGBColor;
begin
  Port[$3c6] := $ff;
  Port[$3c8] := index;
  Color.Red := Port[$3c9];
  Color.Green := Port[$3c9];
  Color.Blue := Port[$3c9];
  Result := Color;
end;


procedure GetColorArray(var RGBArray :TRGBArray);
var i :byte;
begin
  for i := 0 to 255 do begin
    RGBArray[i] := GetPaletteColor(i);
    Delay(1);        {a short delay to wait for video card}
  end;
end;



To set a palette register:

var
  RGBColor :TRGBColor;

RGBColor.Red := RedComponent;
RGBColor.Green := GreenComponent;
RGBColor.Blue := BlueComponent;

SetPaletteColor(ColorNumber, RGBColor);


To retrieve a palette register and store it in a variable of type TRGBColor:

RGBColor := GetPaletteColor(ColorNumber);


To retrieve the entire palette and store it in an array of type TRGBArray:

GetColorArray(RGBArray);


I inserted the Delay(1) in the GetColorArray procedure because the palette registers will be written to many times in succession.  The Delay(1) is just for safety...it allows the video card to update the registers before you send it anoter value.


By the way, it is NOT cheating to get external help on a question like this, even if it is for a homework assignment.  It is not like anyone is writing your whole program...you did it yourself, and I presume that this is only a improvement on your basic requirements.  This uses no assembly language, however using the ports is inevitable.  You can look in the TP help file on the Port array if you need more info.

Just say that you found out how to do this by searching the internet...you wouldn't be lying.  Your teacher will admire your resourcefulness.
0
 
scrapdogCommented:
By the way, change color.r, color.g, and color.b to color.red, color.green, and color.blue.
0

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

  • 6
  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now