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 "SkBitmap.h" | 8 #include "SkBitmap.h" |
9 #include "SkBitmapController.h" | 9 #include "SkBitmapController.h" |
10 #include "SkImage_Base.h" | 10 #include "SkBitmapProvider.h" |
11 #include "SkMatrix.h" | 11 #include "SkMatrix.h" |
12 #include "SkPixelRef.h" | 12 #include "SkPixelRef.h" |
13 #include "SkTemplates.h" | 13 #include "SkTemplates.h" |
14 | 14 |
15 // RESIZE_LANCZOS3 is another good option, but chrome prefers mitchell at the mo
ment | 15 // RESIZE_LANCZOS3 is another good option, but chrome prefers mitchell at the mo
ment |
16 #define kHQ_RESIZE_METHOD SkBitmapScaler::RESIZE_MITCHELL | 16 #define kHQ_RESIZE_METHOD SkBitmapScaler::RESIZE_MITCHELL |
17 | 17 |
18 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 18 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
19 | 19 |
20 int SkBitmapProvider::width() const { | |
21 return fImage ? fImage->width() : fBitmap.width(); | |
22 } | |
23 | |
24 int SkBitmapProvider::height() const { | |
25 return fImage ? fImage->height() : fBitmap.height(); | |
26 } | |
27 | |
28 uint32_t SkBitmapProvider::getID() const { | |
29 return fImage ? fImage->uniqueID() : fBitmap.getGenerationID(); | |
30 } | |
31 | |
32 bool SkBitmapProvider::validForDrawing() const { | |
33 if (!fImage) { | |
34 if (0 == fBitmap.width() || 0 == fBitmap.height()) { | |
35 return false; | |
36 } | |
37 if (nullptr == fBitmap.pixelRef()) { | |
38 return false; // no pixels to read | |
39 } | |
40 if (fBitmap.getTexture()) { | |
41 // we can handle texture (ugh) since lockPixels will perform a read-
back | |
42 return true; | |
43 } | |
44 if (kIndex_8_SkColorType == fBitmap.colorType()) { | |
45 SkAutoLockPixels alp(fBitmap); // but we need to call it before getC
olorTable() is safe. | |
46 if (!fBitmap.getColorTable()) { | |
47 return false; | |
48 } | |
49 } | |
50 } | |
51 return true; | |
52 } | |
53 | |
54 SkImageInfo SkBitmapProvider::info() const { | |
55 if (fImage) { | |
56 SkAlphaType at = fImage->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAl
phaType; | |
57 return SkImageInfo::MakeN32(fImage->width(), fImage->height(), at); | |
58 } else { | |
59 return fBitmap.info(); | |
60 } | |
61 } | |
62 | |
63 SkBitmapCacheDesc SkBitmapProvider::makeCacheDesc(int w, int h) const { | |
64 return fImage ? SkBitmapCacheDesc::Make(fImage, w, h) : SkBitmapCacheDesc::M
ake(fBitmap, w, h); | |
65 } | |
66 | |
67 SkBitmapCacheDesc SkBitmapProvider::makeCacheDesc() const { | |
68 return fImage ? SkBitmapCacheDesc::Make(fImage) : SkBitmapCacheDesc::Make(fB
itmap); | |
69 } | |
70 | |
71 void SkBitmapProvider::notifyAddedToCache() const { | |
72 if (fImage) { | |
73 // TODO | |
74 } else { | |
75 fBitmap.pixelRef()->notifyAddedToCache(); | |
76 } | |
77 } | |
78 | |
79 bool SkBitmapProvider::asBitmap(SkBitmap* bm) const { | |
80 if (fImage) { | |
81 return as_IB(fImage)->getROPixels(bm); | |
82 } else { | |
83 *bm = fBitmap; | |
84 return true; | |
85 } | |
86 } | |
87 | |
88 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | |
89 | |
90 SkBitmapController::State* SkBitmapController::requestBitmap(const SkBitmapProvi
der& provider, | 20 SkBitmapController::State* SkBitmapController::requestBitmap(const SkBitmapProvi
der& provider, |
91 const SkMatrix& inv
, | 21 const SkMatrix& inv
, |
92 SkFilterQuality qua
lity, | 22 SkFilterQuality qua
lity, |
93 void* storage, size
_t storageSize) { | 23 void* storage, size
_t storageSize) { |
94 if (!provider.validForDrawing()) { | 24 if (!provider.validForDrawing()) { |
95 return nullptr; | 25 return nullptr; |
96 } | 26 } |
97 | 27 |
98 State* state = this->onRequestBitmap(provider, inv, quality, storage, storag
eSize); | 28 State* state = this->onRequestBitmap(provider, inv, quality, storage, storag
eSize); |
99 if (state) { | 29 if (state) { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 fResultBitmap.getColorTable()); | 210 fResultBitmap.getColorTable()); |
281 } | 211 } |
282 | 212 |
283 SkBitmapController::State* SkDefaultBitmapController::onRequestBitmap(const SkBi
tmapProvider& bm, | 213 SkBitmapController::State* SkDefaultBitmapController::onRequestBitmap(const SkBi
tmapProvider& bm, |
284 const SkMa
trix& inverse, | 214 const SkMa
trix& inverse, |
285 SkFilterQu
ality quality, | 215 SkFilterQu
ality quality, |
286 void* stor
age, size_t size) { | 216 void* stor
age, size_t size) { |
287 return SkInPlaceNewCheck<SkDefaultBitmapControllerState>(storage, size, bm,
inverse, quality); | 217 return SkInPlaceNewCheck<SkDefaultBitmapControllerState>(storage, size, bm,
inverse, quality); |
288 } | 218 } |
289 | 219 |
OLD | NEW |