
Da ich es leider nicht gebacken krieg, das problem selbst zu lösen und ich auch nicht dauernd Deeem aufn Sack gehn will und ich das Ergebnis, wenn es denn funktionieren würde eh nicht gebrauchen kann, da ich eh kein einigermaßen fehlerfreies Programm auf die Beine stellen kann, schenk ich euch diese Zeilen hier.
Das ganze sollte ein Code für schnelles Alphadrawing sein. Die Zeiten sind auch ganz gut, etwa 8 mal so schnell wie die Routine von PB. nur bin ich leider zu doof, es ans laufen zu kriegen.
Macht damit was ihr wollt

Code: Alles auswählen
Debug "Progg Gestartet"
Global _Alpha_Draw_IMG.BITMAP
Global _Alpha_DrawON_IMG.BITMAP
Global wert.l
Global _Alpha_adr_1.l
Global _Alpha_adr_2.l
Global _Alpha_adr_3.l
Global _Alpha_x.l
Global _Alpha_y.l
Global _Alpha_Add.l
Global _Alpha_Add2.l
Global haltma.b
; 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
; 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
;SAL : <------------
;SAR : ------------->
Macro GetImageDataPointer(ImageID,Bild)
GetObject_(ImageID,SizeOf(Bitmap),Bild)
EndMacro
Macro CallNextAlphaPoint()
ADD edi,4
ADD esi,4
DEC edx
JNZ l_sp_fdai_schleifx
EndMacro
Macro TestBitSet(mkbit,mk_upper)
;Hier geendet.
SAR bl,1
SAR al,1
CompilerIf mk_upper=#True
SAR ah,1
SAR bh,1
CompilerEndIf
CMP cl,ch
JAE l__alpha_draw_bits_#mkbit#_set
ADD dl,bl
CompilerIf mk_upper=#True
ADD dh,bh
CompilerEndIf
JMP l__alpha_draw_bits_#mkbit#_set_no:
_alpha_draw_bits_#mkbit#_set:
ADD dl,al
CompilerIf mk_upper=#True
ADD dh,ah
CompilerEndIf
_alpha_draw_bits_#mkbit#_set_no:
EndMacro
Macro SetAlphaPoint()
MOV cl,byte[edi+3]
CMP cl,240
JA l__alpha_draw_filled
CMP cl,15
JB l__alpha_draw_nofilled
;-Sonst rechnen.........
MOV _alpha_adr_1,edx
MOV eax,dword[edi];Bild, das draufgemalt werden soll
MOV ebx,dword[esi];Bild, auf das gemalt wird
XOR edx,edx ;EDX=0
SAR cl,1
;Roter Kanal
MOV ch,64
TestBitSet(128,#True)
SAR ch,1
TestBitSet(64,#True)
SAR ch,1
TestBitSet(32,#True)
SAR ch,1
TestBitSet(16,#True)
SAR ch,1
TestBitSet(8,#True)
SAR ch,1
TestBitSet(4,#True)
;RüberScrollen
ROR edx,16;Aufstocken des Bytewertes
ROR eax,16
ROR ebx,16
;Grüner und Blauer Kanal
MOV ch,64
TestBitSet(128_not,#False)
SAR ch,1
TestBitSet(64_not,#False)
SAR ch,1
TestBitSet(32_not,#False)
SAR ch,1
TestBitSet(16_not,#False)
SAR ch,1
TestBitSet(8_not,#False)
SAR ch,1
TestBitSet(4_not,#False)
ROR edx,16
MOV dword[esi],edx
MOV edx,_alpha_adr_1
CallNextAlphapoint()
JZ l_sp_fdai_schleifxende
_alpha_draw_filled:;Ganz gefüllt; Wert übertragen
MOV ebx,dword[edi]
MOV dword[esi],ebx
_alpha_draw_nofilled:;Nich gefüllt; Wert bleibt, also weiter zum nächsten
CallNextAlphapoint()
EndMacro
Procedure FastDrawAlphaImage(image_to_draw_on,image_to_draw,x,y)
GetImageDataPointer(ImageID(image_to_draw_on),@_Alpha_DrawON_IMG)
GetImageDataPointer(ImageID(image_to_draw),@_Alpha_Draw_IMG)
If x=>0 And y=>0 And x+_Alpha_Draw_IMG\bmwidth<=_Alpha_DrawON_IMG\bmwidth And y+_Alpha_Draw_IMG\bmheight<=_Alpha_DrawON_IMG\bmheight
;Das Bild soll ohne Randüberschreitungen auf das andere Bild gemalt werden
_Alpha_y=_Alpha_Draw_IMG\bmheight
_Alpha_Adr_1=_Alpha_DrawON_IMG\bmbits+_Alpha_DrawON_IMG\bmwidth*4*(_Alpha_DrawON_IMG\bmheight-_Alpha_Draw_IMG\bmheight-y)+(_Alpha_DrawON_img\bmwidth-_Alpha_Draw_img\bmwidth)
_Alpha_adr_2=_ALpha_Draw_IMG\bmBits+(_Alpha_Draw_img\bmwidth*4)*(_Alpha_Draw_IMG\bmheight-1);AlphaBild
_Alpha_Add=(_Alpha_DrawON_img\bmwidth-_Alpha_Draw_img\bmwidth)*4
_Alpha_Add2=_Alpha_Draw_img\bmwidth*8
!MOV esi,dword[v__Alpha_adr_1]
!MOV edi,dword[v__Alpha_adr_2]
sp_fdai_schleify:
!MOV edx,dword[v__Alpha_Draw_IMG+4]
sp_fdai_schleifx:
SetAlphaPoint()
sp_fdai_schleifxende:
;___Ende der Schleife
ADD esi,_Alpha_Add
SUB edi,_Alpha_Add2
DEC _Alpha_y
JNZ l_sp_fdai_schleify
EndIf
EndProcedure
Procedure FastDrawCheck(menge.l)
zeit1_begin.l=GetTickCount_()
For A=1 To menge
FastDrawAlphaImage(1,2,20,20)
Next
SetGadgetState(1,ImageID(1))
zeit1_ende.l=GetTickCount_()
zeit2_begin.l=GetTickCount_()
For A=1 To menge
StartDrawing(ImageOutput(0))
DrawAlphaImage(ImageID(2),20,20)
StopDrawing()
Next
SetGadgetState(2,ImageID(0))
zeit2_ende.l=GetTickCount_()
SetGadgetText(5,"Zeit von PB: "+Str(zeit2_ende-zeit2_begin)+" ms | Zeit von Mir: "+Str(zeit1_ende-zeit1_begin)+" ms")
EndProcedure
Macro LoadAlphaCompatibleImage(pqrs_id,pqrs_name)
anfid=LoadImage(#PB_Any,"NormalBild.bmp")
CreateImage(pqrs_id,ImageWidth(anfid),ImageHeight(anfid),32)
StartDrawing(ImageOutput(pqrs_id))
DrawAlphaImage(ImageID(anfid),0,0)
StopDrawing()
FreeImage(anfid)
EndMacro
UsePNGImageDecoder()
If OpenWindow(1,100,100,800,400,"Fast Alpha Drawing")
CreateGadgetList(WindowID(1))
ImageGadget(1,0,0,400,300,0)
ImageGadget(2,400,0,400,300,0)
TrackBarGadget(3,0,320,600,20,1,10000)
ButtonGadget(4,650,320,100,20,"Draw")
TextGadget(5,200,360,400,20,"Zeit von PB: 0 ms | Zeit von Mir: 0 ms")
TextGadget(6,0,360,200,20,"Menge: 0")
LoadImage(2,"AlphaBild.png")
LoadAlphaCompatibleImage(1,"NormalBild.bmp")
LoadAlphaCompatibleImage(0,"NormalBild.bmp")
SetGadgetState(1,ImageID(1))
SetGadgetState(2,ImageID(0))
Repeat
Event=WaitWindowEvent()
If event=#PB_Event_Gadget
Select EventGadget()
Case 3
SetGadgetText(6,"Menge: "+Str(GetGadgetState(3)))
Case 4
FastDrawCheck(GetGadgetState(3))
EndSelect
EndIf
Until event=#WM_CLOSE
EndIf