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