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 8namespace skia { 9 10BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, 11 bool is_opaque) { 12 SkBitmap bitmap; 13 if (bitmap.tryAllocN32Pixels(width, height, is_opaque)) { 14 // Follow the logic in SkCanvas::createDevice(), initialize the bitmap if it 15 // is not opaque. 16 if (!is_opaque) 17 bitmap.eraseARGB(0, 0, 0, 0); 18 return new BitmapPlatformDevice(bitmap); 19 } 20 return NULL; 21} 22 23BitmapPlatformDevice* BitmapPlatformDevice::CreateAndClear(int width, 24 int height, 25 bool is_opaque) { 26 BitmapPlatformDevice* device = Create(width, height, is_opaque); 27 if (!is_opaque) 28 device->clear(0); 29 return device; 30} 31 32BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, 33 bool is_opaque, 34 uint8_t* data) { 35 SkBitmap bitmap; 36 bitmap.setInfo(SkImageInfo::MakeN32(width, height, 37 is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType)); 38 if (data) 39 bitmap.setPixels(data); 40 else if (!bitmap.tryAllocPixels()) 41 return NULL; 42 43 return new BitmapPlatformDevice(bitmap); 44} 45 46BitmapPlatformDevice::BitmapPlatformDevice(const SkBitmap& bitmap) 47 : SkBitmapDevice(bitmap) { 48 SetPlatformDevice(this, this); 49} 50 51BitmapPlatformDevice::~BitmapPlatformDevice() { 52} 53 54SkBaseDevice* BitmapPlatformDevice::onCreateDevice(const SkImageInfo& info, 55 Usage /*usage*/) { 56 SkASSERT(info.colorType() == kN32_SkColorType); 57 return BitmapPlatformDevice::Create(info.width(), info.height(), 58 info.isOpaque()); 59} 60 61PlatformSurface BitmapPlatformDevice::BeginPlatformPaint() { 62 // TODO(zhenghao): What should we return? The ptr to the address of the 63 // pixels? Maybe this won't be called at all. 64 return accessBitmap(true).getPixels(); 65} 66 67void BitmapPlatformDevice::DrawToNativeContext( 68 PlatformSurface surface, int x, int y, const PlatformRect* src_rect) { 69 // Should never be called on Android. 70 SkASSERT(false); 71} 72 73// PlatformCanvas impl 74 75SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque, 76 uint8_t* data, OnFailureType failureType) { 77 skia::RefPtr<SkBaseDevice> dev = skia::AdoptRef( 78 BitmapPlatformDevice::Create(width, height, is_opaque, data)); 79 return CreateCanvas(dev, failureType); 80} 81 82// Port of PlatformBitmap to android 83PlatformBitmap::~PlatformBitmap() { 84 // Nothing to do. 85} 86 87bool PlatformBitmap::Allocate(int width, int height, bool is_opaque) { 88 if (!bitmap_.tryAllocN32Pixels(width, height, is_opaque)) 89 return false; 90 91 surface_ = bitmap_.getPixels(); 92 return true; 93} 94 95} // namespace skia 96