15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#ifndef CONTENT_RENDERER_PEPPER_PPB_IMAGE_DATA_IMPL_H_
6bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#define CONTENT_RENDERER_PEPPER_PPB_IMAGE_DATA_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
10bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/common/content_export.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_image_data.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_image_data_shared.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_image_data_api.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkCanvas;
19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass TransportDIB;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochnamespace base {
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass SharedMemory;
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
2558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochclass CONTENT_EXPORT PPB_ImageData_Impl
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : public ppapi::Resource,
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      public ppapi::PPB_ImageData_Shared,
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      public NON_EXPORTED_BASE(ppapi::thunk::PPB_ImageData_API) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We delegate most of our implementation to a back-end class that either uses
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a PlatformCanvas (for most trusted stuff) or bare shared memory (for use by
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // NaCl, or trusted plugins when the PlatformCanvas isn't needed). This makes
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // it cheap & easy to implement Swap.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Backend {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Backend() {};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool Init(PPB_ImageData_Impl* impl, PP_ImageDataFormat format,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int width, int height, bool init_to_zero) = 0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool IsMapped() const = 0;
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    virtual TransportDIB* GetTransportDIB() const = 0;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void* Map() = 0;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void Unmap() = 0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) = 0;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual SkCanvas* GetPlatformCanvas() = 0;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual SkCanvas* GetCanvas() = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual const SkBitmap* GetMappedBitmap() const = 0;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If you call this constructor, you must also call Init before use. Normally
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // you should use the static Create function, but this constructor is needed
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for some internal uses of ImageData (like Graphics2D).
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PPB_ImageData_Impl(PP_Instance instance,
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                     PPB_ImageData_Shared::ImageDataType type);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Constructor used for unittests. The ImageData is always allocated locally.
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct ForTest {};
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PPB_ImageData_Impl(PP_Instance instance,
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     ForTest);
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Init(PP_ImageDataFormat format,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int width, int height,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            bool init_to_zero);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static PP_Resource Create(PP_Instance pp_instance,
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            PPB_ImageData_Shared::ImageDataType type,
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            PP_ImageDataFormat format,
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            const PP_Size& size,
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            PP_Bool init_to_zero);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width() const { return width_; }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int height() const { return height_; }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the image format.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_ImageDataFormat format() const { return format_; }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if this image is mapped. False means that the image is either
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalid or not mapped. See ImageDataAutoMapper below.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsMapped() const;
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  TransportDIB* GetTransportDIB() const;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resource override.
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual ppapi::thunk::PPB_ImageData_API* AsPPB_ImageData_API() OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PPB_ImageData_API implementation.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Bool Describe(PP_ImageDataDesc* desc) OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void* Map() OVERRIDE;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Unmap() OVERRIDE;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual SkCanvas* GetPlatformCanvas() OVERRIDE;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SkCanvas* GetCanvas() OVERRIDE;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetIsCandidateForReuse() OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SkBitmap* GetMappedBitmap() const;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
98bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  virtual ~PPB_ImageData_Impl();
99bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_ImageDataFormat format_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int height_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Backend> backend_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PPB_ImageData_Impl);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageDataPlatformBackend : public PPB_ImageData_Impl::Backend {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |is_browser_allocated| indicates whether the backing shared memory should
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // be allocated by the browser process.
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ImageDataPlatformBackend(bool is_browser_allocated);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ImageDataPlatformBackend();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PPB_ImageData_Impl::Backend implementation.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Init(PPB_ImageData_Impl* impl, PP_ImageDataFormat format,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    int width, int height, bool init_to_zero) OVERRIDE;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsMapped() const OVERRIDE;
119558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual TransportDIB* GetTransportDIB() const OVERRIDE;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void* Map() OVERRIDE;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Unmap() OVERRIDE;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual SkCanvas* GetPlatformCanvas() OVERRIDE;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SkCanvas* GetCanvas() OVERRIDE;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const SkBitmap* GetMappedBitmap() const OVERRIDE;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will be NULL before initialization, and if this PPB_ImageData_Impl is
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // swapped with another.
130558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int width_;
131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int height_;
132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<TransportDIB> dib_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool is_browser_allocated_;
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When the device is mapped, this is the image. Null when umapped.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SkCanvas> mapped_canvas_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ImageDataPlatformBackend);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ImageDataSimpleBackend : public PPB_ImageData_Impl::Backend {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ImageDataSimpleBackend();
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~ImageDataSimpleBackend();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PPB_ImageData_Impl::Backend implementation.
148bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  virtual bool Init(PPB_ImageData_Impl* impl, PP_ImageDataFormat format,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int width, int height, bool init_to_zero) OVERRIDE;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsMapped() const OVERRIDE;
151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual TransportDIB* GetTransportDIB() const OVERRIDE;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void* Map() OVERRIDE;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Unmap() OVERRIDE;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual SkCanvas* GetPlatformCanvas() OVERRIDE;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SkCanvas* GetCanvas() OVERRIDE;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const SkBitmap* GetMappedBitmap() const OVERRIDE;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::SharedMemory> shared_memory_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // skia_bitmap_ is backed by shared_memory_.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap skia_bitmap_;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SkCanvas> skia_canvas_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 map_count_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ImageDataSimpleBackend);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages mapping an image resource if necessary. Use this to ensure the
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// image is mapped. The destructor will put the image back into the previous
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state. You must check is_valid() to make sure the image was successfully
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mapped before using it.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example:
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   ImageDataAutoMapper mapper(image_data);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   if (!mapper.is_valid())
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     return utter_failure;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   image_data->mapped_canvas()->blah();  // Guaranteed valid.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImageDataAutoMapper {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ImageDataAutoMapper(PPB_ImageData_Impl* image_data)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : image_data_(image_data) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (image_data_->IsMapped()) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_valid_ = true;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      needs_unmap_ = false;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_valid_ = needs_unmap_ = !!image_data_->Map();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ImageDataAutoMapper() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (needs_unmap_)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_data_->Unmap();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check this to see if the image was successfully mapped. If this is false,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the image could not be mapped and is unusable.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid() const { return is_valid_; }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PPB_ImageData_Impl* image_data_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool needs_unmap_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ImageDataAutoMapper);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}  // namespace content
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif  // CONTENT_RENDERER_PEPPER_PPB_IMAGE_DATA_IMPL_H_
211