G
G
Gokilla2018-03-18 19:49:50
3D
Gokilla, 2018-03-18 19:49:50

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);

But he draws heresy
5aae9b4f5bd2b395137343.jpeg
in the center of space

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question