Changeset View
Changeset View
Standalone View
Standalone View
libs/image/kis_rect_mask_generator.cpp
1 | /* | 1 | /* | ||
---|---|---|---|---|---|
2 | * Copyright (c) 2004,2007,2008,2009.2010 Cyrille Berger <cberger@cberger.net> | 2 | * Copyright (c) 2004,2007,2008,2009.2010 Cyrille Berger <cberger@cberger.net> | ||
3 | * Copyright (c) 2018 Ivan Santa Maria <ghevan@gmail.com> | ||||
3 | * | 4 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by | ||
Context not available. | |||||
19 | #include <compositeops/KoVcMultiArchBuildSupport.h> //MSVC requires that Vc come first | 20 | #include <compositeops/KoVcMultiArchBuildSupport.h> //MSVC requires that Vc come first | ||
20 | #include <cmath> | 21 | #include <cmath> | ||
21 | 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 | | ||||
42 | | ||||
22 | #include <QDomDocument> | 43 | #include <QDomDocument> | ||
23 | 44 | | |||
24 | #include "kis_fast_math.h" | 45 | #include "kis_fast_math.h" | ||
25 | | ||||
26 | #include "kis_rect_mask_generator.h" | 46 | #include "kis_rect_mask_generator.h" | ||
47 | #include "kis_rect_mask_generator_p.h" | ||||
27 | #include "kis_base_mask_generator.h" | 48 | #include "kis_base_mask_generator.h" | ||
28 | 49 | | |||
29 | #include <qnumeric.h> | 50 | #include "kis_brush_mask_applicator_factories.h" | ||
51 | #include "kis_brush_mask_applicator_base.h" | ||||
30 | 52 | | |||
31 | struct Q_DECL_HIDDEN KisRectangleMaskGenerator::Private { | 53 | #include <qnumeric.h> | ||
32 | double m_c; | | |||
33 | qreal xcoeff; | | |||
34 | qreal ycoeff; | | |||
35 | qreal xfadecoeff; | | |||
36 | qreal yfadecoeff; | | |||
37 | qreal transformedFadeX; | | |||
38 | qreal transformedFadeY; | | |||
39 | }; | | |||
40 | 54 | | |||
41 | KisRectangleMaskGenerator::KisRectangleMaskGenerator(qreal radius, qreal ratio, qreal fh, qreal fv, int spikes, bool antialiasEdges) | 55 | KisRectangleMaskGenerator::KisRectangleMaskGenerator(qreal radius, qreal ratio, qreal fh, qreal fv, int spikes, bool antialiasEdges) | ||
42 | : KisMaskGenerator(radius, ratio, fh, fv, spikes, antialiasEdges, RECTANGLE, DefaultId), d(new Private) | 56 | : KisMaskGenerator(radius, ratio, fh, fv, spikes, antialiasEdges, RECTANGLE, DefaultId), d(new Private) | ||
43 | { | 57 | { | ||
44 | if (fv == 0 && fh == 0) { | | |||
45 | d->m_c = 0; | | |||
46 | } else { | | |||
47 | d->m_c = (fv / fh); | | |||
48 | Q_ASSERT(!qIsNaN(d->m_c)); | | |||
49 | | ||||
50 | } | | |||
51 | | ||||
52 | setScale(1.0, 1.0); | 58 | setScale(1.0, 1.0); | ||
59 | | ||||
60 | // store the variable locally to allow vector implementation read it easily | ||||
61 | d->copyOfAntialiasEdges = antialiasEdges; | ||||
62 | d->applicator.reset(createOptimizedClass<MaskApplicatorFactory<KisRectangleMaskGenerator, KisBrushMaskVectorApplicator> >(this)); | ||||
53 | } | 63 | } | ||
54 | 64 | | |||
55 | KisRectangleMaskGenerator::KisRectangleMaskGenerator(const KisRectangleMaskGenerator &rhs) | 65 | KisRectangleMaskGenerator::KisRectangleMaskGenerator(const KisRectangleMaskGenerator &rhs) | ||
56 | : KisMaskGenerator(rhs), | 66 | : KisMaskGenerator(rhs), | ||
57 | d(new Private(*rhs.d)) | 67 | d(new Private(*rhs.d)) | ||
58 | { | 68 | { | ||
69 | d->applicator.reset(createOptimizedClass<MaskApplicatorFactory<KisRectangleMaskGenerator, KisBrushMaskVectorApplicator> >(this)); | ||||
59 | } | 70 | } | ||
60 | 71 | | |||
61 | KisMaskGenerator* KisRectangleMaskGenerator::clone() const | 72 | KisMaskGenerator* KisRectangleMaskGenerator::clone() const | ||
Context not available. | |||||
75 | d->ycoeff = 2.0 / effectiveSrcHeight(); | 86 | d->ycoeff = 2.0 / effectiveSrcHeight(); | ||
76 | d->xfadecoeff = (horizontalFade() == 0) ? 1 : (2.0 / (horizontalFade() * effectiveSrcWidth())); | 87 | d->xfadecoeff = (horizontalFade() == 0) ? 1 : (2.0 / (horizontalFade() * effectiveSrcWidth())); | ||
77 | d->yfadecoeff = (verticalFade() == 0) ? 1 : (2.0 / (verticalFade() * effectiveSrcHeight())); | 88 | d->yfadecoeff = (verticalFade() == 0) ? 1 : (2.0 / (verticalFade() * effectiveSrcHeight())); | ||
89 | | ||||
78 | setSoftness(this->softness()); | 90 | setSoftness(this->softness()); | ||
79 | } | 91 | } | ||
80 | 92 | | |||
Context not available. | |||||
92 | return effectiveSrcWidth() < 10 || effectiveSrcHeight() < 10; | 104 | return effectiveSrcWidth() < 10 || effectiveSrcHeight() < 10; | ||
93 | } | 105 | } | ||
94 | 106 | | |||
107 | bool KisRectangleMaskGenerator::shouldVectorize() const | ||||
108 | { | ||||
109 | return !shouldSupersample() && spikes() == 2; | ||||
110 | } | ||||
111 | | ||||
112 | KisBrushMaskApplicatorBase* KisRectangleMaskGenerator::applicator() | ||||
113 | { | ||||
114 | return d->applicator.data(); | ||||
115 | } | ||||
116 | | ||||
117 | void KisRectangleMaskGenerator::resetMaskApplicator(bool forceScalar) | ||||
118 | { | ||||
119 | d->applicator.reset(createOptimizedClass<MaskApplicatorFactory<KisRectangleMaskGenerator, KisBrushMaskVectorApplicator> >(this,forceScalar)); | ||||
120 | } | ||||
121 | | ||||
95 | quint8 KisRectangleMaskGenerator::valueAt(qreal x, qreal y) const | 122 | quint8 KisRectangleMaskGenerator::valueAt(qreal x, qreal y) const | ||
96 | { | 123 | { | ||
97 | if (isEmpty()) return 255; | 124 | if (isEmpty()) return 255; | ||
Context not available. | |||||
115 | qreal fxr = xr * d->transformedFadeX; | 142 | qreal fxr = xr * d->transformedFadeX; | ||
116 | qreal fyr = yr * d->transformedFadeY; | 143 | qreal fyr = yr * d->transformedFadeY; | ||
117 | 144 | | |||
118 | if (fxr > 1.0 && (fxr > fyr || fyr < 1.0)) { | 145 | int fxrInt = fxr * 1e4; | ||
146 | int fyrInt = fyr * 1e4; | ||||
147 | | ||||
148 | if (fxr > 1.0 && (fxrInt >= fyrInt || fyr < 1.0)) { | ||||
119 | return 255 * nxr * (fxr - 1.0) / (fxr - nxr); | 149 | return 255 * nxr * (fxr - 1.0) / (fxr - nxr); | ||
120 | } | 150 | } | ||
121 | 151 | | |||
122 | if (fyr > 1.0 && (fyr > fxr || fxr < 1.0)) { | 152 | if (fyr > 1.0 && (fyrInt > fxrInt || fxr < 1.0)) { | ||
123 | return 255 * nyr * (fyr - 1.0) / (fyr - nyr); | 153 | return 255 * nyr * (fyr - 1.0) / (fyr - nyr); | ||
124 | } | 154 | } | ||
125 | 155 | | |||
Context not available. |