Deutsch
Forum

XPSE: Linie auf Bitmap zeichnen

 
- Seite 1 -



Andreas
Koch
Hallo zusammen,

es gibt mal wieder ein Problem, bei dem ich nicht weiterkomme. Es geht darum, das Zeichnen eines Graphen auf eine Bitmap zu beschleunigen. Dabei geht es erst einmal nur um aneinander hängende Linien und ich würde das Ganze gerne mit XPSE angehen.
Dabei stehe ich nun vor zwei Problemen.

1. XPSE kennt nur den Befehl Setpixel, Frage: kennt jemand einen API-Befehl, mit dem man eine Linie zeichnen kann? Einstellungsmöglichkeiten von Farbe, Start- und Endpunkt sowie Linienstärke wären nötig.
2. XPSE zeichnet grundsätzlich erst einmal nur auf dem Hauptfenster. Kann man das Zeichnen irgendwie auf eine Bitmap umleiten?

Zu 1.: das kann ich mir wahrscheinlich auch noch selbst basteln, der API-Befehl würde das Ganze nur vereinfachen.

Zu 2. habe ich versucht, mir etwas aus der nProc drawhPicRotated zu ziehen, was diese Funktion zu haben scheint, klappt aber nicht so ganz....
KompilierenMarkierenSeparieren
 {$cleq}
 $I Pixels.Inc
Window 0,0 - %Maxx, %Maxy
var hPic&=create("hNewPic",400,400,$FF)
StartPaint hPic&
UseFont "Arial",30,0,1,0,0
textcolor $FFFF,-1
drawtext 5,0,"XProfan.Com"
textcolor $AA,-1
drawtext 5,0,"XProfan"
EndPaint
DrawPic hPic&,0,0,0

nproc Test

    Parameters hPic&
    long hDCBits=CreateCompatibleDC(hDC)
    selectObject(hDCBits, hPic&)

    WhileLoop 50

        SetPixel(hDCBits,50+&loop,50,0)

    EndWhile

EndProc

Test(hPic&)
DrawPic hPic&,500,0,0
WaitInput

Wäre prima, wenn ihr mir da weiterhelfen könntet.

Schönen Gruß

Andreas Koch
 
05.09.2012  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »

Sagen wir einfach weil da etwas "geschludert" wurde.

(habe die Stellen im Code markiert)
KompilierenMarkierenSeparieren
 {$cleq}
Window 0,0 - %Maxx, %Maxy
var hPic&=create("hNewPic",400,400,$FF)
StartPaint hPic&
UseFont "Arial",30,0,1,0,0
textcolor $FFFF,-1
drawtext 5,0,"XProfan.Com"
textcolor $AA,-1
drawtext 5,0,"XProfan"
EndPaint
DrawPic hPic&,0,0;0// <-- statt DrawPic hPic&,0,0,0
Test(hPic&)
DrawPic hPic&,500,0;0// <-- statt DrawPic hPic&,500,0,0
WaitInput

nproc Test

    Parameters hPic&
    long hDCBits=CreateCompatibleDC(hDC)
    selectObject(hDCBits, hPic&)

    WhileLoop 50

        SetPixel(hDCBits,50+&loop,50,0)

    EndWhile

    deleteDC(hDCBits)// <-- vergessen, eigentlicher Knackpunkt

EndProc



5 kB
Hochgeladen:05.09.2012
Ladeanzahl106
Herunterladen
 
05.09.2012  
 




Dieter
Zornow
ich arbeite grundsätzlich nicht mit XPSE, aber Xprofan hat doch die Befehle Line und LineTo. Um auf ein Bitmap zu zeichnen musst du Startpaint Handle und Endpaint verwenden.
 
XProfan X2
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
05.09.2012  
 




Andreas
Koch
Danke. Aber das wusste ich schon. Es geht darum, dass das mit den Profan Befehlen zu lange dauert und ich das Ganze mit XPSE beschleunigen möchte.
 
05.09.2012  
 




funkheld
Hallo, ich hatte so etwas schon mal mit XPIA gemacht, dort sind auch einige Beispiele drin. XPSE und XPIA können ja zusammen genutzt werden.
Ich hatte damals keinen grossen Geschwindigkeitsunterschied feststellen können, weil die Grafik-Windows-Befehle(API-Befehl ) auch bei XPIA(ASM) genutzt werden.
Das einzige was beschleunigt wird sind unter umständen Schleifen und Zählvariablen , diese Zeit wird aber wieder durch die Grafik-Windows-Befehle(API-Befehl ) verschlampt.

Ausser du schreibst jetzt selbst ein Linienprogramm usw., da musst du dann aber auch wieder die Punkte selber ausrechnen mit ASM, nämlich wenn du dafür wieder den Plotbefehl(API-Befehl ) nimmst , geht die Zeitschlamperei wieder los.



ich arbeite grundsätzlich nicht mit XPSE, aber Xprofan hat doch die Befehle Line und LineTo. Um auf ein Bitmap zu zeichnen musst du Startpaint Handle und Endpaint verwenden.


