![]() |
Assemler Routine ummodeln - wer kann bitte helfen
Hi,
ich habe volgende Procedure:
Delphi-Quellcode:
und möchte sie wiefolgt verändern:
{------------------------------------------------------------------}
{ 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;
Delphi-Quellcode:
Das soll ein Array umformen in etwa so:
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;
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; |
Re: Assemler Routine ummodeln - wer kann bitte helfen
Hallo,
wenn ich das richtig verstehe, macht das die vorhandene Funktion bereits.
Delphi-Quellcode:
MfG
dec ecx <-- size um 1 erniedrigen
jnz @@loop <--jnz = jump if not zero, also springe nach @@loop wenn size noch nicht null Kolbaschedder |
Re: Assemler Routine ummodeln - wer kann bitte helfen
Also:
1. Diese Routine ist ganz gefährlich, da sie ebx verändert und nicht zurücksetzt! Bsp: Falls du sie aus einer längeren Methode aufrufst (Delphi legt self meist in ebx) wird self verändert du hast einen fehler beim Zugriff auf Objekteigene Properties etc. Auch sonst kann etwas wichtiges in ebx liegen, was die aufrufende Routine gerne so wieder vorfinden möchte. Hingegen darf eax, ecx und edx verändert werden. 2. wäre ja noch edx frei, da muss ich mal schauen. Warum willst du es eigentlich in Assembler? Edit: und 3. Was soll jetzt step bei dir bzw. dem Beispiel bewirken? |
Re: Assemler Routine ummodeln - wer kann bitte helfen
Ich glaube, ich weis jetzt, was du meinst.
Für deinen Fall müsstest du in step 1 übergeben.
Delphi-Quellcode:
procedure SwapRGB(data : Pointer; Size : Integer; Step: Integer);
asm push ebx add ecx,3 test edx,edx jz @@end @@loop : mov bl,[eax+0] mov bh,[eax+2] mov [eax+2],bl mov [eax+0],bh add eax, ecx dec edx jnz @@loop @@end: pop ebx end; |
Re: Assemler Routine ummodeln - wer kann bitte helfen
Tja, nun steig ich nicht mehr so recht druch. wo werden denn
die Parameter wie step übergeben (an den asm-Teil)? |
Re: Assemler Routine ummodeln - wer kann bitte helfen
Aufrufkonvention ist Register, folglich liegt Data in EAX, Size in EDX und Step in ECX.
|
Re: Assemler Routine ummodeln - wer kann bitte helfen
thx Apollonius.
Also nochmal für Dummies, wie müsste folgender Code als ASM aussehen ?
Delphi-Quellcode:
// pData als Pointer übergeben ?!... (to do...)
procedure _SwapRGB(pData: TByteArray; pDataLength: DWORD; Alpha: Byte); var n: DWORD; b, r: byte; begin n := 0; while n <= pDataLength-4 do begin b := pData[n]; r := pData[n + 2]; pData[n] := r; pData[n + 2] := b; pData[n + 3] := Alpha; inc(n, 4); end; end; oder macht das keinen Sinn für die Geschwindigkeit (Delphi oder ASM) |
Re: Assemler Routine ummodeln - wer kann bitte helfen
Wenn es einen Unterschied gibt, dann dürfte er sehr gering sein.
|
Re: Assemler Routine ummodeln - wer kann bitte helfen
Bei grossen Bitmaps (1024*1024) scheint es noch recht zügig zu laufen. :gruebel:
|
Re: Assemler Routine ummodeln - wer kann bitte helfen
Kannst ja die probieren:
Delphi-Quellcode:
procedure SwapRGB(data : Pointer; Size : Integer; Alpha:byte);
asm push ebx test edx,edx jz @@end @@loop : mov bl,[eax+0] mov bh,[eax+2] mov [eax+2],bl mov [eax+0],bh mov [eax+3],cl add eax, 4 sub edx, 4 jnle @@loop @@end: pop ebx end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz