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/ |