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 {};
};