Ohne XPSE oder XPIA ist das gesamte Profanprogramm grottenlangsam.

Schau hier mal für XPIA : [...] 
Das einzige was dort gross geschleunigt wird ist die Zählschleife.

Gruss
 
05.09.2012  
 




funkheld


Dann bliebe da noch das Umlenken der Zeichenbefehle auf eine Bitmap....


Du brauchst die Anfangsadresse der Bitmap die du ändern möchtest, Breite, Höhe und Bitmaptiefe, dann kannst du loslegen mit XPIA.

Gruss
 
05.09.2012  
 




Andreas
Koch
Sorry für das verfrühte Posting. Ich hatte den Link zu dem Beispiel nicht gesehen.
Ich denke, damit kann ich was anfangen. Allerdings erhalte ich immer die Fehlermeldung, dass er GetXpiaProcAddress nicht kennt. Muss ich dafür noch irgendwas einstellen?
KompilierenMarkierenSeparieren
 $MAKE CLE
 $H Windows.ph
Declare hwin&,x&,y&,f&,hdcwin&
Window 20,20-200,200
hWin& = Create("Window", %hWnd, "Test", 250, 20, 650,500)
hDCWin& = ~GetWindowDC(hWin&)

If 0

    AsmStart pset

        Parameters hdcwin&,x&,y&,f&
        mov ecx,para1
        mov eax,para2
        mov ebx,para3
        mov edi,para4
        invoke SetPixel,ecx,eax,ebx,edi

    AsmEnd

EndIf

whileloop 0,100,1

    x&=&loop
    y&=&loop
    f&=$ff0000
    Call(GetXpiaProcAddress(XpiaModule&,"pset"),hdcwin&,x&,y&,f&)

endwhile

WaitInput
End
 
05.09.2012  
 




funkheld


GetXpiaProcAddress


Ich glaube der Aufrufname hat sich geändert ?

Aber "Setpixel" verwendet wieder diese langsame WindowsAPI.

Gruss
 
05.09.2012  
 



Was macht ihr denn hier?! Alles viel einfacher!

Ein Rechteck: [...] 

Auf hWnd zeichen einfach so:
KompilierenMarkierenSeparieren
nProc test

    rectangle(hDC,10,10,100,100)

endproc


Linie oder Kurven gewünscht? Dann einfach Linien oder Kurvenfunktionen nutzen!

Alle beschrieben und einfach aufzurufen: [...] 

Danach geht ne Linie von 20,30 nach 100,100 so:
KompilierenMarkierenSeparieren
nProc test

    MoveToEx(hDC,20,30,0)
    LineTo(hDC,100,100)

endproc


In nProcs stehen quasi alle APIs bereit -

da kann es einem ja an garnichts fehlen.

Einzelnes Pixel setzen?
KompilierenMarkierenSeparieren
nProc test

    setPixel(hDC,10,20,rgb(50,60,70))
    ...
 
05.09.2012  
 




Andreas
Koch
Das sieht jetzt so aus, als könnte ich das direkt benutzen. Schönen Dank schon mal.

Ich möchte aber wirklich nur sehr ungern auf dem Hauptfenster malen, eigentlich gar nicht. Kann man das nicht irgendwie umleiten? Ich habe da dieses hdc im Verdacht, weiß aber nicht wirklich etwas damit anzufangen, siehe erster Beitrag.

PS: Was bedeutet das DC eigentlich in lang?
 
05.09.2012  
 



DeviceContext ( [...]  )

Du kannst genau so gut auf einem "hPic" malen -

das ginge dann z.B. so:
KompilierenMarkierenSeparieren
nProc test

    parameters aufDiesemHPic&//siehe create("hNewPic",... in XProfan-Hilfe
    var dc&=createCompatibleDC(hDC)// hDC ist von XProfan, siehe XProfan-Hilfe
    selectObject(dc&, aufDiesemHPic&)
    //rummalen

    whileLoop 1000

        setPixel(dc&,rnd(100),rnd(100),rnd($FFFFFF))

    wend

    //dc wieder entfernen da nicht mehr notwendig
    deleteDC(dc&)
    //fertig auf hPic rumgemalt

endproc

 
05.09.2012  
 



Nachtrag: Gib auch ne pixels.inc [...]  für Beispiele schneller Grafik- Effekte

und eine hPic.inc auch für fortgeschrittenes Rumbildereihen: [...] 

und schau auch mal hier rein: [...] 
 
05.09.2012  
 




funkheld
Hmm.., was du meinst sind ja auch wieder die langsamen internen Grafik-Windowsbefehle(API):
MoveToEx(hDC,20,30,0)
LineTo(hDC,100,100)
Für ein flotte Grafik taugen die nichts.

Es geht doch direkt viel schneller mit (DirectX) und/oder mit XPIA(ASM) ohne diese fertigen langsamen Move und LineTo.

Gruss
 
05.09.2012  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

15.407 Betrachtungen

Unbenanntvor 0 min.
Rainer Hoefs03.05.2019
Walter Köhler21.09.2018
Andreas Koch08.09.2015
iF12.04.2015
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie