| 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 "SkDevice.h" |
| 11 #include "SkOpts.h" | 12 #include "SkOpts.h" |
| 12 #include "SkReadBuffer.h" | 13 #include "SkReadBuffer.h" |
| 13 #include "SkRect.h" | 14 #include "SkRect.h" |
| 14 #include "SkWriteBuffer.h" | 15 #include "SkWriteBuffer.h" |
| 15 #if SK_SUPPORT_GPU | 16 #if SK_SUPPORT_GPU |
| 16 #include "GrContext.h" | 17 #include "GrContext.h" |
| 17 #include "GrDrawContext.h" | 18 #include "GrDrawContext.h" |
| 18 #include "GrInvariantOutput.h" | 19 #include "GrInvariantOutput.h" |
| 19 #include "GrTexture.h" | 20 #include "GrTexture.h" |
| 20 #include "effects/Gr1DKernelEffect.h" | 21 #include "effects/Gr1DKernelEffect.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 SkIRect bounds; | 70 SkIRect bounds; |
| 70 if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, &src)) { | 71 if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, &src)) { |
| 71 return false; | 72 return false; |
| 72 } | 73 } |
| 73 | 74 |
| 74 SkAutoLockPixels alp(src); | 75 SkAutoLockPixels alp(src); |
| 75 if (!src.getPixels()) { | 76 if (!src.getPixels()) { |
| 76 return false; | 77 return false; |
| 77 } | 78 } |
| 78 | 79 |
| 79 if (!dst->tryAllocPixels(src.info().makeWH(bounds.width(), bounds.height()))
) { | |
| 80 return false; | |
| 81 } | |
| 82 | |
| 83 SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()), | 80 SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()), |
| 84 SkIntToScalar(this->radius().height())); | 81 SkIntToScalar(this->radius().height())); |
| 85 ctx.ctm().mapVectors(&radius, 1); | 82 ctx.ctm().mapVectors(&radius, 1); |
| 86 int width = SkScalarFloorToInt(radius.fX); | 83 int width = SkScalarFloorToInt(radius.fX); |
| 87 int height = SkScalarFloorToInt(radius.fY); | 84 int height = SkScalarFloorToInt(radius.fY); |
| 88 | 85 |
| 89 if (width < 0 || height < 0) { | 86 if (width < 0 || height < 0) { |
| 90 return false; | 87 return false; |
| 91 } | 88 } |
| 92 | 89 |
| 93 SkIRect srcBounds = bounds; | 90 SkIRect srcBounds = bounds; |
| 94 srcBounds.offset(-srcOffset); | 91 srcBounds.offset(-srcOffset); |
| 95 | 92 |
| 96 if (width == 0 && height == 0) { | 93 if (width == 0 && height == 0) { |
| 97 src.extractSubset(dst, srcBounds); | 94 src.extractSubset(dst, srcBounds); |
| 98 offset->fX = bounds.left(); | 95 offset->fX = bounds.left(); |
| 99 offset->fY = bounds.top(); | 96 offset->fY = bounds.top(); |
| 100 return true; | 97 return true; |
| 101 } | 98 } |
| 102 | 99 |
| 103 SkBitmap temp; | 100 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds
.height())); |
| 104 if (!temp.tryAllocPixels(dst->info())) { | 101 if (!device) { |
| 105 return false; | 102 return false; |
| 106 } | 103 } |
| 104 *dst = device->accessBitmap(false); |
| 105 SkAutoLockPixels alp_dst(*dst); |
| 107 | 106 |
| 108 if (width > 0 && height > 0) { | 107 if (width > 0 && height > 0) { |
| 108 SkAutoTUnref<SkBaseDevice> tempDevice(proxy->createDevice(dst->width(),
dst->height())); |
| 109 if (!tempDevice) { |
| 110 return false; |
| 111 } |
| 112 SkBitmap temp = tempDevice->accessBitmap(false); |
| 113 SkAutoLockPixels alp_temp(temp); |
| 109 callProcX(procX, src, &temp, width, srcBounds); | 114 callProcX(procX, src, &temp, width, srcBounds); |
| 110 SkIRect tmpBounds = SkIRect::MakeWH(srcBounds.width(), srcBounds.height(
)); | 115 SkIRect tmpBounds = SkIRect::MakeWH(srcBounds.width(), srcBounds.height(
)); |
| 111 callProcY(procY, temp, dst, height, tmpBounds); | 116 callProcY(procY, temp, dst, height, tmpBounds); |
| 112 } else if (width > 0) { | 117 } else if (width > 0) { |
| 113 callProcX(procX, src, dst, width, srcBounds); | 118 callProcX(procX, src, dst, width, srcBounds); |
| 114 } else if (height > 0) { | 119 } else if (height > 0) { |
| 115 callProcY(procY, src, dst, height, srcBounds); | 120 callProcY(procY, src, dst, height, srcBounds); |
| 116 } | 121 } |
| 117 offset->fX = bounds.left(); | 122 offset->fX = bounds.left(); |
| 118 offset->fY = bounds.top(); | 123 offset->fY = bounds.top(); |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 SkBitmap* result, SkIPoint* offset) con
st { | 659 SkBitmap* result, SkIPoint* offset) con
st { |
| 655 return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset); | 660 return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset); |
| 656 } | 661 } |
| 657 | 662 |
| 658 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
Context& ctx, | 663 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
Context& ctx, |
| 659 SkBitmap* result, SkIPoint* offset) cons
t { | 664 SkBitmap* result, SkIPoint* offset) cons
t { |
| 660 return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset); | 665 return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset); |
| 661 } | 666 } |
| 662 | 667 |
| 663 #endif | 668 #endif |
| OLD | NEW |