/* Copyright (C) 2009-2015 Michael Goffioul This file is part of Octave. Octave is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Octave is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Octave; see the file COPYING. If not, see . */ #if ! defined (txt_eng_ft_h) #define txt_eng_ft_h 1 #if HAVE_FREETYPE #include #include #include #include FT_FREETYPE_H #include #include #include "txt-eng.h" class OCTINTERP_API ft_render : public text_processor { public: enum { MODE_BBOX = 0, MODE_RENDER = 1 }; enum { ROTATION_0 = 0, ROTATION_90 = 1, ROTATION_180 = 2, ROTATION_270 = 3 }; public: ft_render (void); ~ft_render (void); void visit (text_element_string& e); void visit (text_element_list& e); void visit (text_element_subscript& e); void visit (text_element_superscript& e); void visit (text_element_color& e); void visit (text_element_fontsize& e); void visit (text_element_fontname& e); void visit (text_element_fontstyle& e); void visit (text_element_symbol& e); void visit (text_element_combined& e); void reset (void); uint8NDArray get_pixels (void) const { return pixels; } Matrix get_boundingbox (void) const { return bbox; } uint8NDArray render (text_element* elt, Matrix& box, int rotation = ROTATION_0); Matrix get_extent (text_element *elt, double rotation = 0.0); Matrix get_extent (const std::string& txt, double rotation = 0.0, const caseless_str& interpreter = "tex"); void set_font (const std::string& name, const std::string& weight, const std::string& angle, double size); void set_color (Matrix c); void set_mode (int m); void text_to_pixels (const std::string& txt, uint8NDArray& pixels_, Matrix& bbox, int halign, int valign, double rotation, const caseless_str& interpreter = "tex"); private: int rotation_to_mode (double rotation) const; // No copying! ft_render (const ft_render&); ft_render& operator = (const ft_render&); // Class to hold information about fonts and a strong // reference to the font objects loaded by FreeType. class ft_font { public: ft_font (void) : name (), weight (), angle (), size (0), face (0) { } ft_font (const std::string& nm, const std::string& wt, const std::string& ang, double sz, FT_Face f = 0) : name (nm), weight (wt), angle (ang), size (sz), face (f) { } ft_font (const ft_font& ft); ~ft_font (void) { if (face) FT_Done_Face (face); } ft_font& operator = (const ft_font& ft); bool is_valid (void) const { return get_face (); } std::string get_name (void) const { return name; } std::string get_weight (void) const { return weight; } std::string get_angle (void) const { return angle; } double get_size (void) const { return size; } FT_Face get_face (void) const; private: std::string name; std::string weight; std::string angle; double size; mutable FT_Face face; }; void push_new_line (void); void update_line_bbox (void); void compute_bbox (void); int compute_line_xoffset (const Matrix& lb) const; FT_UInt process_character (FT_ULong code, FT_UInt previous = 0); private: // The current font used by the renderer. ft_font font; // Used to stored the bounding box corresponding to the rendered text. // The bounding box has the form [x, y, w, h] where x and y represent the // coordinates of the bottom left corner relative to the anchor point of // the text (== start of text on the baseline). Due to font descent or // multiple lines, the value y is usually negative. Matrix bbox; // Used to stored the rendered text. It's a 3D matrix with size MxNx4 // where M and N are the width and height of the bounding box. uint8NDArray pixels; // Used to store the bounding box of each line. This is used to layout // multiline text properly. std::list line_bbox; // The current horizontal alignment. This is used to align multi-line text. int halign; // The X offset for the next glyph. int xoffset; // The Y offset of the baseline for the current line. int line_yoffset; // The Y offset of the baseline for the next glyph. The offset is relative // to line_yoffset. The total Y offset is computed with: // line_yoffset + yoffset. int yoffset; // The current mode of the rendering process (box computing or rendering). int mode; // The base color of the rendered text. uint8NDArray color; }; #endif // HAVE_FREETYPE #endif