Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich hab nen kleinen Bug. Und zwar werden bei mir bei Unicode-Strings die führenden Leerzeichen nicht mit gerendert. Bei tsTextGetWidthW werden sie aber mitberechnet. Der Fehler tritt mit Lazarus 32- und 64-bit auf.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Bergmann89 hat geschrieben:
ich hab nen kleinen Bug.
Nun. Das muss erst noch bewiesen werden. Nicht Alles was sich nicht so verhält wie man das erwartet muss ein Fehler sein.
Leider fehlen mir da ein bisschen die Randbedingungen um zu erkennen wie du die TextSuite benutzt. Aber ich vermute mal, dass du den Text im Blockmodus ausgibst. Und bei dem ist es so gewollt, dass Leerzeichen am Anfang und Ende einer jeden Zeile unterdrückt werden. Denn in diesem Modus nützt dir eigentlich die Information über die Breite des Textes nicht sonderlich viel. Bzw. ist eine Anforderung dieses Modies eben solche Sachen nicht wissen zu müssen.
Zum Erfragen der aktuellen Position innerhalb eines Blockes müsstest du tsTextGetWidth/Height mit nil als Parameter aufrufen. Dann wird die aktuelle berechnete Größe zurückgeliefert. Natürlich wird nur der Text berücksichtigt der aktuell schon übergeben wurde. Wobei ich gerade nicht genau weiß, ob das mit eine Ausrichtung anders als Oben/Links auch so richtig funktioniert.
PS: Neben den normalen Leerzeichen gibt es auch noch das No-Break Space (Dauerleerzeichen) innerhalb des Zeichensatzes. Ist auch Bestandteil des Ansizeichensatzes. Das wird natürlich nicht umgebrochen oder weggeschnitten.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich wollte mit meiner Erklärung jetzt auch nicht sagen, dass du stumpf die Leerzeichen ersetzen sollst. Sondern schon, dass du dir Gedanken machen solltest was du damit bezwecken willst. Wenn das eine Einrückung am Absatzanfang werden soll. Okay. Genau dafür ist es gedacht. Die vorherige Verwendung von tsTextGetWidthW erzeugt bei mir aber dennoch eine leichte Verwirrung. Denn da Frage ich mich was du damit bezwecken wolltest. Da vermute ich, dass du einzeiligen Text ausgeben wolltest. Wofür wiederrum der Blockmodus nicht ausgelegt ist. Du verstehst mein Dilema?
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
das ganze ist für das Edit bei unserer GUI. Wenn man da paar Leerzeichen und dann erst Text eingibt, dann rendert er das falsch. Das ist zwar dort nur ein einzeiliger Text, aber ich hab trotzdem nen Block genommen, weil ich dann nich mehr viel rechnen muss. So sag ich einfach, das der Block so groß wie das Edit sein soll un der Text vertical zentriert gerendert werden soll. Fertig. Warum selber rechnen, wenn's schon implementiert ist? Das tsTextGetWidthW spielt nur eine Rolle, um die Position des Cursors zu ermitteln.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Na ja. Schön ist das sicherlich nicht gelöst. Wenn es nur einzeilig bleiben soll wäre das Sauberste wohl wirklich den Text nur einzeilig auszugeben. Da finden intern auch weniger Berechnungen statt und Leerzeichen bleiben erhalten ohne Manipulationen durchführen zu müssen. Sollte der Text abgespeichert werden muss der ja auch wieder zurück gerechnet werden. Wenn es später auch mehrzeilig werden soll bliebe da nix anderes übrig. Wobei du dann eh Probleme bekommen würdest, denn da stößt du an die Grenzen des Blockmoduses. Der ist halt eher nur auf Ausgabe ausgelegt anstelle auf Berechnungen innerhalb. Da würde man sich wohl weniger Verrenkungen aufhalsen, wenn man die Zeilen selber zerlegen würde und die Zeilen einzeln im SingleLine ausgibt. Mache da intern auch nix Anderes. + immer die gleichen Berechnungen.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich hab mal wieder ein kleines Problem mit der TextSuite, wo ich nicht so recht weiter weiß. Und zwar wird der Text auf hellem Untergrund sehr ausgefranst (siehe Anhang; erste Zeile). Wenn ich den Text mehrmals übereinandern render sieht alles 1a aus (siehe Anhang; zweite Zeile). Aber alles doppelt und dreifach rendern ist nicht wirklich ne schöne Lösung. Ich hab auch schonma in die Doku geguckt, aber da find ich auch nich wirklich was, was mir weiter hilft. Gibts da ne Möglichkeit das Problem eleganter zu lösen?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich würde mal spontan sagen, dass es entweder am Font oder am Renderer liegt, der die Glyphen für die TextSuite erzeugt. Man kann ja recht gut erkennen, dass gerade Linien klar zu erkennen sind und keine Transparenz aufweisen. Nur bei Rundungen wird die Transparenz so übermäßig stark, dass die Pixel kaum noch zu erkennen sind. Von daher denke ich, dass der Renderer die Fonts sehr genau abzubilden versucht oder die Stärke der Fonts scheinbar extrem dünn ist. Dadurch werden wohl bei den Rundungen die Pixel nur 1/10tel des Pixel belegen wodurch es kaum noch sichtbar ist. Die GDI hat spezielle Technicken eingebaut mit denen solche Fälle vermieden werden sollen. Also überprüfe mal ob das Font zu dünn ist, ob es bei anderen Fonts auch auftritt. Und wenn alles nix nützt könntest du da wohl eventuell was mit einem PostProcessor machen. Durch alle Pixel gehen und entsprechend den Alphakanal manipulieren damit dessen transparenz nicht mehr so stark ist. Es sei denn es ist komplett transparent. Das wäre dann vom Effekt her wie doppelt zeichnen. Nur passiert das dann nur einmalig beim Erstellen der Fonts. Aber ich würde erst mal die anderen Sachen versuchen rauszufinden. Denn irgendeinen Grund muss es ja schließlich haben.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Sieht aus wie falscher Blending-Modus. Versuch mal GL_ONE, GL_ONE_MINUS_SRC_ALPHA.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Für mich sieht das bereits nach GL_ONE, GL_ONE_MINUS_SRC_ALPHA aus. Denn es ist ja nicht die gesammte Schrift davon betroffen sondern nur einzelne Pixel. Bei den Pixeln ist zwar auch zu erwarten das die transparenter sind. Nur sollte das nicht so extrem sein. Dürfte im Übrigen mit schwarzer Schrift auf weißem Grund auch ähnlich sein.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
blending Mode ist (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). Bei schwarzer Schrift auf weißem Hintergrund tritt der Effekt auch auf, aber da ist es nicht ganz so schlimm. Ich hab zum Test mal das AA der TextSuite deaktiviert. Bis jetzt sieht es gut aus. Mal sehen ob sich da noch irgendwo Nachteile ergeben...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
Stimmt. Das ist ja normal der "übliche" Blendmodus. Dann ziehe ich meine Aussage zurück und behaupte das Gegenteil. Ist schon ewig her, dass ich das letzte mal opengl programmiert habe.
AntiAliasing: Das ist nicht das AntiAliasing der TextSuite sondern das des FontRenderers. Die TextSuite macht eigentlich nix anderes als die Glyphen der einzelnen Schriften zu sammeln, zu verwalten und als Quads zu zeichnen. Wenn man von den Effekten absieht.
Nebeneffekte: Da stellt sich jetzt die Frage wie du das gemacht hast. Ob du das nur für das einzelne Font deaktiviert hast oder ob du es gleich Global deaktiviert hast. - Global: Dann fehlt bei allen Schriften jegliche Kantenglättung. Was in der heutigen Zeit eigentlich nicht mehr Standard ist und weswegen man ja primär zu texturbasierten Schriften gegriffen hat. Und je nachdem wie empfindlich der Benutzer ist mag er das als störend empfinden. Besonders wenn die Schrift größer wird nimmt man das stärker war. - Einzeln: Das betrifft dann zwar nur eine Schrift. Aber bedeutet auch, dass andere Schriften noch Kantenglättung haben. MIscht man diese Schriften in der gleichen Anwendung (noch schlimmer in der gleichen Szene oder Textblock), dann fällt das recht stark auf. Neben dem Effekt, dass so etwas verwirrend/verstörend wirken kann wirkt es aber laienhaft. Selbst, wenn die Codestruktur genial ist wirkt es zusammengeschustert. Denn die Benutzer sehen nicht den Code sondern nur das Ergebniss. Weiterer Nebeneffekt: Bei sehr kleinen Buchstaben kann es sein, dass die Buchstaben etwas unförmig werden. Dadurch, dass bei Kantenglättung auch halbe Pixel als Schattierung möglich sind wirken Rundungen wesentlich länger rund als mit vollen Pixeln.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich hattes es global deaktiviert. Jetzt hab ich es aber beim erstellen des Fonts deaktiviert. Bei den kleinen Fonts sieht alles perfekt aus. Die von dir beschriebenen Nebeneffekte treten auch nicht auf (mal sehen ob das so bleibt). Sehr große Texte sehen aber - wie erwartet - unsauber aus. Deshalb hab ich mir den Font in ne Klasse gewrappt, sodass ich die Einstellungen relativ schön an und abschalten kann und der Font dann jedesmal neu erzeugt wird, wenn das nötig ist. Da kann ich dann das AA per Hand an oder abschalten. Vlt findet sich ja dafür später noch ne bessere Lösung, aber so geht es erstmal und liefert die gewünschten Ergebnisse. Danke für die Hilfe
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Nun ja. Ich habe maximal geholfen zu erkennen was da passiert. Du hast ja deine ganze eigene Problembeseitigung dafür gefunden... Die von mir beschriebenen Nebeneffekte hängen immer vom jeweiligen Betrachter ab. Und da gibt es halt empfindlichere und weniger empfindliche.
[edit] Die globale Einstellung wirkt sich im übrigen auch nur auf Fonts aus die im Anschluss erstellt wurden. Sollte bereits ein Font erzeugt worden sein so wird deren Einstellung natürlich nicht verändert.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Dummdidumm, hast du GL_ONE, GL_ONE_MINUS_SRC_ALPHA probiert?
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 11 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.