1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "skia/ext/bitmap_platform_device_skia.h" 6 #include "skia/ext/platform_canvas.h" 7 8 namespace skia { 9 10 BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, 11 bool is_opaque) { 12 SkBitmap bitmap; 13 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height, 0, 14 is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); 15 if (bitmap.allocPixels()) { 16 // Follow the logic in SkCanvas::createDevice(), initialize the bitmap if it 17 // is not opaque. 18 if (!is_opaque) 19 bitmap.eraseARGB(0, 0, 0, 0); 20 return new BitmapPlatformDevice(bitmap); 21 } 22 return NULL; 23 } 24 25 BitmapPlatformDevice* BitmapPlatformDevice::CreateAndClear(int width, 26 int height, 27 bool is_opaque) { 28 BitmapPlatformDevice* device = Create(width, height, is_opaque); 29 if (!is_opaque) 30 device->accessBitmap(true).eraseARGB(0, 0, 0, 0); 31 return device; 32 } 33 34 BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, 35 bool is_opaque, 36 uint8_t* data) { 37 SkBitmap bitmap; 38 bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height, 0, 39 is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); 40 if (data) 41 bitmap.setPixels(data); 42 else if (!bitmap.allocPixels()) 43 return NULL; 44 45 return new BitmapPlatformDevice(bitmap); 46 } 47 48 BitmapPlatformDevice::BitmapPlatformDevice(const SkBitmap& bitmap) 49 : SkBitmapDevice(bitmap) { 50 SetPlatformDevice(this, this); 51 } 52 53 BitmapPlatformDevice::~BitmapPlatformDevice() { 54 } 55 56 SkBaseDevice* BitmapPlatformDevice::onCreateCompatibleDevice( 57 SkBitmap::Config config, int width, int height, bool isOpaque, 58 Usage /*usage*/) { 59 SkASSERT(config == SkBitmap::kARGB_8888_Config); 60 return BitmapPlatformDevice::Create(width, height, isOpaque); 61 } 62 63 PlatformSurface BitmapPlatformDevice::BeginPlatformPaint() { 64 // TODO(zhenghao): What should we return? The ptr to the address of the 65 // pixels? Maybe this won't be called at all. 66 return accessBitmap(true).getPixels(); 67 } 68 69 void BitmapPlatformDevice::DrawToNativeContext( 70 PlatformSurface surface, int x, int y, const PlatformRect* src_rect) { 71 // Should never be called on Android. 72 SkASSERT(false); 73 } 74 75 // PlatformCanvas impl 76 77 SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque, 78 uint8_t* data, OnFailureType failureType) { 79 skia::RefPtr<SkBaseDevice> dev = skia::AdoptRef( 80 BitmapPlatformDevice::Create(width, height, is_opaque, data)); 81 return CreateCanvas(dev, failureType); 82 } 83 84 // Port of PlatformBitmap to android 85 PlatformBitmap::~PlatformBitmap() { 86 // Nothing to do. 87 } 88 89 bool PlatformBitmap::Allocate(int width, int height, bool is_opaque) { 90 bitmap_.setConfig(SkBitmap::kARGB_8888_Config, width, height, 0, 91 is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); 92 if (!bitmap_.allocPixels()) 93 return false; 94 95 surface_ = bitmap_.getPixels(); 96 return true; 97 } 98 99 } // namespace skia 100