From 3ebd82c71df0d5f8eebe1be36857e9cd96e481a6 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Tue, 1 Dec 2015 23:11:51 +0100 Subject: [PATCH] [DEBUG] try to corect color merge ... --- esvg/Base.cpp | 8 ++++---- esvg/Base.h | 4 ++-- esvg/Renderer.cpp | 33 ++++++++++++++++++++++++++------- test/testRectangle.cpp | 8 ++++---- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/esvg/Base.cpp b/esvg/Base.cpp index ca89c36..7b8073b 100644 --- a/esvg/Base.cpp +++ b/esvg/Base.cpp @@ -266,13 +266,13 @@ void esvg::Base::parsePaintAttr(const std::shared_ptr& _ele if (content.size()!=0) { float opacity = parseLength(content); opacity = std::avg(0.0f, opacity, 1.0f); - m_paint.fill.setA(opacity*0xFF); + m_paint.fill.setA(opacity); } content = _element->getAttribute("stroke-opacity"); if (content.size()!=0) { float opacity = parseLength(content); opacity = std::avg(0.0f, opacity, 1.0f); - m_paint.stroke.setA(opacity*0xFF); + m_paint.stroke.setA(opacity); } content = _element->getAttribute("fill-rule"); if (content.size()!=0) { @@ -346,12 +346,12 @@ void esvg::Base::parsePaintAttr(const std::shared_ptr& _ele } else if (outputType == "fill-opacity") { float opacity = parseLength(outputValue); opacity = std::avg(0.0f, opacity, 1.0f); - m_paint.fill.setA(opacity*0xFF); + m_paint.fill.setA(opacity); SVG_VERBOSE(" input : \"" << outputValue << "\" == > " << m_paint.fill); } else if (outputType == "stroke-opacity") { float opacity = parseLength(outputValue); opacity = std::avg(0.0f, opacity, 1.0f); - m_paint.stroke.setA(opacity*0xFF); + m_paint.stroke.setA(opacity); SVG_VERBOSE(" input : \"" << outputValue << "\" == > " << m_paint.stroke); } else if (outputType == "fill-rule" ) { if (outputValue == "nonzero" ) { diff --git a/esvg/Base.h b/esvg/Base.h index 69e7e5d..76dbc3e 100644 --- a/esvg/Base.h +++ b/esvg/Base.h @@ -47,8 +47,8 @@ namespace esvg { PaintState(); void clear(); public: - etk::Color fill; - etk::Color stroke; + etk::Color fill; + etk::Color stroke; float strokeWidth; bool flagEvenOdd; //!< Fill rules enum esvg::cap lineCap; diff --git a/esvg/Renderer.cpp b/esvg/Renderer.cpp index a7be894..a5c4d61 100644 --- a/esvg/Renderer.cpp +++ b/esvg/Renderer.cpp @@ -36,11 +36,14 @@ esvg::Renderer::~Renderer() { m_buffer.clear(); m_size = ivec2(0,0); } - +#if 0 etk::Color esvg::Renderer::mergeColor(etk::Color _base, const etk::Color& _integration) { if (_integration.a() == 0.0f) { return _base; } + if (_base.a() == 0.0f) { + return _integration; + } etk::Color tmpColor(_integration.r()*_integration.a(), _integration.g()*_integration.a(), _integration.b()*_integration.a(), @@ -52,7 +55,18 @@ etk::Color esvg::Renderer::mergeColor(etk::Color _base, const _base.setA(tmpA); return _base; } - +#else +etk::Color esvg::Renderer::mergeColor(etk::Color _base, const etk::Color& _integration) { + etk::Color result; + float a1 = _base.a(); + float a2 = _integration.a(); + result.setR(a1 * _base.r() + a2 * (1.0f - a1) * _integration.r()); + result.setG(a1 * _base.g() + a2 * (1.0f - a1) * _integration.g()); + result.setB(a1 * _base.b() + a2 * (1.0f - a1) * _integration.b()); + result.setA(a1 + a2 * (1.0f - a1)); + return result; +} +#endif void esvg::Renderer::print(const esvg::render::Weight& _weightFill, const etk::Color& _colorFill, const esvg::render::Weight& _weightStroke, @@ -77,7 +91,8 @@ 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 * _opacity; + etk::Color tmpColor = _colorStroke * valueStroke; + tmpColor.setA(tmpColor.a() * _opacity); // integrate the value at the previous color m_buffer[sizeX*yyy + xxx] = mergeColor(m_buffer[sizeX*yyy + xxx], tmpColor); } @@ -97,7 +112,8 @@ 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 * _opacity; + etk::Color tmpColor = _colorFill * valueFill; + tmpColor.setA(tmpColor.a() * _opacity); // integrate the value at the previous color m_buffer[sizeX*yyy + xxx] = mergeColor(m_buffer[sizeX*yyy + xxx], tmpColor); } @@ -115,9 +131,12 @@ void esvg::Renderer::print(const esvg::render::Weight& _weightFill, float valueFill = _weightFill.get(pos); float valueStroke = _weightStroke.get(pos); // calculate merge of stroke and fill value: - etk::Color intermediateColorFill = _colorFill*valueFill; - etk::Color intermediateColorStroke = _colorStroke*valueStroke; - etk::Color intermediateColor = mergeColor(intermediateColorFill, intermediateColorStroke) * _opacity; + etk::Color intermediateColorFill = _colorFill; + intermediateColorFill.setA(intermediateColorFill.a()*valueFill); + etk::Color intermediateColorStroke = _colorStroke; + intermediateColorStroke.setA(intermediateColorStroke.a()*valueStroke); + etk::Color intermediateColor = mergeColor(intermediateColorFill, intermediateColorStroke); + intermediateColor.setA(intermediateColor.a() * _opacity); m_buffer[sizeX*yyy + xxx] = mergeColor(m_buffer[sizeX*yyy + xxx], intermediateColor); } } diff --git a/test/testRectangle.cpp b/test/testRectangle.cpp index 3efc28f..ee9bfc1 100644 --- a/test/testRectangle.cpp +++ b/test/testRectangle.cpp @@ -49,7 +49,7 @@ TEST(TestRectangle, fill_and_stroke) { TEST(TestRectangle, fill_and_stroke_blend) { std::string data("" "" - " " + " " ""); esvg::Document doc; doc.parse(data); @@ -60,12 +60,12 @@ TEST(TestRectangle, fill_and_stroke_blend) { TEST(TestRectangle, fill_and_stroke_opacity) { std::string data("" "" - " " + " " ""); esvg::Document doc; doc.parse(data); - etk::FSNodeWriteAllData("TestRectangle_fill_and_stroke_blend.svg", data); - doc.generateAnImage(ivec2(100, 100), "TestRectangle_fill_and_stroke_blend.bmp", g_visualDebug); + etk::FSNodeWriteAllData("TestRectangle_fill_and_stroke_opacity.svg", data); + doc.generateAnImage(ivec2(100, 100), "TestRectangle_fill_and_stroke_opacity.bmp", g_visualDebug); } TEST(TestRectangle, corned_fill) {