Glyphs.xBearing = slot->metrics.horiBearingX / 64 ĭrawGlyph(&slot->bitmap, glyphs.bitmap, glyphs.width, glyphs.height) Glyphs.yBearing = slot->metrics.horiBearingY / 64 Glyphs.xAdvance = slot->metrics.horiAdvance / 64 Glyphs.bitmap = new GLubyte.width * glyphs.height]
slot is used to simplify the process, given how often face->glyph would need to be called otherwise. DO NOT USE THIS TO CHANGE WHERE THE GLYPH IS RENDERED ON THE SCREEN. For future reference, it would change where in the rendered bitmap the resulting glyph is drawn. Pen is not used here (well, it is, but it doesn’t make any effect), but it’s kept here for later possible use. Note that FreeType could also be initiated outside of the loop, and this would probably be better in order to reduce function calls (and hard drive access, given that the font file is reread for each mipmap set) and improve performance. In order to keep this clean, the actual value of error is not handled directly here. After this, FreeType is initiated, throwing errors along the way when necessary. Note that s is processed at the beginning of the loop, which means it is still processed when s is equal to one. n is initially 0, and keeps track of the currently processed mipmap level.Īfter these, the loop begins, and ends when s is less than or equal to one. s keeps track of the current mipmap size, and changes by each iteration of the coming loop. s initially stands for double the size of the largest mipmap which must be declared as a power of two. n represents the mipmap level of the texture s represents the resolution of the texture After this, the texture names are generated for later. This is a struct that stores relevant data for the bitmap itself, representing most values in pure pixels. First, a struct is defined and declared, and a member is created, an array, with each value standing for a letter represented in ASCII. This is so you can operate accordingly (ie. Note that the Initiate() class is a boolean. After this is the static Initiate() method, which draws each of the characters at every mipmap level, and saves them as texture objects. Next is the DrawGlyph() member function, which will be covered later when it’s relevant. The Create and Destroy methods are unnecessary here, as this class operates almost entirely on static data. initiated is not used in this case.įollowing these are the constructor and destructor, which I like to leave universally empty, opting instead for separate Create() and Destroy() methods for greater control. These variables–particularly texGlyphs–are static so that every class that uses text rendering uses the same shared memory area.
#ifndef FONT_BASE_CXXįT_Vector FontBase::pen /* untransformed origin */įontBase::Glyph FontBase::texGlyphs Glyph is definitely mandatory.Īt the beginning of fontbase.cxx, the include and the top header guard are in their usual place, followed by declaration of static variables. Some of the member variables could be temporarily created in the Initiate() function, and then discarded after FreeType is no longer needed. Note: Some of the headers might be overkill, but don’t hurt. Void DrawString(std::string text, GLfloat x, GLfloat y, GLfloat size)
Static void DrawGlyph(FT_Bitmap* bitmap, GLubyte* image, unsigned int width, unsigned int height) All of the float values are ratios compared to the given size
Static FT_Vector pen /* untransformed origin */ Let’s jump in with the header file, described here as fontbase.hxx. Note: This class is intended as an abstract class, to be inherited, but there is nothing that prevents you from creating and using and instance of it. With enough requests, I can edit in a few extra pieces to make it standalone. That is to say, this example is not standalone. Note: This example needs a functional OpenGL program to operate. Note: This is not necessarily the best way of preparing this, but it is a fast and functional way of doing it, and it does not actively use FreeType during rendering. This tutorial will describe the process of preparing a set of glyphs in OpenGL, using FreeType only in the preparation of the textures (and all mipmaps).