Extreme Schriftarten

    Kleine Rasterschriften waren lange Zeit die Plage von KolibriOS. Aber vor relativ kurzer Zeit ist ein weiterer Entwickler dem Projekt beigetreten - Pathoswithin . Er navigierte schnell durch das Projekt und machte sich daran, dieses Problem zu lösen. Sie können die Ergebnisse seiner Arbeit in den neuesten nächtlichen Bauten beobachten. Nun, dieser Artikel handelt von der Arbeit an Schriften, die Pathos selbst geschrieben hat .


    Jedes Schriftzeichen wird als „Glyphe“ bezeichnet. In der Tat ist dies ein gewöhnliches Bild. Gibt es viele Probleme beim Zeichnen von Bildern? Mindestens zwei. Zuallererst muss die Schriftart skaliert werden, und wenn es immer noch möglich ist, sie zu reduzieren, wird nichts Gutes daraus



    Daher müssen Glyphen zunächst eine hohe Auflösung aufweisen. Um eine maximale Qualität zu erzielen, sind mehrere Sätze unterschiedlicher Größen erforderlich. Und okay, wenn die Schriftart 256 Zeichen hat. Was ist, wenn Unicode? Solch eine Schriftart nimmt selbst für moderne Standards viel Speicherplatz in Anspruch.

    Eine Bitmap speichert die Farben jedes Punktes. Aber warum, wenn Sie eine Beschreibung zum Zeichnen einer Glyphe behalten können. Glücklicherweise passen Schriften perfekt zu den Prinzipien von Vektorgrafiken. In diesem Fall ist es ausreichend, die Koordinaten mehrerer Punkte anzugeben, zwischen denen Sie Linien zeichnen müssen. maximum - Parameter zum Zeichnen einer Kurve. Da fast alle Punkte "on the fly" gezeichnet werden, sind solche Glyphen nicht an eine bestimmte Auflösung gebunden und benötigen viel weniger Speicherplatz.



    Das zweite Problem: Die Reduzierung, einschließlich der Glättung, besteht in der Verwendung von Halbtönen. Dies ergibt ein hervorragendes Ergebnis in Bezug auf Fotos, aber die Glyphe ist ein kontrastierendes Bild, meist ein schwarzes Symbol auf weißem Hintergrund, und wenn Grautöne erscheinen, sieht es verschwommen aus. Andererseits ist es unmöglich, ein kleines Symbol mit nur zwei Farben schön zu zeichnen.

    Um dieses Problem zu lösen, werden die Funktionen von LCD-Monitoren verwendet. Jedes Bildschirmpixel in horizontaler Richtung besteht aus drei Subpixeln: Rot, Grün und Blau. Die Kombination unterschiedlicher Helligkeit dieser Farben bildet den ganzen Rest. Sie werden auf die gleiche Weise codiert, wodurch es einfach ist, Subpixel einzeln zu verwalten. Darüber hinaus können die Farben benachbarter Pixel verschmelzen, wenn der Unterschied zwischen deren Helligkeit nicht zu groß ist. Diesem Prinzip liegt die ClearType-Anti-Aliasing-Technologie zugrunde: Glyphen werden in dreifacher horizontaler Auflösung gezeichnet, Pixel werden mit Subpixeln gleichgesetzt und ihre Helligkeit wird unter Berücksichtigung von 4 Nachbarn bestimmt. Tatsächlich sind Farben mit einem Durchmesser von 5 Subpixeln unscharf, das klassische Verhältnis ist 1/2/3/2/1.



    MenuetOS verwendete eine winzige Bitmap-Schriftart mit einer Glyphenauflösung von 6 x 9. Jedes Pixel wird durch ein Bit, ein Zeilenbyte, 9 Bytes für jedes von 256 Zeichen beschrieben, die gesamte Schriftart benötigt 2 kb. Es sieht nur mit einer Bildschirmauflösung von nicht mehr als 800x600 gut aus. KolibriOS versuchte wiederholt, Vektorschriften zu verwenden, aber beide Probleme stießen an den Rand.

    Mit Ausnahme des Kernels ist das Schreiben unter KOS nicht nur in Assemblersprache möglich. Um jedoch klein und schnell zu bleiben und nicht zu Linux zu werden, ist die Hauptdistribution das Image einer 1,4-MB-Diskette. Für einige ist dies eine psychologische Barriere, für andere ein banaler Zaun. Vektorschriften sparen im Vergleich zu großen Rasterschriften an Größe, belegen aber immer noch mehr als 2 KB. Es wird eine Schande sein, eine Schriftart zu verwenden, die größer als der Kernel ist und Treiber und Grafiken enthält.

    Außerdem gibt es in jedem offenen Betriebssystem Probleme mit Treibern für Grafikkarten. Nvidia und ATI sind ebenfalls eine Mafia, sie verkaufen Hardware, aber sie erklären nicht, wie sie ohne Windows mit ihnen kommunizieren sollen. Glücklicherweise gibt es VESA-BIOS-Erweiterungen, mit denen Sie zumindest die Bildschirmauflösung auf normal einstellen können, aber das Schreiben von durchscheinenden Pixeln in den Videospeicher nicht. Daher müssen Sie das Pixel von dort manuell lesen, die Farben im richtigen Verhältnis mischen und zurückschreiben. Die Häufigkeit der Kommunikation mit dem Videospeicher ist hoch, es treten jedoch große Verzögerungen vom Beginn der Übertragung bis zum Empfang des Ergebnisses auf. Das Schreiben ist schnell, aber beim Lesen müssen Sie lange warten, bis das angeforderte Pixel geliefert wird. Das Aufnehmen eines Screenshots in diesem Modus dauert beispielsweise länger als eine Sekunde. Da das Antialiasing auf dem Mischen der Pixel im Hintergrund mit der Farbe der Glyphe basiert, Dann wird das Zeichnen von Vektorschriften auf dem Bildschirm zu einem äußerst langsamen Vorgang. Ohne Anti-Aliasing benötigen sie entweder zusätzliche Daten zum Andeuten oder sie sehen schlechter aus als Raster-Daten.



    In den besten Traditionen der Low-Level-Programmierung habe ich mir die Frage gestellt, wie man das Maximum zu minimalen Kosten erreicht und mich entschlossen, mehr aus dem herauszuholen, was ist. Mit einer einfachen Vergrößerung bestehen die Symbole aus Quadraten und rechten Winkeln (obwohl einige Kenner des Kubismus diesen Stil mögen), aber wenn Sie die Punkte an den richtigen Stellen zeichnen, erscheinen Winkel von 45 oder sogar 30 Grad. Der Bildglättungsalgorithmus, der optional in diesem "Pixel" -Spiel vorgestellt wurde, hat mich inspiriert . Bei vorhandenen Schriften mit einer Dicke von einem Pixel sind vorhandene Implementierungen jedoch nicht sehr gut.
    Zum Beispiel das Ergebnis von hqx:



    Als Ergebnis habe ich meinen eigenen Algorithmus erstellt, der speziell für kleine Rasterschriften entwickelt wurde, und ihn als Anti-Eye-Bleeding bezeichnet, weil weder mehr noch weniger.



    Sie können die Entwicklung des Algorithmus in unserem Forum verfolgen .

    Nach allgemeinen Grundsätzen wird eine Mehrfacherhöhung oder -glättung erzeugt (um eine reguläre oder eine Subpixel-Erhöhung mit einem vorberechneten Verhältnis zu wählen). Beim Glätten werden nur wenige einzelne Pixel gemischt, wodurch eine akzeptable Leistung erzielt werden kann. Es ist in Assembler geschrieben und als Basiswerkzeug in den KolibriOS-Kern integriert. Außerdem habe ich dem Kernel eine 8x16-Schriftart für 1400 Unicode-Zeichen mit einer Größe von 22 KB (ohne Komprimierung) hinzugefügt, weshalb sie bis zu 188 KB (92 KB nach der Komprimierung) zu heiß wurde.

    Unmittelbar nach der Einführung des systemweiten Anti-Aliasing ist eine Funktion aufgetaucht: Wenn Sie Text zeichnen, müssen Sie die vorherige löschen, da ansonsten die Intensität der gemischten Pixel mit jedem Neuzeichnen zunimmt. In einigen Programmen wird immer noch der Text "Adipositas" angezeigt.

    Das Hauptproblem bleibt die Skalierung mit einem Bruchfaktor. Ich habe versucht, eine Bibliothek zu schreiben, die ClearType verwendet, um nach einer mehrfachen Vergrößerung auf die richtige Größe zu verkleinern, aber das Ergebnis bleibt umstritten. Sie können jedoch bei der Bewertung helfen:


    Jetzt auch beliebt: