CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Właściwości czcionki

Właściwości czcionki

dział ogólny

Właściwości czcionki

Nowy postprzez mckri » czwartek, 3 marca 2011, 10:46

Witam.
Jak można odczytać właściwości czcionki z pliku? Nie chodzi mi tutaj o odczytanie czcionek zainstalowanych w systemie M$, tylko o pobranie informacji o lokalnym pliku czcionki. W ten spsób chciałbym się dowiedzieć, jakiego typu jest czcionka (np. TrueType) oraz jaką ma nazwę wewnętrzną (np. plik czcionki 'texasfuneral.ttf' ma nazwę 'Texas Funeral')?
Czy jest to możliwe i ewentualnie jaką metodą?
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » czwartek, 3 marca 2011, 17:54

mckri napisał(a): W ten spsób chciałbym się dowiedzieć, jakiego typu jest czcionka (np. TrueType)


To akurat jest proste. Czcionki TrueType mają rozszerzenie TTF, a czcionki OpenType mają rozszerzenie OTF.



mckri napisał(a):oraz jaką ma nazwę wewnętrzną (np. plik czcionki 'texasfuneral.ttf' ma nazwę 'Texas Funeral')?


Tutaj sprawa się komplikuje. Nie jest to proste. Znalazłem w sieci kod dla C# i przetłumaczyłem do na C++, jednak nie działa prawidłowo:

KOD cpp:     UKRYJ  
#include <IOUtils.hpp>

typedef struct _tagTT_OFFSET_TABLE{
        unsigned short  uMajorVersion;
        unsigned short  uMinorVersion;
        unsigned short  uNumOfTables;
        unsigned short  uSearchRange;
        unsigned short  uEntrySelector;
        unsigned short  uRangeShift;
}TT_OFFSET_TABLE;

typedef struct _tagTT_TABLE_DIRECTORY{
        char    szTag[4];
        unsigned long   uCheckSum;
        unsigned long   uOffset;
        unsigned long   uLength;
}TT_TABLE_DIRECTORY;

typedef struct _tagTT_NAME_TABLE_HEADER{
        unsigned short  uFSelector;
        unsigned short  uNRCount;
        unsigned short  uStorageOffset;
}TT_NAME_TABLE_HEADER;

typedef struct _tagTT_NAME_RECORD{
        unsigned short  uPlatformID;
        unsigned short  uEncodingID;
        unsigned short  uLanguageID;
        unsigned short  uNameID;
        unsigned short  uStringLength;
        unsigned short  uStringOffset;
}TT_NAME_RECORD;

#define SWAPWORD(x)             MAKEWORD(HIBYTE(x), LOBYTE(x))
#define SWAPLONG(x)             MAKELONG(SWAPWORD(HIWORD(x)), SWAPWORD(LOWORD(x)))


