diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj index 948b53b..c403fad 100644 --- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj +++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj @@ -202,6 +202,7 @@ + diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters index c738e52..e198184 100644 --- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters +++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters @@ -71,6 +71,18 @@ {b9732a33-aa2e-4f8d-886f-1b1730c66519} + + {8d846557-8fd5-47d5-8edf-eb3eb77c226b} + + + {22d7f3ef-8185-476e-8fe1-aea24c4faacc} + + + {6fc32493-d5a2-44c3-a283-d2d3181330fb} + + + {e6de889e-8313-4846-8bdf-125b766eef59} + @@ -141,18 +153,6 @@ Source Files\Renderer\Painting - - Source Files\Editor - - - Source Files\Editor - - - Source Files\Editor - - - Source Files\Editor - Source Files\Editor @@ -201,12 +201,6 @@ Source Files\Editor - - Source Files - - - Source Files\Editor - Source Files @@ -225,20 +219,41 @@ Source Files\Editor - - Source Files\Editor - - - Source Files\Editor - Source Files\Editor Source Files\Editor + + Source Files\Editor + - Source Files + Source Files\Editor + + + Source Files\Editor\Style + + + Source Files\Editor\Element + + + Source Files\Editor\Element + + + Source Files\Editor\Element + + + Source Files\Editor\Layer + + + Source Files\Editor\Layer + + + Source Files\Editor\Layer + + + Source Files\Editor\Layer Source Files @@ -257,9 +272,6 @@ Header Files\Editor - - Header Files\Editor - Header Files @@ -272,15 +284,9 @@ Header Files\Editor - - Header Files\Editor - Header Files\Editor - - Header Files\Editor - Header Files\Editor @@ -291,7 +297,19 @@ Header Files\Editor - Header Files + Header Files\Editor + + + Header Files\Editor\Style + + + Header Files\Editor\Element + + + Header Files\Editor\Layer + + + Header Files\Editor\Layer Header Files @@ -426,15 +444,6 @@ Header Files\Renderer\Painting - - Header Files\Editor - - - Header Files\Editor - - - Header Files\Editor - Header Files\Renderer\Painting @@ -474,9 +483,6 @@ Header Files\Renderer\Preview - - Header Files - Header Files\Renderer @@ -498,6 +504,21 @@ Header Files\Editor\util + + Header Files\Editor\Element + + + Header Files\Editor\Element + + + Header Files\Editor\Layer + + + Header Files\Editor + + + Header Files\Editor\Layer + diff --git a/ArchitectureColoredPainting/res/Shaders/element.comp b/ArchitectureColoredPainting/res/Shaders/element.comp index b44b514..fd09af8 100644 --- a/ArchitectureColoredPainting/res/Shaders/element.comp +++ b/ArchitectureColoredPainting/res/Shaders/element.comp @@ -1071,15 +1071,15 @@ void main() if (num_its % 2 == 1) { hitElement = true; - elementColor = vec4(1, 1, 0, 0); vec4 head = unpackUnorm4x8(floatBitsToUint(style[styleIndex])); if (head.z == 0) { - elementColor = vec4(unpackUnorm4x8(floatBitsToUint(style[++styleIndex])).rgb, 1); + elementColor = vec4(unpackUnorm4x8(floatBitsToUint(style[styleIndex+1])).rgb, 1); } + } - + styleIndex += 2; } else // Stroke { diff --git a/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp b/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp index 5c0acb0..4cc2ef3 100644 --- a/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp +++ b/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp @@ -17,7 +17,10 @@ void SimpleElement::loadSvgFile(const QString& filePath) // TODO 样式问题 SvgFileLoader loader; loader.loadSvgFile(filePath, painterPath); - qDebug() << "load svg file success " << painterPath.elementCount(); + auto startPoint = static_cast(painterPath.elementAt(0)); + auto endPoint = static_cast(painterPath.elementAt(painterPath.elementCount() - 1)); + this->closed = startPoint == endPoint; + qDebug() << "load svg file success " << painterPath.elementCount() << (isClosed() ? "is" : "not") << "closed"; } SimpleElement::SimpleElement(QJsonObject jsonSource) : jsonSource(jsonSource) @@ -117,11 +120,21 @@ void SimpleElement::paint(QPainter* painter, QTransform transform, const LayerSt painter->restore(); } +bool SimpleElement::isClosed() const +{ + return closed; +} + void GroupElement::paint(QPainter* painter, QTransform transform, const LayerStyleContainer& styles) { sourceLayer->paint(painter, transform); } +bool GroupElement::isClosed() const +{ + return false; +} + QPixmap SimpleElement::getPreview(QSize size) { diff --git a/ArchitectureColoredPainting/src/Editor/GraphicElement.h b/ArchitectureColoredPainting/src/Editor/GraphicElement.h index d0500b2..377b9e5 100644 --- a/ArchitectureColoredPainting/src/Editor/GraphicElement.h +++ b/ArchitectureColoredPainting/src/Editor/GraphicElement.h @@ -28,11 +28,14 @@ public: virtual PixelPath getPaintObject() const = 0; virtual PixelPath getPaintObject(const LayerStyleContainer& styles) const = 0; virtual void paint(QPainter* painter, QTransform transform, const LayerStyleContainer& styles) = 0; + virtual bool isClosed() const = 0; virtual QPixmap getPreview(QSize size) = 0; }; class SimpleElement : public GraphicElement { +private: + bool closed; public: QJsonObject jsonSource; // TODO: 改为ComposedPainterPath @@ -48,6 +51,7 @@ public: PixelPath getPaintObject() const override; PixelPath getPaintObject(const LayerStyleContainer& styles) const override; void paint(QPainter* painter, QTransform transform, const LayerStyleContainer& styles) override; + bool isClosed() const override; QPixmap getPreview(QSize size) override; }; @@ -65,6 +69,7 @@ public: PixelPath getPaintObject(const LayerStyleContainer& styles) const override; void setSourceLayer(FolderLayerWrapper* sourceLayer); void paint(QPainter* painter, QTransform transform, const LayerStyleContainer& styles) override; + bool isClosed() const override; QPixmap getPreview(QSize size) override; void collectReachable(std::set& set) const; }; diff --git a/UnitTest/ElementRendererTest.cpp b/UnitTest/ElementRendererTest.cpp index ca1fbca..aba0474 100644 --- a/UnitTest/ElementRendererTest.cpp +++ b/UnitTest/ElementRendererTest.cpp @@ -3,7 +3,7 @@ #include #include "ElementRendererTest.h" #include "Renderer/Painting/ElementStyle.h" - +#include "Renderer/Painting/MaterialStyleFill.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; using namespace Renderer; @@ -12,13 +12,63 @@ namespace UnitTest { void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg); + TEST_CLASS(ElementRendererFillTest) + { + private: + char* argv[1]; + int argc; + QPainterPath path; + public: + ElementRendererFillTest() :argv{ (char*)"" }, argc(1) + { + QQuickSvgParser::parsePathDataFast("M100,100C-.5,100,0,100.5,0,0L40,.07C40,59.5,39.5,60,100,60Z", + path); + QTransform transform; + //transform.scale(10, 10); + path = transform.map(path); + } + + TEST_METHOD_INITIALIZE(initialize) + { + qInstallMessageHandler(messageHandler); + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); + } + TEST_METHOD(TestFillPlain) + { + QApplication a(argc, argv); + class Style : public Renderer::ElementStyle + { + virtual std::vector toBaseStyles() const override + { + + return { BaseStyle(std::make_shared(), + std::make_shared( + std::make_shared(Material(QColor(255,255,0))))) }; + } + } style; + TestGLWidget w(style, path); + w.show(); + a.exec(); + } + + }; + TEST_CLASS(ElementRendererStokeTypeTest) { private: char* argv[1]; int argc; + QPainterPath path; public: - ElementRendererStokeTypeTest() :argv{ (char*)"" }, argc(1) {} + ElementRendererStokeTypeTest() :argv{ (char*)"" }, argc(1) + { + QQuickSvgParser::parsePathDataFast("M292.82,107.78s0,0,0,0,0,3.59,0,7.62c0,3.85,0,5.78.06,6.43a19.94,19.94,0,0,0,2.87,7.58,15.85,15.85,0,0,0,6.61,6.23A14.75,14.75,0,0,0,310,137a11.69,11.69,0,0,0,7.59-2.92,11,11,0,0,0,3.2-6.84c.15-1.27.58-4.84-1.79-7.64a8.54,8.54,0,0,0-3.56-2.44c-1.32-.52-3.32-1.31-5.06-.33a5.41,5.41,0,0,0-2.14,3,3.48,3.48,0,0,0-.16,2.71c.78,1.86,3.36,2.14,3.47,2.15", path); + QTransform transform; + transform.scale(10, 10); + path = transform.map(path); + } TEST_METHOD_INITIALIZE(initialize) { @@ -44,7 +94,7 @@ namespace UnitTest std::make_shared(materialMap, false))) }; } } style; - TestGLWidget w(style); + TestGLWidget w(style, path); w.show(); a.exec(); } @@ -65,7 +115,7 @@ namespace UnitTest std::make_shared(materialMap, false))) }; } } style; - TestGLWidget w(style); + TestGLWidget w(style, path); w.show(); a.exec(); } @@ -86,7 +136,7 @@ namespace UnitTest std::make_shared(materialMap, false))) }; } } style; - TestGLWidget w(style); + TestGLWidget w(style, path); w.show(); a.exec(); } @@ -107,7 +157,7 @@ namespace UnitTest std::make_shared(materialMap, false))) }; } } style; - TestGLWidget w(style); + TestGLWidget w(style, path); w.show(); a.exec(); } @@ -128,7 +178,7 @@ namespace UnitTest std::make_shared(materialMap, false))) }; } } style; - TestGLWidget w(style); + TestGLWidget w(style, path); w.show(); a.exec(); } @@ -139,8 +189,15 @@ namespace UnitTest private: char* argv[1]; int argc; + QPainterPath path; public: - ElementRendererStokeMaterialTest() :argv{ (char*)"" }, argc(1) {} + ElementRendererStokeMaterialTest() :argv{ (char*)"" }, argc(1) + { + QQuickSvgParser::parsePathDataFast("M292.82,107.78s0,0,0,0,0,3.59,0,7.62c0,3.85,0,5.78.06,6.43a19.94,19.94,0,0,0,2.87,7.58,15.85,15.85,0,0,0,6.61,6.23A14.75,14.75,0,0,0,310,137a11.69,11.69,0,0,0,7.59-2.92,11,11,0,0,0,3.2-6.84c.15-1.27.58-4.84-1.79-7.64a8.54,8.54,0,0,0-3.56-2.44c-1.32-.52-3.32-1.31-5.06-.33a5.41,5.41,0,0,0-2.14,3,3.48,3.48,0,0,0-.16,2.71c.78,1.86,3.36,2.14,3.47,2.15", path); + QTransform transform; + transform.scale(10, 10); + path = transform.map(path); + } TEST_METHOD(TestStrokePlain) { QApplication a(argc, argv); @@ -153,7 +210,7 @@ namespace UnitTest std::make_shared(QColor(255,255,255),1,1))) }; } } style; - TestGLWidget w(style); + TestGLWidget w(style, path); w.show(); a.exec(); } @@ -174,7 +231,7 @@ namespace UnitTest std::make_shared(materialMap, false))) }; } } style; - TestGLWidget w(style); + TestGLWidget w(style, path); w.show(); a.exec(); } @@ -195,7 +252,7 @@ namespace UnitTest std::make_shared(materialMap, true))) }; } } style; - TestGLWidget w(style); + TestGLWidget w(style, path); w.show(); a.exec(); } diff --git a/UnitTest/ElementRendererTest.h b/UnitTest/ElementRendererTest.h index 9271821..d709bfe 100644 --- a/UnitTest/ElementRendererTest.h +++ b/UnitTest/ElementRendererTest.h @@ -16,29 +16,25 @@ namespace UnitTest private: Renderer::ElementRenderer& renderer; Renderer::ElementStyle& style; + QPainterPath& path; public: - TestGLWidget(Renderer::ElementStyle& style, QWidget* parent = nullptr) - : QOpenGLWidget(parent), renderer(*Renderer::ElementRenderer::instance()), style(style) {}; + TestGLWidget(Renderer::ElementStyle& style, QPainterPath& path, QWidget* parent = nullptr) + : QOpenGLWidget(parent), renderer(*Renderer::ElementRenderer::instance()), style(style), path(path) {}; void initializeGL() override { initializeOpenGLFunctions(); }; void paintGL() override { - glClearColor(219/255., 78/255., 32/255., 1.0); + glClearColor(219 / 255., 78 / 255., 32 / 255., 1.0); glClear(GL_COLOR_BUFFER_BIT); - QPainterPath path; - QQuickSvgParser::parsePathDataFast("M292.82,107.78s0,0,0,0,0,3.59,0,7.62c0,3.85,0,5.78.06,6.43a19.94,19.94,0,0,0,2.87,7.58,15.85,15.85,0,0,0,6.61,6.23A14.75,14.75,0,0,0,310,137a11.69,11.69,0,0,0,7.59-2.92,11,11,0,0,0,3.2-6.84c.15-1.27.58-4.84-1.79-7.64a8.54,8.54,0,0,0-3.56-2.44c-1.32-.52-3.32-1.31-5.06-.33a5.41,5.41,0,0,0-2.14,3,3.48,3.48,0,0,0-.16,2.71c.78,1.86,3.36,2.14,3.47,2.15", path); - path = PainterPathUtil::monotonization(path); - QTransform transform; - transform.scale(10, 10); - path = transform.map(path); + float pixelRatio = devicePixelRatioF(); auto [img, pos] = renderer.drawElement(path, style, pixelRatio); QPainter painter(this); painter.setRenderHint(QPainter::SmoothPixmapTransform); painter.setRenderHint(QPainter::HighQualityAntialiasing); - painter.drawImage(QRectF(QPointF(0, 0), img.size()/pixelRatio), img); + painter.drawImage(QRectF(QPointF(0, 0), img.size() / pixelRatio), img); }; void resizeGL(int w, int h) override {}; };