OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkMorphologyImageFilter.h" | 8 #include "SkMorphologyImageFilter.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
11 #include "SkFlattenableBuffers.h" | 11 #include "SkFlattenableBuffers.h" |
12 #include "SkRect.h" | 12 #include "SkRect.h" |
13 #include "SkMorphology_opts.h" | |
13 #if SK_SUPPORT_GPU | 14 #if SK_SUPPORT_GPU |
14 #include "GrContext.h" | 15 #include "GrContext.h" |
15 #include "GrTexture.h" | 16 #include "GrTexture.h" |
16 #include "GrTBackendEffectFactory.h" | 17 #include "GrTBackendEffectFactory.h" |
17 #include "gl/GrGLEffect.h" | 18 #include "gl/GrGLEffect.h" |
18 #include "effects/Gr1DKernelEffect.h" | 19 #include "effects/Gr1DKernelEffect.h" |
19 #include "SkImageFilterUtils.h" | 20 #include "SkImageFilterUtils.h" |
20 #endif | 21 #endif |
21 | 22 |
22 SkMorphologyImageFilter::SkMorphologyImageFilter(SkFlattenableReadBuffer& buffer ) | 23 SkMorphologyImageFilter::SkMorphologyImageFilter(SkFlattenableReadBuffer& buffer ) |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
67 up += srcStrideY; | 68 up += srcStrideY; |
68 } | 69 } |
69 if (x >= radius) src += srcStrideX; | 70 if (x >= radius) src += srcStrideX; |
70 if (x + radius < width - 1) upperSrc += srcStrideX; | 71 if (x + radius < width - 1) upperSrc += srcStrideX; |
71 dst += dstStrideX; | 72 dst += dstStrideX; |
72 } | 73 } |
73 } | 74 } |
74 | 75 |
75 static void erodeX(const SkBitmap& src, SkBitmap* dst, int radiusX, const SkIRec t& bounds) | 76 static void erodeX(const SkBitmap& src, SkBitmap* dst, int radiusX, const SkIRec t& bounds) |
76 { | 77 { |
77 erode(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), | 78 if (SkMorphologyProc erodeXProc = SkErodeXGetPlatformProc()) { |
reed1
2013/10/30 15:15:04
can we change either the platformproc or your erod
Stephen White
2013/10/30 19:47:17
Done.
| |
78 radiusX, bounds.width(), bounds.height(), | 79 (*erodeXProc)(src.getAddr32(bounds.left(), bounds.top()), |
79 1, src.rowBytesAsPixels(), 1, dst->rowBytesAsPixels()); | 80 dst->getAddr32(0, 0), radiusX, |
81 bounds.width(), bounds.height(), | |
82 src.rowBytesAsPixels(), | |
83 dst->rowBytesAsPixels()); | |
84 } else { | |
85 erode(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), | |
86 radiusX, bounds.width(), bounds.height(), | |
87 1, src.rowBytesAsPixels(), 1, dst->rowBytesAsPixels()); | |
88 } | |
80 } | 89 } |
81 | 90 |
82 static void erodeY(const SkBitmap& src, SkBitmap* dst, int radiusY, const SkIRec t& bounds) | 91 static void erodeY(const SkBitmap& src, SkBitmap* dst, int radiusY, const SkIRec t& bounds) |
83 { | 92 { |
84 erode(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), | 93 if (SkMorphologyProc erodeYProc = SkErodeYGetPlatformProc()) { |
85 radiusY, bounds.height(), bounds.width(), | 94 (*erodeYProc)(src.getAddr32(bounds.left(), bounds.top()), |
86 src.rowBytesAsPixels(), 1, dst->rowBytesAsPixels(), 1); | 95 dst->getAddr32(0, 0), |
96 radiusY, | |
97 bounds.width(), bounds.height(), | |
98 src.rowBytesAsPixels(), | |
99 dst->rowBytesAsPixels()); | |
100 } else { | |
101 erode(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), | |
102 radiusY, bounds.height(), bounds.width(), | |
103 src.rowBytesAsPixels(), 1, dst->rowBytesAsPixels(), 1); | |
104 } | |
87 } | 105 } |
88 | 106 |
89 static void dilate(const SkPMColor* src, SkPMColor* dst, | 107 static void dilate(const SkPMColor* src, SkPMColor* dst, |
90 int radius, int width, int height, | 108 int radius, int width, int height, |
91 int srcStrideX, int srcStrideY, | 109 int srcStrideX, int srcStrideY, |
92 int dstStrideX, int dstStrideY) | 110 int dstStrideX, int dstStrideY) |
93 { | 111 { |
94 radius = SkMin32(radius, width - 1); | 112 radius = SkMin32(radius, width - 1); |
95 const SkPMColor* upperSrc = src + radius * srcStrideX; | 113 const SkPMColor* upperSrc = src + radius * srcStrideX; |
96 for (int x = 0; x < width; ++x) { | 114 for (int x = 0; x < width; ++x) { |
(...skipping 18 matching lines...) Expand all Loading... | |
115 up += srcStrideY; | 133 up += srcStrideY; |
116 } | 134 } |
117 if (x >= radius) src += srcStrideX; | 135 if (x >= radius) src += srcStrideX; |
118 if (x + radius < width - 1) upperSrc += srcStrideX; | 136 if (x + radius < width - 1) upperSrc += srcStrideX; |
119 dst += dstStrideX; | 137 dst += dstStrideX; |
120 } | 138 } |
121 } | 139 } |
122 | 140 |
123 static void dilateX(const SkBitmap& src, SkBitmap* dst, int radiusX, const SkIRe ct& bounds) | 141 static void dilateX(const SkBitmap& src, SkBitmap* dst, int radiusX, const SkIRe ct& bounds) |
124 { | 142 { |
125 dilate(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), | 143 if (SkMorphologyProc erodeYProc = SkDilateXGetPlatformProc()) { |
126 radiusX, bounds.width(), bounds.height(), | 144 (*erodeYProc)(src.getAddr32(bounds.left(), bounds.top()), |
127 1, src.rowBytesAsPixels(), 1, dst->rowBytesAsPixels()); | 145 dst->getAddr32(0, 0), radiusX, |
146 bounds.width(), bounds.height(), | |
147 src.rowBytesAsPixels(), | |
148 dst->rowBytesAsPixels()); | |
149 } else { | |
150 dilate(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), | |
151 radiusX, bounds.width(), bounds.height(), | |
152 1, src.rowBytesAsPixels(), 1, dst->rowBytesAsPixels()); | |
153 } | |
128 } | 154 } |
129 | 155 |
130 static void dilateY(const SkBitmap& src, SkBitmap* dst, int radiusY, const SkIRe ct& bounds) | 156 static void dilateY(const SkBitmap& src, SkBitmap* dst, int radiusY, const SkIRe ct& bounds) |
131 { | 157 { |
132 dilate(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), | 158 if (SkMorphologyProc dilateYProc = SkDilateYGetPlatformProc()) { |
133 radiusY, bounds.height(), bounds.width(), | 159 (*dilateYProc)(src.getAddr32(bounds.left(), bounds.top()), |
134 src.rowBytesAsPixels(), 1, dst->rowBytesAsPixels(), 1); | 160 dst->getAddr32(0, 0), |
161 radiusY, | |
162 bounds.width(), bounds.height(), | |
163 src.rowBytesAsPixels(), | |
164 dst->rowBytesAsPixels()); | |
165 } else { | |
166 dilate(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), | |
167 radiusY, bounds.height(), bounds.width(), | |
168 src.rowBytesAsPixels(), 1, dst->rowBytesAsPixels(), 1); | |
169 } | |
135 } | 170 } |
136 | 171 |
137 bool SkErodeImageFilter::onFilterImage(Proxy* proxy, | 172 bool SkErodeImageFilter::onFilterImage(Proxy* proxy, |
138 const SkBitmap& source, const SkMatrix& c tm, | 173 const SkBitmap& source, const SkMatrix& c tm, |
139 SkBitmap* dst, SkIPoint* offset) { | 174 SkBitmap* dst, SkIPoint* offset) { |
140 SkBitmap src = source; | 175 SkBitmap src = source; |
141 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, offse t)) { | 176 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, offse t)) { |
142 return false; | 177 return false; |
143 } | 178 } |
144 | 179 |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
585 | 620 |
586 if (!apply_morphology(input, bounds, GrMorphologyEffect::kErode_MorphologyTy pe, radius(), result)) { | 621 if (!apply_morphology(input, bounds, GrMorphologyEffect::kErode_MorphologyTy pe, radius(), result)) { |
587 return false; | 622 return false; |
588 } | 623 } |
589 offset->fX += bounds.left(); | 624 offset->fX += bounds.left(); |
590 offset->fY += bounds.top(); | 625 offset->fY += bounds.top(); |
591 return true; | 626 return true; |
592 } | 627 } |
593 | 628 |
594 #endif | 629 #endif |
OLD | NEW |