Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 08:49

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Graphics32 Frage
BeitragVerfasst: Mi Jun 30, 2004 07:54 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hi,

ich hab nen komisches prob.
Ich progge momentan ne Dynamische Skin Engine auf Basis von TBitmapLayer´n.
Bisher funzte das ganze einwandfrei, Buttons, Progressbars, Backgrounds...

Ich benutze eine TForm, welche ich momentan noch die Layer auf ein TImage32 lege, welches das komplette Form ausfüllt.
Aktiviere noch einen API Transparenz befehl, so das Eine Farbe Masked wird.

Buttons, Progressbars, Backgrounds kommen mit einem Layer prima aus.
Aber Trackbars nicht, diese bestehen aus 2 Layern: Background und Bar

Am liebsten wäre mir wenn ichs nur mit einem Layer mache, aber dann bekomm ich es nicht hin die Bar mit AlphaMaske auf den Hintergrund zu zeichnen. Deswegen 2 Layer, Background mit seiner eigenen Transparenzmaske und Bar mit seiner eigener

Die Grafiken für die Trackbar sind in der TTrackbar struktur integriert, welche aber nicht abgeleitet von "TTrackbar" ist!
Gibt da 5 Grafiken:

Code:
  1.  
  2.   TTrackbar = class(TObject)
  3.   private
  4.     ...
  5.     X,Y,W,H,
  6.     BarW, BarH  : Integer;
  7.     LayerBg,
  8.     LayerBar    : TXLayer;
  9.     BitmapsBg   : array [0..1] of TBitmap;
  10.     {
  11.       0 Alphamask Background
  12.       1 Background
  13.     }
  14.     BitmapsBar   : array [0..1] of TBitmap;
  15.     {
  16.       0 Alphamask Bar
  17.       1 Bar
  18.       2 Bar gedrückt
  19.     }
  20.     Min,
  21.     Max,
  22.     Position : Int64;
  23.     ...
  24.   public
  25.     procedure Render;
  26.   end;
  27.  


Soweit so gut, im grunde sollte das ganz easy laufen und so sieht meine render routine für TTrackbar momentan aus.

Code:
  1.  
  2. // TTrackbar
  3. procedure TTrackbar.Render;
  4. var
  5.   ProgressPixel : Integer;
  6. begin
  7.   LayerBg.Bitmap.DrawMode := dmBlend;
  8.   LayerBg.Location := FloatRect(X,Y,X+W,Y+H);
  9.   LayerBg.Bitmap.SetSize(W,H);
  10.   LayerBg.Bitmap.Assign(BitmapsBg[1]);
  11.   AddBitmap32Alpha(LayerBg.Bitmap, BitmapsBg[0]);
  12.  
  13.   LayerBar.Bitmap.DrawMode := dmBlend;
  14.   LayerBar.Bitmap.SetSize(BarW,BarH);
  15.   case Orientation of
  16.     tbo_left_to_right:
  17.     begin
  18.       ProgressPixel := XValuesToPixels(Min, Max, Position, W - BarW);
  19.       LayerBar.Location := FloatRect(X + ProgressPixel,Y,X + ProgressPixel + BarW,Y + BarH);
  20.     end;
  21.     ...
  22.   end;
  23.   LayerBar.Bitmap.Assign(BitmapsBar[1]);
  24.   AddBitmap32Alpha(LayerBar.Bitmap, BitmapsBar[0]);
  25. end;
  26.  


Kurze erklärung:

Als erstes wird der background layer mit seiner AlphaMaske gezeichnet.
X und Y sind die Koordinaten wo der Layer positioniert werden soll auf dem TImage32.
W und H sind die Width und Height des Backgrounds.

Danach Wird der Bar Layer gezeichnet:

- Grösse festgelegt SetSite()
- Pixel Position berechnet, wo die trackbar betreffend der position steht XValuesToPixels()
- und dann die Position auf dem TImage32 festgelegt.

Code:
  1.  
  2.       LayerBar.Location := FloatRect(X + ProgressPixel,Y,X + ProgressPixel + BarW,Y + BarH);
  3.  


