Autor Wątek: Biblioteka do obsługi fontów wspierająca Unicode.  (Przeczytany 5118 razy)

.

  • Gość
# Sierpień 02, 2008, 15:08:03
Od zawsze na forum pojawiało się wiele pytań odnośnie fontów, unicodu i renderingu napisów. W związku z tym chciałbym zaprezentować Wam potężny *moduł odpowiadający za pracę z fontami. Moduł jest niezależny od API biblioteki graficznej i systemu. Wspiera Unicode. Niewątpliwie jest bardzo przystępny i przeznaczony w szczególności dla programistów gier. Umożliwia wygodny rendering do wspólnej tekstury. Pozwala dynamicznie i efektywnie skalować fonty. Architektura biblioteki umożliwia to, czego nie umożliwia żadna inna biblioteka: jawny i niesamowicie efektywny podział na Font i Face. Biblioteka jest w pełni obiektowa. Ze wszystkich tego typu bibliotek na rynku niewątpliwie wyróżnia się możliwościami i przystępnością.

Biblioteka dostarcza dwóch podstawowych klas -- 'Font' i 'FontFace':
  • Klasa 'Font' odpowiada za wczytanie fonta (bezpośrednio z pamięci lub z pliku na dysku) i zinterpretowaniu go na wewnętrzny format. Klasa ta umożliwia wybranie kodowania, odczytanie z fonta podstawowych informacji, takich jak typ, nazwiska autorów, licencję, czy rodzinę fonta.
  • Klasa 'FontFace' umożliwia, po dowiązaniu do wybranego obiektu klasy Font, rendering poszczególnych glifów jak i ustawienie rozmiaru czcionki.


Wspierane formaty:
- TrueType (+ collections)
- OpenType
- Type 1, 2, 42
- Compact Font Format
- Microsoft Windows bitmapped font
- TrueDoc Portable Font Resources
- Bitmap Distribution Format
- Sun X11
                Rozpoznawane, najpopularniejsze formaty plików przechowujących dane o czcionkach:
[.otf, .ttf, .pfb, .pfm, .afm, .inf, .otf]

Niektóre ze wspieranych mechanizmów:
anti-aliasing, hinting, kerning

Dokumentacja (w jezyku polskim) [37stron, 554KB]:
http://www.ii.uj.edu.pl/~planeta/SDK/Font/documentation.pdf

Jeśli ktoś chciałby przyglądnąć się samym nagłówkom bez pobierania całego modułu, to są one tutaj udostępnione:
http://www.ii.uj.edu.pl/~planeta/SDK/Font/source/header/




Pełny pakiet: Biblioteka (dla g++, Visual C++ i C++ Builder) + Tutoriale:
-> Pełny pakiet będzie dostępny jak pojawi się 1.0, na razie tylko dla g++ (+ Tutoriale Dev-Cpp)
http://www.ii.uj.edu.pl/~planeta/SDK/Font/lib/
|
|
|

Aktualna wersja: 0.8a, 2008-08-06
Poprzednia wersja: brak



Tutoriale:
Przykładowe programy mają na celu stopniowe zaprezentowanie możliwości biblioteki. Biblioteka jest niezależna zarówno od platformy jak i od API biblioteki graficznej. Aby używać bibliotekę należy dodać plik nagłówkowy 'myFont.h', który deklaruje między innymi klasy 'Font' i 'FontFace', oraz powinniśmy poinformować konsolidator (linker) o bibliotece łączonej dynamicznie (myFont.dll). Przestrzeń nazw dla biblioteki została zdefiniowana jako 'myFont'.
Do celów edukacyjnych, aby zaprezentować działanie biblioteki (renderowanie tekstów) została wykorzystana biblioteka OpenGL, GLU oraz GLUT, lecz nic nie stoi na przeszkodzie aby wykorzystać DirectX, czy jakąkolwiek inną bibliotekę graficzną -- wystarczy wprowadzić odpowiednie zmiany w metodzie 'Print' typu pochodnego od klasy 'FontFace' w zależności od użytej biblioteki graficznej. Aby nie komplikować przykładów, zostały wykorzystane najprostsze a zarazem najmniej efektywne sposoby renderingu. Przykładowe programy mają na celu pokazanie możliwości biblioteki a sposoby renderingu danych glifów (prostokątów z nałożoną teksturą z odpowiednimi koordynatami UV) zależą już tylko i wyłącznie od programisty.



Tutorial 1