String GetFontNameFromFile(String lpszFilePath)
{
 TFileStream *f = new TFileStream( lpszFilePath, fmOpen);
 String csRetVal;

 if( f != NULL )
 {
  TT_OFFSET_TABLE ttOffsetTable;
  f->Read(&ttOffsetTable, sizeof(TT_OFFSET_TABLE));
  ttOffsetTable.uNumOfTables  = SWAPWORD(ttOffsetTable.uNumOfTables);
  ttOffsetTable.uMajorVersion = SWAPWORD(ttOffsetTable.uMajorVersion);
  ttOffsetTable.uMinorVersion = SWAPWORD(ttOffsetTable.uMinorVersion);


  if(ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0)
   return csRetVal;

  TT_TABLE_DIRECTORY tblDir;
  BOOL bFound = FALSE;
  String csTemp;

  for(int i = 0; i < ttOffsetTable.uNumOfTables; i++)
  {
   f->Read(&tblDir, sizeof(TT_TABLE_DIRECTORY));
   csTemp = tblDir.szTag;
   csTemp = csTemp.Delete(5, csTemp.Length());

   if( CompareText(csTemp, "name") == 0)
   {
    bFound = TRUE;
    tblDir.uLength = SWAPLONG(tblDir.uLength);
    tblDir.uOffset = SWAPLONG(tblDir.uOffset);
    break;
   }
  }

  if(bFound)
  {
   f->Seek(tblDir.uOffset, soBeginning);
   TT_NAME_TABLE_HEADER ttNTHeader;
   f->Read(&ttNTHeader, sizeof(TT_NAME_TABLE_HEADER));

   ttNTHeader.uNRCount       = SWAPWORD(ttNTHeader.uNRCount);
   ttNTHeader.uStorageOffset = SWAPWORD(ttNTHeader.uStorageOffset);
   TT_NAME_RECORD ttRecord;
   bFound = FALSE;

   for(int i = 0; i < ttNTHeader.uNRCount; i++)
   {
    f->Read(&ttRecord, sizeof(TT_NAME_RECORD));
    ttRecord.uNameID = SWAPWORD(ttRecord.uNameID);
    if(ttRecord.uNameID == 1)
    {
     ttRecord.uStringLength = SWAPWORD(ttRecord.uStringLength);
     ttRecord.uStringOffset = SWAPWORD(ttRecord.uStringOffset);

     f->Seek(tblDir.uOffset + ttRecord.uStringOffset +
                                     ttNTHeader.uStorageOffset, soBeginning);

     int nByte = ttRecord.uStringLength + 1;
     char *ByteArray = new char[nByte];

     f->Read(&ByteArray, ttRecord.uStringLength);

     csTemp = (String)ByteArray;
     if(!csTemp.IsEmpty())
     {
      csRetVal = csTemp;
      break;
     }
    }
   }
  }
  delete f;
 }
 else return "Błąd";

 return csRetVal;
}


Nie zwraca nazwy czcionki, tylko jakieś nic nie znaczące znaczki. :roll:
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez polymorphism » czwartek, 3 marca 2011, 19:38

KOD cpp:     UKRYJ  
                ...
                                if(ttRecord.uNameID == 1)
                                {
                                        ...
                                        char *ByteArray = new char[nByte]; //<--- cieknie!
                                        ...
                                }
                        }
                }

                delete f;
        }
        else return "Błąd";

        return csRetVal;
}

Tak mi się rzuciło w oczy ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » czwartek, 3 marca 2011, 21:07

Tak, przeoczenie, ale to i tak niczego nie zmienia.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez mckri » czwartek, 3 marca 2011, 21:39

Dzieki za zainteresowanie. Znalazłem ciekawy program (oraz kody), który wyciaga informację z wybranej czcionki. Program pisany jest w środowisku VB. Może zna ktoś to środowisko i potrafiłby prztłumaczyć fragment kodu czytania informacji z wybranego pliku czcionki.
Załączam.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Właściwości czcionki

Nowy postprzez mckri » piątek, 4 marca 2011, 11:21

Ten kod, który podałes Baronie pochodzi ze środowiska C++ VS. Dzieki starej wersji BCB5 udało mi się go przekonwertować, tak aby BCB mógł sobie z nim poradzić. Program kompiluje się i działa. Postaram się nad tym posiedzieć, zeby można było wykorzystać kod odczytywania właściwości czcinki wprost w projekcie srodowiska BCB (>=2009). Gdyby komus udało się to wcześniej, to byłoby miło :)
Załączam kod projektu BCB5.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 12:30

mckri napisał(a):Ten kod, który podałes Baronie pochodzi ze środowiska C++ VS.


No nie! Ktoś po prostu również natknął się na ten plik z kodem i przerobił go sobie na VC++.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez polymorphism » piątek, 4 marca 2011, 13:19