Und genau hier liegt das problem, die Bar ist 12x10 Pixel gross.
Aber es wird irgendwie voll komisch gestretched und ich raffs nicht wieso.

siehe screenie:

Bild

und so sollte es eher aussehen, ohne die Grüne farbe natürlich ;)

Bild
Bild

Es liegt an dem Location, da stimmt was nicht... sollte aber nach meiner meinung korrekt sein.

Left = Trackbar X Position + Fortschritt in Pixel
Top = Trackbar Y Position
Right = (Trackbar X Position + Fortschritt in Pixel) + Bar Width
Bottom = (Trackbar Y Position) + Bar height

So, dat wars wenn jemand eine idee hat wäre sehr dankbar.

Danke,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 08:07 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
hat sich erledigt funzt ;) war zu schnell mit forum thread hmpf :p

Bitte thread löschen, Danke !


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 08:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hmmm. Na gut. Dann kann ich ja mein bereits getipptes wieder löschen. Aber ein Tipp am Rande. Für solche Probleme gibt es einen Debugger und der ist Gold wert. Wenn man ihn den benutzt.

Aber etwas anderes was mir nicht ganz sinnvoll erscheint. In der Methode Render. Tut es not, dass du dort deine Bilder erstellst? Zum Beispiel LayerBg. Du setzte eine Reihe von Eigenschaften und rufst diverse Methoden (Bitmap.Assign, AddBitmap32Alpha,...) auf. Ist es nicht sinnvoller diese zu Begin zu machen? Oder ändert sich die Bilder ständig. Denn wenn sie es nicht tun verschwendest du enorm viel Zeit.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 08:53 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Die bilder ändern sich, je nachdem was für status sie haben.

Trackbar ist die einzige welche 2 layer hat, wo ich background nur einmal zeichnen lassen könnte.

Siehe diese Executable: http://www.xenorate.com/final/Xenorate3.zip

So jetzt kommt noch TEdit, TListbox und TCheckbox dran ;)

*Edit:

Betreffend geschwindigkeit hab ichs optimiert, das Backgrounds,sachen welche sich niciht ändern nur einmal gerender werden, am anfang.

hab da einfach ne variable erstellt FirstDraw : Boolean diese auf false gesetzt beim initialisieren.
und in der zeichen routine steht einfach ob FirstDraw = false is, wenn ja dann wird background usw, alles was sich nciht ändern gezeichet und Firstdraw auf true gesetzt.

Beim nächsten zeichenvorgang, bleibt das dann weg ;)

aber das geht leider nur bei Trackbars :( Bei allen anderen ausser Backgrounds funzt diese methode nicht.
Naja, zeichen routine lass eh nur aufrufen wenn sich was ändert.


Zuletzt geändert von Finalspace am Mi Jun 30, 2004 09:17, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 09:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ah. Okay. jetzt sehe ich auch die kleinen Bilder. Die waren gerade irgendwie nicht da.

Jetzt glaube ich zu verstehen was sich ändert. Evtl wäre es an der Stelle ja sinnvoll die einzelnen Layer schon vorzuberechnen und je nach Status dann den einen oder anderen Layer zu verwenden. Allerdings weiß ich nicht ob das so einfach möglich ist und vor allem (viel wichtiger) wie oft das Render überhaupt aufgerufen wird. Wenn es nur bei Veränderungen aufgerufen wird, dann kann man sich das auch sparen. Allerdings wenn es in regelmäßigen Abständen aufgerufen wird sieht das schon wieder ein wenig anders aus. Aber das kannst du besser beurteilen als ich. ;-)

PS: der Link geht im Übrigen nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 09:21 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
ah hier der richtige link: http://www.xenorate.com/final/temppics/Xenorate3.zip

Betreffend der render routinen, diese werden nur ausgeführt wenn sich was ändern, und auch nur das jeweilige Objekt.
Brauch man ja nich bei GR32 ;)

