Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/core/SkDevice.cpp

Issue 16410009: Add an option to create unpremultiplied bitmaps. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
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"
(...skipping 12 matching lines...) Expand all
23 do { if (paint.isNoDrawAnnotation()) { return; } } while (0) 23 do { if (paint.isNoDrawAnnotation()) { return; } } while (0)
24 24
25 /////////////////////////////////////////////////////////////////////////////// 25 ///////////////////////////////////////////////////////////////////////////////
26 26
27 SkDevice::SkDevice(const SkBitmap& bitmap) 27 SkDevice::SkDevice(const SkBitmap& bitmap)
28 : fBitmap(bitmap), fLeakyProperties(SkDeviceProperties::MakeDefault()) 28 : fBitmap(bitmap), fLeakyProperties(SkDeviceProperties::MakeDefault())
29 #ifdef SK_DEBUG 29 #ifdef SK_DEBUG
30 , fAttachedToCanvas(false) 30 , fAttachedToCanvas(false)
31 #endif 31 #endif
32 { 32 {
33 SkASSERT(bitmap.config() != SkBitmap::kIndex8_Config);
34 SkASSERT(bitmap.premultiplied());
33 fOrigin.setZero(); 35 fOrigin.setZero();
34 fMetaData = NULL; 36 fMetaData = NULL;
35 } 37 }
36 38
37 SkDevice::SkDevice(const SkBitmap& bitmap, const SkDeviceProperties& devicePrope rties) 39 SkDevice::SkDevice(const SkBitmap& bitmap, const SkDeviceProperties& devicePrope rties)
38 : fBitmap(bitmap), fLeakyProperties(deviceProperties) 40 : fBitmap(bitmap), fLeakyProperties(deviceProperties)
39 #ifdef SK_DEBUG 41 #ifdef SK_DEBUG
40 , fAttachedToCanvas(false) 42 , fAttachedToCanvas(false)
41 #endif 43 #endif
42 { 44 {
45 SkASSERT(bitmap.config() != SkBitmap::kIndex8_Config);
46 SkASSERT(bitmap.premultiplied());
43 fOrigin.setZero(); 47 fOrigin.setZero();
44 fMetaData = NULL; 48 fMetaData = NULL;
45 } 49 }
46 50
47 SkDevice::SkDevice(SkBitmap::Config config, int width, int height, bool isOpaque ) 51 SkDevice::SkDevice(SkBitmap::Config config, int width, int height, bool isOpaque )
48 : fLeakyProperties(SkDeviceProperties::MakeDefault()) 52 : fLeakyProperties(SkDeviceProperties::MakeDefault())
49 #ifdef SK_DEBUG 53 #ifdef SK_DEBUG
50 , fAttachedToCanvas(false) 54 , fAttachedToCanvas(false)
51 #endif 55 #endif
52 { 56 {
53 fOrigin.setZero(); 57 fOrigin.setZero();
54 fMetaData = NULL; 58 fMetaData = NULL;
55 59
60 if (SkBitmap::kIndex8_Config == config) {
61 config = SkBitmap::kARGB_8888_Config;
62 }
56 fBitmap.setConfig(config, width, height); 63 fBitmap.setConfig(config, width, height);
57 fBitmap.allocPixels(); 64 fBitmap.allocPixels();
58 fBitmap.setIsOpaque(isOpaque); 65 fBitmap.setIsOpaque(isOpaque);
59 if (!isOpaque) { 66 if (!isOpaque) {
60 fBitmap.eraseColor(SK_ColorTRANSPARENT); 67 fBitmap.eraseColor(SK_ColorTRANSPARENT);
61 } 68 }
62 } 69 }
63 70
64 SkDevice::SkDevice(SkBitmap::Config config, int width, int height, bool isOpaque , 71 SkDevice::SkDevice(SkBitmap::Config config, int width, int height, bool isOpaque ,
65 const SkDeviceProperties& deviceProperties) 72 const SkDeviceProperties& deviceProperties)
66 : fLeakyProperties(deviceProperties) 73 : fLeakyProperties(deviceProperties)
67 #ifdef SK_DEBUG 74 #ifdef SK_DEBUG
68 , fAttachedToCanvas(false) 75 , fAttachedToCanvas(false)
69 #endif 76 #endif
70 { 77 {
71 fOrigin.setZero(); 78 fOrigin.setZero();
72 fMetaData = NULL; 79 fMetaData = NULL;
73 80
81 if (SkBitmap::kIndex8_Config == config) {
82 config = SkBitmap::kARGB_8888_Config;
83 }
74 fBitmap.setConfig(config, width, height); 84 fBitmap.setConfig(config, width, height);
75 fBitmap.allocPixels(); 85 fBitmap.allocPixels();
76 fBitmap.setIsOpaque(isOpaque); 86 fBitmap.setIsOpaque(isOpaque);
77 if (!isOpaque) { 87 if (!isOpaque) {
78 fBitmap.eraseColor(SK_ColorTRANSPARENT); 88 fBitmap.eraseColor(SK_ColorTRANSPARENT);
79 } 89 }
80 } 90 }
81 91
82 SkDevice::~SkDevice() { 92 SkDevice::~SkDevice() {
83 delete fMetaData; 93 delete fMetaData;
84 } 94 }
85 95
86 void SkDevice::replaceBitmapBackendForRasterSurface(const SkBitmap& bm) { 96 void SkDevice::replaceBitmapBackendForRasterSurface(const SkBitmap& bm) {
97 SkASSERT(bm.config() != SkBitmap::kIndex8_Config);
98 SkASSERT(bm.premultiplied());
87 SkASSERT(bm.width() == fBitmap.width()); 99 SkASSERT(bm.width() == fBitmap.width());
88 SkASSERT(bm.height() == fBitmap.height()); 100 SkASSERT(bm.height() == fBitmap.height());
89 fBitmap = bm; // intent is to use bm's pixelRef (and rowbytes/config) 101 fBitmap = bm; // intent is to use bm's pixelRef (and rowbytes/config)
90 fBitmap.lockPixels(); 102 fBitmap.lockPixels();
91 } 103 }
92 104
93 SkDevice* SkDevice::createCompatibleDevice(SkBitmap::Config config, 105 SkDevice* SkDevice::createCompatibleDevice(SkBitmap::Config config,
94 int width, int height, 106 int width, int height,
95 bool isOpaque) { 107 bool isOpaque) {
96 return this->onCreateCompatibleDevice(config, width, height, 108 return this->onCreateCompatibleDevice(config, width, height,
97 isOpaque, kGeneral_Usage); 109 isOpaque, kGeneral_Usage);
98 } 110 }
99 111
100 SkDevice* SkDevice::createCompatibleDeviceForSaveLayer(SkBitmap::Config config, 112 SkDevice* SkDevice::createCompatibleDeviceForSaveLayer(SkBitmap::Config config,
101 int width, int height, 113 int width, int height,
102 bool isOpaque) { 114 bool isOpaque) {
103 return this->onCreateCompatibleDevice(config, width, height, 115 return this->onCreateCompatibleDevice(config, width, height,
104 isOpaque, kSaveLayer_Usage); 116 isOpaque, kSaveLayer_Usage);
105 } 117 }
106 118
107 SkDevice* SkDevice::onCreateCompatibleDevice(SkBitmap::Config config, 119 SkDevice* SkDevice::onCreateCompatibleDevice(SkBitmap::Config config,
108 int width, int height, 120 int width, int height,
109 bool isOpaque, 121 bool isOpaque,
110 Usage usage) { 122 Usage usage) {
123 if (SkBitmap::kIndex8_Config == config) {
124 config = SkBitmap::kARGB_8888_Config;
125 }
111 return SkNEW_ARGS(SkDevice,(config, width, height, isOpaque, fLeakyPropertie s)); 126 return SkNEW_ARGS(SkDevice,(config, width, height, isOpaque, fLeakyPropertie s));
112 } 127 }
113 128
114 SkMetaData& SkDevice::getMetaData() { 129 SkMetaData& SkDevice::getMetaData() {
115 // metadata users are rare, so we lazily allocate it. If that changes we 130 // metadata users are rare, so we lazily allocate it. If that changes we
116 // can decide to just make it a field in the device (rather than a ptr) 131 // can decide to just make it a field in the device (rather than a ptr)
117 if (NULL == fMetaData) { 132 if (NULL == fMetaData) {
118 fMetaData = new SkMetaData; 133 fMetaData = new SkMetaData;
119 } 134 }
120 return *fMetaData; 135 return *fMetaData;
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 paint.getStyle() != SkPaint::kFill_Style || 563 paint.getStyle() != SkPaint::kFill_Style ||
549 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) { 564 !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) {
550 // turn off lcd 565 // turn off lcd
551 flags->fFlags = paint.getFlags() & ~SkPaint::kLCDRenderText_Flag; 566 flags->fFlags = paint.getFlags() & ~SkPaint::kLCDRenderText_Flag;
552 flags->fHinting = paint.getHinting(); 567 flags->fHinting = paint.getHinting();
553 return true; 568 return true;
554 } 569 }
555 // we're cool with the paint as is 570 // we're cool with the paint as is
556 return false; 571 return false;
557 } 572 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698