Seite 1 von 1

Kaputter Code; Schenk ich euch

Verfasst: 01.12.2006 21:35
von Franky
Hi. :|

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 

Viel Spass damit

Verfasst: 01.12.2006 21:50
von AND51
> Da ich wie üblich zu blöd bin, 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 Scheiße hier.

Das wäre doch was für den "Sinnlosen Selbstbeschuldigungsthread"... :mrgreen:

Verfasst: 02.12.2006 10:55
von Kaeru Gaman
wow, franky, bist ja echt frustriert davon...

hey kopf hoch, wird auch wieder besser.
dein PGS ist doch recht beeindruckend, also kannst du ja nicht behaupten, du könntest nix... ;)

Verfasst: 02.12.2006 16:11
von bluejoke
Da schließ ich mich KG an. Sonst könnte hier ja jeder kommen und behaupten er könne nix. Soweit kommts noch!!!

Verfasst: 02.12.2006 16:53
von Franky
Wer das Ding jemals länger als eine Stunde ohne Absturz genutzt hat bitte aufzeigen.

Verfasst: 02.12.2006 16:59
von Tafkadasom2k5
Also als ich das Ding vor Urzeiten mal ausprobiert habe, hat es ne 3/4telstunde ca durchgehend meinen Experimenten standgehalten... Danach hab ichs zu gemacht- aber es war zu keiner Zeit instabil oder so...

Also ich finde es gut- und manchmal nutze ich es auch für manche Malarbeiten...

Gr33tz
Tafkadasom2k5