| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 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 "SkAlphaThresholdFilter.h" | 8 #include "SkAlphaThresholdFilter.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkDevice.h" |
| 10 #include "SkReadBuffer.h" | 11 #include "SkReadBuffer.h" |
| 11 #include "SkWriteBuffer.h" | 12 #include "SkWriteBuffer.h" |
| 12 #include "SkRegion.h" | 13 #include "SkRegion.h" |
| 13 #if SK_SUPPORT_GPU | 14 #if SK_SUPPORT_GPU |
| 14 #include "GrDrawContext.h" | 15 #include "GrDrawContext.h" |
| 15 #endif | 16 #endif |
| 16 | 17 |
| 17 class SK_API SkAlphaThresholdFilterImpl : public SkImageFilter { | 18 class SK_API SkAlphaThresholdFilterImpl : public SkImageFilter { |
| 18 public: | 19 public: |
| 19 SkAlphaThresholdFilterImpl(const SkRegion& region, SkScalar innerThreshold, | 20 SkAlphaThresholdFilterImpl(const SkRegion& region, SkScalar innerThreshold, |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 } | 297 } |
| 297 #endif | 298 #endif |
| 298 | 299 |
| 299 void SkAlphaThresholdFilterImpl::flatten(SkWriteBuffer& buffer) const { | 300 void SkAlphaThresholdFilterImpl::flatten(SkWriteBuffer& buffer) const { |
| 300 this->INHERITED::flatten(buffer); | 301 this->INHERITED::flatten(buffer); |
| 301 buffer.writeScalar(fInnerThreshold); | 302 buffer.writeScalar(fInnerThreshold); |
| 302 buffer.writeScalar(fOuterThreshold); | 303 buffer.writeScalar(fOuterThreshold); |
| 303 buffer.writeRegion(fRegion); | 304 buffer.writeRegion(fRegion); |
| 304 } | 305 } |
| 305 | 306 |
| 306 bool SkAlphaThresholdFilterImpl::onFilterImage(Proxy*, const SkBitmap& src, | 307 bool SkAlphaThresholdFilterImpl::onFilterImage(Proxy* proxy, const SkBitmap& src
, |
| 307 const Context& ctx, SkBitmap* dst
, | 308 const Context& ctx, SkBitmap* dst
, |
| 308 SkIPoint* offset) const { | 309 SkIPoint* offset) const { |
| 309 SkASSERT(src.colorType() == kN32_SkColorType); | 310 SkASSERT(src.colorType() == kN32_SkColorType); |
| 310 | 311 |
| 311 if (src.colorType() != kN32_SkColorType) { | 312 if (src.colorType() != kN32_SkColorType) { |
| 312 return false; | 313 return false; |
| 313 } | 314 } |
| 314 | 315 |
| 315 SkMatrix localInverse; | 316 SkMatrix localInverse; |
| 316 if (!ctx.ctm().invert(&localInverse)) { | 317 if (!ctx.ctm().invert(&localInverse)) { |
| 317 return false; | 318 return false; |
| 318 } | 319 } |
| 319 | 320 |
| 320 SkAutoLockPixels alp(src); | 321 SkAutoLockPixels alp(src); |
| 321 SkASSERT(src.getPixels()); | 322 SkASSERT(src.getPixels()); |
| 322 if (!src.getPixels() || src.width() <= 0 || src.height() <= 0) { | 323 if (!src.getPixels() || src.width() <= 0 || src.height() <= 0) { |
| 323 return false; | 324 return false; |
| 324 } | 325 } |
| 325 | 326 |
| 326 if (!dst->tryAllocPixels(src.info())) { | 327 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(src.width(), src.heigh
t())); |
| 328 if (!device) { |
| 327 return false; | 329 return false; |
| 328 } | 330 } |
| 331 *dst = device->accessBitmap(false); |
| 332 SkAutoLockPixels alp_dst(*dst); |
| 329 | 333 |
| 330 U8CPU innerThreshold = (U8CPU)(fInnerThreshold * 0xFF); | 334 U8CPU innerThreshold = (U8CPU)(fInnerThreshold * 0xFF); |
| 331 U8CPU outerThreshold = (U8CPU)(fOuterThreshold * 0xFF); | 335 U8CPU outerThreshold = (U8CPU)(fOuterThreshold * 0xFF); |
| 332 SkColor* sptr = src.getAddr32(0, 0); | 336 SkColor* sptr = src.getAddr32(0, 0); |
| 333 SkColor* dptr = dst->getAddr32(0, 0); | 337 SkColor* dptr = dst->getAddr32(0, 0); |
| 334 int width = src.width(), height = src.height(); | 338 int width = src.width(), height = src.height(); |
| 335 for (int y = 0; y < height; ++y) { | 339 for (int y = 0; y < height; ++y) { |
| 336 for (int x = 0; x < width; ++x) { | 340 for (int x = 0; x < width; ++x) { |
| 337 const SkColor& source = sptr[y * width + x]; | 341 const SkColor& source = sptr[y * width + x]; |
| 338 SkColor output_color(source); | 342 SkColor output_color(source); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 366 } | 370 } |
| 367 | 371 |
| 368 #ifndef SK_IGNORE_TO_STRING | 372 #ifndef SK_IGNORE_TO_STRING |
| 369 void SkAlphaThresholdFilterImpl::toString(SkString* str) const { | 373 void SkAlphaThresholdFilterImpl::toString(SkString* str) const { |
| 370 str->appendf("SkAlphaThresholdImageFilter: ("); | 374 str->appendf("SkAlphaThresholdImageFilter: ("); |
| 371 str->appendf("inner: %f outer: %f", fInnerThreshold, fOuterThreshold); | 375 str->appendf("inner: %f outer: %f", fInnerThreshold, fOuterThreshold); |
| 372 str->append(")"); | 376 str->append(")"); |
| 373 } | 377 } |
| 374 #endif | 378 #endif |
| 375 | 379 |
| OLD | NEW |