Program w jednym oknie przedstawia glif, a w drugim jego indeks w wewnętrznej tablicy glifów fonta, oraz jego wymiary. Ponadto podczas wczytywania przez program fonta wyświetlane są wszelkie dostępne informacje o nim. Rozmiar okna wyświetlającego glify można zmieniać.
Indeksy glifów zmieniamy strzałkami: UP(+1), DOWN(-1), RIGHT(+10), LEFT(-10).

Kod źródłowy omawianego przykładu:
http://www.ii.uj.edu.pl/~planeta/SDK/Font/source/Tutorial1.cpp
Binaria (jeśli szybko chcemy przetestować efekt działania, bez zbędnej kompilacji):
http://www.ii.uj.edu.pl/~planeta/SDK/Font/bin/




Tutorial 2

Programista gier prawdopodobnie będzie wykorzystywał jedną, lub kilka tekstur na przechowanie wszystkich znaków które potrzebuje. Pakowanie wszystko do jednej tekstury i przechowywanie jej w pamięci karty graficznej może znacząco przyspieszyć rendering. W przykładowym programie podglądniemy jak jest budowana główna tekstura na podstawie wpisywanych przez nas znaków, oraz zmian rozmiaru okna. W utworzonym przez nas obiekcie typu pochodnego od 'FontFace' zdefiniujemy dynamiczne skalowanie zależne od rozmiaru okna (zmieniając szerokość okna zmienia się wielkość fonta).
Może się też tak zdarzyć, że znacznej ilości znaków potrzebowaliśmy tylko na pewnym etapie i później na przykład będziemy korzystali tylko z cyfr. Staramy się oszczędzać pamięć i chcemy ten niewykorzystany nadmiar glifów usunąć. W tym celu możemy wykorzystać metodę 'FontFace::ClearCache' i wyczyścić pamięć podręczną instancji klasy 'FontFace'. W przykładowym programie, możemy to zrobić za pomocą klawisza 'Delete'. Dodatkowo pobawimy się ustawieniami pióra (karetki) i wyrównywaniem tekstu. Naciskając F1, F2, F3 będziemy wyrównywać tekst do lewej, do środka i do prawej, względem ustalonego punktu za pomocą metody 'FontFace::SetPosition' (w przykładowym programie metoda jest ustawiona na środek ekranu). Naciskając F5, F6, F7 będziemy rysować cały blok tekstu nad, na środku lub pod linią ''horyzontu'' wyznaczoną przez metodę 'FontFace::SetPosition'. Naciskając F9 będziemy mogli wyświetlić ramki glifów, a naciskając F10 będziemy mogli włączać i wyłączać kerning.

Kod źródłowy omawianego przykładu:
http://www.ii.uj.edu.pl/~planeta/SDK/Font/source/Tutorial2.cpp
Binaria (jeśli szybko chcemy przetestować efekt działania, bez zbędnej kompilacji):
http://www.ii.uj.edu.pl/~planeta/SDK/Font/bin/




Tutorial 3

Jeśli irytuje cię, gdy skalujesz okno, napisy które to okno wyświetla nie skalują się razem z nim, możesz być spokojny. Biblioteka wspiera dynamiczne i bardzo efektywne skalowanie fontów.
Program wyświetla dwa napisy. Jeden jest generowany przez face'e z ustawionym dynamicznym skalowaniem, drugi ma ustalony statyczny rozmiar. Zmieniając wielkość okna, jeden z napisów będzie się cały czas dostosowywał do wielkości okna, podczas gdy drugi pozostanie niezmieniony. Ponadto naciskając F1 i F2, będziemy mogli dynamicznie zmieniać napisy; czy mają być wyświetlone normalnie (F1), czy też kursywą (F2).

Kod źródłowy omawianego przykładu:
http://www.ii.uj.edu.pl/~planeta/SDK/Font/source/Tutorial3.cpp
Binaria (jeśli szybko chcemy przetestować efekt działania, bez zbędnej kompilacji):
http://www.ii.uj.edu.pl/~planeta/SDK/Font/bin/




Tutorial 4

Czasami mogą cię zdziwić jakieś ciekawe efekty związane z napisami. Często można zobaczyć takie efekty jak kolorowe fonty, czy też falowanie. W tym przykładzie za pomocą zaledwie kilku linijek kodu zostały zaprogramowane podobne efekty. Kolor poszczególnych znaków zależny jest od ich odległości od kursora -- tworząc ładne ''podświetlenie'' pod kursorem, gdy którykolwiek z przycisków myszy jest wciśnięty. Cały czas możemy dodawać (lub usuwać) nowe znaki do bufora, oraz bawić się ustawieniami akapitu (F1..3, F5..F7).

