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