Toon posts:

[Delphi / jedi-sdl]"kleurenpalet rotatie procedure" probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hey,
ik ben nog niet zo lang met de Jedi-SDL headers aant werken en ben dus voornamelijk allerlij kleine zaken aan het uittesten.

Ik probreer een procedure te maken die het kleuren palet van een surface laat roteren. Nu ik heb daarvoor onderstaande procedure gemaakt en deze werkt perfect voor 8 bit (256) kleuren modusen, maar zodra ik 8 bit fullscreen gebruik faalt de functie op de copymemory call. Ik heb geen idee waarom, kan iemand me het uitleggen ? En is copymemory wel een goede manier voor dit probleem ?

bedankt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure SDL_movepallete(Surface : PSDL_Surface; Movedown : boolean);
var
 Pal : TSDL_ColorArray;
 Temp : TSDL_Color;
 Tel : UInt32;
begin
 // Get the current palette from the surface
 CopyMemory(@Pal,Surface.Format.Palette.Colors,Length(pal));
 
 if Movedown then
 begin
  Temp := Pal[Surface.Format.Palette.NColors-1];
  for Tel := Surface.Format.Palette.NColors -2 downto  0  do Pal[Tel+1] := Pal[Tel];
  Pal[0] := Temp;
 end
 else
 begin
  Temp := Pal[0];
  for Tel := 0 to Surface.Format.Palette.NColors -2 do Pal[tel] := Pal[tel+1];
  Pal[Surface.Format.Palette.NColors-1] := Temp;
 end;
 SDL_SetPalette(Surface,SDL_LOGPAL or SDL_PHYSPAL,@Pal,0,Surface.Format.Palette.NColors);
end;

[ Voor 14% gewijzigd door Verwijderd op 22-12-2003 05:56 ]


Verwijderd

Topicstarter
Heb het zelf opgelost gekregen fout lag idd aan copymemory functie, gaf namelijk een foute grootte mee. heb men juiste code hieronder nog eens gezet voor zij die het eventueel ooit nodig hebben.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function SDL_movepallete(Surface : PSDL_Surface; Movedown : boolean) : boolean;
var
 Pal : TSDL_ColorArray;
 Temp : TSDL_Color;
 Tel : integer;
begin

 //check if surface has 8 bits per pixel
 if surface.format.BitsPerPixel <> 8 then
 begin
  SDL_movepallete := false;
  exit;
 end;

 // Get the current palette from the surface
  CopyMemory(@Pal,Surface.Format.Palette.Colors,256*sizeof(TSDL_Color));

 if Movedown then
 begin
  Temp := Pal[255];
  for Tel := 254 downto  0  do Pal[Tel+1] := Pal[Tel];
  Pal[0] := Temp;
 end
 else
 begin
  Temp := Pal[0];
  for Tel := 0 to 254 do Pal[tel] := Pal[tel+1];
  Pal[255] := Temp;
 end;

 //return true if the pallete has been succesfully set & rotated
 SDL_movepallete := (SDL_SetPalette(Surface,SDL_LOGPAL or SDL_PHYSPAL,@Pal,0,256) = 1)

end;