Kod źródłowy omawianego przykładu:
http://www.ii.uj.edu.pl/~planeta/SDK/Font/source/Tutorial4.cpp
Binaria (jeśli szybko chcemy przetestować efekt działania, bez zbędnej kompilacji):
http://www.ii.uj.edu.pl/~planeta/SDK/Font/bin/




Pozdrawiam,
Autor

*Biblioteka stanowi część pakietu obejmującego niezależne moduły wspierające każdy aspekt rozbudowanego silnika; począwszy od fontów a skończywszy na niesamowitej sztucznej inteligencji.
« Ostatnia zmiana: Sierpień 06, 2008, 16:04:31 wysłana przez Złośliwiec »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

.

  • Gość
# Sierpień 02, 2008, 15:20:59
Nooo w koncu!! Libka jest sliczna, fajno, ze udostepniles dokumentacyje. Z tego co wiem, to jest ona licencjonowana, tak (nie bedziesz jej tutaj publicznie udostepnial)?

Cytuj
Bo kiedy z nią skończę pewnie już nie będę do tego gówna wracał.
Super, ja takze jestem zwolennikiem takiego podejscia ;D

Niebawem w swoim silniku bede implementowal podobny modulik; zobaczem co z tego bedzie...

Pzdr.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Sierpień 02, 2008, 16:43:02
Dobra robota! Tym badziej brawa za niezłą dokumentację.

Dlaczego nie udostępnić biblioteki po prostu do pobrania w Internecie? FMOD też ma podobną licencję (darmowy do projektów niekomercyjnych) i jest na ich stronie do pobrania.

Fajnie byłoby gdybyś zrobił porównanie Twojej biblioteki do używanej powszechnie FreeType.

Pisząc o wspieranych formatach czcionek nie wspomniałeś, jakie rozszerzenia plików są do nich używane. Tymczasem TrueType czy OpenType mówi dużo mniej, niż np. "pliki TTF".

.

  • Gość
# Sierpień 02, 2008, 16:55:10
Biblioteka oczywiście będzie do pobrania i do dowolnego niekomercyjnego używania... za jakieś 21h (oby, bo biblioteka składa się z 4 plików wewnętrznych a jeden ma 41.961 wierszy i mnie coś trafia podczas edycji).
Do tego czasu, jesli ktoś poczułby ochotę wykorzystywania tego modułu, spełnię każde życzenie i udostępnię każdą funkcjonalność.

Reg: Moim zdaniem, starając się być sprawiedliwy, to najlepsza biblioteka na rynku (pod kątem programistów gier).
FreeType nie umożliwia takiej prostoty, ale udostępnia bardzo podobną funkcjonalność lecz w znanie bardziej skomplikowany sposób (przeglądnąłem każdą linię tej biblioteki [wiele rzeczy jest w niej kompletnie poza zasięgiem przeciętnego programisty, głęboko ukryte i nigdzie nie opisane]). No i biblioteka naturalnie skaluje fonty względem dynamicznego obszaru co nie udostępnia żadna inna tego typu biblioteka (za każdym razem korzystając z innych bibliotek trzeba ładować wszystko do nowa, co jest potwornie wolne). To znaczy, że GUI mogę sobie pomniejszać, powiększać okienka a biblioteka do Fontów w sposób automagiczny i niesamowicie efektywny dostosowuje mi tak napisy, żeby zawsze miesciło się na przykład 20 znaków w wierszu.

Offline Kos

  • Użytkownik
    • kos.gd

# Sierpień 02, 2008, 19:30:48
Planujesz licencjonować do użytku komercyjnego?

Offline Majtek

  • Użytkownik

# Sierpień 02, 2008, 22:00:57
cudo czegoś takiego szukalem, bo ten co ja napisałem to dużych możliwości nie ma :D

.

  • Gość
# Sierpień 03, 2008, 21:23:20
-------------------------------------------------------------------------------------------------
                         Biblioteka została udostępniona
-------------------------------------------------------------------------------------------------
(Post zarezerwowany na opis wersji i ewentualnych poprawionych błędów)

