Hallo Gemeinde!
Folgende Methode bereitet mir leichte Bauchschmerzen:
Delphi-Quellcode:
Function TDIBSection24.GetMaskValue(X,Y:DWord):Byte;
asm // eax = Self; edx = X; ecx = Y
push ebx
cmp [eax].FMask, 0
je @NoMaskValue
// Keine Maske definiert
// X-Wert anpassen und überprüfen
mov ebx, [eax].FMaskRect.Left
sub edx, ebx
// X-Offset der Maske berücksichtigen
js @NoMaskValue
// X < 0 -> ausserhalb der Maske
mov ebx, [eax].FMask
// Zeiger auf FMask Object
cmp edx, [ebx+$08]
// ebx + $08 = FMask.FWidth
jge @NoMaskValue
// X >= Width -> ausserhalb der Maske
add edx, [ebx+$04]
// Zeiger auf Byte X, 0
// Y-Wert überprüfen und anpassen
mov edi, [eax].FMaskRect.Top
sub ecx, edi
// Y-Offset der Maske berücksichtigen
js @NoMaskValue
// Y < 0 -> ausserhalb der Maske
cmp ecx, [ebx+$0C]
// X >= FMask.FHeight -> ausserhalb der Maske
jge @NoMaskValue
jecxz @FirstRow
imul ecx, [ebx+$08]
// Y-Offset nur bei Y > 0
add edx, ecx
@FirstRow:
mov eax, [edx]
and eax, $000000FF
jmp @EndFunc
@NoMaskValue:
xor eax, eax
// Result = 0
@EndFunc:
pop ebx
End;
Ich bekomme keinen direkten Zugriff auf die privaten Variablen des Objektes FMask über den Punktoperator. Die Anweisung [eax].FMask.FWidth wird vom Compiler nicht korrekt aufgelöst. So bleibt mir nur der Umweg über mov ebx, [eax].FMask den Zeiger auf das Objekt zu ziehen und den Offset zu FWidth direkt über [ebx+$04] zu setzen. Hab auch schon diverse Casting Varianten ausprobiert; leider ohne Erfolg. Vielleicht gibt es doch eine Lösung, denn so ist der GAU vorprogrammiert, wenn ich die privaten Variablen der Klasse TDIBMask ändere.
Vielen Dank für´s mitdenken.
Gruss
OLLI