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

Offline Kos

  • Użytkownik
    • kos.gd

# Listopad 07, 2008, 21:34:07
Cytuj
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);

Pierwsze, plus drugie jako opcjonalny frontend do pierwszego ;)

Offline Mr. Spam

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

Offline agent_J

  • Użytkownik

# Listopad 11, 2008, 13:18:57
Jak sobie radzi biblioteka z wyświetlaniem tesktów ze złożonym layoutem ? Na przykład gdy jeden znak może składać się z kilku (m.in. dla alfabetu tajskiego http://www.unicode.org/charts/PDF/U0E00.pdf - w te przerywane kółeczka "wchodzi" znak). Do tego obsługa tekstów pionowych oraz mieszania Left-to-Right z Right-to-Left (obsługa np. przy Arabskim). Przydałyby się dodatkowo funkcje do wyszukiwania czcionek o zadanej metryce.
« Ostatnia zmiana: Listopad 11, 2008, 13:20:56 wysłana przez agent_J »

yfan

  • Gość
# Listopad 11, 2008, 14:13:06
Bezproblemowo (ligatura == 1 znak).
Dla tego co podałeś, na przykład znak 0E41, przy użyciu najpopularniejszej tajlandzkiej czcionki angsa (można ją skopiować do tutka1 i sprawdzić) obrazek (wewnątrz pliku z czcionką jest to znak o numerze 194).
A jak skopiujemy na przykład do tutek5 i podmienimy z arialem to zobaczymy brak polskiego znaku 'ł', bo go po prostu nie ma w tym pliku (angsa.TTF). Radziłbym skopiować sobie jakiś tutek i pobawić się (spróbować odpowiedzieć na pytanie, jak biblioteka domyśla się jakie będą potrzebne znaki i jakiej wielkości, przecież najpierw użytkownik prosi o teksturę ze znakami a dopiero później mówi jakie znaki chciałby mieć na tej teksturze...:)).

Cytuj
Do tego obsługa tekstów pionowych oraz mieszania Left-to-Right z Right-to-Left (obsługa np. przy Arabskim).
W standardzie; każdy glif (struct FontFace::Glyph) ma advanceX, advanceY, bearingX, bearingY. Jendak użytkownik podczas wyświetlania musi sam wiedzieć czy chce pionowo czy poziomo, czy może od prawej do lewej :).

Cytuj
Przydałyby się dodatkowo funkcje do wyszukiwania czcionek o zadanej metryce.
Użytkownik musi samodzielnie wybrać plik z czcionką jaki mu odpowiada, ewentualnie wybrać z tego co ma systemie. Bo jesli biblioteka miałaby to robić, to musiałaby się łączyć z serwerem i szukać, co chyba nie byłoby jednak dobre. U mnie co prawda framework może sam pobrać arial z systemu, ale to już warstwa wyższa.

//EDIT:
"w te przerywane kółeczka "wchodzi" znak", aaa tego nie zauważyłem, przepraszam. Faktycznie tego standardowo biblioteka nie obsługuje. Użytkownik musiałby to sobie sam zaimplementować. Chyba w pliku z fontem nie jest zapisane które znaki mogą znajdować się w "kółeczkach". Jeśli założymy, że każdy, to nie ma większego problemy z zaimplementowaniem takiego mechanizmu.
« Ostatnia zmiana: Listopad 11, 2008, 14:53:36 wysłana przez . »

Offline agent_J

  • Użytkownik

# Listopad 11, 2008, 15:03:27
W standardzie; każdy glif (struct FontFace::Glyph) ma advanceX, advanceY, bearingX, bearingY. Jendak użytkownik podczas wyświetlania musi sam wiedzieć czy chce pionowo czy poziomo, czy może od prawej do lewej :).

No właśnie nie bardzo musi. Przykład: mieszanie alfabetów RTL z LTR, wpisujemy krzaki, pojawiają się od prawej do lewej. Następnie wpisujemy naszą czcionkę i znaki pojawiają się od lewej do prawej. IKSBARA ŁACIńSKI IKSBARA. Mimo że dane tekstu są wpisane w "naszej" kolejności, to renderer i tak musi je odpowiednio poustawiać. Kolejne pytanko: co z UTF-32 i surrogate pairs ? ;)

yfan

  • Gość
# Listopad 11, 2008, 16:12:18
Cytuj
No właśnie nie bardzo musi. Przykład: mieszanie alfabetów RTL z LTR, wpisujemy krzaki, pojawiają się od prawej do lewej. Następnie wpisujemy naszą czcionkę i znaki pojawiają się od lewej do prawej.
Pewnie tak się ta, ale ja nie wiem gdzie w samym pliku z czcionką jest to zapisane (chyba trzeba ręcznie po numerach U+202D/U+202E glifów). Ale poszukam. Jeśli mi się to uda -- zrobię dodatkową metodę w klasie FontFace zwracającą o tym informacje, co umożliwi poprawne wyświetlanie kolejnych znaków (za pomocą prostego algorytmu bidi).

