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 |