From f5d53918840c54b12bba553c19b0dc886ae11baa Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sat, 21 Nov 2015 16:34:58 +0100 Subject: [PATCH] [DEV] set Opacity working corectly and corect old bug of opacity --- esvg/Base.cpp | 42 +++++++++++++++++++++++++++++++++--------- esvg/Base.h | 4 ++++ esvg/Path.cpp | 3 ++- esvg/Rectangle.cpp | 3 ++- esvg/Renderer.cpp | 9 +++++---- esvg/Renderer.h | 3 ++- esvg/esvg.cpp | 17 +---------------- test/testRectangle.cpp | 9 +++++++++ 8 files changed, 58 insertions(+), 32 deletions(-) diff --git a/esvg/Base.cpp b/esvg/Base.cpp index 3693c50..7c7bfdf 100644 --- a/esvg/Base.cpp +++ b/esvg/Base.cpp @@ -12,9 +12,37 @@ #include +#undef __class__ +#define __class__ "PaintState" + +esvg::PaintState::PaintState() : + fill(etk::color::none), + stroke(etk::color::none), + strokeWidth(1.0f), + flagEvenOdd(false), + lineCap(esvg::cap_butt), + lineJoin(esvg::join_miter), + viewPort(255,255), + opacity(1.0) { + +} + +void esvg::PaintState::clear() { + fill = etk::color::none; + stroke = etk::color::none; + strokeWidth = 1.0; + viewPort.setValue(255,255); + flagEvenOdd = false; + lineJoin = esvg::join_miter; + lineCap = esvg::cap_butt; + opacity = 1.0; +} + + #undef __class__ #define __class__ "Base" + esvg::Base::Base(PaintState _parentPaintState) { // copy the parent painting properties ... m_paint = _parentPaintState; @@ -220,10 +248,8 @@ void esvg::Base::parsePaintAttr(const std::shared_ptr& _ele } content = _element->getAttribute("opacity"); if (content.size()!=0) { - float opacity = parseLength(content); - opacity = std::avg(0.0f, opacity, 1.0f); - m_paint.fill.setA(opacity*0xFF); - m_paint.stroke.setA(opacity*0xFF); + m_paint.opacity = parseLength(content); + m_paint.opacity = std::avg(0.0f, m_paint.opacity, 1.0f); } content = _element->getAttribute("fill-opacity"); if (content.size()!=0) { @@ -298,11 +324,9 @@ void esvg::Base::parsePaintAttr(const std::shared_ptr& _ele m_paint.strokeWidth = parseLength(outputValue); SVG_VERBOSE(" input : \"" << outputValue << "\" == > " << m_paint.strokeWidth); } else if (outputType == "opacity" ) { - float opacity = parseLength(outputValue); - opacity = std::avg(0.0f, opacity, 1.0f); - m_paint.fill.setA(opacity*0xFF); - m_paint.stroke.setA(opacity*0xFF); - SVG_VERBOSE(" input : \"" << outputValue << "\" == > " << m_paint.fill); + m_paint.opacity = parseLength(content); + m_paint.opacity = std::avg(0.0f, m_paint.opacity, 1.0f); + SVG_VERBOSE(" input : \"" << outputValue << "\" == > " << m_paint.opacity); } else if (outputType == "fill-opacity") { float opacity = parseLength(outputValue); opacity = std::avg(0.0f, opacity, 1.0f); diff --git a/esvg/Base.h b/esvg/Base.h index 15cd5d0..02c3c8c 100644 --- a/esvg/Base.h +++ b/esvg/Base.h @@ -50,6 +50,9 @@ namespace esvg { }; class PaintState { + public: + PaintState(); + void clear(); public: etk::Color fill; etk::Color stroke; @@ -58,6 +61,7 @@ namespace esvg { enum esvg::cap lineCap; enum esvg::join lineJoin; vec2 viewPort; + float opacity; }; class Base { diff --git a/esvg/Path.cpp b/esvg/Path.cpp index 91498a6..56ad16a 100644 --- a/esvg/Path.cpp +++ b/esvg/Path.cpp @@ -285,7 +285,8 @@ void esvg::Path::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32_t _l _myRenderer.print(tmpFill, m_paint.fill, tmpStroke, - m_paint.stroke); + m_paint.stroke, + m_paint.opacity); #ifdef DEBUG _myRenderer.addDebugSegment(listSegmentFill); _myRenderer.addDebugSegment(listSegmentStroke); diff --git a/esvg/Rectangle.cpp b/esvg/Rectangle.cpp index e584314..fe21317 100644 --- a/esvg/Rectangle.cpp +++ b/esvg/Rectangle.cpp @@ -101,7 +101,8 @@ void esvg::Rectangle::draw(esvg::Renderer& _myRenderer, mat2& _basicTrans, int32 _myRenderer.print(tmpFill, m_paint.fill, tmpStroke, - m_paint.stroke); + m_paint.stroke, + m_paint.opacity); #ifdef DEBUG _myRenderer.addDebugSegment(listSegmentFill); _myRenderer.addDebugSegment(listSegmentStroke); diff --git a/esvg/Renderer.cpp b/esvg/Renderer.cpp index 285ae7b..ee7bba2 100644 --- a/esvg/Renderer.cpp +++ b/esvg/Renderer.cpp @@ -53,7 +53,8 @@ etk::Color esvg::Renderer::mergeColor(etk::Color _base, const void esvg::Renderer::print(const esvg::render::Weight& _weightFill, const etk::Color& _colorFill, const esvg::render::Weight& _weightStroke, - const etk::Color& _colorStroke) { + const etk::Color& _colorStroke, + float _opacity) { int32_t sizeX = m_size.x(); int32_t sizeY = m_size.y(); #if DEBUG @@ -73,7 +74,7 @@ void esvg::Renderer::print(const esvg::render::Weight& _weightFill, float valueStroke = _weightStroke.get(pos); if (valueStroke != 0.0f) { // set a ratio of the merging value - etk::Color tmpColor = _colorStroke * valueStroke; + etk::Color tmpColor = _colorStroke * valueStroke * _opacity; // integrate the value at the previous color m_buffer[sizeX*yyy + xxx] = mergeColor(m_buffer[sizeX*yyy + xxx], tmpColor); } @@ -93,7 +94,7 @@ void esvg::Renderer::print(const esvg::render::Weight& _weightFill, float valueFill = _weightFill.get(pos); if (valueFill != 0.0f) { // set a ratio of the merging value - etk::Color tmpColor = _colorFill * valueFill; + etk::Color tmpColor = _colorFill * valueFill * _opacity; // integrate the value at the previous color m_buffer[sizeX*yyy + xxx] = mergeColor(m_buffer[sizeX*yyy + xxx], tmpColor); } @@ -113,7 +114,7 @@ void esvg::Renderer::print(const esvg::render::Weight& _weightFill, // calculate merge of stroke and fill value: etk::Color intermediateColorFill = _colorFill*valueFill; etk::Color intermediateColorStroke = _colorStroke*valueStroke; - etk::Color intermediateColor = mergeColor(intermediateColorFill, intermediateColorStroke); + etk::Color intermediateColor = mergeColor(intermediateColorFill, intermediateColorStroke) * _opacity; m_buffer[sizeX*yyy + xxx] = mergeColor(m_buffer[sizeX*yyy + xxx], intermediateColor); } } diff --git a/esvg/Renderer.h b/esvg/Renderer.h index 761d8f2..84aabe2 100644 --- a/esvg/Renderer.h +++ b/esvg/Renderer.h @@ -57,7 +57,8 @@ namespace esvg { void print(const esvg::render::Weight& _weightFill, const etk::Color& _colorFill, const esvg::render::Weight& _weightStroke, - const etk::Color& _colorStroke); + const etk::Color& _colorStroke, + float _opacity); #ifdef DEBUG void addDebugSegment(const esvg::render::SegmentList& _listSegment); #endif diff --git a/esvg/esvg.cpp b/esvg/esvg.cpp index 1a911e7..52c7cee 100644 --- a/esvg/esvg.cpp +++ b/esvg/esvg.cpp @@ -28,14 +28,6 @@ esvg::Document::Document() : m_fileName = ""; m_version = "0.0"; m_loadOK = false; - m_paint.fill = etk::color::none; - m_paint.stroke = etk::color::none; - - m_paint.strokeWidth = 1.0; - m_paint.viewPort.setValue(255,255); - m_paint.flagEvenOdd = false; - m_paint.lineJoin = esvg::join_miter; - m_paint.lineCap = esvg::cap_butt; m_size.setValue(0,0); } @@ -164,14 +156,7 @@ void esvg::Document::clear() { m_fileName = ""; m_version = "0.0"; m_loadOK = true; - m_paint.fill = etk::color::none; - m_paint.stroke = etk::color::none; - - m_paint.strokeWidth = 1.0; - m_paint.viewPort.setValue(255,255); - m_paint.flagEvenOdd = false; - m_paint.lineJoin = esvg::join_miter; - m_paint.lineCap = esvg::cap_butt; + m_paint.clear(); m_size.setValue(0,0); } diff --git a/test/testRectangle.cpp b/test/testRectangle.cpp index 9a5ffe6..35c7123 100644 --- a/test/testRectangle.cpp +++ b/test/testRectangle.cpp @@ -49,6 +49,15 @@ TEST(TestRectangle, fill_and_stroke_blend) { doc.generateAnImage(ivec2(100, 100), "TestRectangle_fill_and_stroke_blend.ppm", g_visualDebug); } +TEST(TestRectangle, fill_and_stroke_opacity) { + esvg::Document doc; + doc.parse( "" + "" + " " + ""); + doc.generateAnImage(ivec2(100, 100), "TestRectangle_fill_and_stroke_blend.ppm", g_visualDebug); +} + TEST(TestRectangle, corned_fill) { esvg::Document doc; doc.parse( ""