AssetAtlas.cpp revision d5207b2eb9ba520da822d61ff78b539842fc5255
13b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy/* 23b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * Copyright (C) 2013 The Android Open Source Project 33b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * 43b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 53b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * you may not use this file except in compliance with the License. 63b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * You may obtain a copy of the License at 73b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * 83b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 93b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * 103b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * Unless required by applicable law or agreed to in writing, software 113b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 123b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * See the License for the specific language governing permissions and 143b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * limitations under the License. 153b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy */ 163b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 173b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include "AssetAtlas.h" 183b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 193b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <GLES2/gl2ext.h> 203b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guynamespace android { 223b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guynamespace uirenderer { 233b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 243b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy/////////////////////////////////////////////////////////////////////////////// 253b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// Lifecycle 263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy/////////////////////////////////////////////////////////////////////////////// 273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 283b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyvoid AssetAtlas::init(sp<GraphicBuffer> buffer, int* map, int count) { 29877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy if (mImage) { 303b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy return; 313b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 323b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 33877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy mImage = new Image(buffer); 34877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy mTexture = mImage->getTexture(); 353b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 36877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy if (mTexture) { 37877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy mWidth = buffer->getWidth(); 38877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy mHeight = buffer->getHeight(); 393b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 40877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy createEntries(map, count); 41877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy } else { 42d5207b2eb9ba520da822d61ff78b539842fc5255Romain Guy ALOGW("Could not create atlas image"); 43d5207b2eb9ba520da822d61ff78b539842fc5255Romain Guy 44877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy delete mImage; 45d5207b2eb9ba520da822d61ff78b539842fc5255Romain Guy mImage = NULL; 463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy} 483b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyvoid AssetAtlas::terminate() { 50877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy if (mImage) { 51877cfe0e32a845d5a58252b8a6e1f54f95b4379cRomain Guy delete mImage; 52d5207b2eb9ba520da822d61ff78b539842fc5255Romain Guy mImage = NULL; 533b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 543b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (size_t i = 0; i < mEntries.size(); i++) { 553b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy delete mEntries.valueAt(i); 563b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 573b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy mEntries.clear(); 583b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 593b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy mWidth = mHeight = 0; 603b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 613b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy} 623b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 633b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy/////////////////////////////////////////////////////////////////////////////// 643b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// Entries 653b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy/////////////////////////////////////////////////////////////////////////////// 663b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 673b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain GuyAssetAtlas::Entry* AssetAtlas::getEntry(SkBitmap* const bitmap) const { 683b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy ssize_t index = mEntries.indexOfKey(bitmap); 693b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy return index >= 0 ? mEntries.valueAt(index) : NULL; 703b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy} 713b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 723b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain GuyTexture* AssetAtlas::getEntryTexture(SkBitmap* const bitmap) const { 733b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy ssize_t index = mEntries.indexOfKey(bitmap); 743b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy return index >= 0 ? &mEntries.valueAt(index)->texture : NULL; 753b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy} 763b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 773b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy/** 783b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * TODO: This method does not take the rotation flag into account 793b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy */ 803b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyvoid AssetAtlas::createEntries(int* map, int count) { 813b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (int i = 0; i < count; ) { 823b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy SkBitmap* bitmap = (SkBitmap*) map[i++]; 833b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy int x = map[i++]; 843b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy int y = map[i++]; 853b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy bool rotated = map[i++] > 0; 863b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 873b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy // Bitmaps should never be null, we're just extra paranoid 883b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy if (!bitmap) continue; 893b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 903b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy const UvMapper mapper( 913b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy x / (float) mWidth, (x + bitmap->width()) / (float) mWidth, 923b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy y / (float) mHeight, (y + bitmap->height()) / (float) mHeight); 933b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 943b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy Entry* entry = new Entry(bitmap, x, y, rotated, mapper, *this); 953b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy entry->texture.id = mTexture; 963b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy entry->texture.blend = !bitmap->isOpaque(); 973b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy entry->texture.width = bitmap->width(); 983b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy entry->texture.height = bitmap->height(); 993b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy entry->texture.uvMapper = &entry->uvMapper; 1003b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 1013b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy mEntries.add(entry->bitmap, entry); 1023b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 1033b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy} 1043b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 1053b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy}; // namespace uirenderer 1063b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy}; // namespace android 107