Typedef-Chaos in Anti-Grain-Geometry: Debug/Release unterschied
-
Hmmm. Nicht dass ich wüsste, aber ich schau mal nach ob sich irgendwo so was versteckt... Kann es für Templates und Typendefinitionen unterschiede zwischen den Konfigurationen geben?
Grüße
SörenEdit: Im fraglichen Code sind keine DEBUG-bezüglichen Präprozessor-Direktiven zu sehen...
-
ich hab schon ziemlich viel mit agg gemacht,
und muss sagen das dein problem eigentlich garnicht auftreten sollte ^^zeig mal die typendefinitionen von rendering_buffer, pixelformat, renderer_base, rasterizer, ... etc
gruss
-
Moin,
Was meinst du mit: Zeig mal die Typdefinitionen...? Die sind doch im agg definiert, oder?
Die Parameter der Funktion sind:
Color:
agg::rgba8(fillColor.red,fillColor.green,fillColor.blue,fillColor.alpha)
Base Renderer:
renderer_base<pixfmt_bgr24> baseRenderer;
Scanline:
agg::scanline_u8 sl;
Rasterizer:
agg::rasterizer_scanline_aa<> scanlineRasterizer;Das ganze geht übrigens nur schief, wenn ich Ellipsen zeichnen will, falls es was hilft:
void Vst2AggAdapter::renderEllipse(agg::ellipse ellipse) { if(!drawBufferAdapter.getBuffer())return; agg::scanline_u8 sl; agg::conv_transform<agg::ellipse,agg::trans_affine> ePath(ellipse, trans_affine()); scanlineRasterizer.add_path(ePath); agg::render_scanlines_aa_solid(scanlineRasterizer, sl, *aggRenderer.getBaseRenderer(), agg::rgba8(fillColor.red,fillColor.green,fillColor.blue,fillColor.alpha)); scanlineRasterizer.reset(); }Danke!
Sören
-
Kann es sein, dass du deine Variablen nicht alle initialisierst? - Daher könnte unteschiedliches Verhalten von Debug und Release hervorgerufen werden.
-
Das kommt bei mir mit Sicherheit mal vor, hier aber ganz bestimmt nicht. Die verwendeten Variablen Funktionieren beim Linienzeichnen super. aggRenderer.getBaseRenderer() ist auf jeden Fall initialisiert und color initialisiere ich ja beim Funktionsaufruf, fillColor gehts auch top. Was anderes sollte mit der Problematik ja nichts zu tun haben, oder? Meint ihr, dass beim dereferenzieren von getBaseRenderer() was schief gehen kann?
Grüße
Sören
-
Hast du Code in assertions? Der geht im Releasemode i.d.R. baden.
-
soerenP schrieb:
Moin,
Was meinst du mit: Zeig mal die Typdefinitionen...? Die sind doch im agg definiert, oder?
Die Parameter der Funktion sind:
Color:
agg::rgba8(fillColor.red,fillColor.green,fillColor.blue,fillColor.alpha)
Base Renderer:
renderer_base<pixfmt_bgr24> baseRenderer;
Scanline:
agg::scanline_u8 sl;
Rasterizer:
agg::rasterizer_scanline_aa<> scanlineRasterizer;Das ganze geht übrigens nur schief, wenn ich Ellipsen zeichnen will, falls es was hilft:
void Vst2AggAdapter::renderEllipse(agg::ellipse ellipse) { if(!drawBufferAdapter.getBuffer())return; agg::scanline_u8 sl; agg::conv_transform<agg::ellipse,agg::trans_affine> ePath(ellipse, trans_affine()); scanlineRasterizer.add_path(ePath); agg::render_scanlines_aa_solid(scanlineRasterizer, sl, *aggRenderer.getBaseRenderer(), agg::rgba8(fillColor.red,fillColor.green,fillColor.blue,fillColor.alpha)); scanlineRasterizer.reset(); }Danke!
Sörensoweit ich das sehe verwendest du einen rgba8 typen auf einem bgr24 surface.
was dazu führt das du die farben falsch darstellst.nur der lesbarkeit halber solltest du die agg typen in typedefinitions ausdrücken.
das verhindert natürlich das man sich mal beim typen irrt, und unerklärliche effekte hervorruft.typedef agg::pixfmt_bgr24 TPixFmt; typedef agg::renderer_base<TPixFmt> TRendererBase; typedef typename TPixFmt::color_type TColor; //bin mir nicht sicher ob das color_type wirklich so heisst (definiert ist der typ aufjedenfall). ... void Vst2AggAdapter::renderEllipse(agg::ellipse ellipse) { ... agg::render_scanlines_aa_solid(scanlineRasterizer, sl, *aggRenderer.getBaseRenderer(), TColor(fillColor.blue,fillColor.green,fillColor.red)); //hier TColor verwendet, welches global definiert ist ... }
-
inpimp schrieb:
]
soweit ich das sehe verwendest du einen rgba8 typen auf einem bgr24 surface.
was dazu führt das du die farben falsch darstellst.Hallo inpimp,
das ist leider falsch. Der Pixelformattyp ist zwar pixfmt_bgr24, der color_type von pixfmt_bgr24 ist aber rgba8. Außerdem wird ja auch versucht, die Farbtypen ins richtige Format zu konvertieren, was auch bei verschiedenen Typen funktionieren sollte, weil ich mir ja sonst auch nicht die Mühe machen müsste, erst die Farbe zu konvertieren. Und die Debug/Release-Unterschiede sind damit auch nicht geklärt. Und nochwas: Warum werden Linien in der korrekten Farbe dargestellt, Ellipsen nicht?
Was den Umgang mit Typedefinitionen angeht hast du aber vermutlich recht, das sollte ich mir angewöhnen.Vielen Dank trotzdem...
Sören
Edit:
Ich hab, um die ganze Sache besser Debuggen zu können, in der Release-Konfguration StackFrames an und die Optimierung aus. => Da ist der Fehler natürlich weg. WASZUMTEUFEL???
Edit2:
Jetzt, wo ich auch die VertexSources verstanden haben, hab ich die conv_transform weggelassen. Und jetzt läuft es. Seltsam. Die falschen Farben kamen wohl durch falschen Ausgabem beim Debug. (Die angezeigten Werte waren falsch...)
-
Das ist ein sehr nerviger Fehler und ich denke mal sehr schwer zu finden. Da kommst du wahrscheinlich am besten mit divide and conquer am besten voran. Geh Stück für Stück dem Fehler auf die schliche. Mit Debugger und sehr viel Geduld. Also schau, was falsch läuft, dann schau warum das falsch läuft. Also wenn z.B die Color falsch ist, kannst du nachschauen, welche Farbe beim rendern da ist. Dann weisst du, wenn die Farbe die falsche ist, dass irgendwo eine falsche gesetzt wird. Und so halt immer Stück für Stück zurück.
Mir ist bewusst, dass das jetzt nicht wirkilch das ist, was du an Hilfe erwartest, aber für uns ist das ganze noch viel schwerer nachzuvollziehen, weil wir weder deinen gesamten Code, noch die Bibiliothek mit der du arbeitest kennen. (zumindest ich nicht).
Du kannst einfach froh sein, dass du den Fehler reproduzieren kannst. Ich hatte letztens Fehler, die nur sporadisch und mit Zufallszahlen erscheinen. Sprich ich durfte einfach mal alles mittracken und wenn der Fehler so nach ein paar Minuten erschienen ist musste ich den mit dem Debugger dazwischen gehen und die nächsten paar Schritte Stück für Stück durchdenken.. Und sobald ich ein Stück zu weit ging, durfte ich wieder ein paar Minuten warten, bis ich wieder beim Fehler war..

Du siehst, dass jeder solche Fehler hat und da sehr viel Zeit draufgeht bei der Suche. Das einzige was du brauchst ist Zeit und Geduld. (Auch wenn es ein paar Tage dauert).. Wenn du den Fehler einmal hast ist das umso mehr eine Erhebung.

-
ich mag jetzt nicht auf dem beharren was ich gesagt habe, da ich agg nicht mehr so intensiv nutze.
aber wegen surfaces und farben konvertieren: bei agg 2.4 (die letzte version die ich verwendet habe) wurde nichts implizit konvertiert, man musste den richtigen surfacetype + colortype angeben.
um zweifel auszuräumen gibts ja zum glück den source

wenn du dir absolut sicher bist das du nichts falsch machst, und auch die neueste version davon hast,
solltest du das fehlverhalten dem agg author berichten
er leistet soweit ich weiss wunderbar support für agg.