OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkDevice.h" | 8 #include "SkDevice.h" |
9 #include "SkDeviceProperties.h" | 9 #include "SkDeviceProperties.h" |
10 #include "SkDraw.h" | 10 #include "SkDraw.h" |
11 #include "SkMetaData.h" | 11 #include "SkMetaData.h" |
12 #include "SkPatchUtils.h" | 12 #include "SkPatchUtils.h" |
13 #include "SkShader.h" | 13 #include "SkShader.h" |
14 #include "SkTextBlob.h" | 14 #include "SkTextBlob.h" |
15 | 15 |
16 SkBaseDevice::SkBaseDevice() | 16 SkBaseDevice::SkBaseDevice() |
17 : fLeakyProperties(SkNEW_ARGS(SkDeviceProperties, (SkDeviceProperties::kLega
cyLCD_InitType))) | 17 : fLeakyProperties(SkNEW_ARGS(SkDeviceProperties, (SkDeviceProperties::kLega
cyLCD_InitType))) |
18 #ifdef SK_DEBUG | 18 #ifdef SK_DEBUG |
19 , fAttachedToCanvas(false) | 19 , fAttachedToCanvas(false) |
20 #endif | 20 #endif |
21 { | 21 { |
22 fOrigin.setZero(); | 22 fOrigin.setZero(); |
23 fMetaData = NULL; | 23 fMetaData = NULL; |
24 } | 24 } |
25 | 25 |
| 26 SkBaseDevice::SkBaseDevice(const SkDeviceProperties& dp) |
| 27 : fLeakyProperties(SkNEW_ARGS(SkDeviceProperties, (dp))) |
| 28 #ifdef SK_DEBUG |
| 29 , fAttachedToCanvas(false) |
| 30 #endif |
| 31 { |
| 32 fOrigin.setZero(); |
| 33 fMetaData = NULL; |
| 34 } |
| 35 |
26 SkBaseDevice::~SkBaseDevice() { | 36 SkBaseDevice::~SkBaseDevice() { |
27 SkDELETE(fLeakyProperties); | 37 SkDELETE(fLeakyProperties); |
28 SkDELETE(fMetaData); | 38 SkDELETE(fMetaData); |
29 } | 39 } |
30 | 40 |
31 SkBaseDevice* SkBaseDevice::createCompatibleDevice(const SkImageInfo& info) { | |
32 return this->onCreateCompatibleDevice(CreateInfo(info, kGeneral_Usage)); | |
33 } | |
34 | |
35 SkBaseDevice* SkBaseDevice::createCompatibleDeviceForSaveLayer(const SkImageInfo
& info) { | |
36 return this->onCreateCompatibleDevice(CreateInfo(info, kSaveLayer_Usage)); | |
37 } | |
38 | |
39 SkBaseDevice* SkBaseDevice::createCompatibleDeviceForImageFilter(const SkImageIn
fo& info) { | |
40 return this->onCreateCompatibleDevice(CreateInfo(info, kImageFilter_Usage)); | |
41 } | |
42 | |
43 SkMetaData& SkBaseDevice::getMetaData() { | 41 SkMetaData& SkBaseDevice::getMetaData() { |
44 // metadata users are rare, so we lazily allocate it. If that changes we | 42 // metadata users are rare, so we lazily allocate it. If that changes we |
45 // can decide to just make it a field in the device (rather than a ptr) | 43 // can decide to just make it a field in the device (rather than a ptr) |
46 if (NULL == fMetaData) { | 44 if (NULL == fMetaData) { |
47 fMetaData = new SkMetaData; | 45 fMetaData = new SkMetaData; |
48 } | 46 } |
49 return *fMetaData; | 47 return *fMetaData; |
50 } | 48 } |
51 | 49 |
52 SkImageInfo SkBaseDevice::imageInfo() const { | 50 SkImageInfo SkBaseDevice::imageInfo() const { |
53 return SkImageInfo::MakeUnknown(); | 51 return SkImageInfo::MakeUnknown(); |
54 } | 52 } |
55 | 53 |
56 const SkBitmap& SkBaseDevice::accessBitmap(bool changePixels) { | 54 const SkBitmap& SkBaseDevice::accessBitmap(bool changePixels) { |
57 const SkBitmap& bitmap = this->onAccessBitmap(); | 55 const SkBitmap& bitmap = this->onAccessBitmap(); |
58 if (changePixels) { | 56 if (changePixels) { |
59 bitmap.notifyPixelsChanged(); | 57 bitmap.notifyPixelsChanged(); |
60 } | 58 } |
61 return bitmap; | 59 return bitmap; |
62 } | 60 } |
63 | 61 |
64 void SkBaseDevice::setPixelGeometry(SkPixelGeometry geo) { | 62 SkPixelGeometry SkBaseDevice::CreateInfo::AdjustGeometry(const SkImageInfo& info
, |
65 fLeakyProperties->setPixelGeometry(geo); | 63 Usage usage, |
| 64 SkPixelGeometry geo) { |
| 65 switch (usage) { |
| 66 case kGeneral_Usage: |
| 67 break; |
| 68 case kSaveLayer_Usage: |
| 69 if (info.alphaType() != kOpaque_SkAlphaType) { |
| 70 geo = kUnknown_SkPixelGeometry; |
| 71 } |
| 72 break; |
| 73 case kImageFilter_Usage: |
| 74 geo = kUnknown_SkPixelGeometry; |
| 75 break; |
| 76 } |
| 77 return geo; |
| 78 } |
| 79 |
| 80 void SkBaseDevice::initForRootLayer(SkPixelGeometry geo) { |
| 81 // For now we don't expect to change the geometry for the root-layer, but we
make the call |
| 82 // anyway to document logically what is going on. |
| 83 // |
| 84 fLeakyProperties->setPixelGeometry(CreateInfo::AdjustGeometry(this->imageInf
o(), |
| 85 kGeneral_Usage
, |
| 86 geo)); |
66 } | 87 } |
67 | 88 |
68 SkSurface* SkBaseDevice::newSurface(const SkImageInfo&, const SkSurfaceProps&) {
return NULL; } | 89 SkSurface* SkBaseDevice::newSurface(const SkImageInfo&, const SkSurfaceProps&) {
return NULL; } |
69 | 90 |
70 const void* SkBaseDevice::peekPixels(SkImageInfo*, size_t*) { return NULL; } | 91 const void* SkBaseDevice::peekPixels(SkImageInfo*, size_t*) { return NULL; } |
71 | 92 |
72 void SkBaseDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, | 93 void SkBaseDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, |
73 const SkRRect& inner, const SkPaint& paint) { | 94 const SkRRect& inner, const SkPaint& paint) { |
74 SkPath path; | 95 SkPath path; |
75 path.addRRect(outer); | 96 path.addRRect(outer); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 | 201 |
181 void* SkBaseDevice::onAccessPixels(SkImageInfo* info, size_t* rowBytes) { | 202 void* SkBaseDevice::onAccessPixels(SkImageInfo* info, size_t* rowBytes) { |
182 return NULL; | 203 return NULL; |
183 } | 204 } |
184 | 205 |
185 bool SkBaseDevice::EXPERIMENTAL_drawPicture(SkCanvas*, const SkPicture*, const S
kMatrix*, | 206 bool SkBaseDevice::EXPERIMENTAL_drawPicture(SkCanvas*, const SkPicture*, const S
kMatrix*, |
186 const SkPaint*) { | 207 const SkPaint*) { |
187 // The base class doesn't perform any accelerated picture rendering | 208 // The base class doesn't perform any accelerated picture rendering |
188 return false; | 209 return false; |
189 } | 210 } |
| 211 |
| 212 ////////////////////////////////////////////////////////////////////////////////
////////// |
| 213 |
| 214 bool SkBaseDevice::shouldDisableLCD(const SkPaint& paint) const { |
| 215 if (!paint.isLCDRenderText() || !paint.isAntiAlias()) { |
| 216 return false; |
| 217 } |
| 218 |
| 219 if (kUnknown_SkPixelGeometry == fLeakyProperties->pixelGeometry()) { |
| 220 return true; |
| 221 } |
| 222 |
| 223 return this->onShouldDisableLCD(paint); |
| 224 } |
| 225 |
OLD | NEW |