SDL PixelFormat
Inhaltsverzeichnis
SDL_Pixelformat
Name
SDL_Pixelformat - Speichert Surfaceformatinformationen
Delphi-Spezifikation
type SDL_Pixelformat = record palette : PSDL_Palette; BitsPerPixel : Uint8; BytesPerPixel : Uint8; Rloss, Gloss, Bloss, Aloss : Uint8; Rshift, Gshift, Bshift, Ashift : Uint8; Rmask, Gmask, Bmask, Amask : Uint8; colorkey : Uint32; alpha : Uint8; end;
Parameter
palette | Zeiger auf die Farbpalette oder nil wenn BitsPerPixel>8 ist. |
---|---|
BitsPerPixel | Die Anzahl der Bits die benutzt werden um einen Pixel in einer Surface zu beschreiben. Normalerweise 8, 16, 24 oder 32. |
BytesPerPixel | Die Anzahl der Bytes die einen Pixel in einer Surface beschreiben. Normalerweise 1 bis 4. |
[RGBA]mask | Binäre Maske die benutzt wird um die individuellen Farbwerte zu bekommen. |
[RGBA]loss | Prezisionsverlust jedes Farbwertes (2^[RGBA]loss). |
[RGBA]shift | Binäre Linksverschiebung von der Farbekomponente in dem Pixelwert. |
colorkey | Pixelwert von transpartenten Pixeln. |
alpha | Allgemeiner Surface Alphawert. |
Beschreibung
SDL_PixelFormat beschreibt das Format der Pixeldaten die im Pixelfeld einer SDL_Surface gespeichert sind. Jede Surface speichert ein SDL_Pixelformat in ihrem Formatfeld.
Beispiel
Wenn man einzelne Pixel in einer Surface verändern will sollte man erst verstehen wie SDL diese Farbinformationen speichert.
Das 8-Bit Format ist am einfachsten zu verstehen. Jeder Pixel ist ein Uint8 welcher den Farbindex aus palette.colors enthält. Um die Farbe eines Pixels in einer 8-Bit Surface zu bestimmen lesen wir einen den Farbindex aus surface.pixels und benutzen diesen Index um die SDL_Color Struktur von surface.format.palette.colors zu lesen:
var surface: PSDL_Surface; fmt: PSDL_PixelFormat; color: PSDL_Color; index: Uint8; begin //Erstellung der Surface . . fmt:=surface.format; //Überprüfung der Bitsperpixel if fmt.BitsPerPixel<>8 then begin writeln('keine 8-Bit Surface'); exit; end; //Surface sperren SDL_LockSurface(surface); //den link oberen Pixel bekommen index:=Uint8(surface.pixels^); color:=fmt.palette.colors[index]; //Entsperren der Surface SDL_UnlockSurface(surface); writeln('Rot: '+InttoStr(color.r)+' Grün: '+InttoStr(color.g)+' Blau: '+InttoStr(color.b); end;
Pixelformate über 8 Bit sind eine komplett andere Erfahrung. Dies sind "TrueColor" Formate und die Farbinformationen sind im Pixel selber gespeichert, nicht in einer Palette. Die mask, shift und loss Felder sagen uns wie die Farbinformationen codiert sind.
Das mask Feld erlaubt uns jede einzelne Farbkomponente zu isolieren. Das shift Feld sagt uns die Anzahl der Bits rechts von jeder Komponente und das loss Feld sagt wieviele Bits von jeder Komponente verloren gingen als sie in 8 Bit Farbkomponenten gepackt wurden.
var fmt: PSDL_Pixelformat; surface: PSDL_Surface; temp, pixel: Uint32; red, green, blue, alpha: Uint8; begin . . . fmt:=surface.format; SDL_LockSurface(surface); pixel:=Uint32(surface.pixels^); SDL_UnlockSurface(surface); //Rote Komponente temp:=pixel and fmt.Rmask; //Isolieren der roten Komponente temp:=temp shr fmt.Rshift; //Auf 8 Bit zurückschieben temp:=temp sdl fmt.Rloss; //Auf eine volle 8 Bit Zahl expandieren red:=(Uint8)temp; //Grüne Komponente temp:=pixel and fmt.Gmask; //Isolieren der grünen Komponente temp:=temp shr fmt.Gshift; //Auf 8 Bit zurückschieben temp:=temp sdl fmt.Gloss; //Auf eine volle 8 Bit Zahl expandieren green:=(Uint8)temp; //Blaue Komponente temp:=pixel and fmt.Bmask; //Isolieren der blauen Komponente temp:=temp shr fmt.Bshift; //Auf 8 Bit zurückschieben temp:=temp sdl fmt.Bloss; //Auf eine volle 8 Bit Zahl expandieren blue:=(Uint8)temp; //Alpha Komponente temp:=pixel and fmt.Amask; //Isolieren des Alphawerts temp:=temp shr fmt.Ashift; //Auf 8 Bit zurückschieben temp:=temp sdl fmt.Aloss; //Auf eine volle 8 Bit Zahl expandieren alpha:=(Uint8)temp; writeln('Pixelfarbe -> R: '+InttoStr(red)+' G: '+InttoStr(green)+' B: '+InttoStr(blue)+' A: '+InttoStr(alpha)); end;