Answer the question
In order to leave comments, you need to log in
Freetype c++ windows opengl?
I want to add fonts to my project to draw glasses and words like winner, I can't find a simple code, here is a bunch of freetype + opengl + windows + c++
Here is my code for the Hello text:
// ! Устанавлеваем локаль для нормальной работы с кирилицей
std::wcin.imbue(std::locale("rus_rus.866"));
string font_file_name= "arial.ttf"; // путь к шритфу
wstring draw_str=L"Hello"; // юникод текст для отрисовки
string render_to_file_name=".Q.txt";// файл для сохранения отрисованной строки
// ! Просим путь к файлу шрифта
cout<<"Enter font file path: \n";
//std::getline(std::cin, font_file_name); // ! Инициализация библиотеки Freetype
if(FT_Init_FreeType(&ft))
{
cout<<"Could not init freetype library\n";
return 1;
} // ! Загрузка шрифта
if (FT_New_Face(ft, font_file_name.c_str(), 0, &face))
{
// ! Не удалось загрузить
cout << "Could not " << font_file_name << "\n";
return 1;
}
//! Просим ввести текст для отрисовки
cout<<"Enter text to render: \n";
//std::getline(std::wcin, draw_str);
// ! Просим ввести путь к файлу для сохранения
cout<<"Enter file to save render result: \n";
//std::getline(std::cin, render_to_file_name);
// ! Открываем файл для записи (или создаем, если его нет)
file.open(render_to_file_name.c_str(), std::ios_base::out);
if (!file)
{
// ! Не удалось открыть файл
cout << "Could open file: " <<render_to_file_name<<"\n";
return 1;
}
// ! Установка размера пикселя (специфическое понятие в Freetype)
// и обязательное для FT_Load_Glyph
FT_Set_Pixel_Sizes(face, 0, 36); // ! Указатель на глиф
FT_GlyphSlot g = face->glyph;
// ! Цикл отрисовки образов символов из строки в файл
for (unsigned int i = 0; i < draw_str.size(); ++i)
{
// ! Пытаемся загрузить образ одного символа
// эта функция(FT_Load_Char) вызывает FT_Load_Glyph и FT_Get_Char_Index
if (FT_Load_Char(face, draw_str.at(i), FT_LOAD_RENDER))
{
// ! Не удалось загрузить битовый образ символа
cout << "glyph not load!! \n";
continue;
}
// ! Отрисовываем образ в файл
for (int y = 0; y < g->bitmap.rows; ++y)
{
for (int i = 0; i < g->bitmap.width; ++i)
{
// ! Вытяваем значение байта образа
unsigned char c = g->bitmap.buffer[y * g->bitmap.width + i];
if (c == 0)
file << ' '; // Если ноль, записываем пробел
else
if (c < 128)
file << '+';
// Если "прозрачность" ниже 128
else file << '#'; // Если "прозрачность" выше 128
}
file << '\n';
}
file << "\n\n";
} // ! Заставлем сбросить внутренний буфер Ofstream в файл
file.flush(); // ! Закрываем файл
file.close(); // ! Освобождаем выделенные ресурсы и библиотеку
IndexTexture[CountIndexTexture] = 0;
glGenTextures(1, &IndexTexture[CountIndexTexture]);
glBindTexture(GL_TEXTURE_2D, IndexTexture[CountIndexTexture]);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
//
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, g->bitmap.width, g->bitmap.rows, GL_RGBA, GL_UNSIGNED_BYTE, g->bitmap.buffer);
CountIndexTexture++;
FT_Done_Face(face);
FT_Done_FreeType(ft);
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question