Exemplo n.º 1
0
 public void ReleaseGlyph()
 {
     if (m_pGlyph != null)
     {
         ANT.ANT_Done_Glyph(ref m_pGlyph);
         m_pGlyph = null;
     }
 }
Exemplo n.º 2
0
 public ANTBitmapChar()
 {
     m_x = 0;
     m_y = 0;
     m_width = 0;
     m_height = 0;
     m_xOffset = 0;
     m_yOffset = 0;
     m_xAdvance = 0;
     m_pGlyph = null;
 }
        void DoWork()
        {
            ANT_Library library;
            ANT_Face    face;

            ANT_GlyphSlot slot;
            ANT_Error     error;

            string filename;
            string text;

            int num_chars;

            int  glyph_index;
            bool use_kerning;
            int  previous;
            int  pen_x, pen_y, n;


            filename  = Common.Example_AltNETType_FontFileName;
            text      = "AltNETType (kerning + centering)";// Common.Pangram;
            num_chars = text.Length;


            //  ... initialize library ...
            //  ... create face object ...
            //  ... set character size ...
            {
                //  initialize library
                error = ANT.ANT_Init_AltNETType(out library);
                //  error handling omitted

                //  create face object
                error = ANT.ANT_New_Face(library, filename, 0, out face);
                //  error handling omitted
                if (error != ANT_Error.ANT_Err_Ok)
                {
                    return;
                }

                //  use 36pt at 100dpi
                //  set character size
                error = ANT.ANT_Set_Char_Size(face, 36 * 64, 0, 96, 0);
                //  error handling omitted
            }

            //  a small shortcut
            slot = face.glyph;


            //  start at (0,0)
            pen_x = 0;
            pen_y = 0;

            num_glyphs  = 0;
            use_kerning = ANT.ANT_HAS_KERNING(face);
            previous    = 0;

            ANT_Vector delta = new ANT_Vector();

            for (n = 0; n < num_chars; n++)
            {
                //  convert character code to glyph index
                glyph_index = ANT.ANT_Get_Char_Index(face, text[n]);

                //  retrieve kerning distance and move pen position
                if (use_kerning &&
                    previous != 0 &&
                    glyph_index != 0)
                {
                    ANT.ANT_Get_Kerning(face, previous, glyph_index, ANT_Kerning_Mode.ANT_KERNING_DEFAULT, delta);

                    pen_x += delta.x >> 6;
                }

                //  store current pen position
                if (pos[num_glyphs] == null)
                {
                    pos[num_glyphs] = new ANT_Vector();
                }
                pos[num_glyphs].x = pen_x;
                pos[num_glyphs].y = pen_y;

                //  load glyph image into the slot without rendering
                error = ANT.ANT_Load_Glyph(face, glyph_index, ANT_LOAD.ANT_LOAD_DEFAULT);
                if (error != ANT_Error.ANT_Err_Ok)
                {
                    //  ignore errors, jump to next glyph
                    continue;
                }

                //  extract glyph image and store it in our table
                error = ANT.ANT_Get_Glyph(face.glyph, out glyphs[num_glyphs]);
                if (error != ANT_Error.ANT_Err_Ok)
                {
                    //  ignore errors, jump to next glyph
                    continue;
                }

                //  increment pen position
                pen_x += slot.advance.x >> 6;

                //  record current glyph index
                previous = glyph_index;

                //  increment number of glyphs
                num_glyphs++;
            }


            ANT_BBox string_bbox;

            compute_string_bbox(out string_bbox);


            int my_target_width  = WIDTH;
            int my_target_height = HEIGHT;


            //  compute string dimensions in integer pixels
            int string_width  = string_bbox.xMax - string_bbox.xMin;
            int string_height = string_bbox.yMax - string_bbox.yMin;

            //  compute start pen position in 26.6 cartesian pixels
            int start_x = ((my_target_width - string_width) / 2) * 64;
            //  int start_y = ((my_target_height - string_height) / 2) * 64;
            //  need to center bitmaps (not base line)
            int start_y = ((my_target_height - string_height) / 2 - string_bbox.yMin) * 64;

            ANT_Vector pen = new ANT_Vector();

            for (n = 0; n < num_glyphs; n++)
            {
                ANT_Glyph image = glyphs[n];

                pen.x = start_x + pos[n].x * 64;
                pen.y = start_y + pos[n].y * 64;

                error = ANT.ANT_Glyph_To_Bitmap(ref image, ANT_Render_Mode.ANT_RENDER_MODE_NORMAL, pen, false);
                if (error == ANT_Error.ANT_Err_Ok)
                {
                    ANT_BitmapGlyph bit = (ANT_BitmapGlyph)image;

                    draw_bitmap(bit.bitmap, bit.left, my_target_height - bit.top);

                    ANT.ANT_Done_Glyph(ref image);
                }
            }


            //
            show_image();

            ANT.ANT_Done_Face(ref face);
            ANT.ANT_Done_AltNETType(ref library);
        }
Exemplo n.º 4
0
 public void SetGlyph(ANT_Glyph pGlyph)
 {
     m_pGlyph = pGlyph;
 }