{"id":2284,"date":"2013-09-09T20:00:13","date_gmt":"2013-09-09T18:00:13","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2284"},"modified":"2013-09-09T20:00:13","modified_gmt":"2013-09-09T18:00:13","slug":"true-type-fonts-in-swingawt-anwendungen","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/09\/true-type-fonts-in-swingawt-anwendungen\/","title":{"rendered":"True Type Fonts in Swing\/AWT-Anwendungen"},"content":{"rendered":"<p>Grafische Oberfl\u00e4chen stellen selbstverst\u00e4ndlich wie Drucker Zeichens\u00e4tze dar. Doch der Weg von der Datei bis zur Darstellung ist lang und f\u00fchrt unweigerlich \u00fcber die Firma Adobe, die erstmalig die standardisierte Zeichendefinition PostScript \u00f6ffentlich machte. Genauer gesagt, definiert PostScript noch etwas mehr, doch das soll uns hier nicht interessieren. Die erste kommerzielle Zeichensatzrevolution begann 1985, als der Drucker LaserWriter von Apple das Adobe-Format PostScript rastern konnte. Die Definition eines Zeichensatzes lag bis zu dieser Zeit nur in Bitmaps vor, doch die PostScript-Zeichens\u00e4tze wie auch die TrueType-Zeichens\u00e4tze, um die es sp\u00e4ter gehen soll, lagen als Punktbeschreibung vor. Die Rasterung \u00fcbersetzte diese Punkte in eine Bitmap, die dann entweder auf dem Bildschirm oder auf dem Drucker ausgegeben wurde. Durch die Punktbeschreibung waren also nicht mehr gr\u00f6\u00dfenabh\u00e4ngige Beschreibungen vorhanden, sondern die Zeichen (auch Glyphs genannt) wurden durch Linien und Kurven in kubischen B\u00e9zier-Kurven beschrieben.<\/p>\n<p>Die Visualisierung der Zeichens\u00e4tze machte Microsoft und Apple Sorgen, weil Adobe mehrere Definitionen der PostScript-Zeichens\u00e4tze pflegte, darunter Type 1 (PS-1) und Type 3 (PS-3). Type 1 nutzt so genannte Hints (Hinweise), um auch bei unterschiedlichen Gr\u00f6\u00dfen und grafischen Oberfl\u00e4chen optimale Darstellungen zuzulassen. Diese Definition war jedoch geheim. Zeichens\u00e4tze des Type 3 sehen zwar auf dem Papier gut aus, nicht aber auf dem Bildschirm mit niedriger Aufl\u00f6sung \u2013 hier fehlen die Informationen aus den Hints. Microsoft und Apple wollten nun ihre Zeichensatzausgabe nicht der Firma Adobe \u00fcberlassen (die nat\u00fcrlich einen Type-1-Rasterer im Programm hatte), sondern definierten ihre eigene Font-Technologie, die nicht mehr auf B\u00e9zier-Kurven, sondern auf quadratischen B-Splines basierte. Apple machte dabei den Anfang mit Royal, welches sp\u00e4ter in TrueType (TT) umgetauft wurde. Dies war sechs Jahre nach den PostScript Fonts. Der einzige Hersteller, der dennoch bei PostScript-Type 1-Zeichens\u00e4tzen geblieben ist, ist IBM mit dem Betriebssystem OS\/2. Daneben nutzte auch NeXtStep diese Zeichensatzdefinitionen, doch das System hallte nicht lange nach.<\/p>\n<p>Nachdem Apple den Anfang mit TT gemacht hatte und es 1991 in MacOS integrierte, \u00fcbernahm auch Microsoft, wo ein bis dahin wenig lauff\u00e4higer PostScript-Clone (\u00bbTrueImage\u00ab) zum Einsatz gekommen war, die Technologie f\u00fcr Windows 3.1. Adobe erkannte fr\u00fch die Konsequenz dieser Allianz und \u00f6ffnete die Spezifikation f\u00fcr PostScript-Type-1-Zeichens\u00e4tze im M\u00e4rz 1990. Mitte des Jahres lieferte Adobe zus\u00e4tzlich den Adobe Type Manager (ATM) aus, der Type-1-(aber keine Type-3-)PostScript-Zeichens\u00e4tze f\u00fcr den Bildschirm und f\u00fcr nicht PostScript-f\u00e4hige Drucker darstellte. Heutzutage existieren beide Definitionen immer noch parallel, und f\u00fcr Drucker ist die Frage, welche nun besser ist, nicht zu beantworten. Moderne Drucker haben auch ein eigenes TrueType-Raster im ROM eingebaut. In Zukunft wird die Unterscheidung wohl auch unwichtiger werden, da Microsoft die \u00bboffene\u00ab OpenType-Spezifikation (auch \u00bbTrueType Open Version 2\u00ab genannt) nach vorne bringt. Der Zeichensatz PS-1 oder TrueType wird hier in einer OpenType-Datei gekapselt und dem Rasterer \u00fcbergeben und berechnet. Dabei \u00fcbernimmt Adobe, wo eine Zusammenarbeit mit Microsoft unterst\u00fctzt wird, die PS-1-Rasterung, und Microsoft die TT-Rasterung. In Zukunft m\u00f6chten Microsoft und Adobe Zeichens\u00e4tze im OpenType unterst\u00fctzen und deren Verbreitung f\u00f6rdern.<\/p>\n<p><b>TTF in Java nutzen<\/b><\/p>\n<p>Eine Einschr\u00e4nkung mit den gegeben vordefinierten Standard-Zeichens\u00e4tzen (Dialog, DialogInput, Monospaced, Serif, SansSerif, Symbol) ist, dass dies zu wenig sind. Doch die Font Kasse bietet die statisch Methode createFont() an, die zu einen Eingabestrom auf ein TrueType Zeichensatz das entsprechende Font-Objekt zur\u00fcckgibt.<\/p>\n<pre>Font f = Font.createFont( Font.TRUETYPE_FONT,\nnew FileInputStream(&quot;f.ttf&quot;) );<\/pre>\n<p>Der erste Parameter ist die fest vorgeschriebene Konstante Font.TRUETYPE_FONT, andere Parameter sind nicht definiert und f\u00fchren zu einer IllegalArgumentException(&quot;font format not recognized&quot;). Der zweite Parameter ist ein Eingabestrom zu der Bin\u00e4rdatei mit den Zeichensatzinformationen. Die Daten werden ausgelesen und zu einem Font Objekt verarbeitet. Da die Daten intern \u00fcber einen gepufferten Datenstrom in eine tempor\u00e4re Datei geschrieben wird, ist eine eigene Pufferung \u00fcber einen BufferedInputStream nur doppelter Overhead. Waren die Beschreibungsinformationen in der Datei ung\u00fcltig, so erzeugt die Fontklasse eine FontFormatException(&quot;Unable to create font &#8211; bad font data&quot;). Dateifehler fallen hier nicht drunter und werden extra \u00fcber eine IOException angezeigt. Der Datenstrom wird anschlie\u00dfend nicht wieder geschlossen.<\/p>\n<p>Wir wundern uns vielleicht an dieser Stelle, dass die Methode createFont() von der Arbeitsweise mit dem Konstruktor \u00e4hnlich sein m\u00fcsste, aber der Parameterliste die Attribute fehlen. Das liegt daran, dass die Methode automatisch einen Zeichensatz der Gr\u00f6\u00dfe 1 im Stil PLAIN erzeugt. Um daher einen gr\u00f6\u00dferen Zeichensatz zu erzeugen, m\u00fcssen wie ein zweites Font Objekt anlegen. Dies geschieht am einfachsten mit der Methode deriveFont().<\/p>\n<pre>font = f.deriveFont( 20f );<\/pre>\n<p>Der Parameter ist ein float und kein double.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Grafische Oberfl\u00e4chen stellen selbstverst\u00e4ndlich wie Drucker Zeichens\u00e4tze dar. Doch der Weg von der Datei bis zur Darstellung ist lang und f\u00fchrt unweigerlich \u00fcber die Firma Adobe, die erstmalig die standardisierte Zeichendefinition PostScript \u00f6ffentlich machte. Genauer gesagt, definiert PostScript noch etwas mehr, doch das soll uns hier nicht interessieren. Die erste kommerzielle Zeichensatzrevolution begann 1985, als [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-2284","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2284"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2284\/revisions"}],"predecessor-version":[{"id":2285,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2284\/revisions\/2285"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}