Overview |
This example demonstrates how to work in a virtual 32 bit display mode. It draws random pixels to a 32 bit ARGB8888 surface and updates this surface to the display until the user presses a key.
Description |
Initialization
The program starts by initializing PTC. Firstly
it tried a command line initialize so that the user can pass mode parameters
on the command line like this: "rand32 xres yres format". For example "rand32
320 200 RGB565" would run the rand32 program in a 320x200xRGB565 display
mode. The program then checks if the command line setup failed with "ptc.ok",
and if it has failed falls back to a 320x200 virtual 32 bit mode. This
means that the user can just type "rand32" and get a default virtual 32
bit display mode. After PTC initialization the program gets the display
resolution from the PTC object and creates a fullscreen ARGB8888 surface.
Main loop
The program loops around until the user presses
a key. Each loop around it locks the surface to access the memory, then
draws 100 random pixels at a time to this surface before unlocking it and
updating to the display. The RGB32 function is used to pack the three red,
green, blue bytes into a 32 bit ARGB8888 pixel.
Clean up
The PTC object is cleaned up automatically
when the main procedure exits, there is no need to explicitly shut down
PTC. At times during the program uses the function "PTC::Error" to shutdown
PTC and report an error message.
Source code |
////////////////////////////////////
// random 32bit ARGB8888 putpixel //
////////////////////////////////////
#include "ptc.h"
int main(int
argc,char *argv[])
{
// initialize ptc from
command line (eg: "rand32 640 480 ARGB8888")
PTC ptc(argc,argv);
if (!ptc.ok())
{
//
fallback to virtual 32bit
if
(!ptc.Init(320,200))
{
//
failure
ptc.Error("could not initialize ptc");
return 1;
}
}
// get display resolution
int xres=ptc.GetXResolution();
int yres=ptc.GetYResolution();
// create fullscreen surface
Surface surface(ptc,xres,yres,ARGB8888);
// main loop
while (!ptc.kbhit())
{
//
lock surface
char
*buffer=(char*)surface.Lock();
if
(!buffer) return 1;
//
plot 100 random pixels
int
pitch=surface.GetPitch();
for
(int i=0; i<100; i++)
{
int x=random(xres);
int y=random(yres);
uint *pixel=(uint*)(buffer+pitch*y+x*4);
*pixel=RGB32(random(255),random(255),random(255));
}
//
unlock surface
surface.Unlock();
//
update to display
surface.Update();
}
return 0;
}