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* source, const Conte
xt& 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(source->internal_getProxy(), |
| 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(source->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 // TODO: it seems like this clear shouldn't be necessary (see skbug.com/5075
) |
| 96 canvas->clear(0x0); |
| 97 |
85 SkPaint paint; | 98 SkPaint paint; |
86 | 99 |
87 // Subtract off the integer component of the translation (will be applied in
loc, below). | 100 // Subtract off the integer component of the translation (will be applied in
offset, below). |
88 dstRect.offset(-SkIntToScalar(dstIRect.fLeft), -SkIntToScalar(dstIRect.fTop)
); | 101 dstRect.offset(-SkIntToScalar(dstIRect.fLeft), -SkIntToScalar(dstIRect.fTop)
); |
89 paint.setXfermodeMode(SkXfermode::kSrc_Mode); | 102 paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
90 // FIXME: this probably shouldn't be necessary, but drawImageRect asserts | 103 // FIXME: this probably shouldn't be necessary, but drawImageRect asserts |
91 // None filtering when it's translate-only | 104 // None filtering when it's translate-only |
92 paint.setFilterQuality( | 105 paint.setFilterQuality( |
93 fSrcRect.width() == dstRect.width() && fSrcRect.height() == dstRect.heig
ht() ? | 106 fSrcRect.width() == dstRect.width() && fSrcRect.height() == dstRect.heig
ht() ? |
94 kNone_SkFilterQuality : fFilterQuality); | 107 kNone_SkFilterQuality : fFilterQuality); |
95 canvas.drawImageRect(fImage, fSrcRect, dstRect, &paint, SkCanvas::kStrict_Sr
cRectConstraint); | 108 canvas->drawImageRect(fImage, fSrcRect, dstRect, &paint, SkCanvas::kStrict_S
rcRectConstraint); |
96 | 109 |
97 *result = device.get()->accessBitmap(false); | |
98 offset->fX = dstIRect.fLeft; | 110 offset->fX = dstIRect.fLeft; |
99 offset->fY = dstIRect.fTop; | 111 offset->fY = dstIRect.fTop; |
100 | 112 return surf->newImageSnapshot(); |
101 return true; | |
102 } | 113 } |
103 | 114 |
104 void SkImageSource::computeFastBounds(const SkRect& src, SkRect* dst) const { | 115 void SkImageSource::computeFastBounds(const SkRect& src, SkRect* dst) const { |
105 *dst = fDstRect; | 116 *dst = fDstRect; |
106 } | 117 } |
107 | 118 |
108 #ifndef SK_IGNORE_TO_STRING | 119 #ifndef SK_IGNORE_TO_STRING |
109 void SkImageSource::toString(SkString* str) const { | 120 void SkImageSource::toString(SkString* str) const { |
110 str->appendf("SkImageSource: ("); | 121 str->appendf("SkImageSource: ("); |
111 str->appendf("src: (%f,%f,%f,%f) dst: (%f,%f,%f,%f) ", | 122 str->appendf("src: (%f,%f,%f,%f) dst: (%f,%f,%f,%f) ", |
112 fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBotto
m, | 123 fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBotto
m, |
113 fDstRect.fLeft, fDstRect.fTop, fDstRect.fRight, fDstRect.fBotto
m); | 124 fDstRect.fLeft, fDstRect.fTop, fDstRect.fRight, fDstRect.fBotto
m); |
114 str->appendf("image: (%d,%d)", | 125 str->appendf("image: (%d,%d)", |
115 fImage->width(), fImage->height()); | 126 fImage->width(), fImage->height()); |
116 str->append(")"); | 127 str->append(")"); |
117 } | 128 } |
118 #endif | 129 #endif |
OLD | NEW |