![]() |
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Hmmm also ich habe jetzt die "alte" Methode entfernt und sie neu deklariert:
Delphi-Quellcode:
Ergebnis war jedes mal eine weiße Fläche. Ich müsste auch bmp der Grafik zuweisen. Jetzt bekomme ich vernünftige Ergebnisse:
function TAdVCLFormat.AssignTo(ABitmap: TAdBitmap;
AGraphic: TObject): boolean; var pc1, pc2: PCardinal; x, y: integer; bmp: TBitmap; begin bmp := TBitmap.Create; try bmp.PixelFormat := pf32Bit; bmp.Width := ABitmap.Width; bmp.Height := ABitmap.Height; // Ab hier habe ich das aus deinen Codesniplseln kopiert for y := 0 to bmp.Height - 1 do begin pc1 := bmp.Scanline[y]; pc2 := ABitmap.Scanline(y); for x := 0 to bmp.Width - 1 do begin pc1^ := pc2^; //Inhalt ABitmap, Alpha $FF inc(pc1); inc(pc2); end; end; // Bis hier finally bmp.free; end; end;
Hier ist mein Workaround für weiße Hintergrundflächen:
Delphi-Quellcode:
Wie man sieht längst nicht so performat wie dein Code, aber damit bekomme ich immerhin Transparenz.
function TAdVCLFormat.AssignTo(ABitmap: TAdBitmap;
AGraphic: TObject): boolean; var bmp: TBitmap; y, x: integer; var i : Integer; LineIn, LineOut : PCardinal; LineInRec : LongRec; begin result := true; bmp := TBitmap.Create; try bmp.PixelFormat := pf32Bit; bmp.Width := ABitmap.Width; bmp.Height := ABitmap.Height; for y := 0 to bmp.Height - 1 do begin LineIn := ABitmap.ScanLine(y); LineOut := bmp.ScanLine[y]; for x := 0 to bmp.Width - 1 do begin LineInRec.Bytes[0] := 255 - LineIn^ shr 24; LineInRec.Bytes[1] := (LineIn^ shr 16) and $00FF; LineInRec.Bytes[2] := (LineIn^ shr 8) and $0000FF; LineInRec.Bytes[3] := LineIn^ and $000000FF; for i := 1 to 3 do begin if LineInRec.Bytes[0] < 255 - LineInRec.Bytes[i] then LineInRec.Bytes[i] := LineInRec.Bytes[0] + LineInRec.Bytes[i] else LineInRec.Bytes[i] := $FF; end; LineOut^ := $FF000000 or (LineInRec.Bytes[1] shl 16) or (LineInRec.Bytes[2] shl 8) or (LineInRec.Bytes[3]); Inc(LineIn); Inc(LineOut); end; end; TGraphic(AGraphic).Assign(bmp); finally bmp.Free; end; end; Übrigens gibt es eine Möglichkeit bei deinem Canvas auch Kreis/Rechtecksringe zu zeichnen? Und wie sieht es mit abgerundeten Rechtecken aus? Btw, wenn du möchtest könntest du noch folgende Funktionen implementieren (Dürfte es alle nicht geben):
Delphi-Quellcode:
MfG
function AdPoint(const APoint : TPoint) : TAdPoint; overload;
begin Result := AdPoint(APoint.X, APoint.Y); end; function AdRect(ACorner1, ACorner2 : TAdPoint; const APreventFlipOver : Boolean = true) : TAdRect; overload; var CornerBuffer : TAdPoint; begin if APreventFlipOver then begin if (ACorner1.X > ACorner2.X) or (ACorner1.Y > ACorner2.Y) then begin CornerBuffer := ACorner1; ACorner1 := ACorner2; ACorner2 := CornerBuffer; end; end; Result := AdRect(ACorner1.X, ACorner1.Y, ACorner2.X, ACorner2.Y); end; function AdRect(ACorner1, ACorner2 : TPoint; const APreventFlipOver : Boolean = true) : TAdRect; overload; begin Result := AdRect(AdPoint(ACorner1), AdPoint(ACorner2), APreventFlipOver) end; xZise |
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Was ist los :) Ist so still geworden, aber auch mit Workaround sieht die Transparenz schrecklich aus.
MfG xZise |
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Hallo,
ich habe deinen letzten Post ohne das Edit nur gelesen, deshalb wurde ich nicht darauf aufmerksam. Deinen "Workaround" muss ich mir mal genauer anschauen. Deine AdPoint-Funktion lässt sich auch viel effizienter ohne Funktion schreiben (übrigens geht das genauso mit TAdRect):
Delphi-Quellcode:
Mit der Transparenz schaue ich mal - wenn mich nicht alles täuscht, habe ich die Transparenzbehandlung ausgebaut: In den älteren Versionen habe ich das in das gegebene Bitmap übergeblendet. Ich dachte damals (als ich es ausgebaut habe) so was wie: "Wenn die VCL schon pf32Bit anbietet, dann verwende ich dass doch auch - da bekommt der Benutzer seine Daten auch so, wie sie sein sollen und nicht verfälscht." - Was auch stimmt, denn schließlich stehen die Daten 1 zu 1, so wie sie sein sollen im Speicher des Bitmaps. Ich denke hier sollte eher die VCL und nicht Andorra 2D gefixt werden. Du kannst ja mal Borland Inprise CodeGear Emba-irgendwas deswegen fragen ;-).
var
p1: TAdPoint; p2: TPoint; begin p1 := PAdPoint(@p2)^; end; Das mit dem APreventFlip over baue ich lieber direkt ins Canvas ein. Wenn du Code für abgerundete Ecken schreibst, übernehme ich den auch gerne. Schau dir mal die Unit TAdCanvas an - du musst einfach nur eine Klasse von TAdCanvasObject ableiten und 3 oder 4 Funktionen implementieren. Aber achte darauf, dass die Texturkoordinaten, Farbverläufe und Normalen richtig gesetzt werden und du nirgendst Speicherüberläufe einbaust. Und dann musst du nur noch eine Funktion zu TAdCanvas hinzufügen, die dein Objekt erzeugt und auf die aktuelle DisplayList pusht. Also ganz einfach... :-) Danke für die Vorschläge, Andreas |
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Tja, aber wie wir wissen können Bugfixes von größeren Softwareunternehmen eine Zeit dauern. Embarcadero heißen die Jungs übrigens momentan, aber wenn mans genau wissen will, sollte man das jeden Tag überprüfen, so oft wie sich das ändert. :mrgreen:
|
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Btw: Du wolltest doch mal wissen, was alles Andorra 2D verwendet? Da könntest du auch den DrawBall Editor drauf setzen! Und eine andere Frage: Ist es möglich ein "Screenshot" davon zu erstellen? MfG xZise |
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Grade gesehen: Könntest du bitte bei der Beschreibung von DrawBall auf der Andorra-HP (
![]() Durch das "your" ist das eigentlich schon ziemlich eindeutig als 'deine Eier' zu verstehen :mrgreen: |
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Uuups :oops:
Ok, jetzt sind es "Murmeln", ohne "your"... Aber vorher war es doch auch ganz lustig. ;-) |
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Here ye go, mate!
(Jemand mit einem englischen Lazarus könnte vielleicht noch mal überprüfen, ob die Menüpunkte so stimmen - wahrscheinlich nicht ganz, ich hab die einfach übersetzt und habe kein Lazarus, um es nachzuprüfen) Zitat:
|
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Wow .... Mal eben ein abgerundetes Rechteck zu zeichnen ist nicht ohne, wenn ich mir den Code des Rechtecks anschaue. Also ein Großteil habe ich verstanden, wobei ich bei procedure TAdCanvasQuadObject.Generate; noch nicht so den Durchblick habe :D
By the way: Zitat:
Und eine Frage bei dem Kreis: Die Anzahl der Schritte sind ja: 2 * PI * r * (0,1/(0,01 * r)) Wenn mich nicht alles täuscht lässt sich das vereinfachen: 2 * PI * r * ((1/10)/(1/100)) * (1/r) | Mit dem Kerwert malnehmen 2 * PI * r * (100/10) * (1/r) 2 * PI * r/r * 10 2 * PI * 10 20 * PI Siehe TAdCanvasEllipseObject.Generate:
Delphi-Quellcode:
Wozu so kompliziert :) Abgesehen davon wird der Kreis bei größerem Radius immer schlechter, da es immer 63 Ecken sind.
steps := round(Pi * 2 * ar * (0.1/(ar*0.01)));
Übrigens wie kann es sein, dass ein Kreis mit der SimpleDemo gezeichnet kein IntegerÜberlauf verursacht, während er in meinem Editor (komischerweise seit kurzem) einen solchen verursacht? Ich habe mein WorkAround verbessert, da vorher es zu Integerüberläufen kam. MfG xZise |
Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]
Warum ist das Property Name einer TAdImageList noch ein AnsiString, während alles andere ein String ist. Das könnte unter Delphi 2009 doch ein Problem geben, oder irre ich mich?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz