Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkImageSource.h" | 8 #include "SkImageSource.h" |
| 9 | 9 |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| 11 #include "SkDevice.h" | |
| 12 #include "SkImage.h" | 11 #include "SkImage.h" |
| 13 #include "SkReadBuffer.h" | 12 #include "SkReadBuffer.h" |
| 13 #include "SkSpecialImage.h" | |
| 14 #include "SkSpecialSurface.h" | |
| 14 #include "SkWriteBuffer.h" | 15 #include "SkWriteBuffer.h" |
| 15 #include "SkString.h" | 16 #include "SkString.h" |
| 16 | 17 |
| 17 SkImageFilter* SkImageSource::Create(const SkImage* image) { | 18 SkImageFilter* SkImageSource::Create(const SkImage* image) { |
| 18 return image ? new SkImageSource(image) : nullptr; | 19 return image ? new SkImageSource(image) : nullptr; |
| 19 } | 20 } |
| 20 | 21 |
| 21 SkImageFilter* SkImageSource::Create(const SkImage* image, | 22 SkImageFilter* SkImageSource::Create(const SkImage* image, |
| 22 const SkRect& srcRect, | 23 const SkRect& srcRect, |
| 23 const SkRect& dstRect, | 24 const SkRect& dstRect, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 57 return SkImageSource::Create(image, src, dst, filterQuality); | 58 return SkImageSource::Create(image, src, dst, filterQuality); |
| 58 } | 59 } |
| 59 | 60 |
| 60 void SkImageSource::flatten(SkWriteBuffer& buffer) const { | 61 void SkImageSource::flatten(SkWriteBuffer& buffer) const { |
| 61 buffer.writeInt(fFilterQuality); | 62 buffer.writeInt(fFilterQuality); |
| 62 buffer.writeRect(fSrcRect); | 63 buffer.writeRect(fSrcRect); |
| 63 buffer.writeRect(fDstRect); | 64 buffer.writeRect(fDstRect); |
| 64 buffer.writeImage(fImage); | 65 buffer.writeImage(fImage); |
| 65 } | 66 } |
| 66 | 67 |
| 67 bool SkImageSource::onFilterImageDeprecated(Proxy* proxy, const SkBitmap& src, c onst Context& ctx, | 68 SkSpecialImage* SkImageSource::onFilterImage(SkSpecialImage* src, const Context& ctx, |
| 68 SkBitmap* result, SkIPoint* offset) const { | 69 SkIPoint* offset) const { |
| 69 SkRect dstRect; | 70 SkRect dstRect; |
| 70 ctx.ctm().mapRect(&dstRect, fDstRect); | 71 ctx.ctm().mapRect(&dstRect, fDstRect); |
| 72 | |
| 71 SkRect bounds = SkRect::MakeIWH(fImage->width(), fImage->height()); | 73 SkRect bounds = SkRect::MakeIWH(fImage->width(), fImage->height()); |
| 72 if (fSrcRect == bounds && dstRect == bounds) { | 74 if (fSrcRect == bounds && dstRect == bounds) { |
| 73 // No regions cropped out or resized; return entire image. | 75 // No regions cropped out or resized; return entire image. |
| 74 offset->fX = offset->fY = 0; | 76 offset->fX = offset->fY = 0; |
| 75 return fImage->asLegacyBitmap(result, SkImage::kRO_LegacyBitmapMode); | 77 return SkSpecialImage::NewFromImage(src->internal_getProxy(), |
|
Stephen White
2016/03/07 21:47:26
This seems unfortunate. I'm guessing we need the p
robertphillips
2016/03/08 16:45:29
It is unfortunate but we do need it for downstream
Stephen White
2016/03/08 16:48:42
Acknowledged.
| |
| 78 SkIRect::MakeWH(fImage->width(), fIm age->height()), | |
| 79 fImage); | |
| 76 } | 80 } |
| 77 | 81 |
| 78 const SkIRect dstIRect = dstRect.roundOut(); | 82 const SkIRect dstIRect = dstRect.roundOut(); |
| 79 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(dstIRect.width(), dstI Rect.height())); | 83 |
| 80 if (nullptr == device.get()) { | 84 const SkImageInfo info = SkImageInfo::MakeN32(dstIRect.width(), dstIRect.hei ght(), |
| 81 return false; | 85 kPremul_SkAlphaType); |
| 86 | |
| 87 SkAutoTUnref<SkSpecialSurface> surf(src->newSurface(info)); | |
| 88 if (!surf) { | |
| 89 return nullptr; | |
| 82 } | 90 } |
| 83 | 91 |
| 84 SkCanvas canvas(device.get()); | 92 SkCanvas* canvas = surf->getCanvas(); |
| 93 SkASSERT(canvas); | |
| 94 | |
| 95 canvas->clear(0x0); | |
| 96 | |
| 85 SkPaint paint; | 97 SkPaint paint; |
| 86 | 98 |
| 87 // Subtract off the integer component of the translation (will be applied in loc, below). | 99 // Subtract off the integer component of the translation (will be applied in offset, below). |
| 88 dstRect.offset(-SkIntToScalar(dstIRect.fLeft), -SkIntToScalar(dstIRect.fTop) ); | 100 dstRect.offset(-SkIntToScalar(dstIRect.fLeft), -SkIntToScalar(dstIRect.fTop) ); |
| 89 paint.setXfermodeMode(SkXfermode::kSrc_Mode); | 101 paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| 90 // FIXME: this probably shouldn't be necessary, but drawImageRect asserts | 102 // FIXME: this probably shouldn't be necessary, but drawImageRect asserts |
| 91 // None filtering when it's translate-only | 103 // None filtering when it's translate-only |
| 92 paint.setFilterQuality( | 104 paint.setFilterQuality( |
| 93 fSrcRect.width() == dstRect.width() && fSrcRect.height() == dstRect.heig ht() ? | 105 fSrcRect.width() == dstRect.width() && fSrcRect.height() == dstRect.heig ht() ? |
| 94 kNone_SkFilterQuality : fFilterQuality); | 106 kNone_SkFilterQuality : fFilterQuality); |
| 95 canvas.drawImageRect(fImage, fSrcRect, dstRect, &paint, SkCanvas::kStrict_Sr cRectConstraint); | 107 canvas->drawImageRect(fImage, fSrcRect, dstRect, &paint, SkCanvas::kStrict_S rcRectConstraint); |
| 96 | 108 |
| 97 *result = device.get()->accessBitmap(false); | |
| 98 offset->fX = dstIRect.fLeft; | 109 offset->fX = dstIRect.fLeft; |
| 99 offset->fY = dstIRect.fTop; | 110 offset->fY = dstIRect.fTop; |
| 100 | 111 return surf->newImageSnapshot(); |
| 101 return true; | |
| 102 } | 112 } |
| 103 | 113 |
| 104 void SkImageSource::computeFastBounds(const SkRect& src, SkRect* dst) const { | 114 void SkImageSource::computeFastBounds(const SkRect& src, SkRect* dst) const { |
| 105 *dst = fDstRect; | 115 *dst = fDstRect; |
| 106 } | 116 } |
| 107 | 117 |
| 108 #ifndef SK_IGNORE_TO_STRING | 118 #ifndef SK_IGNORE_TO_STRING |
| 109 void SkImageSource::toString(SkString* str) const { | 119 void SkImageSource::toString(SkString* str) const { |
| 110 str->appendf("SkImageSource: ("); | 120 str->appendf("SkImageSource: ("); |
| 111 str->appendf("src: (%f,%f,%f,%f) dst: (%f,%f,%f,%f) ", | 121 str->appendf("src: (%f,%f,%f,%f) dst: (%f,%f,%f,%f) ", |
| 112 fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBotto m, | 122 fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBotto m, |
| 113 fDstRect.fLeft, fDstRect.fTop, fDstRect.fRight, fDstRect.fBotto m); | 123 fDstRect.fLeft, fDstRect.fTop, fDstRect.fRight, fDstRect.fBotto m); |
| 114 str->appendf("image: (%d,%d)", | 124 str->appendf("image: (%d,%d)", |
| 115 fImage->width(), fImage->height()); | 125 fImage->width(), fImage->height()); |
| 116 str->append(")"); | 126 str->append(")"); |
| 117 } | 127 } |
| 118 #endif | 128 #endif |
| OLD | NEW |