Changeset View
Changeset View
Standalone View
Standalone View
libs/image/kis_gauss_circle_mask_generator.cpp
Context not available. | |||||
20 | #include <compositeops/KoVcMultiArchBuildSupport.h> //MSVC requires that Vc come first | 20 | #include <compositeops/KoVcMultiArchBuildSupport.h> //MSVC requires that Vc come first | ||
---|---|---|---|---|---|
21 | #include <cmath> | 21 | #include <cmath> | ||
22 | 22 | | |||
23 | #include <config-vc.h> | ||||
24 | #ifdef HAVE_VC | ||||
25 | #if defined(__clang__) | ||||
26 | #pragma GCC diagnostic ignored "-Wundef" | ||||
27 | #pragma GCC diagnostic ignored "-Wlocal-type-template-args" | ||||
28 | #endif | ||||
29 | #if defined _MSC_VER | ||||
30 | // Lets shut up the "possible loss of data" and "forcing value to bool 'true' or 'false' | ||||
31 | #pragma warning ( push ) | ||||
32 | #pragma warning ( disable : 4244 ) | ||||
33 | #pragma warning ( disable : 4800 ) | ||||
34 | #endif | ||||
35 | #include <Vc/Vc> | ||||
36 | #include <Vc/IO> | ||||
37 | #if defined _MSC_VER | ||||
38 | #pragma warning ( pop ) | ||||
39 | #endif | ||||
40 | #endif | ||||
41 | | ||||
23 | #include <QDomDocument> | 42 | #include <QDomDocument> | ||
24 | #include <QVector> | 43 | #include <QVector> | ||
25 | #include <QPointF> | 44 | #include <QPointF> | ||
Context not available. | |||||
29 | #include "kis_fast_math.h" | 48 | #include "kis_fast_math.h" | ||
30 | 49 | | |||
31 | #include "kis_base_mask_generator.h" | 50 | #include "kis_base_mask_generator.h" | ||
32 | #include "kis_gauss_circle_mask_generator.h" | | |||
33 | #include "kis_antialiasing_fade_maker.h" | 51 | #include "kis_antialiasing_fade_maker.h" | ||
52 | #include "kis_brush_mask_applicator_factories.h" | ||||
53 | #include "kis_brush_mask_applicator_base.h" | ||||
54 | #include "kis_gauss_circle_mask_generator.h" | ||||
55 | #include "kis_gauss_circle_mask_generator_p.h" | ||||
34 | 56 | | |||
35 | #define M_SQRT_2 1.41421356237309504880 | 57 | #define M_SQRT_2 1.41421356237309504880 | ||
36 | 58 | | |||
Context not available. | |||||
41 | #endif | 63 | #endif | ||
42 | 64 | | |||
43 | 65 | | |||
44 | struct Q_DECL_HIDDEN KisGaussCircleMaskGenerator::Private | | |||
45 | { | | |||
46 | Private(bool enableAntialiasing) | | |||
47 | : fadeMaker(*this, enableAntialiasing) | | |||
48 | { | | |||
49 | } | | |||
50 | | ||||
51 | Private(const Private &rhs) | | |||
52 | : ycoef(rhs.ycoef), | | |||
53 | fade(rhs.fade), | | |||
54 | center(rhs.center), | | |||
55 | distfactor(rhs.distfactor), | | |||
56 | alphafactor(rhs.alphafactor), | | |||
57 | fadeMaker(rhs.fadeMaker, *this) | | |||
58 | { | | |||
59 | } | | |||
60 | | ||||
61 | qreal ycoef; | | |||
62 | qreal fade; | | |||
63 | qreal center, distfactor, alphafactor; | | |||
64 | KisAntialiasingFadeMaker1D<Private> fadeMaker; | | |||
65 | | ||||
66 | inline quint8 value(qreal dist) const; | | |||
67 | }; | | |||
68 | | ||||
69 | KisGaussCircleMaskGenerator::KisGaussCircleMaskGenerator(qreal diameter, qreal ratio, qreal fh, qreal fv, int spikes, bool antialiasEdges) | 66 | KisGaussCircleMaskGenerator::KisGaussCircleMaskGenerator(qreal diameter, qreal ratio, qreal fh, qreal fv, int spikes, bool antialiasEdges) | ||
70 | : KisMaskGenerator(diameter, ratio, fh, fv, spikes, antialiasEdges, CIRCLE, GaussId), | 67 | : KisMaskGenerator(diameter, ratio, fh, fv, spikes, antialiasEdges, CIRCLE, GaussId), | ||
71 | d(new Private(antialiasEdges)) | 68 | d(new Private(antialiasEdges)) | ||
72 | { | 69 | { | ||
73 | d->ycoef = 1.0 / ratio; | 70 | d->ycoef = 1.0 / ratio; | ||
74 | d->fade = 1.0 - (fh + fv) / 2.0; | 71 | d->fade = 1.0 - (fh + fv) / 2.0; | ||
72 | | ||||
75 | if (d->fade == 0.0) d->fade = 1e-6; | 73 | if (d->fade == 0.0) d->fade = 1e-6; | ||
76 | else if (d->fade == 1.0) d->fade = 1.0 - 1e-6; // would become undefined for fade == 0 or 1 | 74 | else if (d->fade == 1.0) d->fade = 1.0 - 1e-6; // would become undefined for fade == 0 or 1 | ||
75 | | ||||
77 | d->center = (2.5 * (6761.0*d->fade-10000.0))/(M_SQRT_2*6761.0*d->fade); | 76 | d->center = (2.5 * (6761.0*d->fade-10000.0))/(M_SQRT_2*6761.0*d->fade); | ||
78 | d->alphafactor = 255.0 / (2.0 * erf(d->center)); | 77 | d->alphafactor = 255.0 / (2.0 * erf(d->center)); | ||
78 | | ||||
79 | d->applicator.reset(createOptimizedClass<MaskApplicatorFactory<KisGaussCircleMaskGenerator, KisBrushMaskVectorApplicator> >(this)); | ||||
80 | | ||||
79 | } | 81 | } | ||
80 | 82 | | |||
81 | KisGaussCircleMaskGenerator::KisGaussCircleMaskGenerator(const KisGaussCircleMaskGenerator &rhs) | 83 | KisGaussCircleMaskGenerator::KisGaussCircleMaskGenerator(const KisGaussCircleMaskGenerator &rhs) | ||
82 | : KisMaskGenerator(rhs), | 84 | : KisMaskGenerator(rhs), | ||
83 | d(new Private(*rhs.d)) | 85 | d(new Private(*rhs.d)) | ||
84 | { | 86 | { | ||
87 | d->applicator.reset(createOptimizedClass<MaskApplicatorFactory<KisGaussCircleMaskGenerator, KisBrushMaskVectorApplicator> >(this)); | ||||
85 | } | 88 | } | ||
86 | 89 | | |||
87 | KisMaskGenerator* KisGaussCircleMaskGenerator::clone() const | 90 | KisMaskGenerator* KisGaussCircleMaskGenerator::clone() const | ||
Context not available. | |||||
109 | return (quint8) 255 - ret; | 112 | return (quint8) 255 - ret; | ||
110 | } | 113 | } | ||
111 | 114 | | |||
115 | bool KisGaussCircleMaskGenerator::shouldVectorize() const | ||||
116 | { | ||||
117 | return !shouldSupersample() && spikes() == 2; | ||||
118 | } | ||||
119 | | ||||
120 | KisBrushMaskApplicatorBase* KisGaussCircleMaskGenerator::applicator() | ||||
121 | { | ||||
122 | return d->applicator.data(); | ||||
123 | } | ||||
124 | | ||||
112 | quint8 KisGaussCircleMaskGenerator::valueAt(qreal x, qreal y) const | 125 | quint8 KisGaussCircleMaskGenerator::valueAt(qreal x, qreal y) const | ||
113 | { | 126 | { | ||
114 | if (isEmpty()) return 255; | 127 | if (isEmpty()) return 255; | ||
Context not available. | |||||
125 | 138 | | |||
126 | return d->value(dist); | 139 | return d->value(dist); | ||
127 | } | 140 | } | ||
141 | | ||||
142 | void KisGaussCircleMaskGenerator::resetMaskApplicator(bool forceScalar) | ||||
143 | { | ||||
144 | d->applicator.reset(createOptimizedClass<MaskApplicatorFactory<KisGaussCircleMaskGenerator, KisBrushMaskVectorApplicator> >(this,forceScalar)); | ||||
145 | } | ||||
Context not available. |