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#ifndef CC_RESOURCES_UI_RESOURCE_BITMAP_H_
6#define CC_RESOURCES_UI_RESOURCE_BITMAP_H_
7
8#include "base/memory/ref_counted.h"
9#include "base/memory/scoped_ptr.h"
10#include "cc/base/cc_export.h"
11#include "skia/ext/refptr.h"
12#include "third_party/skia/include/core/SkPixelRef.h"
13#include "third_party/skia/include/core/SkTypes.h"
14#include "ui/gfx/size.h"
15
16class SkBitmap;
17
18namespace cc {
19
20class ETC1PixelRef;
21
22// A bitmap class that contains a ref-counted reference to a SkPixelRef that
23// holds the content of the bitmap (cannot use SkBitmap because of ETC1).
24// Thread-safety (by ways of SkPixelRef) ensures that both main and impl threads
25// can hold references to the bitmap and that asynchronous uploads are allowed.
26class CC_EXPORT UIResourceBitmap {
27 public:
28  enum UIResourceFormat {
29    RGBA8,
30    ETC1
31  };
32  enum UIResourceWrapMode {
33    CLAMP_TO_EDGE,
34    REPEAT
35  };
36
37  gfx::Size GetSize() const { return size_; }
38  UIResourceFormat GetFormat() const { return format_; }
39  UIResourceWrapMode GetWrapMode() const { return wrap_mode_; }
40  void SetWrapMode(UIResourceWrapMode wrap_mode) { wrap_mode_ = wrap_mode; }
41  bool GetOpaque() const { return opaque_; }
42  void SetOpaque(bool opaque) { opaque_ = opaque; }
43
44  // User must ensure that |skbitmap| is immutable.  The SkBitmap Format should
45  // be 32-bit RGBA.
46  explicit UIResourceBitmap(const SkBitmap& skbitmap);
47
48  UIResourceBitmap(const skia::RefPtr<ETC1PixelRef>& etc1_pixel_ref,
49                   gfx::Size size);
50
51  ~UIResourceBitmap();
52
53 private:
54  friend class AutoLockUIResourceBitmap;
55  void Create(const skia::RefPtr<SkPixelRef>& pixel_ref,
56              UIResourceFormat format,
57              gfx::Size size);
58
59  skia::RefPtr<SkPixelRef> pixel_ref_;
60  UIResourceFormat format_;
61  UIResourceWrapMode wrap_mode_;
62  gfx::Size size_;
63  bool opaque_;
64};
65
66class CC_EXPORT AutoLockUIResourceBitmap {
67 public:
68  explicit AutoLockUIResourceBitmap(const UIResourceBitmap& bitmap);
69  ~AutoLockUIResourceBitmap();
70  const uint8_t* GetPixels() const;
71
72 private:
73  const UIResourceBitmap& bitmap_;
74};
75
76}  // namespace cc
77
78#endif  // CC_RESOURCES_UI_RESOURCE_BITMAP_H_
79