PMG
https://forum.pmg.org.ru/

Русский шрифт
https://forum.pmg.org.ru/viewtopic.php?f=1&t=300
Страница 1 из 1

Автор:  MagicWolf [ 26 фев 2006 17:39 ]
Заголовок сообщения: 

Попробуй увеличить число символов с 128 до 256. И вычислить номер глифа по функции FT_Get_Char_Index( face, ch ), исходя из номера русской буквы в UNICODE.

Автор:  MagicWolf [ 28 фев 2006 10:56 ]
Заголовок сообщения: 

Ну сразу скажу, что русские буквы я не получал в этом уроке. Но
думаю, что все достаточно просто.

Глиф это просто форма буквы и все. Можно считать, что это и есть
символ нужной буквы.

Если ты выставил FT_ENCODING_UNICODE, то ты должен и брать русские
символы в уникоде, а они находятся (если посмотреть по таблице
символов) с номера 1040. Поэтому чтобы адресовать правильно номер
символа русской буквы ты должен по какой-то функции получить номер
этого символа. Например, в Win32 API есть такие функции:
#define W_B(w, a, cb) WideCharToMultiByte( \
CP_ACP, \
0, \
w, \
-1, \
a, \
cb, \
NULL, \
NULL)

#define B_W(a, w, cb) MultiByteToWideChar( \
CP_ACP, \
0, \
a, \
-1, \
w, \
cb)

Автор:  rabbit [ 09 янв 2009 15:22 ]
Заголовок сообщения:  Re: Русский шрифт

Я решил эту проблему следующим образом
1) Указуем, что будем создавать список для 256 символов
2)базу ставим в 0, при рисовании не будет никаких смезений, просто - glListBase(fontbase);
3)и все равно ничего не работало...а проблема оказалась в позиционировании текста(центровке). Оказалось, что для русских букв оно возвращает минусовые значение кода символа. Это решаеться очень просто:

GLvoid glPrint(char *fmt, float size ...)
{float length=0;
char text[255];
int code;
int n;
va_list ap;
if(fmt==NULL) return;
va_start(ap,fmt);
vsprintf(text,fmt,ap);
va_end(ap);

n=strlen(text);

for(int i=0; i<n; i++)
{code=text[i];
if(code<0) code+=256; //просто добавляем 256, и получаем нормальный код русских символов
length+=gmf[code].gmfCellIncX; //и их размеры
}

glPushMatrix();
glScalef(size*10,size*10,size*10);//и да...размер при построении шрифта так и не сделал что б работал, так что //приходиться масштабировать, но есть большой минус - маленький шрифт не вывести, пропадают части символов
glTranslatef(-length/2,0.0f,0.0f);
glPushAttrib(GL_LIST_BIT);
glListBase(fontbase);
glCallLists(n,GL_UNSIGNED_BYTE,text);
glPopAttrib();
glPopMatrix();

}

Автор:  MagicWolf [ 11 янв 2009 10:49 ]
Заголовок сообщения:  Re: Русский шрифт

Может тогда какие-то изменения в урок внести? Может у тебя есть предложения?

Автор:  rabbit [ 12 янв 2009 16:24 ]
Заголовок сообщения:  Re: Русский шрифт

Как на меня, то пока что вполне достаточно было бы добавить небольшую проверку, схожую, или как у меня, и объяснить что в OpenGL есть такой глюк, и таким образом его можно исправить.
Например я был очень разочарован, когда увидел что выводит только латынь, стал с обиды искать библиотеки для вывода текста)))
А вот с размерами шрифта...Просто написать при построении шрифта, размер не учитывается, менять его можно только с помощью масштабирования. Дать идею читателям, типа:"и не забывайте, что не обязательно писать каждый раз одно и тоже, вы ведь можете сделать универсальную функцию по своему вкусу, передавая у нее нужные параметры, например
glPrint(bool centralize, //Выводить текст по центру или по левому краю
float size,//в сколько раз увеличить размер шрифта
..... //прочие ваши параметры
const char *fmt,//сам текст
...//переменные
);

Автор:  MagicWolf [ 13 янв 2009 09:27 ]
Заголовок сообщения:  Re: Русский шрифт

Может тогда напишешь текст примечания с кодом исправленной функции, а я вставлю.

Автор:  rabbit [ 17 янв 2009 23:08 ]
Заголовок сообщения:  Re: Русский шрифт

Теперь небольшой нюанс для выведения русских символов!.. Кроме того что нам нужно создать 256 списков отображения, нужно добавить одну строчку кода в нашу функцию вывода, а именно в цикл, где мы считаем длину строчки.
for (unsigned int loop=0,int code;loop<strlen(text);loop++)//Цикл поиска размера строки

{if(text[loop]<0) code=text[loop]+256;//НОВОЕ
else code=text[loop];//НОВОЕ
length+=gmf[text[loop]].gmfCellIncX;
// Увеличение размера на ширину символа
}
Все это для того, что бы получить нормальный код символа, потому что само оно возвращает нам не правильный, а на 256 меньший, код.

Автор:  MagicWolf [ 19 янв 2009 11:14 ]
Заголовок сообщения:  Re: Русский шрифт

Н-да прикольно...

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/