| @@ -217,6 +217,9 @@ namespace lts | |||||
| Flags(const TEnum& e) : | Flags(const TEnum& e) : | ||||
| _value(1 << e) | _value(1 << e) | ||||
| { }; | { }; | ||||
| Flags(const Flags& f) : | |||||
| _value(f._value) | |||||
| { }; | |||||
| Flags(const std::initializer_list<TEnum>& vec) : | Flags(const std::initializer_list<TEnum>& vec) : | ||||
| _value(0) | _value(0) | ||||
| { | { | ||||
| @@ -275,6 +278,12 @@ namespace lts | |||||
| float arr[4]; | float arr[4]; | ||||
| }; | }; | ||||
| union ImageModes | |||||
| { | |||||
| struct { ImageMode r, g, b, a; }; | |||||
| ImageMode arr[4]; | |||||
| }; | |||||
| struct GlyphMetric | struct GlyphMetric | ||||
| { | { | ||||
| Position glyphOrigin; | Position glyphOrigin; | ||||
| @@ -314,7 +323,6 @@ namespace lts | |||||
| typedef float Vector4f[4]; | typedef float Vector4f[4]; | ||||
| typedef Vector4f Matrix4f[4]; | typedef Vector4f Matrix4f[4]; | ||||
| typedef ImageMode ImageModes[4]; | |||||
| /* exeption ***********************************************************************************************************************/ | /* exeption ***********************************************************************************************************************/ | ||||
| class Exception : public std::exception | class Exception : public std::exception | ||||
| @@ -361,6 +369,7 @@ namespace lts | |||||
| class Context | class Context | ||||
| { | { | ||||
| friend class Image; | friend class Image; | ||||
| friend class PostProcessor; | |||||
| private: | private: | ||||
| const Library::Impl& _impl; | const Library::Impl& _impl; | ||||
| ContextHandle _handle; | ContextHandle _handle; | ||||
| @@ -459,12 +468,13 @@ namespace lts | |||||
| class PostProcessor | class PostProcessor | ||||
| { | { | ||||
| private: | private: | ||||
| const Library::Impl& _impl; | |||||
| PostProcessorHandle _handle; | |||||
| PostProcessorHandle _handle; | |||||
| PostProcessor(const PostProcessor&) = delete; | PostProcessor(const PostProcessor&) = delete; | ||||
| protected: | 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: | public: | ||||
| PostProcessorHandle getHandle() const; | PostProcessorHandle getHandle() const; | ||||
| @@ -479,7 +489,6 @@ namespace lts | |||||
| class PostProcessorFillColor final : public PostProcessor | class PostProcessorFillColor final : public PostProcessor | ||||
| { | { | ||||
| private: | private: | ||||
| const Library::Impl& _impl; | |||||
| Color4f _color; | Color4f _color; | ||||
| ImageModes _modes; | ImageModes _modes; | ||||
| ColorChannels _channels; | ColorChannels _channels; | ||||
| @@ -488,7 +497,11 @@ namespace lts | |||||
| const ImageModes& getModes() const; | const ImageModes& getModes() const; | ||||
| const ColorChannels& getChannels() 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 ****************************************************************************************************/ | /* post processor fill pattern ****************************************************************************************************/ | ||||
| @@ -496,22 +509,21 @@ namespace lts | |||||
| { | { | ||||
| private: | private: | ||||
| const Image& _pattern; | const Image& _pattern; | ||||
| bool _ownsPattern; | |||||
| Position _position; | Position _position; | ||||
| ImageModes _modes; | ImageModes _modes; | ||||
| ColorChannels _channels; | ColorChannels _channels; | ||||
| protected: | |||||
| const Library::Impl& _impl; | |||||
| public: | public: | ||||
| const Image& getPattern() const; | const Image& getPattern() const; | ||||
| bool getOwnsPattern() const; | |||||
| const Position& getPosition() const; | const Position& getPosition() const; | ||||
| const ImageModes& getModes() const; | const ImageModes& getModes() const; | ||||
| const ColorChannels& getChannels() 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 **********************************************************************************************************/ | /* post processor border **********************************************************************************************************/ | ||||
| @@ -537,22 +549,26 @@ namespace lts | |||||
| private: | private: | ||||
| float _radius; | float _radius; | ||||
| float _strength; | float _strength; | ||||
| Position _position; | |||||
| Position _offset; | |||||
| Color4f _color; | Color4f _color; | ||||
| public: | public: | ||||
| float getRadius() const; | float getRadius() const; | ||||
| float getStrength() const; | float getStrength() const; | ||||
| Position getPosition() const; | |||||
| Position getOffset() const; | |||||
| Color4f getColor() const; | Color4f getColor() const; | ||||
| PostProcessorShadow(const Context& context, float radius, float strength, const Position& offset, const Color4f& color); | PostProcessorShadow(const Context& context, float radius, float strength, const Position& offset, const Color4f& color); | ||||
| }; | }; | ||||
| /* post processor custom **********************************************************************************************************/ | /* post processor custom **********************************************************************************************************/ | ||||
| class PostProcessorCustom | |||||
| class PostProcessorCustom : public PostProcessor | |||||
| { | { | ||||
| protected: | 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 ************************************************************************************************************/ | /* post processor list ************************************************************************************************************/ | ||||
| @@ -561,7 +577,7 @@ namespace lts | |||||
| public std::list<T> | public std::list<T> | ||||
| { | { | ||||
| protected: | protected: | ||||
| virtual void execute(Char c, Image i); | |||||
| virtual void execute(Char& c, Image& i); | |||||
| public: | public: | ||||
| PostProcessorList(const Context& context); | PostProcessorList(const Context& context); | ||||
| }; | }; | ||||
| @@ -599,7 +615,7 @@ namespace lts | |||||
| void setCharSpacing(int value); | void setCharSpacing(int value); | ||||
| void setLineSpacing(int value); | void setLineSpacing(int value); | ||||
| Font(FontHandle handle); | |||||
| Font(Library::Impl& impl, FontHandle handle); | |||||
| virtual ~Font(); | virtual ~Font(); | ||||
| }; | }; | ||||
| typedef std::unique_ptr<Font> FontPtrU; | typedef std::unique_ptr<Font> FontPtrU; | ||||
| @@ -795,7 +811,7 @@ public: /* stream */ | |||||
| public: /* custom post processor */ | public: /* custom post processor */ | ||||
| struct PostProcessorData | 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; | void* args; | ||||
| post_processor_execute_t execute; | 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_fontname_t) (lts::FontHandle handle); | ||||
| typedef const char* (WINAPI *font_get_facename_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_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 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_post_processor_t) (lts::FontHandle handle, lts::PostProcessorHandle pp); | ||||
| typedef lts::ErrorCode (WINAPI *font_set_tab_width_t) (lts::FontHandle handle, int value); | 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_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_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::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::PostProcessorHandle(WINAPI *post_processor_custom_create_t) (lts::PostProcessorHandle handle, const PostProcessorData& data); | ||||
| typedef lts::ErrorCode (WINAPI *post_processor_destroy_t) (lts::PostProcessorHandle handle); | 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_fontname_t font_get_fontname; | ||||
| font_get_facename_t font_get_facename; | font_get_facename_t font_get_facename; | ||||
| font_get_stylename_t font_get_stylename; | 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_get_copyright_t font_get_copyright; | ||||
| font_set_post_processor_t font_set_post_processor; | font_set_post_processor_t font_set_post_processor; | ||||
| font_set_tab_width_t font_set_tab_width; | font_set_tab_width_t font_set_tab_width; | ||||
| @@ -1088,7 +1104,7 @@ public: | |||||
| font_get_fontname (NULL), | font_get_fontname (NULL), | ||||
| font_get_facename (NULL), | font_get_facename (NULL), | ||||
| font_get_stylename (NULL), | font_get_stylename (NULL), | ||||
| font_get_fillname (NULL), | |||||
| font_get_fullname (NULL), | |||||
| font_get_copyright (NULL), | font_get_copyright (NULL), | ||||
| font_set_post_processor (NULL), | font_set_post_processor (NULL), | ||||
| font_set_tab_width (NULL), | font_set_tab_width (NULL), | ||||
| @@ -1190,7 +1206,7 @@ public: | |||||
| loadProc(font_get_fontname, "ltsFontGetFontname"); | loadProc(font_get_fontname, "ltsFontGetFontname"); | ||||
| loadProc(font_get_facename, "ltsFontGetFacename"); | loadProc(font_get_facename, "ltsFontGetFacename"); | ||||
| loadProc(font_get_stylename, "ltsFontGetStylename"); | loadProc(font_get_stylename, "ltsFontGetStylename"); | ||||
| loadProc(font_get_fillname, "ltsFontGetFullname"); | |||||
| loadProc(font_get_fullname, "ltsFontGetFullname"); | |||||
| loadProc(font_get_copyright, "ltsFontGetCopyright"); | loadProc(font_get_copyright, "ltsFontGetCopyright"); | ||||
| loadProc(font_set_post_processor, "ltsFontSetPostProcessor"); | loadProc(font_set_post_processor, "ltsFontSetPostProcessor"); | ||||
| loadProc(font_set_tab_width, "ltsFontSetTabWidth"); | loadProc(font_set_tab_width, "ltsFontSetTabWidth"); | ||||
| @@ -1294,6 +1310,15 @@ namespace lts | |||||
| return value; | 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> | template <typename T> | ||||
| void setFunc(const Library::Impl& impl, Handle handle, ErrorCode (WINAPI * const callback)(Handle, T), const T& value) | 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); | 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 ******************************************************************************************************************* | /* font creator ******************************************************************************************************************* | ||||
| class FontCreator | class FontCreator | ||||