public final class

GridDrawables

extends Object
/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.cooliris.media;

import java.util.HashMap;

import javax.microedition.khronos.opengles.GL11;

import com.cooliris.app.App;
import com.cooliris.app.Res;

public final class GridDrawables {
    // The display primitives.
    public static GridQuad sGrid;
    public static GridQuadFrame sFrame;
    public static GridQuad sTextGrid;
    public static GridQuad sSelectedGrid;
    public static GridQuad sVideoGrid;
    public static GridQuad sLocationGrid;
    public static GridQuad sSourceIconGrid;
    public static final GridQuad[] sFullscreenGrid = new GridQuad[3];

    // All the resource Textures.
    private static final int TEXTURE_FRAME = Res.drawable.stack_frame;
    private static final int TEXTURE_GRID_FRAME = Res.drawable.grid_frame;
    private static final int TEXTURE_FRAME_FOCUS = Res.drawable.stack_frame_focus;
    private static final int TEXTURE_FRAME_PRESSED = Res.drawable.stack_frame_gold;
    private static final int TEXTURE_LOCATION = Res.drawable.btn_location_filter_unscaled;
    private static final int TEXTURE_VIDEO = Res.drawable.videooverlay;
    private static final int TEXTURE_CHECKMARK_ON = Res.drawable.grid_check_on;
    private static final int TEXTURE_CHECKMARK_OFF = Res.drawable.grid_check_off;
    private static final int TEXTURE_CAMERA_SMALL = Res.drawable.icon_camera_small_unscaled;
    private static final int TEXTURE_PICASA_SMALL = Res.drawable.icon_picasa_small_unscaled;
    public static final int[] TEXTURE_SPINNER = new int[8];
    private static final int TEXTURE_TRANSPARENT = Res.drawable.transparent;
    private static final int TEXTURE_PLACEHOLDER = Res.drawable.grid_placeholder;

    public Texture mTextureFrame;
    public Texture mTextureGridFrame;
    public Texture mTextureFrameFocus;
    public Texture mTextureFramePressed;
    public Texture mTextureLocation;
    public Texture mTextureVideo;
    public Texture mTextureCheckmarkOn;
    public Texture mTextureCheckmarkOff;
    public Texture mTextureCameraSmall;
    public Texture mTexturePicasaSmall;
    public Texture[] mTextureSpinner = new Texture[8];
    public Texture mTextureTransparent;
    public Texture mTexturePlaceholder;

    // The textures generated from strings.
    public static final HashMap<String, StringTexture> sStringTextureTable = new HashMap<String, StringTexture>(128);

    static {
        // We first populate the spinner textures.
        final int[] textureSpinner = TEXTURE_SPINNER;
        textureSpinner[0] = Res.drawable.ic_spinner1;
        textureSpinner[1] = Res.drawable.ic_spinner2;
        textureSpinner[2] = Res.drawable.ic_spinner3;
        textureSpinner[3] = Res.drawable.ic_spinner4;
        textureSpinner[4] = Res.drawable.ic_spinner5;
        textureSpinner[5] = Res.drawable.ic_spinner6;
        textureSpinner[6] = Res.drawable.ic_spinner7;
        textureSpinner[7] = Res.drawable.ic_spinner8;
    }

    public GridDrawables(final int itemWidth, final int itemHeight) {
        if (sGrid == null) {
            final float height = 1.0f;
            final float width = (float) (height * itemWidth) / (float) itemHeight;
            final float aspectRatio = (float) itemWidth / (float) itemHeight;
            final float oneByAspect = 1.0f / aspectRatio;

            // We create the grid quad.
            sGrid = GridQuad.createGridQuad(width, height, 0, 0, 1.0f, oneByAspect, true);

            // We create the quads used in fullscreen.
            sFullscreenGrid[0] = GridQuad.createGridQuad(width, height, 0, 0, 1.0f, oneByAspect, false);
            sFullscreenGrid[0].setDynamic(true);
            sFullscreenGrid[1] = GridQuad.createGridQuad(width, height, 0, 0, 1.0f, oneByAspect, false);
            sFullscreenGrid[1].setDynamic(true);
            sFullscreenGrid[2] = GridQuad.createGridQuad(width, height, 0, 0, 1.0f, oneByAspect, false);
            sFullscreenGrid[2].setDynamic(true);

            // We create supplementary quads for the checkmarks, video overlay
            // and location button
            float sizeOfSelectedIcon = 32 * App.PIXEL_DENSITY; // In pixels.
            sizeOfSelectedIcon /= itemHeight;
            float sizeOfLocationIcon = 52 * App.PIXEL_DENSITY; // In pixels.
            sizeOfLocationIcon /= itemHeight;
            float sizeOfSourceIcon = 76 * App.PIXEL_DENSITY; // In pixels.
            sizeOfSourceIcon /= itemHeight;
            sSelectedGrid = GridQuad.createGridQuad(sizeOfSelectedIcon, sizeOfSelectedIcon, -0.5f, 0.25f, 1.0f, 1.0f, false);
            sVideoGrid = GridQuad.createGridQuad(sizeOfSelectedIcon, sizeOfSelectedIcon, -0.08f, -0.09f, 1.0f, 1.0f, false);
            sLocationGrid = GridQuad.createGridQuad(sizeOfLocationIcon, sizeOfLocationIcon, 0, 0, 1.0f, 1.0f, false);
            sSourceIconGrid = GridQuad.createGridQuad(sizeOfSourceIcon, sizeOfSourceIcon, 0, 0, 1.0f, 1.0f, false);

            // We create the quad for the text label.
            float seedTextWidth = (App.PIXEL_DENSITY < 1.5f) ? 128.0f : 256.0f;
            float textWidth = (seedTextWidth / (float) itemWidth) * width;
            float textHeightPow2 = (App.PIXEL_DENSITY < 1.5f) ? 32.0f : 64.0f;
            float textHeight = (textHeightPow2 / (float) itemHeight) * height;
            float textOffsetY = 0.0f;
            sTextGrid = GridQuad.createGridQuad(textWidth, textHeight, 0, textOffsetY, 1.0f, 1.0f, false);

            // We finally create the frame around every grid item
            sFrame = GridQuadFrame.createFrame(width, height, itemWidth, itemHeight);
        }
    }

