#include <boost/gil/typedefs.hpp>
#include <boost/gil/extension/io/png_dynamic_io.hpp>
#include <freegil.hpp>
using namespace boost::gil;
//GCC Build String
//g++ sample1.cpp -lpng -lz -I . -I ~/lib/freetype2/include -I ~/lib/boost -I ~/lib -L ~/lib/freetype2 -lfreetype
//REMEMBER TO SEND IN THE FULL PATH TO THE FONT
struct glyph
{
char ch;
FT_Face face;
boost::gil::rgb8_pixel_t color;
};
int main(int args, char** argv)
{
assert(args == 2);
char* font_path = argv[1];
//Step 1. Create boost::gil image
//Step 2. Initialize freetype
//Step 3. Make Glyphs Array
//Step 4. Make Metrics Array
//Step 5. Make Kerning Array
//Step 6. Get Coordinates (x,y)
//Step 7. Render Glyphs on GIL View
//Step 8. Save GIL Image
//Step 1. Create boost::gil image
rgb8_image_t img(200,200);
boost::gil::fill_pixels(boost::gil::view(img),
boost::gil::rgb8_pixel_t(170,170,170));
//Step 2. Initialize freetype
FT_Library library;
FT_Init_FreeType(&library);
FT_Face face;
FT_New_Face(library,argv[1],0,&face);
FT_Set_Pixel_Sizes(face,0,12);
//Step 3. Make Glyphs Array --------------
glyph glyphs[5];
glyphs[0].ch = 'S';
glyphs[0].face = face;
glyphs[0].color = rgb8_pixel_t(0,0,0);
glyphs[1].ch = 'A';
glyphs[1].face = face;
glyphs[1].color = rgb8_pixel_t(0,0,0);
glyphs[2].ch = 'M';
glyphs[2].face = face;
glyphs[2].color = rgb8_pixel_t(0,0,0);
glyphs[3].ch = 'P';
glyphs[3].face = face;
glyphs[3].color = rgb8_pixel_t(0,0,0);
glyphs[4].ch = '1';
glyphs[4].face = face;
glyphs[4].color = rgb8_pixel_t(0,0,0);
//Step 4. Make Metrics Array --------------------
FT_Glyph_Metrics metrics[5];
int index = FT_Get_Char_Index(glyphs[0].face,glyphs[0].ch);
FT_Load_Glyph(glyphs[0].face, index, FT_LOAD_DEFAULT);
metrics[0] = glyphs[0].face->glyph->metrics;
index = FT_Get_Char_Index(glyphs[1].face,glyphs[1].ch);
FT_Load_Glyph(glyphs[1].face, index, FT_LOAD_DEFAULT);
metrics[1] = glyphs[1].face->glyph->metrics;
index = FT_Get_Char_Index(glyphs[2].face,glyphs[2].ch);
FT_Load_Glyph(glyphs[2].face, index, FT_LOAD_DEFAULT);
metrics[2] = glyphs[2].face->glyph->metrics;
index = FT_Get_Char_Index(glyphs[3].face,glyphs[3].ch);
FT_Load_Glyph(glyphs[3].face, index, FT_LOAD_DEFAULT);
metrics[3] = glyphs[3].face->glyph->metrics;
index = FT_Get_Char_Index(glyphs[4].face,glyphs[4].ch);
FT_Load_Glyph(glyphs[4].face, index, FT_LOAD_DEFAULT);
metrics[4] = glyphs[4].face->glyph->metrics;
//Step 5. Make Kerning Array ----------------
int kerning[5] = {0,0,0,0,0};
//Step 6. Get Coordinates (x,y)
int width = std::for_each(metrics, metrics+5, kerning, make_width());
int height = std::for_each(metrics, metrics+5, kerning, make_width());
int x = (boost::gil::view(img).width()-width)/2;
int y = (boost::gil::view(img).height()-height)/2;
//Step 7. Render Glyphs
render_gray_glyph<rgb8_view_t> render(
boost::gil::subimage_view(boost::gil::view(img),x,y,width,height));
render(&glyphs[0]);
render(&glyphs[1]);
render(&glyphs[2]);
render(&glyphs[3]);
render(&glyphs[4]);
//Step 8. Save GIL Image
png_write_view("sample1.png", boost::gil::view(img));
}