Hmm... wenn du lust hast kannst mich ja mal in icq oder so anlabern, dann kann ich dir ja mal genauer erklären was ich noch mache ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 10:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Hm,
Problem an den TBitmap32 Layern ist wirklich die Performance.
Sobald du auch nur ein bisschen an dem Layer änderst(Position,größe,drauf zeichnen) wird das gesammte TImage32 neu gezeichnet.
Deshalb wirklich verdammt gut aufpassen wie oft du irgendwas an den Layern änderst.
am besten zu Beginn der Render Routine immer TImage32.BeginUpdate und am Ende TImage32.EndUpdate aufrufen. Wird dazwischen irgendwas am Layer gemacht so wird das TImage32 nicht jedesmal neu gezeichnett.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 10:05 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Guter Tip, danke !

;) Ah Billi-san haste dir ma Talisman Desktop angeguckt?
Ist echt nich schlecht, aber supported leider kein unicode deshalb unbrauchbar für mich :(
Kannst dir da ja paar sachen abgucken oder so sind echt nette sachen drin ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 10:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Finalspace hat geschrieben:
;) Ah Billi-san haste dir ma Talisman Desktop angeguckt?
Ist echt nich schlecht, aber supported leider kein unicode deshalb unbrauchbar für mich :(
Kannst dir da ja paar sachen abgucken oder so sind echt nette sachen drin ;)

Ich bin ständig dabei mir auf diversen Art/Skin/Theme Seiten wie DeviantArt oder Wincustomize die ganzen Screenshots und Themes anzusehen ;)
Meine beste Quelle für neue Ideen war aber bis jetzt das XFCE4 Shell unter Linux 8)

[Edit] Zur Zeit verzweifle ich recht stark am JPEG laden mit TBitmap32. Das ist bei mir einfach nur dermaßen abartig langsam. 10 Sekunden um ein 1024x768 bild zu laden :shock:
Vielleicht mach ich irgendwas falsch, aber in der GR32 Mailingliste hab ich auch schon mehrfach was gelesen wo es Leuten nicht anders ging... :(
Hat jemand ne Idee wie ich das irgendwie beschleunigen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 10:25 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also ich weiss ja nicht... ich würde JPEG standmässig mit TBitmap laden, oder sogar gleich eigenen JPEG loader nehmen.
Im bereich OpenGL gibts ja unmengen an loader, da einfach an der JPEG-Lade routine orientieren oder so.
Und dann direkt per Bitmap32.Pixels oder so zuweisen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 10:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Ok, ich hab mein Problem gefunden...
Es ist nicht direkt das JPEG laden, (Jpeg laden dauert ~ 310 ms)
sondern das TBitmap32 auf das TPNGImage zuweisen damit ich es dann als .png Datei Speichern kann.
Problem ist das ich das TBitmap32 nicht direkt auf das TPNGImage zuweisen kann sondern hier noch über ein extra TBitmap gehen muß. Eine Idee wie ich das direkt machen kann?
Wenn das irgendwie direkt mit einem TJPegImage geht würde ich auch das nehmen (obwohl mir .png wesentlich lieber wäre).
TBitmap32 unterstützt aber soweit ich weiß kein direktes .jpg speichern, oder Irre ich mich da?

[Edit]
Wie es scheint ist es nur das als PNG Speichern was so verdammt langsam ist,
hab das ganze Zuweisen jetzt auf 90 ms hinbekommen...
Werde dann wohl doch .jpg nehmen müssen

[Edit2]
Als PNG Speichern dauert 4,6 sekunden,
als JPEG dauerts 1,3 sekunden.
Ich glaub ich steige auf .jpg um =)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 30, 2004 13:29 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Wieso nich gleich tga ;)
Im Bereich OpenGL ist es sowieso unschlagbar, weshalb nicht dann auch für anwendungen nehmen ? ;)

Yeah ich habs geschafft zum ersten mal eine Japanische File anzeigen und abspielen zu lassen ;)
Jetzt muss ich nur noch ne gescheite verwaltung von Threads programmieren, damit ich OSD`s, Progressbars, Scrolllabels usw perfect machen kann ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]