    public void onSurfaceCreated(RenderView view, GL11 gl) {
        // The grid quad.
        sGrid.freeHardwareBuffers(gl);
        sGrid.generateHardwareBuffers(gl);

        // The fullscreen quads.
        sFullscreenGrid[0].freeHardwareBuffers(gl);
        sFullscreenGrid[1].freeHardwareBuffers(gl);
        sFullscreenGrid[2].freeHardwareBuffers(gl);
        sFullscreenGrid[0].generateHardwareBuffers(gl);
        sFullscreenGrid[1].generateHardwareBuffers(gl);
        sFullscreenGrid[2].generateHardwareBuffers(gl);

        // Supplementary quads.
        sSelectedGrid.freeHardwareBuffers(gl);
        sVideoGrid.freeHardwareBuffers(gl);
        sLocationGrid.freeHardwareBuffers(gl);
        sSourceIconGrid.freeHardwareBuffers(gl);
        sSelectedGrid.generateHardwareBuffers(gl);
        sVideoGrid.generateHardwareBuffers(gl);
        sLocationGrid.generateHardwareBuffers(gl);
        sSourceIconGrid.generateHardwareBuffers(gl);

        // Text quads.
        sTextGrid.freeHardwareBuffers(gl);
        sTextGrid.generateHardwareBuffers(gl);

        // Frame mesh.
        sFrame.freeHardwareBuffers(gl);
        sFrame.generateHardwareBuffers(gl);

        // Clear the string table.
        sStringTextureTable.clear();

        // Regenerate all the textures.
        mTextureFrame = view.getResource(TEXTURE_FRAME, false);
        mTextureGridFrame = view.getResource(TEXTURE_GRID_FRAME, false);
        mTextureFrameFocus = view.getResource(TEXTURE_FRAME_FOCUS, false);
        mTextureFramePressed = view.getResource(TEXTURE_FRAME_PRESSED, false);
        mTextureLocation = view.getResource(TEXTURE_LOCATION, false);
        mTextureVideo = view.getResource(TEXTURE_VIDEO, false);
        mTextureCheckmarkOn = view.getResource(TEXTURE_CHECKMARK_ON, false);
        mTextureCheckmarkOff = view.getResource(TEXTURE_CHECKMARK_OFF, false);
        mTextureCameraSmall = view.getResource(TEXTURE_CAMERA_SMALL, false);
        mTexturePicasaSmall = view.getResource(TEXTURE_PICASA_SMALL, false);
        mTextureTransparent = view.getResource(TEXTURE_TRANSPARENT, false);
        mTexturePlaceholder = view.getResource(TEXTURE_PLACEHOLDER, false);
        view.loadTexture(mTextureFrame);
        view.loadTexture(mTextureGridFrame);
        view.loadTexture(mTextureFrameFocus);
        view.loadTexture(mTextureFramePressed);

        mTextureSpinner[0] = view.getResource(Res.drawable.ic_spinner1);
        mTextureSpinner[1] = view.getResource(Res.drawable.ic_spinner2);
        mTextureSpinner[2] = view.getResource(Res.drawable.ic_spinner3);
        mTextureSpinner[3] = view.getResource(Res.drawable.ic_spinner4);
        mTextureSpinner[4] = view.getResource(Res.drawable.ic_spinner5);
        mTextureSpinner[5] = view.getResource(Res.drawable.ic_spinner6);
        mTextureSpinner[6] = view.getResource(Res.drawable.ic_spinner7);
        mTextureSpinner[7] = view.getResource(Res.drawable.ic_spinner8);
    }

    public int getIconForSet(MediaSet set, boolean scaled) {
        // We return the scaled version for HUD rendering and the unscaled
        // version for 3D rendering.
        if (scaled) {
            if (set == null) {
                return Res.drawable.icon_folder_small;
            }
            if (set.mPicasaAlbumId != Shared.INVALID) {
                return Res.drawable.icon_picasa_small;
            } else if (set.mId == LocalDataSource.CAMERA_BUCKET_ID) {
                return Res.drawable.icon_camera_small;
            } else {
                return Res.drawable.icon_folder_small;
            }
        } else {
            if (set == null) {
                return Res.drawable.icon_folder_small_unscaled;
            }
            if (set.mPicasaAlbumId != Shared.INVALID) {
                return Res.drawable.icon_picasa_small_unscaled;
            } else if (set.mId == LocalDataSource.CAMERA_BUCKET_ID) {
                return Res.drawable.icon_camera_small_unscaled;
            } else {
                return Res.drawable.icon_folder_small_unscaled;
            }
        }
    }
}