Changeset View
Changeset View
Standalone View
Standalone View
libs/image/kis_curve_circle_mask_generator.cpp
Context not available. | |||||
17 | */ | 17 | */ | ||
---|---|---|---|---|---|
18 | 18 | | |||
19 | #include <compositeops/KoVcMultiArchBuildSupport.h> //MSVC requires that Vc come first | 19 | #include <compositeops/KoVcMultiArchBuildSupport.h> //MSVC requires that Vc come first | ||
20 | | ||||
21 | #include <cmath> | 20 | #include <cmath> | ||
22 | 21 | | |||
22 | #include <config-vc.h> | ||||
23 | #ifdef HAVE_VC | ||||
24 | #if defined(__clang__) | ||||
25 | #pragma GCC diagnostic ignored "-Wundef" | ||||
26 | #pragma GCC diagnostic ignored "-Wlocal-type-template-args" | ||||
27 | #endif | ||||
28 | #if defined _MSC_VER | ||||
29 | // Lets shut up the "possible loss of data" and "forcing value to bool 'true' or 'false' | ||||
30 | #pragma warning ( push ) | ||||
31 | #pragma warning ( disable : 4244 ) | ||||
32 | #pragma warning ( disable : 4800 ) | ||||
33 | #endif | ||||
34 | #include <Vc/Vc> | ||||
35 | #include <Vc/IO> | ||||
36 | #if defined _MSC_VER | ||||
37 | #pragma warning ( pop ) | ||||
38 | #endif | ||||
39 | #endif | ||||
40 | | ||||
23 | #include <QDomDocument> | 41 | #include <QDomDocument> | ||
24 | #include <QVector> | 42 | #include <QVector> | ||
25 | #include <QPointF> | 43 | #include <QPointF> | ||
Context not available. | |||||
29 | #include "kis_fast_math.h" | 47 | #include "kis_fast_math.h" | ||
30 | 48 | | |||
31 | #include "kis_base_mask_generator.h" | 49 | #include "kis_base_mask_generator.h" | ||
32 | #include "kis_curve_circle_mask_generator.h" | | |||
33 | #include "kis_cubic_curve.h" | | |||
34 | #include "kis_antialiasing_fade_maker.h" | 50 | #include "kis_antialiasing_fade_maker.h" | ||
51 | #include "kis_brush_mask_applicator_factories.h" | ||||
35 | 52 | | |||
53 | #include "kis_curve_circle_mask_generator.h" | ||||
54 | #include "kis_curve_circle_mask_generator_p.h" | ||||
55 | #include "kis_cubic_curve.h" | ||||
36 | 56 | | |||
37 | struct Q_DECL_HIDDEN KisCurveCircleMaskGenerator::Private | | |||
38 | { | | |||
39 | Private(bool enableAntialiasing) | | |||
40 | : fadeMaker(*this, enableAntialiasing) | | |||
41 | { | | |||
42 | } | | |||
43 | | ||||
44 | Private(const Private &rhs) | | |||
45 | : xcoef(rhs.xcoef), | | |||
46 | ycoef(rhs.ycoef), | | |||
47 | curveResolution(rhs.curveResolution), | | |||
48 | curveData(rhs.curveData), | | |||
49 | curvePoints(rhs.curvePoints), | | |||
50 | dirty(true), | | |||
51 | fadeMaker(rhs.fadeMaker,*this) | | |||
52 | { | | |||
53 | } | | |||
54 | | ||||
55 | qreal xcoef, ycoef; | | |||
56 | qreal curveResolution; | | |||
57 | QVector<qreal> curveData; | | |||
58 | QList<QPointF> curvePoints; | | |||
59 | bool dirty; | | |||
60 | | ||||
61 | KisAntialiasingFadeMaker1D<Private> fadeMaker; | | |||
62 | inline quint8 value(qreal dist) const; | | |||
63 | }; | | |||
64 | 57 | | |||
65 | KisCurveCircleMaskGenerator::KisCurveCircleMaskGenerator(qreal diameter, qreal ratio, qreal fh, qreal fv, int spikes, const KisCubicCurve &curve, bool antialiasEdges) | 58 | KisCurveCircleMaskGenerator::KisCurveCircleMaskGenerator(qreal diameter, qreal ratio, qreal fh, qreal fv, int spikes, const KisCubicCurve &curve, bool antialiasEdges) | ||
66 | : KisMaskGenerator(diameter, ratio, fh, fv, spikes, antialiasEdges, CIRCLE, SoftId), d(new Private(antialiasEdges)) | 59 | : KisMaskGenerator(diameter, ratio, fh, fv, spikes, antialiasEdges, CIRCLE, SoftId), d(new Private(antialiasEdges)) | ||
Context not available. | |||||
73 | d->dirty = false; | 66 | d->dirty = false; | ||
74 | 67 | | |||
75 | setScale(1.0, 1.0); | 68 | setScale(1.0, 1.0); | ||
69 | | ||||
70 | d->applicator.reset(createOptimizedClass<MaskApplicatorFactory<KisCurveCircleMaskGenerator, KisBrushMaskVectorApplicator> >(this)); | ||||
76 | } | 71 | } | ||
77 | 72 | | |||
78 | KisCurveCircleMaskGenerator::KisCurveCircleMaskGenerator(const KisCurveCircleMaskGenerator &rhs) | 73 | KisCurveCircleMaskGenerator::KisCurveCircleMaskGenerator(const KisCurveCircleMaskGenerator &rhs) | ||
79 | : KisMaskGenerator(rhs), | 74 | : KisMaskGenerator(rhs), | ||
80 | d(new Private(*rhs.d)) | 75 | d(new Private(*rhs.d)) | ||
81 | { | 76 | { | ||
77 | d->applicator.reset(createOptimizedClass<MaskApplicatorFactory<KisCurveCircleMaskGenerator, KisBrushMaskVectorApplicator> >(this)); | ||||
82 | } | 78 | } | ||
83 | 79 | | |||
84 | KisCurveCircleMaskGenerator::~KisCurveCircleMaskGenerator() | 80 | KisCurveCircleMaskGenerator::~KisCurveCircleMaskGenerator() | ||
Context not available. | |||||
108 | return effectiveSrcWidth() < 10 || effectiveSrcHeight() < 10; | 104 | return effectiveSrcWidth() < 10 || effectiveSrcHeight() < 10; | ||
109 | } | 105 | } | ||
110 | 106 | | |||
107 | bool KisCurveCircleMaskGenerator::shouldVectorize() const | ||||
108 | { | ||||
109 | return !shouldSupersample() && spikes() == 2; | ||||
110 | } | ||||
111 | | ||||
112 | KisBrushMaskApplicatorBase* KisCurveCircleMaskGenerator::applicator() | ||||
113 | { | ||||
114 | return d->applicator.data(); | ||||
115 | } | ||||
116 | | ||||
111 | inline quint8 KisCurveCircleMaskGenerator::Private::value(qreal dist) const | 117 | inline quint8 KisCurveCircleMaskGenerator::Private::value(qreal dist) const | ||
112 | { | 118 | { | ||
113 | qreal distance = dist * curveResolution; | 119 | qreal distance = dist * curveResolution; | ||
Context not available. | |||||
118 | qreal alpha = ( | 124 | qreal alpha = ( | ||
119 | (1.0 - alphaValueF) * curveData.at(alphaValue) + | 125 | (1.0 - alphaValueF) * curveData.at(alphaValue) + | ||
120 | alphaValueF * curveData.at(alphaValue+1)); | 126 | alphaValueF * curveData.at(alphaValue+1)); | ||
127 | | ||||
121 | return (1.0 - alpha) * 255; | 128 | return (1.0 - alpha) * 255; | ||
122 | } | 129 | } | ||
123 | 130 | | |||
Context not available. | |||||
178 | KisCubicCurve curve(newList); | 185 | KisCubicCurve curve(newList); | ||
179 | result = curve.floatTransfer( curveResolution ); | 186 | result = curve.floatTransfer( curveResolution ); | ||
180 | } | 187 | } | ||
188 | | ||||
189 | void KisCurveCircleMaskGenerator::resetMaskApplicator(bool forceScalar) | ||||
190 | { | ||||
191 | d->applicator.reset(createOptimizedClass<MaskApplicatorFactory<KisCurveCircleMaskGenerator, KisBrushMaskVectorApplicator> >(this,forceScalar)); | ||||
192 | } | ||||
Context not available. |