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