| 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" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 { | 133 { |
| 134 procY(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), | 134 procY(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), |
| 135 radiusY, bounds.height(), bounds.width(), | 135 radiusY, bounds.height(), bounds.width(), |
| 136 src.rowBytesAsPixels(), dst->rowBytesAsPixels()); | 136 src.rowBytesAsPixels(), dst->rowBytesAsPixels()); |
| 137 } | 137 } |
| 138 | 138 |
| 139 bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc p
rocX, | 139 bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc p
rocX, |
| 140 SkMorphologyImageFilter::Proc p
rocY, | 140 SkMorphologyImageFilter::Proc p
rocY, |
| 141 Proxy* proxy, | 141 Proxy* proxy, |
| 142 const SkBitmap& source, | 142 const SkBitmap& source, |
| 143 const SkMatrix& ctm, | 143 const Context& ctx, |
| 144 SkBitmap* dst, | 144 SkBitmap* dst, |
| 145 SkIPoint* offset) const { | 145 SkIPoint* offset) const { |
| 146 SkBitmap src = source; | 146 SkBitmap src = source; |
| 147 SkIPoint srcOffset = SkIPoint::Make(0, 0); | 147 SkIPoint srcOffset = SkIPoint::Make(0, 0); |
| 148 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, &srcO
ffset)) { | 148 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, &src, &srcO
ffset)) { |
| 149 return false; | 149 return false; |
| 150 } | 150 } |
| 151 | 151 |
| 152 if (src.colorType() != kPMColor_SkColorType) { | 152 if (src.colorType() != kPMColor_SkColorType) { |
| 153 return false; | 153 return false; |
| 154 } | 154 } |
| 155 | 155 |
| 156 SkIRect bounds; | 156 SkIRect bounds; |
| 157 src.getBounds(&bounds); | 157 src.getBounds(&bounds); |
| 158 bounds.offset(srcOffset); | 158 bounds.offset(srcOffset); |
| 159 if (!this->applyCropRect(&bounds, ctm)) { | 159 if (!this->applyCropRect(&bounds, ctx.ctm())) { |
| 160 return false; | 160 return false; |
| 161 } | 161 } |
| 162 | 162 |
| 163 SkAutoLockPixels alp(src); | 163 SkAutoLockPixels alp(src); |
| 164 if (!src.getPixels()) { | 164 if (!src.getPixels()) { |
| 165 return false; | 165 return false; |
| 166 } | 166 } |
| 167 | 167 |
| 168 dst->setConfig(src.config(), bounds.width(), bounds.height()); | 168 dst->setConfig(src.config(), bounds.width(), bounds.height()); |
| 169 dst->allocPixels(); | 169 dst->allocPixels(); |
| 170 if (!dst->getPixels()) { | 170 if (!dst->getPixels()) { |
| 171 return false; | 171 return false; |
| 172 } | 172 } |
| 173 | 173 |
| 174 SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()), | 174 SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()), |
| 175 SkIntToScalar(this->radius().height())); | 175 SkIntToScalar(this->radius().height())); |
| 176 ctm.mapVectors(&radius, 1); | 176 ctx.ctm().mapVectors(&radius, 1); |
| 177 int width = SkScalarFloorToInt(radius.fX); | 177 int width = SkScalarFloorToInt(radius.fX); |
| 178 int height = SkScalarFloorToInt(radius.fY); | 178 int height = SkScalarFloorToInt(radius.fY); |
| 179 | 179 |
| 180 if (width < 0 || height < 0) { | 180 if (width < 0 || height < 0) { |
| 181 return false; | 181 return false; |
| 182 } | 182 } |
| 183 | 183 |
| 184 SkIRect srcBounds = bounds; | 184 SkIRect srcBounds = bounds; |
| 185 srcBounds.offset(-srcOffset); | 185 srcBounds.offset(-srcOffset); |
| 186 | 186 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 205 callProcX(procX, src, dst, width, srcBounds); | 205 callProcX(procX, src, dst, width, srcBounds); |
| 206 } else if (height > 0) { | 206 } else if (height > 0) { |
| 207 callProcY(procY, src, dst, height, srcBounds); | 207 callProcY(procY, src, dst, height, srcBounds); |
| 208 } | 208 } |
| 209 offset->fX = bounds.left(); | 209 offset->fX = bounds.left(); |
| 210 offset->fY = bounds.top(); | 210 offset->fY = bounds.top(); |
| 211 return true; | 211 return true; |
| 212 } | 212 } |
| 213 | 213 |
| 214 bool SkErodeImageFilter::onFilterImage(Proxy* proxy, | 214 bool SkErodeImageFilter::onFilterImage(Proxy* proxy, |
| 215 const SkBitmap& source, const SkMatrix& c
tm, | 215 const SkBitmap& source, const Context& ct
x, |
| 216 SkBitmap* dst, SkIPoint* offset) const { | 216 SkBitmap* dst, SkIPoint* offset) const { |
| 217 Proc erodeXProc = SkMorphologyGetPlatformProc(kErodeX_SkMorphologyProcType); | 217 Proc erodeXProc = SkMorphologyGetPlatformProc(kErodeX_SkMorphologyProcType); |
| 218 if (!erodeXProc) { | 218 if (!erodeXProc) { |
| 219 erodeXProc = erode<kX>; | 219 erodeXProc = erode<kX>; |
| 220 } | 220 } |
| 221 Proc erodeYProc = SkMorphologyGetPlatformProc(kErodeY_SkMorphologyProcType); | 221 Proc erodeYProc = SkMorphologyGetPlatformProc(kErodeY_SkMorphologyProcType); |
| 222 if (!erodeYProc) { | 222 if (!erodeYProc) { |
| 223 erodeYProc = erode<kY>; | 223 erodeYProc = erode<kY>; |
| 224 } | 224 } |
| 225 return this->filterImageGeneric(erodeXProc, erodeYProc, proxy, source, ctm,
dst, offset); | 225 return this->filterImageGeneric(erodeXProc, erodeYProc, proxy, source, ctx,
dst, offset); |
| 226 } | 226 } |
| 227 | 227 |
| 228 bool SkDilateImageFilter::onFilterImage(Proxy* proxy, | 228 bool SkDilateImageFilter::onFilterImage(Proxy* proxy, |
| 229 const SkBitmap& source, const SkMatrix&
ctm, | 229 const SkBitmap& source, const Context& c
tx, |
| 230 SkBitmap* dst, SkIPoint* offset) const { | 230 SkBitmap* dst, SkIPoint* offset) const { |
| 231 Proc dilateXProc = SkMorphologyGetPlatformProc(kDilateX_SkMorphologyProcType
); | 231 Proc dilateXProc = SkMorphologyGetPlatformProc(kDilateX_SkMorphologyProcType
); |
| 232 if (!dilateXProc) { | 232 if (!dilateXProc) { |
| 233 dilateXProc = dilate<kX>; | 233 dilateXProc = dilate<kX>; |
| 234 } | 234 } |
| 235 Proc dilateYProc = SkMorphologyGetPlatformProc(kDilateY_SkMorphologyProcType
); | 235 Proc dilateYProc = SkMorphologyGetPlatformProc(kDilateY_SkMorphologyProcType
); |
| 236 if (!dilateYProc) { | 236 if (!dilateYProc) { |
| 237 dilateYProc = dilate<kY>; | 237 dilateYProc = dilate<kY>; |
| 238 } | 238 } |
| 239 return this->filterImageGeneric(dilateXProc, dilateYProc, proxy, source, ctm
, dst, offset); | 239 return this->filterImageGeneric(dilateXProc, dilateYProc, proxy, source, ctx
, dst, offset); |
| 240 } | 240 } |
| 241 | 241 |
| 242 void SkMorphologyImageFilter::computeFastBounds(const SkRect& src, SkRect* dst)
const { | 242 void SkMorphologyImageFilter::computeFastBounds(const SkRect& src, SkRect* dst)
const { |
| 243 if (getInput(0)) { | 243 if (getInput(0)) { |
| 244 getInput(0)->computeFastBounds(src, dst); | 244 getInput(0)->computeFastBounds(src, dst); |
| 245 } else { | 245 } else { |
| 246 *dst = src; | 246 *dst = src; |
| 247 } | 247 } |
| 248 dst->outset(SkIntToScalar(fRadius.width()), SkIntToScalar(fRadius.height()))
; | 248 dst->outset(SkIntToScalar(fRadius.width()), SkIntToScalar(fRadius.height()))
; |
| 249 } | 249 } |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 } | 531 } |
| 532 SkImageFilter::WrapTexture(src, rect.width(), rect.height(), dst); | 532 SkImageFilter::WrapTexture(src, rect.width(), rect.height(), dst); |
| 533 return true; | 533 return true; |
| 534 } | 534 } |
| 535 | 535 |
| 536 }; | 536 }; |
| 537 | 537 |
| 538 bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, | 538 bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, |
| 539 Proxy* proxy, | 539 Proxy* proxy, |
| 540 const SkBitmap& src, | 540 const SkBitmap& src, |
| 541 const SkMatrix& ctm, | 541 const Context& ctx, |
| 542 SkBitmap* result, | 542 SkBitmap* result, |
| 543 SkIPoint* offset) const { | 543 SkIPoint* offset) const { |
| 544 SkBitmap input = src; | 544 SkBitmap input = src; |
| 545 SkIPoint srcOffset = SkIPoint::Make(0, 0); | 545 SkIPoint srcOffset = SkIPoint::Make(0, 0); |
| 546 if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctm, &input,
&srcOffset)) { | 546 if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, &input,
&srcOffset)) { |
| 547 return false; | 547 return false; |
| 548 } | 548 } |
| 549 SkIRect bounds; | 549 SkIRect bounds; |
| 550 input.getBounds(&bounds); | 550 input.getBounds(&bounds); |
| 551 bounds.offset(srcOffset); | 551 bounds.offset(srcOffset); |
| 552 if (!this->applyCropRect(&bounds, ctm)) { | 552 if (!this->applyCropRect(&bounds, ctx.ctm())) { |
| 553 return false; | 553 return false; |
| 554 } | 554 } |
| 555 SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()), | 555 SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()), |
| 556 SkIntToScalar(this->radius().height())); | 556 SkIntToScalar(this->radius().height())); |
| 557 ctm.mapVectors(&radius, 1); | 557 ctx.ctm().mapVectors(&radius, 1); |
| 558 int width = SkScalarFloorToInt(radius.fX); | 558 int width = SkScalarFloorToInt(radius.fX); |
| 559 int height = SkScalarFloorToInt(radius.fY); | 559 int height = SkScalarFloorToInt(radius.fY); |
| 560 | 560 |
| 561 if (width < 0 || height < 0) { | 561 if (width < 0 || height < 0) { |
| 562 return false; | 562 return false; |
| 563 } | 563 } |
| 564 | 564 |
| 565 SkIRect srcBounds = bounds; | 565 SkIRect srcBounds = bounds; |
| 566 srcBounds.offset(-srcOffset); | 566 srcBounds.offset(-srcOffset); |
| 567 if (width == 0 && height == 0) { | 567 if (width == 0 && height == 0) { |
| 568 input.extractSubset(result, srcBounds); | 568 input.extractSubset(result, srcBounds); |
| 569 offset->fX = bounds.left(); | 569 offset->fX = bounds.left(); |
| 570 offset->fY = bounds.top(); | 570 offset->fY = bounds.top(); |
| 571 return true; | 571 return true; |
| 572 } | 572 } |
| 573 | 573 |
| 574 GrMorphologyEffect::MorphologyType type = dilate ? GrMorphologyEffect::kDila
te_MorphologyType : GrMorphologyEffect::kErode_MorphologyType; | 574 GrMorphologyEffect::MorphologyType type = dilate ? GrMorphologyEffect::kDila
te_MorphologyType : GrMorphologyEffect::kErode_MorphologyType; |
| 575 if (!apply_morphology(input, srcBounds, type, | 575 if (!apply_morphology(input, srcBounds, type, |
| 576 SkISize::Make(width, height), result)) { | 576 SkISize::Make(width, height), result)) { |
| 577 return false; | 577 return false; |
| 578 } | 578 } |
| 579 offset->fX = bounds.left(); | 579 offset->fX = bounds.left(); |
| 580 offset->fY = bounds.top(); | 580 offset->fY = bounds.top(); |
| 581 return true; | 581 return true; |
| 582 } | 582 } |
| 583 | 583 |
| 584 bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, cons
t SkMatrix& ctm, | 584 bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, cons
t Context& ctx, |
| 585 SkBitmap* result, SkIPoint* offset) con
st { | 585 SkBitmap* result, SkIPoint* offset) con
st { |
| 586 return this->filterImageGPUGeneric(true, proxy, src, ctm, result, offset); | 586 return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset); |
| 587 } | 587 } |
| 588 | 588 |
| 589 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
SkMatrix& ctm, | 589 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
Context& ctx, |
| 590 SkBitmap* result, SkIPoint* offset) cons
t { | 590 SkBitmap* result, SkIPoint* offset) cons
t { |
| 591 return this->filterImageGPUGeneric(false, proxy, src, ctm, result, offset); | 591 return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset); |
| 592 } | 592 } |
| 593 | 593 |
| 594 #endif | 594 #endif |
| OLD | NEW |