1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "skia/ext/bitmap_platform_device_skia.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace skia { 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_opaque) { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bitmap; 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (bitmap.tryAllocN32Pixels(width, height, is_opaque)) { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Follow the logic in SkCanvas::createDevice(), initialize the bitmap if it 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not opaque. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_opaque) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.eraseARGB(0, 0, 0, 0); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BitmapPlatformDevice(bitmap); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BitmapPlatformDevice* BitmapPlatformDevice::CreateAndClear(int width, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_opaque) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BitmapPlatformDevice* device = Create(width, height, is_opaque); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_opaque) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device->clear(0); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return device; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_opaque, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* data) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bitmap; 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bitmap.setInfo(SkImageInfo::MakeN32(width, height, 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType)); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.setPixels(data); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (!bitmap.tryAllocPixels()) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BitmapPlatformDevice(bitmap); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BitmapPlatformDevice::BitmapPlatformDevice(const SkBitmap& bitmap) 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : SkBitmapDevice(bitmap) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPlatformDevice(this, this); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BitmapPlatformDevice::~BitmapPlatformDevice() { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SkBaseDevice* BitmapPlatformDevice::onCreateDevice(const SkImageInfo& info, 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Usage /*usage*/) { 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SkASSERT(info.colorType() == kN32_SkColorType); 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return BitmapPlatformDevice::Create(info.width(), info.height(), 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) info.isOpaque()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PlatformSurface BitmapPlatformDevice::BeginPlatformPaint() { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(zhenghao): What should we return? The ptr to the address of the 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pixels? Maybe this won't be called at all. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return accessBitmap(true).getPixels(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BitmapPlatformDevice::DrawToNativeContext( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformSurface surface, int x, int y, const PlatformRect* src_rect) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should never be called on Android. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkASSERT(false); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PlatformCanvas impl 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8_t* data, OnFailureType failureType) { 77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) skia::RefPtr<SkBaseDevice> dev = skia::AdoptRef( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BitmapPlatformDevice::Create(width, height, is_opaque, data)); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CreateCanvas(dev, failureType); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Port of PlatformBitmap to android 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PlatformBitmap::~PlatformBitmap() { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Nothing to do. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PlatformBitmap::Allocate(int width, int height, bool is_opaque) { 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!bitmap_.tryAllocN32Pixels(width, height, is_opaque)) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surface_ = bitmap_.getPixels(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace skia 96