Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
Delphi 6 Personal
|
Assemler Routine ummodeln - wer kann bitte helfen
7. Okt 2007, 14:48
Hi,
ich habe volgende Procedure:
Delphi-Quellcode:
{------------------------------------------------------------------}
{ Swap bitmap format from BGR to RGB }
{------------------------------------------------------------------}
procedure SwapRGB(data : Pointer; Size : Integer);
asm
mov ebx, eax
mov ecx, size
@@loop :
mov al,[ebx+0]
mov ah,[ebx+2]
mov [ebx+2],al
mov [ebx+0],ah
add ebx,3
dec ecx
jnz @@loop
end;
und möchte sie wiefolgt verändern:
Delphi-Quellcode:
procedure SwapRGB(data : Pointer; Size : Integer; Step: Byte);
asm
mov ebx, eax
mov ecx, size
mov ???, step
@@loop :
mov al,[ebx+0]
mov ah,[ebx+2]
mov [ebx+2],al
mov [ebx+0],ah
add ebx, ??? (4)
dec ecx
jnz @@loop
end;
Das soll ein Array umformen in etwa so:
Code:
BGRA, BGRA, BGRA...
// nach:
RGBA, RGBA, RGBA...
und das ergibt dann eine Bitmapladeroutiene für zB. OpenGl:
Delphi-Quellcode:
function LoadBMPTexture(ResID: Integer; var Texture : GLuint) : Boolean;
var
BitmapLength: LongWord;
bmpBits: array of byte;
hBmp: HBitmap;
bi: tagBITMAP;
begin
hBmp := Loadimage(HInstance, MAKEINTRESOURCE(ResID), IMAGE_BITMAP, 0,0,0);
GetObject(hBmp, sizeof(bi), @bi);
BitmapLength := bi.bmWidth * bi.bmHeight * bi.bmBitsPixel Div 8;
SetLength(bmpBits, BitmapLength+1);
GetBitmapBits(hBmp, BitmapLength, @bmpBits[0]);
if @bmpBits[0] <> nil then
begin
SwapRGB(@bmpBits[0], bi.bmWidth * bi.bmHeight); // Swap Bitmap Bits BGR(A) to RGB(A)
Texture := CreateTexture(bi.bmWidth, bi.bmHeight, GL_RGBA, @bmpBits[0]);
Result := (Texture <> 0);
end else
Result := False;
DeleteObject(hBmp);
end;
|
|
Zitat
|