| @@ -217,6 +217,9 @@ namespace lts | |||
| Flags(const TEnum& e) : | |||
| _value(1 << e) | |||
| { }; | |||
| Flags(const Flags& f) : | |||
| _value(f._value) | |||
| { }; | |||
| Flags(const std::initializer_list<TEnum>& vec) : | |||
| _value(0) | |||
| { | |||
| @@ -275,6 +278,12 @@ namespace lts | |||
| float arr[4]; | |||
| }; | |||
| union ImageModes | |||
| { | |||
| struct { ImageMode r, g, b, a; }; | |||
| ImageMode arr[4]; | |||
| }; | |||
| struct GlyphMetric | |||
| { | |||
| Position glyphOrigin; | |||
| @@ -314,7 +323,6 @@ namespace lts | |||
| typedef float Vector4f[4]; | |||
| typedef Vector4f Matrix4f[4]; | |||
| typedef ImageMode ImageModes[4]; | |||
| /* exeption ***********************************************************************************************************************/ | |||
| class Exception : public std::exception | |||
| @@ -361,6 +369,7 @@ namespace lts | |||
| class Context | |||
| { | |||
| friend class Image; | |||
| friend class PostProcessor; | |||
| private: | |||
| const Library::Impl& _impl; | |||
| ContextHandle _handle; | |||
| @@ -459,12 +468,13 @@ namespace lts | |||
| class PostProcessor | |||
| { | |||
| private: | |||
| const Library::Impl& _impl; | |||
| PostProcessorHandle _handle; | |||
| PostProcessorHandle _handle; | |||
| PostProcessor(const PostProcessor&) = delete; | |||
| protected: | |||
| virtual void execute(Char c, Image i); | |||
| PostProcessor(PostProcessorHandle handle); | |||
| const Library::Impl& _impl; | |||
| void setHandle(PostProcessorHandle handle); | |||
| virtual void execute(Char& c, Image& i); | |||
| PostProcessor(const Context& context); | |||
| public: | |||
| PostProcessorHandle getHandle() const; | |||
| @@ -479,7 +489,6 @@ namespace lts | |||
| class PostProcessorFillColor final : public PostProcessor | |||
| { | |||
| private: | |||
| const Library::Impl& _impl; | |||
| Color4f _color; | |||
| ImageModes _modes; | |||
| ColorChannels _channels; | |||
| @@ -488,7 +497,11 @@ namespace lts | |||
| const ImageModes& getModes() const; | |||
| const ColorChannels& getChannels() const; | |||
| PostProcessorFillColor(const Context& context, const Color4f& color, const ImageModes& modes, const ColorChannels& channels); | |||
| PostProcessorFillColor( | |||
| const Context& context, | |||
| const Color4f& color, | |||
| const ImageModes& modes, | |||
| const ColorChannels& channels); | |||
| }; | |||
| /* post processor fill pattern ****************************************************************************************************/ | |||
| @@ -496,22 +509,21 @@ namespace lts | |||
| { | |||
| private: | |||
| const Image& _pattern; | |||
| bool _ownsPattern; | |||
| Position _position; | |||
| ImageModes _modes; | |||
| ColorChannels _channels; | |||
| protected: | |||
| const Library::Impl& _impl; | |||
| public: | |||
| const Image& getPattern() const; | |||
| bool getOwnsPattern() const; | |||
| const Position& getPosition() const; | |||
| const ImageModes& getModes() const; | |||
| const ColorChannels& getChannels() const; | |||
| PostProcessorFillPattern(const Context& context, const Image& pattern, bool ownsPattern, | |||
| const Position& pos, ImageModes modes, ColorChannels channels); | |||
| virtual ~PostProcessorFillPattern(); | |||
| PostProcessorFillPattern( | |||
| const Context& context, | |||
| const Image& pattern, | |||
| const Position& pos, | |||
| ImageModes modes, | |||
| ColorChannels channels); | |||
| }; | |||
| /* post processor border **********************************************************************************************************/ | |||
| @@ -537,22 +549,26 @@ namespace lts | |||
| private: | |||
| float _radius; | |||
| float _strength; | |||
| Position _position; | |||
| Position _offset; | |||
| Color4f _color; | |||
| public: | |||
| float getRadius() const; | |||
| float getStrength() const; | |||
| Position getPosition() const; | |||
| Position getOffset() const; | |||
| Color4f getColor() const; | |||
| PostProcessorShadow(const Context& context, float radius, float strength, const Position& offset, const Color4f& color); | |||
| }; | |||
| /* post processor custom **********************************************************************************************************/ | |||
| class PostProcessorCustom | |||
| class PostProcessorCustom : public PostProcessor | |||
| { | |||
| protected: | |||
| virtual void execute(Char c, Image i); | |||
| virtual void execute(Char& c, Image& i); | |||
| public: | |||
| PostProcessorCustom(const Context& context); | |||
| public: | |||
| static void WINAPI executeCallback(CharHandle charHandle, ImageHandle imageHandle, void* args); | |||
| }; | |||
| /* post processor list ************************************************************************************************************/ | |||
| @@ -561,7 +577,7 @@ namespace lts | |||
| public std::list<T> | |||
| { | |||
| protected: | |||
| virtual void execute(Char c, Image i); | |||
| virtual void execute(Char& c, Image& i); | |||
| public: | |||
| PostProcessorList(const Context& context); | |||
| }; | |||
| @@ -599,7 +615,7 @@ namespace lts | |||
| void setCharSpacing(int value); | |||
| void setLineSpacing(int value); | |||
| Font(FontHandle handle); | |||
| Font(Library::Impl& impl, FontHandle handle); | |||
| virtual ~Font(); | |||
| }; | |||
| typedef std::unique_ptr<Font> FontPtrU; | |||
| @@ -795,7 +811,7 @@ public: /* stream */ | |||
| public: /* custom post processor */ | |||
| struct PostProcessorData | |||
| { | |||
| typedef void (WINAPI *post_processor_execute_t)(lts::CharHandle charHandle, lts::ImageHandle imageHandle); | |||
| typedef void (WINAPI *post_processor_execute_t)(lts::CharHandle charHandle, lts::ImageHandle imageHandle, void* args); | |||
| void* args; | |||
| post_processor_execute_t execute; | |||
| @@ -863,7 +879,7 @@ public: /* callbacks */ | |||
| typedef const char* (WINAPI *font_get_fontname_t) (lts::FontHandle handle); | |||
| typedef const char* (WINAPI *font_get_facename_t) (lts::FontHandle handle); | |||
| typedef const char* (WINAPI *font_get_stylename_t) (lts::FontHandle handle); | |||
| typedef const char* (WINAPI *font_get_fillname_t) (lts::FontHandle handle); | |||
| typedef const char* (WINAPI *font_get_fullname_t) (lts::FontHandle handle); | |||
| typedef const char* (WINAPI *font_get_copyright_t) (lts::FontHandle handle); | |||
| typedef lts::ErrorCode (WINAPI *font_set_post_processor_t) (lts::FontHandle handle, lts::PostProcessorHandle pp); | |||
| typedef lts::ErrorCode (WINAPI *font_set_tab_width_t) (lts::FontHandle handle, int value); | |||
| @@ -920,10 +936,10 @@ public: /* callbacks */ | |||
| typedef lts::ErrorCode (WINAPI *post_processor_add_chars_t) (lts::PostProcessorHandle handle, lts::CharRangeUsage usage, const WideChar* chars); | |||
| typedef lts::ErrorCode (WINAPI *post_processor_clear_ranges_t) (lts::PostProcessorHandle handle); | |||
| typedef lts::ErrorCode (WINAPI *post_processor_execute_t) (lts::PostProcessorHandle handle, lts::CharHandle charHandle, lts::ImageHandle image); | |||
| typedef lts::PostProcessorHandle(WINAPI *post_processor_fill_color_create_t) (lts::PostProcessorHandle handle, lts::Color4f color, lts::ImageModes modes, lts::ColorChannels channels); | |||
| typedef lts::PostProcessorHandle(WINAPI *post_processor_fill_pattern_create_t) (lts::PostProcessorHandle handle, lts::ImageHandle pattern, bool ownsPattern, lts::Position position, lts::ImageModes modes, lts::ColorChannels channels); | |||
| typedef lts::PostProcessorHandle(WINAPI *post_processor_border_create_t) (lts::PostProcessorHandle handle, float width, float strength, lts::Color4f color, bool keepSize); | |||
| typedef lts::PostProcessorHandle(WINAPI *post_processor_shadow_create_t) (lts::PostProcessorHandle handle, float radius, float strength, lts::Position offset, lts::Color4f color); | |||
| typedef lts::PostProcessorHandle(WINAPI *post_processor_fill_color_create_t) (lts::PostProcessorHandle handle, const lts::Color4f color, const lts::ImageModes modes, const lts::ColorChannels channels); | |||
| typedef lts::PostProcessorHandle(WINAPI *post_processor_fill_pattern_create_t) (lts::PostProcessorHandle handle, lts::ImageHandle pattern, bool ownsPattern, const lts::Position position, const lts::ImageModes modes, const lts::ColorChannels channels); | |||
| typedef lts::PostProcessorHandle(WINAPI *post_processor_border_create_t) (lts::PostProcessorHandle handle, float width, float strength, const lts::Color4f color, bool keepSize); | |||
| typedef lts::PostProcessorHandle(WINAPI *post_processor_shadow_create_t) (lts::PostProcessorHandle handle, float radius, float strength, const lts::Position offset, const lts::Color4f color); | |||
| typedef lts::PostProcessorHandle(WINAPI *post_processor_custom_create_t) (lts::PostProcessorHandle handle, const PostProcessorData& data); | |||
| typedef lts::ErrorCode (WINAPI *post_processor_destroy_t) (lts::PostProcessorHandle handle); | |||
| @@ -980,7 +996,7 @@ public: | |||
| font_get_fontname_t font_get_fontname; | |||
| font_get_facename_t font_get_facename; | |||
| font_get_stylename_t font_get_stylename; | |||
| font_get_fillname_t font_get_fillname; | |||
| font_get_fullname_t font_get_fullname; | |||
| font_get_copyright_t font_get_copyright; | |||
| font_set_post_processor_t font_set_post_processor; | |||
| font_set_tab_width_t font_set_tab_width; | |||
| @@ -1088,7 +1104,7 @@ public: | |||
| font_get_fontname (NULL), | |||
| font_get_facename (NULL), | |||
| font_get_stylename (NULL), | |||
| font_get_fillname (NULL), | |||
| font_get_fullname (NULL), | |||
| font_get_copyright (NULL), | |||
| font_set_post_processor (NULL), | |||
| font_set_tab_width (NULL), | |||
| @@ -1190,7 +1206,7 @@ public: | |||
| loadProc(font_get_fontname, "ltsFontGetFontname"); | |||
| loadProc(font_get_facename, "ltsFontGetFacename"); | |||
| loadProc(font_get_stylename, "ltsFontGetStylename"); | |||
| loadProc(font_get_fillname, "ltsFontGetFullname"); | |||
| loadProc(font_get_fullname, "ltsFontGetFullname"); | |||
| loadProc(font_get_copyright, "ltsFontGetCopyright"); | |||
| loadProc(font_set_post_processor, "ltsFontSetPostProcessor"); | |||
| loadProc(font_set_tab_width, "ltsFontSetTabWidth"); | |||
| @@ -1294,6 +1310,15 @@ namespace lts | |||
| return value; | |||
| } | |||
| template<typename T> | |||
| T getFunc(const Library::Impl& impl, Handle handle, T (WINAPI * const callback)(Handle), T invalidValue) | |||
| { | |||
| T value = callback(handle); | |||
| if (value == invalidValue) | |||
| throw Exception(impl.get_last_error_msg(), impl.get_last_error_code()); | |||
| return value; | |||
| } | |||
| template <typename T> | |||
| void setFunc(const Library::Impl& impl, Handle handle, ErrorCode (WINAPI * const callback)(Handle, T), const T& value) | |||
| { | |||
| @@ -1554,154 +1579,267 @@ void lts::Image::blendFunc(ImageHandle handle, lts::Color4f src, lts::Color4f ds | |||
| result = (*ba->func)(*ba->image, src, dst); | |||
| } | |||
| /* post processor ***************************************************************************************************************** | |||
| class PostProcessor | |||
| /* post processor *****************************************************************************************************************/ | |||
| inline void lts::PostProcessor::setHandle(PostProcessorHandle handle) | |||
| { _handle = handle; }; | |||
| void lts::PostProcessor::execute(Char& c, Image& i) | |||
| { | |||
| private: | |||
| const Library::Impl& _impl; | |||
| PostProcessorHandle _handle; | |||
| PostProcessor(const PostProcessor&) = delete; | |||
| protected: | |||
| virtual void execute(Char c, Image i); | |||
| PostProcessor(PostProcessorHandle handle); | |||
| public: | |||
| PostProcessorHandle getHandle() const; | |||
| void addRange(CharRangeUsage usage, WideChar start, WideChar stop); | |||
| void addChars(CharRangeUsage usage, WideChar* chars); | |||
| void clearRanges(); | |||
| virtual ~PostProcessor(); | |||
| }; | |||
| auto err = _impl.post_processor_execute(_handle, c.getHandle(), i.getHandle()); | |||
| if (err != ErrorCode::None) | |||
| throw Exception(_impl.get_last_error_msg(), err); | |||
| } | |||
| /* post processor fill color ****************************************************************************************************** | |||
| class PostProcessorFillColor final : public PostProcessor | |||
| lts::PostProcessor::PostProcessor(const Context& context) : | |||
| _impl (context._impl), | |||
| _handle (NULL) | |||
| { }; | |||
| inline lts::PostProcessorHandle lts::PostProcessor::getHandle() const | |||
| { return _handle; }; | |||
| void lts::PostProcessor::addRange(CharRangeUsage usage, WideChar start, WideChar stop) | |||
| { | |||
| private: | |||
| const Library::Impl& _impl; | |||
| Color4f _color; | |||
| ImageModes _modes; | |||
| ColorChannels _channels; | |||
| public: | |||
| const Color4f& getColor() const; | |||
| const ImageModes& getModes() const; | |||
| const ColorChannels& getChannels() const; | |||
| PostProcessorFillColor(const Context& context, const Color4f& color, const ImageModes& modes, const ColorChannels& channels); | |||
| auto err = _impl.post_processor_add_range(_handle, usage, start, stop); | |||
| if (err != ErrorCode::None) | |||
| throw Exception(_impl.get_last_error_msg(), err); | |||
| } | |||
| void lts::PostProcessor::addChars(CharRangeUsage usage, WideChar* chars) | |||
| { | |||
| auto err = _impl.post_processor_add_chars(_handle, usage, chars); | |||
| if (err != ErrorCode::None) | |||
| throw Exception(_impl.get_last_error_msg(), err); | |||
| } | |||
| void lts::PostProcessor::clearRanges() | |||
| { | |||
| auto err = _impl.post_processor_clear_ranges(_handle); | |||
| if (err != ErrorCode::None) | |||
| throw Exception(_impl.get_last_error_msg(), err); | |||
| } | |||
| lts::PostProcessor::~PostProcessor() | |||
| { | |||
| if (_handle) | |||
| { | |||
| _impl.post_processor_destroy(_handle); | |||
| _handle = NULL; | |||
| } | |||
| } | |||
| /* post processor fill color ******************************************************************************************************/ | |||
| inline const lts::Color4f& lts::PostProcessorFillColor::getColor() const | |||
| { return _color; }; | |||
| inline const lts::ImageModes& lts::PostProcessorFillColor::getModes() const | |||
| { return _modes; }; | |||
| const lts::ColorChannels& lts::PostProcessorFillColor::getChannels() const | |||
| { return _channels; }; | |||
| lts::PostProcessorFillColor::PostProcessorFillColor( | |||
| const Context& context, | |||
| const Color4f& color, | |||
| const ImageModes& modes, | |||
| const ColorChannels& channels) : | |||
| PostProcessor (context), | |||
| _color (color), | |||
| _modes (modes), | |||
| _channels (channels) | |||
| { | |||
| auto handle = _impl.post_processor_fill_color_create(context.getHandle(), color, modes, channels); | |||
| if (!handle) | |||
| throw Exception(_impl.get_last_error_msg(), _impl.get_last_error_code()); | |||
| setHandle(handle); | |||
| }; | |||
| /* post processor fill pattern **************************************************************************************************** | |||
| class PostProcessorFillPattern final : public PostProcessor | |||
| /* post processor fill pattern ****************************************************************************************************/ | |||
| inline const lts::Image& lts::PostProcessorFillPattern::getPattern() const | |||
| { return _pattern; }; | |||
| inline const lts::Position& lts::PostProcessorFillPattern::getPosition() const | |||
| { return _position; }; | |||
| inline const lts::ImageModes& lts::PostProcessorFillPattern::getModes() const | |||
| { return _modes; }; | |||
| inline const lts::ColorChannels& lts::PostProcessorFillPattern::getChannels() const | |||
| { return _channels; }; | |||
| lts::PostProcessorFillPattern::PostProcessorFillPattern( | |||
| const Context& context, | |||
| const Image& pattern, | |||
| const Position& pos, | |||
| ImageModes modes, | |||
| ColorChannels channels) : | |||
| PostProcessor (context), | |||
| _pattern (pattern), | |||
| _position (pos), | |||
| _modes (modes), | |||
| _channels (channels) | |||
| { | |||
| private: | |||
| const Image& _pattern; | |||
| bool _ownsPattern; | |||
| Position _position; | |||
| ImageModes _modes; | |||
| ColorChannels _channels; | |||
| protected: | |||
| const Library::Impl& _impl; | |||
| public: | |||
| const Image& getPattern() const; | |||
| bool getOwnsPattern() const; | |||
| const Position& getPosition() const; | |||
| const ImageModes& getModes() const; | |||
| const ColorChannels& getChannels() const; | |||
| PostProcessorFillPattern(const Context& context, const Image& pattern, bool ownsPattern, | |||
| const Position& pos, ImageModes modes, ColorChannels channels); | |||
| virtual ~PostProcessorFillPattern(); | |||
| auto handle = _impl.post_processor_fill_pattern_create(context.getHandle(), pattern.getHandle(), false, pos, modes, channels); | |||
| if (!handle) | |||
| throw Exception(_impl.get_last_error_msg(), _impl.get_last_error_code()); | |||
| setHandle(handle); | |||
| }; | |||
| /* post processor border ********************************************************************************************************** | |||
| class PostProcessorBorder final : public PostProcessor | |||
| /* post processor border **********************************************************************************************************/ | |||
| inline float lts::PostProcessorBorder::getWidth() const | |||
| { return _width; }; | |||
| inline float lts::PostProcessorBorder::getStrength() const | |||
| { return _strength; }; | |||
| inline lts::Color4f lts::PostProcessorBorder::getColor() const | |||
| { return _color; }; | |||
| inline bool lts::PostProcessorBorder::getKeepSize() const | |||
| { return _keepSize; }; | |||
| lts::PostProcessorBorder::PostProcessorBorder( | |||
| const Context& context, | |||
| float width, | |||
| float strength, | |||
| Color4f color, | |||
| bool keepSize) : | |||
| PostProcessor (context), | |||
| _width (width), | |||
| _strength (strength), | |||
| _color (color), | |||
| _keepSize (keepSize) | |||
| { | |||
| private: | |||
| float _width; | |||
| float _strength; | |||
| Color4f _color; | |||
| bool _keepSize; | |||
| public: | |||
| float getWidth() const; | |||
| float getStrength() const; | |||
| Color4f getColor() const; | |||
| bool getKeepSize() const; | |||
| PostProcessorBorder(const Context& context, float width, float strength, Color4f color, bool keepSize); | |||
| auto handle = _impl.post_processor_border_create(context.getHandle(), width, strength, color, keepSize); | |||
| if (!handle) | |||
| throw Exception(_impl.get_last_error_msg(), _impl.get_last_error_code()); | |||
| setHandle(handle); | |||
| }; | |||
| /* post processor shadow ********************************************************************************************************** | |||
| class PostProcessorShadow final : public PostProcessor | |||
| /* post processor shadow **********************************************************************************************************/ | |||
| inline float lts::PostProcessorShadow::getRadius() const | |||
| { return _radius; }; | |||
| inline float lts::PostProcessorShadow::getStrength() const | |||
| { return _strength; }; | |||
| inline lts::Position lts::PostProcessorShadow::getOffset() const | |||
| { return _offset; }; | |||
| inline lts::Color4f lts::PostProcessorShadow::getColor() const | |||
| { return _color; }; | |||
| lts::PostProcessorShadow::PostProcessorShadow( | |||
| const Context& context, | |||
| float radius, | |||
| float strength, | |||
| const Position& offset, | |||
| const Color4f& color) : | |||
| PostProcessor (context), | |||
| _radius (radius), | |||
| _strength (strength), | |||
| _offset (offset), | |||
| _color (color) | |||
| { | |||
| private: | |||
| float _radius; | |||
| float _strength; | |||
| Position _position; | |||
| Color4f _color; | |||
| public: | |||
| float getRadius() const; | |||
| float getStrength() const; | |||
| Position getPosition() const; | |||
| Color4f getColor() const; | |||
| auto handle = _impl.post_processor_shadow_create(context.getHandle(), radius, strength, offset, color); | |||
| if (!handle) | |||
| throw Exception(_impl.get_last_error_msg(), _impl.get_last_error_code()); | |||
| setHandle(handle); | |||
| } | |||
| /* post processor custom **********************************************************************************************************/ | |||
| void lts::PostProcessorCustom::execute(Char& c, Image& i) | |||
| { /* do not call base class to avoid infinite loop */ } | |||
| lts::PostProcessorCustom::PostProcessorCustom(const Context& context) : | |||
| PostProcessor(context) | |||
| { | |||
| Library::Impl::PostProcessorData ppd; | |||
| ppd.args = this; | |||
| ppd.execute = &PostProcessorCustom::executeCallback; | |||
| auto handle = _impl.post_processor_custom_create(context.getHandle(), ppd); | |||
| if (!handle) | |||
| throw Exception(_impl.get_last_error_msg(), _impl.get_last_error_code()); | |||
| setHandle(handle); | |||
| } | |||
| void lts::PostProcessorCustom::executeCallback(CharHandle charHandle, ImageHandle imageHandle, void* args) | |||
| { | |||
| auto ppc = static_cast<PostProcessorCustom*>(args); | |||
| Char chr(ppc->_impl, charHandle); | |||
| Image img(ppc->_impl, imageHandle); | |||
| ppc->execute(chr, img); | |||
| } | |||
| /* post processor list ************************************************************************************************************/ | |||
| template<class T> | |||
| void lts::PostProcessorList<T>::execute(Char& c, Image& i) | |||
| { | |||
| for (auto& pp : *this) | |||
| pp.execute(c, i); | |||
| } | |||
| template<class T> | |||
| lts::PostProcessorList<T>::PostProcessorList(const Context& context) : | |||
| PostProcessor(context) | |||
| { }; | |||
| /* font ***************************************************************************************************************************/ | |||
| inline lts::FontHandle lts::Font::getHandle() const | |||
| { return _handle; }; | |||
| PostProcessorShadow(const Context& context, float radius, float strength, const Position& offset, const Color4f& color); | |||
| }; | |||
| inline const lts::Font::Names& lts::Font::getNames() const | |||
| { return _names; }; | |||
| inline const lts::FontMetric& lts::Font::getMetric() const | |||
| { return _metric; }; | |||
| inline lts::PostProcessor* lts::Font::getPostProcessor() const | |||
| { return _postProcessor; }; | |||
| inline int lts::Font::getTabWidth() const | |||
| { return getFunc<int>(_impl, _handle, _impl.font_get_tab_width); }; | |||
| /* post processor custom ********************************************************************************************************** | |||
| class PostProcessorCustom | |||
| inline int lts::Font::getCharSpacing() const | |||
| { return getFunc<int>(_impl, _handle, _impl.font_get_char_spacing); }; | |||
| inline int lts::Font::getLineSpacing() const | |||
| { return getFunc<float>(_impl, _handle, _impl.font_get_line_spacing); }; | |||
| inline void lts::Font::setPostProcessor(PostProcessor* value) | |||
| { | |||
| protected: | |||
| virtual void execute(Char c, Image i); | |||
| _postProcessor = value; | |||
| setFunc(_impl, _handle, _impl.font_set_post_processor, (value ? value->getHandle() : NULL)); | |||
| }; | |||
| /* post processor list ************************************************************************************************************ | |||
| template<typename T> | |||
| class PostProcessorList : public PostProcessorCustom, | |||
| public std::list<T> | |||
| inline void lts::Font::setTabWidth(int value) | |||
| { setFunc<int>(_impl, _handle, _impl.font_set_tab_width, value); }; | |||
| inline void lts::Font::setCharSpacing(int value) | |||
| { setFunc<int>(_impl, _handle, _impl.font_set_char_spacing, value); }; | |||
| inline void lts::Font::setLineSpacing(int value) | |||
| { setFunc<float>(_impl, _handle, _impl.font_set_line_spacing, value); }; | |||
| lts::Font::Font(Library::Impl& impl, FontHandle handle) : | |||
| _impl (impl), | |||
| _handle (handle) | |||
| { | |||
| protected: | |||
| virtual void execute(Char c, Image i); | |||
| public: | |||
| PostProcessorList(const Context& context); | |||
| _metric = getFunc(_impl, _handle, _impl.font_get_metric); | |||
| _names.fontname = std::string(getFunc<const char*>(_impl, _handle, _impl.font_get_fontname, NULL)); | |||
| _names.facename = std::string(getFunc<const char*>(_impl, _handle, _impl.font_get_facename, NULL)); | |||
| _names.stylename = std::string(getFunc<const char*>(_impl, _handle, _impl.font_get_stylename, NULL)); | |||
| _names.fullname = std::string(getFunc<const char*>(_impl, _handle, _impl.font_get_fullname, NULL)); | |||
| }; | |||
| /* font *************************************************************************************************************************** | |||
| class Font | |||
| lts::Font::~Font() | |||
| { | |||
| public: | |||
| struct Names | |||
| if (_handle) | |||
| { | |||
| std::string fontname; | |||
| std::string copyright; | |||
| std::string facename; | |||
| std::string stylename; | |||
| std::string fullname; | |||
| }; | |||
| private: | |||
| const Library::Impl& _impl; | |||
| FontHandle _handle; | |||
| FontMetric _metric; | |||
| Names _names; | |||
| PostProcessor* _postProcessor; | |||
| Font(const Font&) = delete; | |||
| public: | |||
| FontHandle getHandle() const; | |||
| const Names& getNames() const; | |||
| const FontMetric& getMetric() const; | |||
| PostProcessor* getPostProcessor() const; | |||
| int getTabWidth() const; | |||
| int getCharSpacing() const; | |||
| int getLineSpacing() const; | |||
| void setPostProcessor(PostProcessor* value); | |||
| void setTabWidth(int value); | |||
| void setCharSpacing(int value); | |||
| void setLineSpacing(int value); | |||
| Font(FontHandle handle); | |||
| virtual ~Font(); | |||
| }; | |||
| typedef std::unique_ptr<Font> FontPtrU; | |||
| _impl.font_destroy(_handle); | |||
| _handle = NULL; | |||
| } | |||
| } | |||
| /* font creator ******************************************************************************************************************* | |||
| class FontCreator | |||