Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Шрифт TrueType определенного размера


Автор: Dreamer_0x01 16.11.2005, 18:12
нужно получить битовую маску нужных мне символов выбранного мной шрифта.

Пока что думаю сделать следующим образом:
1. Нарисовать нужный мне символ в прямоугольнике определенного размера (мне надо 8х16).
2. Oбработать посимвольно каждый пиксел функцией GetPixel(), проставляя соответственно в битовой маске нули и единицы..

так поступить с каждым символом.


Но может быть, есть какие-то стандартные методы?

Автор: Earnest 16.11.2005, 20:25
Да уж, GetPixel у DC спрашивать - не самый лучший путь (медленно - жуть!).
Вариант 1. Прорисовать как ты сказал, но в memory context + свой Bitmap, а потом сразу попросить все биты (GetBitmapBits).
Вариант 2 ( для продвинутых). См. GetGlyphOutline:
Цитата
The GetGlyphOutline function retrieves the outline or bitmap for a character in the TrueType font that is selected into the specified device context

Т.е. прямо можно получить битмап для символа.

Автор: Dreamer_0x01 16.11.2005, 20:47
Цитата(Earnest @ 16.11.2005, 20:25)
медленно - жуть!


Это пофигу, операция выполняется только один раз для каждого символа кодовой таблицы при запуске программы, и все.


Цитата(Earnest @ 16.11.2005, 20:25)
Т.е. прямо можно получить битмап для символа

А что отом с этим битмапом делать? Как его "расшифровать"?

Мне собственно что нужно...
Допустим, есть символ, вписанный в прямоугольник 8х8;
нужно заполнить массив типа
unsigned short Ar[8]={
0x00FF,//вся строка черная
0x00FF,//вся строка черная
0x00FF,//вся строка черная
0x00C3,//в центре 4 пробела
0x00C3,//в центре 4 пробела
0x00FF,//вся строка черная
0x00FF,//вся строка черная
0x00FF,//вся строка черная
}

где элементы массива означают строки в битовой маске, а биты в элементах - точки в строках
(В данном примере это будет небольшое пятно в центре битовой маски).

Автор: Earnest 17.11.2005, 19:46
Битмап (черно-белый) и есть битовая маска, которая тебе нужна. Учти только, что строки в битмапе должны быть выровнены на WORD.
Размер выровненной строки вычисляется так:
Код

size_t BmpLineSize(UINT nWidth, UINT nBitCnt)
{ 
    size_t nLine = nWidth*nBitCnt/8; 
    if (nLine & 1) ++nLine; 
    return nLine; 
}

Соответственно, размер буфера под биты = размер строки * высота.



Автор: Dreamer_0x01 17.11.2005, 20:24
Я понимаю, что битовая маска, но она будет "чистая", или как и файл bmp, содержать в каких-то первых строках служебную информацию?

Автор: Earnest 17.11.2005, 20:44
Биты, которые ты получаешь с помощью GetBitmapBits - это ровно содержание, т.е. нужная тебе маска, нет там никакого заголовка.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)