Moja propozycja:
KOD cpp:     UKRYJ  
wstring get_ttf_name(const char *fn)
{
        TT_OFFSET_TABLE hdr;
        TT_TABLE_DIRECTORY tbl_dir;
        TT_NAME_TABLE_HEADER tbl_hdr;
        TT_NAME_RECORD name_rec;

        ifstream is(fn, ios::binary);

        is.read((char*)&hdr, sizeof(hdr));

        if(SWAPWORD(hdr.uMajorVersion) != 1 || SWAPWORD(hdr.uMinorVersion) != 0)return L"";

        hdr.uNumOfTables = SWAPWORD(hdr.uNumOfTables);

        while(hdr.uNumOfTables-- && is.read((char*)&tbl_dir, sizeof(tbl_dir)))
        {
                if(memcmp("name", tbl_dir.szTag, 4))continue;

                is.seekg(SWAPLONG(tbl_dir.uOffset), ios::beg);
                is.read((char*)&tbl_hdr, sizeof(tbl_hdr));

                tbl_hdr.uNRCount = SWAPWORD(tbl_hdr.uNRCount);

                while (tbl_hdr.uNRCount-- && is.read((char*)&name_rec, sizeof(name_rec)))
                {
                        if(SWAPWORD(name_rec.uNameID) != 1) continue;

                        size_t old_pos = is.tellg();
                        size_t str_offset = SWAPLONG(tbl_dir.uOffset);

                        str_offset += SWAPWORD(tbl_hdr.uStorageOffset);
                        str_offset += SWAPWORD(name_rec.uStringOffset);

                        is.seekg(str_offset, ios::beg);

                        name_rec.uStringLength = SWAPWORD(name_rec.uStringLength);

                        if(SWAPWORD(name_rec.uPlatformID) == 0)
                        {
                                wchar_t c;
                                wstring str;

                                while(name_rec.uStringLength && is.read((char*)&c, 2))
                                {
                                        str.push_back(SWAPWORD(c));
                                        name_rec.uStringLength -= 2;
                                }

                                return str;
                        }

                        /*
                           tę część dałem dla zasady, bo nie wiem, czy zawsze
                           występuje uPlatformID równe 0.
                        */

                        if(SWAPWORD(name_rec.uPlatformID) == 1)
                        {
                                char c;
                                wstring str;

                                locale loc(""); //<--- trochę fuszerka, ale...
                                const ctype<wchar_t> &ct = use_facet< ctype<wchar_t> >(loc);

                                while(name_rec.uStringLength-- && is.read(&c, 1))
                                {
                                        str.push_back(ct.widen(c));
                                }

                                return str;
                        }

                        is.seekg(old_pos, ios::beg);
                }

                break;
        }

        return L"";
}

Oczywiście funkcja jest daleka od ideału...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 13:37

Kod nie działa z czcionką OpenType.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez polymorphism » piątek, 4 marca 2011, 13:42

Którą konkretnie?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 13:45

Z każdą OpenType którą sprawdzałem, natomiast działa bezbłędnie z TrueType.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 13:49

Po dodaniu czcionki do tymczasowo używanych np. za pomocą funkcji AddFontResource można jej używać tak jakby była zainstalowana. To oznacza, że system gdzieś przechowuje informacje o tej czcionce. Gdyby dobrać się do tych informacji, nie trzeba by czytać bezpośrednio z pliku.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez polymorphism » piątek, 4 marca 2011, 14:01

Ej, ale Ty piszesz o czcionce w pliku .otf, a nie .ttf, tak? Bo jeśli tak, to się nie dziw, że nie działa, wszak to inne formaty plików. U mnie czcionki OpenType w kontenerze .ttf otwiera bez problemu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 14:04

Zgadza się! Chodziło mi o czcionkę OpenType zapisaną w formacie OTF.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez mckri » piątek, 4 marca 2011, 14:58

Kod, który podałem w BCB5 działa tylko dla TTF - tak przynajmniej opisywał autor tego programu w VS.
Podaje namiary na stronę, skąd pobrałem kod:
http://www.codeproject.com/KB/GDI/fontnamefromfile.aspx


To oznacza, że system gdzieś przechowuje informacje o tej czcionce. Gdyby dobrać się do tych informacji, nie trzeba by czytać bezpośrednio z pliku.

Też o tym myślałe, jednak brak informacji w MSDN na ten temat.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 57 gości

cron