Cytuj
Kolejne pytanko: co z UTF-32 i surrogate pairs ?
Standardowa metoda pobierająca glif:
const Glyph* FontFace::GetGlyph(unsigned i);
przyjmuje indeks zapisany w UTF-32.

Jedyna domyślna konwersja w bibliotece, to z cp1250 na UTF-32 [unsigned FontFace::Convert(char) const;]
Nie robiłem konwersji UTF8/16 (i z tym związanej obsługi Surrogate Pairs), ale w następnej wersji zrobię to już w standardzie.

++k :). za Hebrew Fonts.
« Ostatnia zmiana: Listopad 11, 2008, 16:16:54 wysłana przez . »

yfan

  • Gość
# Styczeń 18, 2009, 17:05:56
Czy ja czegoś nie rozumiem? Jest sześć tutoriali Są cztery tutoriale i obszerna dokumentacja, wszystkie wypuszczone do wolnego ściągnięcia i opisane jako darmowe do użytku niekomercyjnego, a sama biblioteka, w formie do zwyczajnego dolinkowania nie jest dostępna i czeka na połączenie się z szerszą biblioteką do gui, tak? Czy na obecną chwilę da się jej używać?


edit: zagalopowałem się z ilością tutoriali ;)
« Ostatnia zmiana: Styczeń 18, 2009, 17:11:59 wysłana przez yfan »

yfan

  • Gość
# Styczeń 18, 2009, 17:41:45
Tutoriali jak na razie jest 5. Piąty (pokazujący kolorowanie) nie był porządnie testowany: https://www.ii.uj.edu.pl/~planeta/SDK/Font/temp/Tutorial5beta.rar

Każdy tutorial jest dostępny z projektem Dev-Cpp* gotowym do skompilowania i zabawy.
Otwieramy projekt *.dev.
W projekcie konsolidowane są następujące biblioteki:
myFont.dll
-lopengl32
-lglu32
-lglut32
W folderze wraz z projektem oczywiście znajdują się potrzebne biblioteki: myFont.dll (87,5 KB), glu32.dll, oraz glut32.dll.

Klikamy "compile" i już :).
http://img140.imageshack.us/img140/3984/beznazwy2op8.png

Należy jeszcze zaznaczyć, że myFont.dll z tego piątego tutoriala jest najbardziej aktualny i efektywny -- w przeciwieństwie do wcześniejszych wersji (z tutoriali 1-4).

*Wybrałem Dev-Cpp gdyż jest on często wykorzystywany przez stawiających pierwsze kroki programistów C++, oraz dla g++ i pozwoliłem sobie przygotować wszystko jak na tacy właśnie w Devie.

Edit:
"Każdy tutorial jest dostępny z projektem Dev-Cpp* gotowym do skompilowania i zabawy"
Oj, pomyliło mi się, tylko w Tutorial5 jest plik projektu *.dev (wraz z ustawieniami konsolidacji), a w pozostałych są same kody źródłowe (bez projektu). Muszę to w przyszłości poprawić. Najłatwiej chyba ściągnąć sobie ten tutorial5 z przygotowanym projektem *.dev i pobawić się kodami tutków (2-4). Tutorial1 (jak na razie) nie jest kompatybilny z wersją myFont.dll z Tutorial5beta.rar tylko ze starszą.

Edit2:
Zapomniałem, ale w http://www.ii.uj.edu.pl/~planeta/SDK/Font/lib/g++.rar są już usdostępnione projekt *dev.
Ciekawe czy w ogóle komuś udało się przebrnąć przez to wszystko i wykorzystuje tą blibliotekę ;p
« Ostatnia zmiana: Styczeń 18, 2009, 18:33:22 wysłana przez . »

yfan

  • Gość
# Styczeń 18, 2009, 19:20:27
Wiesz, chyba podpadam pod twoją szarą strefę, bo z devCpp'a dawno przestałem korzystać, ale linkowanie .dll'ki widzę po raz pierwszy. Dlaczego nie po bożemu, w libie?

Jakieś podpowiedzi jak dołączyć .dll'kę w Visualu? Przy dorzucaniu jej do "additional dependencies" razem z .lib'ami w "linker->input", dostaję "invalid or corrupted file" (oczywiste?); kiedy wrzucam ją w "delay loaded DLLs" otrzymuję " MyFont.dll ignored - no imports found from MyFont.dll". Jestem w... kropce  ::)?