Schrift mit transparentem Hintergrund

  • Hi,


    ich möchte mal ein Problem diskutieren, das mich schon länger stört...wenn man in einem true color OSD auf einer Pixmap einen Text mit


    Code
    virtual void DrawText(const cPoint &Point, const char *s, tColor ColorFg, tColor ColorBg, const cFont *Font, int Width = 0, int Height = 0, int Alignment = taDefault)


    schreibt und ColorBg auf clrTransparent setzt, dann hat man bei bestimmten Farbkombinationen (dunkle Schrift auf hellem Hintergrund) den Effekt, dass die Schrift "ausgefranst" ist. Irgendwie wird der Hintergrund um die einzelnen Buchstaben da nicht sauber gezeichnet...


    Klar kann ich den Hintergrund auf die gleiche Farbe setzten wie die Hintergrundfarbe der Pixmap...das ist nur dann blöd, wenn der Hintergrund einen Farbverlauf hat ;) Als Workaround kann man ein weiteres transparentes Pixmap über die Pixmap mit dem Hintergrund legen und den Text darauf zeichnen...dann tritt dieser Effekt nicht auf.


    Ich merke das übrigens nur auf meinem LCD TV, auf dem Monitor an meinem Entwicklungsrechner sehe ich das nicht...keine Ahnung, warum?!


    Vielleicht hat Klaus da ja ne Idee dazu...


    Ciao Louis

  • Ich merke das übrigens nur auf meinem LCD TV, auf dem Monitor an meinem Entwicklungsrechner sehe ich das nicht...keine Ahnung, warum?!


    Ob der Fehler im Code liegt, da bin ich mir nicht so sicher. Hast Du auf Deinen Entwicklungsrechner auch softhddevice im Einsatz oder eher was anderes? Vielleicht stellt sich die Frage: wo liegen die Unterschiede zwischen den beiden Systemen?


    Albert

  • Moin,


    der Effekt tritt ja auch bei den meisten nopacity und tvguide Usern auf...nur auf meinem Entwicklungsrechner merke ich es nicht. Ich denke schon, dass das ein Problem ist, wie der transparente Hintergrund vom VDR erzeugt wird, bzw. wie die Schrift gerendert wird.


    Ciao Louis

  • Das Problem ist, daß cFreetypeFont::DrawText(cPixmap *Pixmap, ...) den Text *immer* mit ColorFg und ColorBg (bzw. deren AlphaBlend-Werten für Anti-Aliasing) zeichnet. Wenn ColorBg clrTransparent ist, dann wird lediglich in cPixmapMemory::DrawText() nicht vorher das entsprechende Rechteck mit ColorBg gefüllt.


    Ich schätze mal, das stammt noch aus der Zeit bevor es Anti-Aliasing gab, denn ohne das macht das nichts.
    Um das völlig "richtig" zu behandeln müsste in cFreetypeFont::DrawText(cPixmap *Pixmap, ...) erst der aktuelle Farbwert des jeweiligen Pixels aus der Pixmap geholt werden und *dieser* anstatt ColorBg in


    Pixmap->DrawPixel(cPoint(x + pitch + g->Left() + kerning, y + row + (height - Bottom() - g->Top())), AlphaBlend(ColorFg, ColorBg, bt));


    verwendet werden. Das ist aber nicht vorgesehen, denn eine cPixmap könnte auch auf einer nur über ein "Nadelöhr" erreichbaren Hardware liegen, und da wäre es relativ aufwendig, einzelne Pixel rüberzuschaufeln.


    Klaus

  • Hi Klaus,


    danke für die Erklärung.


    D.h. also, ausser meinem oben beschriebenen Workaround mit einer separaten transparenten Pixmap obendrüber siehst du keine Chance, mein Problem mit nur einer Pixmap zu lösen?


    Ciao Louis


  • D.h. also, ausser meinem oben beschriebenen Workaround mit einer separaten transparenten Pixmap obendrüber siehst du keine Chance, mein Problem mit nur einer Pixmap zu lösen?


    Mit den momentanen Mitteln leider nicht.
    Man könnte natürlich cPixmap eine GetPixel()-Funktion geben und diese in cFreetypeFont::DrawText(cPixmap *Pixmap, ...) verwenden, mit der Argumentation, daß eine cPixmap, die in "Hardware" implementiert ist, ja wohl auch das Font-Handling auf der "anderen Seite" des Nadelörs handhaben wird. Das wäre aber eine API-Änderung und ich bin mir nicht ganz sicher, ob das überhaupt gut wäre. Zumindest müsste GetPixel() "protected" sein und cFreetypeFont müsste dann "friend" von cPixmap werden, denn ich würde nicht gerne zulassen, daß jeder einfach so auf die Pixel einer cPixmap zugreifen kann.


    Klaus

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!