Kaputter Code; Schenk ich euch

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Kaputter Code; Schenk ich euch

Beitrag 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
Zuletzt geändert von Franky am 23.12.2011 02:28, insgesamt 3-mal geändert.
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Da schließ ich mich KG an. Sonst könnte hier ja jeder kommen und behaupten er könne nix. Soweit kommts noch!!!
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

Wer das Ding jemals länger als eine Stunde ohne Absturz genutzt hat bitte aufzeigen.
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag 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
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Antworten