public void ReleaseGlyph() { if (m_pGlyph != null) { ANT.ANT_Done_Glyph(ref m_pGlyph); m_pGlyph = null; } }
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); }
public void SetGlyph(ANT_Glyph pGlyph) { m_pGlyph = pGlyph; }