1.) [2008-07-05]: Aktualna wersja 0.8a, brak wykrytych błędów.
W ramach testów została udostępniona najlżejsza wersja biblioteki. Za jakiś czas powinienem udostępnić wersję 1.0, która już nie będzie wymagała zewnętrznych bibliotek. Niestety dll'ka została skompilowana na razie tylko dla g++ (Dev-Cpp). Mimo wszystko jednak udostępniłem ta wersję (tylko g++), gdyż przez najbliższy czas nie będę miał czasu aby się nią zajmować. Dopiero za 5-6 tygodni (wtedy przygotuje 1.0 dla Visual C++ i C++ Builder).
« Ostatnia zmiana: Sierpień 06, 2008, 00:52:26 wysłana przez . »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Sierpień 06, 2008, 14:54:22
No nie powiem, zapowiada się ciekawie. Życzę dalszych sukcesów. :)

Offline Majtek

  • Użytkownik

# Październik 21, 2008, 22:22:14
I co z tą biblioteką wyszła wersja 1.0? bo ja nic nie widzę, dll jest lib do dll nie, wersji 1.0 tez nie. a bym sobie użył to coś.

.

  • Gość
# Październik 21, 2008, 23:26:46
Po bibliotece do GUI wypuszczę wersję 0.9 z poprawionym błędem, dotyczącym efektywności (aktualnie jedna operacja wykonuje się niepotrzebnie, drastycznie zwalniając moduł). Jako jeden moduł i dla wszystkich (popularnych) kompilatorów. Wersja 1.0 będzie dostępna po 6mc okresie kwarantanny wraz z dokumentacją w 5 językach i dla 3 podstawowych systemów. Wersja 1.0 będzie dostępna dopiero z pakietem dostępnym wraz z frameworkiem.

Biblioteka powstała na potrzeby GUI i dopiero po spełnieniu wszystkich oczekiwań względem GUI przestanie być ostatecznie rozwijana. Dlatego dopóki nie skończę GUI nie mogę umieścić wersji 0.9 (poprawionej) ;/.



Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Październik 23, 2008, 22:59:08
Jeśli mogę udzielić dobrej rady, sugerowałbym podczas pisania tak rozbudowanego programu pokazywać komuś (a najlepiej wszystkim, tu na forum czy na swojej stronie WWW) postępy w pracach, choćby w postaci przeglądu jak ma wyglądać interfejs plus jakiś projekt, założenia itp. To może pomóc podjąć lepsze decyzje projektowe, bo w niczym nie kwestionując Twoich umiejętności wiadomo jednak, że co dwie głowy to nie jedna i samemu ze swoimi myślami łatwo zejść na manowce, a w opinii innych zawsze znajdzie się coś ciekawego do rozważenia.

.

  • Gość
# Listopad 06, 2008, 19:39:35
W engine pisząc coś wykorzystywałem kolory przekazywane przez parametry, ale ostatnio naszła mnie myśl, by zrobić to może nie naj-optymalnie, ale za to bardzo czytelnie.
Z jakiej notacji wolelibyście korzystać (pytam bo nie chce mi się robić tutków na każdą okazje ;p):
Print("$<00FF00>The $<FF0000>Font $<0000FF>Library"); // kolory reprezentujemy po 2 bajty na każdy w RGB (można oczywiście banalnie rozszerzyć na RGBA).
Czy Print("%cThe %cFont %cLibrary", Green, Red, Blue);

Kod źródłowy przykładu (g++, Dev-C++): https://www.ii.uj.edu.pl/~planeta/SDK/Font/temp/Tutorial5beta.rar

Reg: Zgadzam się z Tobą :), za (max, w sumie już gotowe, ale...) kilka miesięcy udostępnię alfy; biblioteki stanowiącej warstwę pomiędzy aplikacją a systemem (dla kilku systemów), oraz GUI, to z pewnością będę prosił o opinie :)


Offline vashpan

  • Użytkownik
    • Strona

# Listopad 06, 2008, 19:46:28
Zdecydowanie 1 opcja.


Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Listopad 06, 2008, 20:05:29
Ja preferuję drugą opcję. Można wmontować obie ;)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Listopad 07, 2008, 20:45:24
Zdecydowanie opcja pierwsza. Taki łańcuch z tagami formatującymi można sobie wcześniej przygotować, zbudować jakąś skomplikowaną funkcją, wsadzić do niego tyle tagów ile chcemy (np. w pętli), a potem trzymać gdzieś i rysować zawsze takim samym wywołaniem Print(s).