1 /*
2 	Actiona
3 	Copyright (C) 2005 Jonathan Mercier-Ganady
4 
5 	Actiona is free software: you can redistribute it and/or modify
6 	it under the terms of the GNU General Public License as published by
7 	the Free Software Foundation, either version 3 of the License, or
8 	(at your option) any later version.
9 
10 	Actiona is distributed in the hope that it will be useful,
11 	but WITHOUT ANY WARRANTY; without even the implied warranty of
12 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 	GNU General Public License for more details.
14 
15 	You should have received a copy of the GNU General Public License
16 	along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18 	Contact : jmgr@jmgr.info
19 */
20 
21 #pragma once
22 
23 #include "actiontools_global.h"
24 #include "qtimagefilters/QtImageFilter"
25 #include "code/codeclass.h"
26 #include "matchingpointlist.h"
27 
28 #include <QObject>
29 #include <QScriptValue>
30 #include <QScriptEngine>
31 #include <QImage>
32 
33 namespace ActionTools
34 {
35 	class OpenCVAlgorithms;
36 }
37 
38 namespace Code
39 {
40 	class ACTIONTOOLSSHARED_EXPORT Image : public CodeClass
41 	{
42 		Q_OBJECT
43 		Q_ENUMS(Filter)
44 		Q_ENUMS(MirrorOrientation)
45         Q_ENUMS(AlgorithmMethod)
46 
47 	public:
48 		enum Filter
49 		{
50 			ConvolutionFilter,
51 			GaussianBlur,
52 			Defocus,
53 			Highlight,
54 			Sharpen,
55 			SharpenMore,
56 			SharpenEvenMore,
57 			EdgeDetect,
58 			BigEdge,
59 			Emboss,
60 			EmbossColor,
61 			Negative,
62 			RemoveChannel,
63 			Punch
64 		};
65 		enum MirrorOrientation
66 		{
67 			Vertical = 1,
68 			Horizontal = 2
69 		};
70         enum AlgorithmMethod
71         {
72             CorrelationCoefficient,
73             CrossCorrelation,
74             SquaredDifference
75         };
76 
77 		static QScriptValue constructor(QScriptContext *context, QScriptEngine *engine);
78 		static QScriptValue constructor(const QImage &image, QScriptEngine *engine);
79 
80 		static QScriptValue takeScreenshot(QScriptContext *context, QScriptEngine *engine);
81         static QScriptValue takeScreenshotUsingScreenIndex(QScriptContext *context, QScriptEngine *engine);
82 
83 		static void registerClass(QScriptEngine *scriptEngine);
84 
85 		Image();
86 		Image(const Image &other);
87 		Image(const QImage &image);
88 		Image(const QString &filename);
89 
90 		Image &operator=(Image other);
91 		Image &operator=(QImage image);
92 
93 		void swap(Image &other);
94 		void swap(QImage &image);
95 
96 		const QImage &image() const;
97 
additionalMemoryCost()98         int additionalMemoryCost() const override { return mImage.byteCount(); }
99 
100 	public slots:
101 		QScriptValue clone() const;
102 		bool equals(const QScriptValue &other) const override ;
103 		QString toString() const override ;
104 		QScriptValue setData(const QScriptValue &data);
105 		QScriptValue data(const QString &format = QStringLiteral("BMP")) const;
106 		QScriptValue loadFromFile(const QString &filename);
107 		QScriptValue saveToFile(const QString &filename) const;
108 		QScriptValue applyFilter(Filter filter, const QScriptValue &options = QScriptValue());
109 		QScriptValue pixel(int x, int y) const;
110 		QScriptValue setPixel(int x, int y, const QScriptValue &color);
111         QScriptValue pixels() const;
112         QScriptValue pixelData() const;
113 		QScriptValue mirror(MirrorOrientation mirrorOrientation);
114 		QScriptValue setSize();
115 		QScriptValue size() const;
116 		int width() const;
117 		int height() const;
118 		QScriptValue copy() const;
119 		QScriptValue findSubImage(const QScriptValue &otherImage, const QScriptValue &options = QScriptValue()) const;
120 		QScriptValue findSubImages(const QScriptValue &otherImage, const QScriptValue &options = QScriptValue()) const;
121 		QScriptValue findSubImageAsync(const QScriptValue &otherImage, const QScriptValue &callback, const QScriptValue &options = QScriptValue());
122 		QScriptValue findSubImagesAsync(const QScriptValue &otherImage, const QScriptValue &callback, const QScriptValue &options = QScriptValue());
123 
124 	private slots:
125 		void findSubImageAsyncFinished(const ActionTools::MatchingPointList &matchingPointList);
126 
127 	private:
128         void findSubImageOptions(const QScriptValue &options, int *confidenceMinimum, int *downPyramidCount, int *searchExpansion, AlgorithmMethod *method, int *maximumMatches = nullptr) const;
129 
130 		enum FilterOption
131 		{
132 			FilterChannels = QtImageFilter::FilterChannels,
133 			FilterBorderPolicy = QtImageFilter::FilterBorderPolicy,
134 			ConvolutionDivisor = QtImageFilter::ConvolutionDivisor,
135 			ConvolutionBias = QtImageFilter::ConvolutionBias,
136 			Radius = QtImageFilter::Radius,
137 			Force = QtImageFilter::Force,
138 			Center = QtImageFilter::Center
139 		};
140 
141 		static const QString filterNames[];
142 		static const QStringList filterOptionsNames;
143 
144 		QImage mImage;
145 		ActionTools::OpenCVAlgorithms *mOpenCVAlgorithms;
146 		QScriptValue mFindSubImageAsyncFunction;
147 		bool mFindSubImageSearchForOne{false};
148 	};
149 }
150 
151