blob: 1772effb911b8f21f86a3b3fef4dc943193b2540 [file] [log] [blame]
Romain Guy3b748a42013-04-17 18:54:38 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_HWUI_ASSET_ATLAS_H
18#define ANDROID_HWUI_ASSET_ATLAS_H
19
20#include <GLES2/gl2.h>
21
Romain Guy3b748a42013-04-17 18:54:38 -070022#include <ui/GraphicBuffer.h>
23
24#include <utils/KeyedVector.h>
25
26#include <cutils/compiler.h>
27
28#include <SkBitmap.h>
29
30#include "Texture.h"
31#include "UvMapper.h"
32
33namespace android {
34namespace uirenderer {
35
Romain Guy8aa195d2013-06-04 18:00:09 -070036class Caches;
Tom Hudson2dc236b2014-10-15 15:46:42 -040037class Image;
Romain Guy8aa195d2013-06-04 18:00:09 -070038
Romain Guy3b748a42013-04-17 18:54:38 -070039/**
40 * An asset atlas holds a collection of framework bitmaps in a single OpenGL
41 * texture. Each bitmap is associated with a location, defined in pixels,
42 * inside the atlas. The atlas is generated by the framework and bound as
43 * an external texture using the EGLImageKHR extension.
44 */
45class AssetAtlas {
46public:
47 /**
48 * Entry representing the position and rotation of a
49 * bitmap inside the atlas.
50 */
John Reck7809f832015-04-17 20:45:19 +000051 struct Entry {
52 /**
53 * The bitmap that generated this atlas entry.
54 */
55 SkBitmap* bitmap;
56
57 /**
58 * Location of the bitmap inside the atlas, in pixels.
59 */
60 int x;
61 int y;
62
63 /**
64 * If set, the bitmap is rotated 90 degrees (clockwise)
65 * inside the atlas.
66 */
67 bool rotated;
68
Romain Guya404e162013-05-24 16:19:19 -070069 /*
70 * A "virtual texture" object that represents the texture
71 * this entry belongs to. This texture should never be
72 * modified.
73 */
74 Texture* texture;
75
Romain Guy3b748a42013-04-17 18:54:38 -070076 /**
77 * Maps texture coordinates in the [0..1] range into the
78 * correct range to sample this entry from the atlas.
79 */
80 const UvMapper uvMapper;
81
82 /**
John Reck7809f832015-04-17 20:45:19 +000083 * Atlas this entry belongs to.
84 */
85 const AssetAtlas& atlas;
86
87 /**
Romain Guy7f6d6b02013-08-06 13:49:28 -070088 * Unique identifier used to merge bitmaps and 9-patches stored
89 * in the atlas.
90 */
91 const void* getMergeId() const {
92 return texture->blend ? &atlas.mBlendKey : &atlas.mOpaqueKey;
93 }
94
Romain Guy3b748a42013-04-17 18:54:38 -070095 private:
John Reck7809f832015-04-17 20:45:19 +000096 Entry(SkBitmap* bitmap, int x, int y, bool rotated,
97 Texture* texture, const UvMapper& mapper, const AssetAtlas& atlas):
98 bitmap(bitmap), x(x), y(y), rotated(rotated),
99 texture(texture), uvMapper(mapper), atlas(atlas) {
Romain Guy7f6d6b02013-08-06 13:49:28 -0700100 }
Romain Guya404e162013-05-24 16:19:19 -0700101
102 ~Entry() {
103 delete texture;
104 }
Romain Guy3b748a42013-04-17 18:54:38 -0700105
106 friend class AssetAtlas;
107 };
108
Chris Craike84a2082014-12-22 14:28:49 -0800109 AssetAtlas(): mTexture(nullptr), mImage(nullptr),
Romain Guy7f6d6b02013-08-06 13:49:28 -0700110 mBlendKey(true), mOpaqueKey(false) { }
Romain Guy3b748a42013-04-17 18:54:38 -0700111 ~AssetAtlas() { terminate(); }
112
113 /**
114 * Initializes the atlas with the specified buffer and
115 * map. The buffer is a gralloc'd texture that will be
116 * used as an EGLImage. The map is a list of SkBitmap*
117 * and their (x, y) positions as well as their rotation
118 * flags.
119 *
120 * This method returns immediately if the atlas is already
121 * initialized. To re-initialize the atlas, you must
122 * first call terminate().
123 */
Ashok Bhat17ab38f2014-01-27 16:00:23 +0000124 ANDROID_API void init(sp<GraphicBuffer> buffer, int64_t* map, int count);
Romain Guy3b748a42013-04-17 18:54:38 -0700125
126 /**
127 * Destroys the atlas texture. This object can be
128 * re-initialized after calling this method.
129 *
130 * After calling this method, the width, height
131 * and texture are set to 0.
132 */
John Reckebd52612014-12-10 16:47:36 -0800133 void terminate();
Romain Guy3b748a42013-04-17 18:54:38 -0700134
135 /**
136 * Returns the width of this atlas in pixels.
137 * Can return 0 if the atlas is not initialized.
138 */
139 uint32_t getWidth() const {
Romain Guya404e162013-05-24 16:19:19 -0700140 return mTexture ? mTexture->width : 0;
Romain Guy3b748a42013-04-17 18:54:38 -0700141 }
142
143 /**
144 * Returns the height of this atlas in pixels.
145 * Can return 0 if the atlas is not initialized.
146 */
147 uint32_t getHeight() const {
Romain Guya404e162013-05-24 16:19:19 -0700148 return mTexture ? mTexture->height : 0;
Romain Guy3b748a42013-04-17 18:54:38 -0700149 }
150
151 /**
152 * Returns the OpenGL name of the texture backing this atlas.
153 * Can return 0 if the atlas is not initialized.
154 */
155 GLuint getTexture() const {
Romain Guya404e162013-05-24 16:19:19 -0700156 return mTexture ? mTexture->id : 0;
Romain Guy3b748a42013-04-17 18:54:38 -0700157 }
158
159 /**
160 * Returns the entry in the atlas associated with the specified
161 * bitmap. If the bitmap is not in the atlas, return NULL.
162 */
Chris Craikd218a922014-01-02 17:13:34 -0800163 Entry* getEntry(const SkBitmap* bitmap) const;
Romain Guy3b748a42013-04-17 18:54:38 -0700164
165 /**
166 * Returns the texture for the atlas entry associated with the
167 * specified bitmap. If the bitmap is not in the atlas, return NULL.
168 */
Chris Craikd218a922014-01-02 17:13:34 -0800169 Texture* getEntryTexture(const SkBitmap* bitmap) const;
Romain Guy3b748a42013-04-17 18:54:38 -0700170
171private:
Ashok Bhat17ab38f2014-01-27 16:00:23 +0000172 void createEntries(Caches& caches, int64_t* map, int count);
John Reckebd52612014-12-10 16:47:36 -0800173 void updateTextureId();
Romain Guy3b748a42013-04-17 18:54:38 -0700174
Romain Guya404e162013-05-24 16:19:19 -0700175 Texture* mTexture;
Romain Guy877cfe02013-05-02 17:36:28 -0700176 Image* mImage;
Romain Guy3b748a42013-04-17 18:54:38 -0700177
Romain Guy7f6d6b02013-08-06 13:49:28 -0700178 const bool mBlendKey;
179 const bool mOpaqueKey;
180
John Reck7809f832015-04-17 20:45:19 +0000181 KeyedVector<const SkBitmap*, Entry*> mEntries;
Romain Guy3b748a42013-04-17 18:54:38 -0700182}; // class AssetAtlas
183
184}; // namespace uirenderer
185}; // namespace android
186
187#endif // ANDROID_HWUI_ASSET_ATLAS_H