| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "skia/ext/bitmap_platform_device_mac.h" | 5 #include "skia/ext/bitmap_platform_device_mac.h" |
| 6 | 6 |
| 7 #import <ApplicationServices/ApplicationServices.h> | 7 #import <ApplicationServices/ApplicationServices.h> |
| 8 #include <time.h> | 8 #include <time.h> |
| 9 | 9 |
| 10 #include "base/mac/mac_util.h" | 10 #include "base/mac/mac_util.h" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 } | 106 } |
| 107 | 107 |
| 108 | 108 |
| 109 // We use this static factory function instead of the regular constructor so | 109 // We use this static factory function instead of the regular constructor so |
| 110 // that we can create the pixel data before calling the constructor. This is | 110 // that we can create the pixel data before calling the constructor. This is |
| 111 // required so that we can call the base class' constructor with the pixel | 111 // required so that we can call the base class' constructor with the pixel |
| 112 // data. | 112 // data. |
| 113 BitmapPlatformDevice* BitmapPlatformDevice::Create(CGContextRef context, | 113 BitmapPlatformDevice* BitmapPlatformDevice::Create(CGContextRef context, |
| 114 int width, | 114 int width, |
| 115 int height, | 115 int height, |
| 116 bool is_opaque) { | 116 int flags) { |
| 117 SkBitmap bitmap; | 117 SkBitmap bitmap; |
| 118 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); | 118 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height); |
| 119 if (bitmap.allocPixels() != true) | 119 if (bitmap.allocPixels() != true) |
| 120 return NULL; | 120 return NULL; |
| 121 | 121 |
| 122 void* data = NULL; | 122 void* data = NULL; |
| 123 if (context) { | 123 if (context) { |
| 124 data = CGBitmapContextGetData(context); | 124 data = CGBitmapContextGetData(context); |
| 125 bitmap.setPixels(data); | 125 bitmap.setPixels(data); |
| 126 } else { | 126 } else { |
| 127 data = bitmap.getPixels(); | 127 data = bitmap.getPixels(); |
| 128 | 128 |
| 129 // Note: The Windows implementation clears the Bitmap later on. | 129 // Note: The Windows implementation clears the Bitmap later on. |
| 130 // This bears mentioning since removal of this line makes the | 130 // This bears mentioning since removal of this line makes the |
| 131 // unit tests only fail periodically (or when MallocPreScribble is set). | 131 // unit tests only fail periodically (or when MallocPreScribble is set). |
| 132 bitmap.eraseARGB(0, 0, 0, 0); | 132 if (flags & FLAGS_INITIALIZED) |
| 133 bitmap.eraseARGB(0, 0, 0, 0); |
| 133 } | 134 } |
| 134 | 135 |
| 135 bitmap.setIsOpaque(is_opaque); | 136 bitmap.setIsOpaque(flags & FLAGS_OPAQUE); |
| 136 | 137 |
| 137 // If we were given data, then don't clobber it! | 138 // If we were given data, then don't clobber it! |
| 138 #ifndef NDEBUG | 139 #ifndef NDEBUG |
| 139 if (!context && is_opaque) { | 140 if (!context && (flags & FLAGS_OPAQUE)) { |
| 140 // To aid in finding bugs, we set the background color to something | 141 // To aid in finding bugs, we set the background color to something |
| 141 // obviously wrong so it will be noticable when it is not cleared | 142 // obviously wrong so it will be noticable when it is not cleared |
| 142 bitmap.eraseARGB(255, 0, 255, 128); // bright bluish green | 143 bitmap.eraseARGB(255, 0, 255, 128); // bright bluish green |
| 143 } | 144 } |
| 144 #endif | 145 #endif |
| 145 | 146 |
| 146 if (!context) { | 147 if (!context) { |
| 147 context = CGContextForData(data, width, height); | 148 context = CGContextForData(data, width, height); |
| 148 if (!context) | 149 if (!context) |
| 149 return NULL; | 150 return NULL; |
| 150 } else | 151 } else |
| 151 CGContextRetain(context); | 152 CGContextRetain(context); |
| 152 | 153 |
| 153 BitmapPlatformDevice* rv = new BitmapPlatformDevice( | 154 BitmapPlatformDevice* rv = new BitmapPlatformDevice( |
| 154 new BitmapPlatformDeviceData(context), bitmap); | 155 new BitmapPlatformDeviceData(context), bitmap); |
| 155 | 156 |
| 156 // The device object took ownership of the graphics context with its own | 157 // The device object took ownership of the graphics context with its own |
| 157 // CGContextRetain call. | 158 // CGContextRetain call. |
| 158 CGContextRelease(context); | 159 CGContextRelease(context); |
| 159 | 160 |
| 160 return rv; | 161 return rv; |
| 161 } | 162 } |
| 162 | 163 |
| 163 BitmapPlatformDevice* BitmapPlatformDevice::CreateWithData(uint8_t* data, | 164 BitmapPlatformDevice* BitmapPlatformDevice::CreateWithData(uint8_t* data, |
| 164 int width, | 165 int width, |
| 165 int height, | 166 int height, |
| 166 bool is_opaque) { | 167 int flags) { |
| 167 CGContextRef context = NULL; | 168 CGContextRef context = NULL; |
| 168 if (data) | 169 if (data) |
| 169 context = CGContextForData(data, width, height); | 170 context = CGContextForData(data, width, height); |
| 170 | 171 |
| 171 BitmapPlatformDevice* rv = Create(context, width, height, is_opaque); | 172 BitmapPlatformDevice* rv = Create(context, width, height, flags); |
| 172 | 173 |
| 173 // The device object took ownership of the graphics context with its own | 174 // The device object took ownership of the graphics context with its own |
| 174 // CGContextRetain call. | 175 // CGContextRetain call. |
| 175 if (context) | 176 if (context) |
| 176 CGContextRelease(context); | 177 CGContextRelease(context); |
| 177 | 178 |
| 178 return rv; | 179 return rv; |
| 179 } | 180 } |
| 180 | 181 |
| 181 // The device will own the bitmap, which corresponds to also owning the pixel | 182 // The device will own the bitmap, which corresponds to also owning the pixel |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 | 236 |
| 236 const SkBitmap& BitmapPlatformDevice::onAccessBitmap(SkBitmap* bitmap) { | 237 const SkBitmap& BitmapPlatformDevice::onAccessBitmap(SkBitmap* bitmap) { |
| 237 // Not needed in CoreGraphics | 238 // Not needed in CoreGraphics |
| 238 return *bitmap; | 239 return *bitmap; |
| 239 } | 240 } |
| 240 | 241 |
| 241 SkDevice* BitmapPlatformDevice::onCreateCompatibleDevice( | 242 SkDevice* BitmapPlatformDevice::onCreateCompatibleDevice( |
| 242 SkBitmap::Config config, int width, int height, bool isOpaque, | 243 SkBitmap::Config config, int width, int height, bool isOpaque, |
| 243 Usage /*usage*/) { | 244 Usage /*usage*/) { |
| 244 SkASSERT(config == SkBitmap::kARGB_8888_Config); | 245 SkASSERT(config == SkBitmap::kARGB_8888_Config); |
| 245 return BitmapPlatformDevice::Create(NULL, width, height, isOpaque); | 246 return BitmapPlatformDevice::Create(NULL, width, height, |
| 247 GetDefaultFlags(isOpaque)); |
| 246 } | 248 } |
| 247 | 249 |
| 248 } // namespace skia | 250 } // namespace skia |
| OLD | NEW |