198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2012 The Android Open Source Project
398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License.
698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at
798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software
1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and
1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License.
1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */
1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript;
1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.io.IOException;
2098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.io.InputStream;
2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.content.res.Resources;
2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.content.res.AssetManager;
2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.graphics.Bitmap;
2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.graphics.BitmapFactory;
2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log;
2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.TypedValue;
2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>
3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Memory allocation class for renderscript.  An allocation combines a
3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * {@link android.renderscript.Type} with the memory to provide storage for user data and objects.
3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * This implies that all memory in Renderscript is typed.
3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </p>
3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>Allocations are the primary way data moves into and out of scripts. Memory is user
3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * synchronized and it's possible for allocations to exist in multiple memory spaces
3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * concurrently. Currently those spaces are:</p>
3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <ul>
3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <li>Script: accessable by RS scripts.</li>
4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <li>Graphics Texture: accessable as a graphics texture.</li>
4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <li>Graphics Vertex: accessable as graphical vertex data.</li>
4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <li>Graphics Constants: Accessable as constants in user shaders</li>
4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </ul>
4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </p>
4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>
4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * For example, when creating a allocation for a texture, the user can
4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * specify its memory spaces as both script and textures. This means that it can both
4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * be used as script binding and as a GPU texture for rendering. To maintain
4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * synchronization if a script modifies an allocation used by other targets it must
5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * call a synchronizing function to push the updates to the memory, otherwise the results
5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * are undefined.
5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </p>
5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>By default, Android system side updates are always applied to the script accessable
5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * memory. If this is not present, they are then applied to the various HW
5598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * memory types.  A {@link android.renderscript.Allocation#syncAll syncAll()}
5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * call is necessary after the script data is updated to
5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * keep the other memory spaces in sync.</p>
5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>Allocation data is uploaded in one of two primary ways. For simple
6098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * arrays there are copyFrom() functions that take an array from the control code and
6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * copy it to the slave memory store. Both type checked and unchecked copies are provided.
6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * The unchecked variants exist to allow apps to copy over arrays of structures from a
6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * control language that does not support structures.</p>
6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <div class="special reference">
6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <h3>Developer Guides</h3>
6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>For more information about creating an application that uses Renderscript, read the
6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <a href="{@docRoot}guide/topics/graphics/renderscript.html">Renderscript</a> developer guide.</p>
6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </div>
7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class Allocation extends BaseObj {
7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Type mType;
7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Bitmap mBitmap;
7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mUsage;
7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Allocation mAdaptedAllocation;
7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mConstrainedLOD;
7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mConstrainedFace;
7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mConstrainedY;
8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mConstrainedZ;
8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mReadAllowed = true;
8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mWriteAllowed = true;
8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mSelectedY;
8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mSelectedZ;
8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mSelectedLOD;
8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Type.CubemapFace mSelectedFace = Type.CubemapFace.POSITIVE_X;
8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mCurrentDimX;
8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mCurrentDimY;
9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mCurrentDimZ;
9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mCurrentCount;
9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * The usage of the allocation.  These signal to renderscript
9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * where to place the allocation in memory.
9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * SCRIPT The allocation will be bound to and accessed by
9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * scripts.
10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static final int USAGE_SCRIPT = 0x0001;
10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * GRAPHICS_TEXTURE The allocation will be used as a texture
10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * source by one or more graphics programs.
10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static final int USAGE_GRAPHICS_TEXTURE = 0x0002;
10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Controls mipmap behavior when using the bitmap creation and
11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * update functions.
11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public enum MipmapControl {
11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * No mipmaps will be generated and the type generated from the
11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * incoming bitmap will not contain additional LODs.
11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MIPMAP_NONE(0),
12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * A Full mipmap chain will be created in script memory.  The
12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * type of the allocation will contain a full mipmap chain.  On
12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * upload to graphics the full chain will be transfered.
12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MIPMAP_FULL(1),
12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * The type of the allocation will be the same as MIPMAP_NONE.
13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * It will not contain mipmaps.  On upload to graphics the
13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * graphics copy of the allocation data will contain a full
13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * mipmap chain generated from the top level in script memory.
13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MIPMAP_ON_SYNC_TO_TEXTURE(2);
13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mID;
13798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MipmapControl(int id) {
13898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mID = id;
13998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
14098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
14198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private int getIDSafe() {
14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mAdaptedAllocation != null) {
14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return mAdaptedAllocation.getID(mRS);
14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
14798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return getID(mRS);
14898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
14998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams   /**
15298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Get the element of the type of the Allocation.
15398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
15498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element that describes the structure of data in the
15598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *         allocation
15698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
15798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
15898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public Element getElement() {
15998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mType.getElement();
16098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
16198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
16298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
16398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Get the usage flags of the Allocation.
16498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
16598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return usage flags associated with the allocation. e.g.
16698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *         script, texture, etc.
16798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
16898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
16998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getUsage() {
17098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mUsage;
17198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
17298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
17398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
17498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Get the size of the Allocation in bytes.
17598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
17698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return size of the Allocation in bytes.
17798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
17898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
17998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getBytesSize() {
18098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mType.getCount() * mType.getElement().getBytesSize();
18198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
18298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
18398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void updateCacheInfo(Type t) {
18498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mCurrentDimX = t.getX();
18598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mCurrentDimY = t.getY();
18698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mCurrentDimZ = t.getZ();
18798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mCurrentCount = mCurrentDimX;
18898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mCurrentDimY > 1) {
18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mCurrentCount *= mCurrentDimY;
19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
19198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mCurrentDimZ > 1) {
19298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mCurrentCount *= mCurrentDimZ;
19398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
19498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
19598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Allocation(int id, RenderScript rs, Type t, int usage) {
19798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        super(id, rs);
19898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((usage & ~(USAGE_SCRIPT | USAGE_GRAPHICS_TEXTURE)) != 0) {
19998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Unknown usage specified.");
20098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
20198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
20298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mType = t;
20398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mUsage = usage;
20498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
20598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (t != null) {
20698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            updateCacheInfo(t);
20798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
20898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
20998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
21098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void validateIsInt32() {
21198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((mType.mElement.mType == Element.DataType.SIGNED_32) ||
21298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            (mType.mElement.mType == Element.DataType.UNSIGNED_32)) {
21398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return;
21498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
21598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        throw new RSIllegalArgumentException(
21698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            "32 bit integer source does not match allocation type " + mType.mElement.mType);
21798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
21898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
21998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void validateIsInt16() {
22098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((mType.mElement.mType == Element.DataType.SIGNED_16) ||
22198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            (mType.mElement.mType == Element.DataType.UNSIGNED_16)) {
22298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return;
22398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
22498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        throw new RSIllegalArgumentException(
22598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            "16 bit integer source does not match allocation type " + mType.mElement.mType);
22698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
22798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
22898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void validateIsInt8() {
22998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((mType.mElement.mType == Element.DataType.SIGNED_8) ||
23098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            (mType.mElement.mType == Element.DataType.UNSIGNED_8)) {
23198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return;
23298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
23398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        throw new RSIllegalArgumentException(
23498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            "8 bit integer source does not match allocation type " + mType.mElement.mType);
23598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
23698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
23798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void validateIsFloat32() {
23898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mType.mElement.mType == Element.DataType.FLOAT_32) {
23998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return;
24098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
24198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        throw new RSIllegalArgumentException(
24298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            "32 bit float source does not match allocation type " + mType.mElement.mType);
24398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
24498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
24598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void validateIsObject() {
24698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((mType.mElement.mType == Element.DataType.RS_ELEMENT) ||
24798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            (mType.mElement.mType == Element.DataType.RS_TYPE) ||
24898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            (mType.mElement.mType == Element.DataType.RS_ALLOCATION) ||
24998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            (mType.mElement.mType == Element.DataType.RS_SAMPLER) ||
25098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            (mType.mElement.mType == Element.DataType.RS_SCRIPT)) {
25198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return;
25298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
25398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        throw new RSIllegalArgumentException(
25498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            "Object source does not match allocation type " + mType.mElement.mType);
25598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
25698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
25798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
25898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Get the type of the Allocation.
25998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
26098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Type
26198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
26298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
26398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public Type getType() {
26498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mType;
26598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
26698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
26798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
26898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Propagate changes from one usage of the allocation to the
26998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * remaining usages of the allocation.
27098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
27198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
27298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void syncAll(int srcLocation) {
27398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        switch (srcLocation) {
27498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case USAGE_SCRIPT:
27598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case USAGE_GRAPHICS_TEXTURE:
27698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
27798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        default:
27898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Source must be exactly one usage type.");
27998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
28098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
28198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationSyncAll(getIDSafe(), srcLocation);
28298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
28398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
28498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
28598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
28698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an array of RS objects to the allocation.
28798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
28898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d Source array.
28998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
29098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFrom(BaseObj[] d) {
29198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
29298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateIsObject();
29398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (d.length != mCurrentCount) {
29498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Array size mismatch, allocation sizeX = " +
29598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                 mCurrentCount + ", array length = " + d.length);
29698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
29798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int i[] = new int[d.length];
29898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for (int ct=0; ct < d.length; ct++) {
29998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            i[ct] = d[ct].getID(mRS);
30098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
30198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(0, mCurrentCount, i);
30298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
30398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
30498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void validateBitmapFormat(Bitmap b) {
30598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Bitmap.Config bc = b.getConfig();
30698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        switch (bc) {
30798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case ALPHA_8:
30898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mType.getElement().mKind != Element.DataKind.PIXEL_A) {
30998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Allocation kind is " +
31098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     mType.getElement().mKind + ", type " +
31198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     mType.getElement().mType +
31298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     " of " + mType.getElement().getBytesSize() +
31398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     " bytes, passed bitmap was " + bc);
31498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
31598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
31698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case ARGB_8888:
31798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
31898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                (mType.getElement().getBytesSize() != 4)) {
31998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Allocation kind is " +
32098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     mType.getElement().mKind + ", type " +
32198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     mType.getElement().mType +
32298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     " of " + mType.getElement().getBytesSize() +
32398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     " bytes, passed bitmap was " + bc);
32498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
32598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
32698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case RGB_565:
32798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGB) ||
32898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                (mType.getElement().getBytesSize() != 2)) {
32998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Allocation kind is " +
33098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     mType.getElement().mKind + ", type " +
33198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     mType.getElement().mType +
33298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     " of " + mType.getElement().getBytesSize() +
33398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     " bytes, passed bitmap was " + bc);
33498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
33598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
33698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case ARGB_4444:
33798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
33898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                (mType.getElement().getBytesSize() != 2)) {
33998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Allocation kind is " +
34098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     mType.getElement().mKind + ", type " +
34198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     mType.getElement().mType +
34298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     " of " + mType.getElement().getBytesSize() +
34398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     " bytes, passed bitmap was " + bc);
34498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
34598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
34698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
34798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
34898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
34998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
35098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void validateBitmapSize(Bitmap b) {
35198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if((mCurrentDimX != b.getWidth()) || (mCurrentDimY != b.getHeight())) {
35298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch");
35398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
35498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
35598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
35698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
35798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an allocation from an array.  This variant is not type
35898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * checked which allows an application to fill in structured
35998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * data from an array.
36098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
36198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
36298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
36398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFromUnchecked(int[] d) {
36498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
36598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(0, mCurrentCount, d);
36698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
36798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
36898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an allocation from an array.  This variant is not type
36998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * checked which allows an application to fill in structured
37098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * data from an array.
37198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
37298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
37398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
37498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFromUnchecked(short[] d) {
37598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
37698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(0, mCurrentCount, d);
37798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
37898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
37998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an allocation from an array.  This variant is not type
38098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * checked which allows an application to fill in structured
38198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * data from an array.
38298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
38398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
38498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
38598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFromUnchecked(byte[] d) {
38698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
38798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(0, mCurrentCount, d);
38898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
38998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
39098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an allocation from an array.  This variant is not type
39198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * checked which allows an application to fill in structured
39298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * data from an array.
39398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
39498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
39598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
39698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFromUnchecked(float[] d) {
39798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
39898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(0, mCurrentCount, d);
39998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
40098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
40198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
40298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an allocation from an array.  This variant is type
40398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * checked and will generate exceptions if the Allocation type
40498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * is not a 32 bit integer type.
40598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
40698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
40798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
40898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFrom(int[] d) {
40998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
41098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFrom(0, mCurrentCount, d);
41198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
41298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
41398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
41498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an allocation from an array.  This variant is type
41598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * checked and will generate exceptions if the Allocation type
41698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * is not a 16 bit integer type.
41798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
41898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
41998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
42098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFrom(short[] d) {
42198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
42298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFrom(0, mCurrentCount, d);
42398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
42498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
42598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
42698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an allocation from an array.  This variant is type
42798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * checked and will generate exceptions if the Allocation type
42898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * is not a 8 bit integer type.
42998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
43098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
43198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
43298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFrom(byte[] d) {
43398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
43498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFrom(0, mCurrentCount, d);
43598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
43698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
43798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
43898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an allocation from an array.  This variant is type
43998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * checked and will generate exceptions if the Allocation type
44098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * is not a 32 bit float type.
44198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
44298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
44398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
44498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFrom(float[] d) {
44598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
44698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFrom(0, mCurrentCount, d);
44798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
44898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
44998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
45098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy an allocation from a bitmap.  The height, width, and
45198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * format of the bitmap must match the existing allocation.
45298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
45398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param b the source bitmap
45498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
45598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyFrom(Bitmap b) {
45698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
45798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateBitmapSize(b);
45898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateBitmapFormat(b);
45998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationCopyFromBitmap(getID(mRS), b);
46098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
46198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
46298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
46398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * This is only intended to be used by auto-generate code reflected from the
46498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * renderscript script files.
46598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
46698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param xoff
46798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param fp
46898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
46998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setFromFieldPacker(int xoff, FieldPacker fp) {
47098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
47198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int eSize = mType.mElement.getBytesSize();
47298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        final byte[] data = fp.getData();
47398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
47498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int count = data.length / eSize;
47598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((eSize * count) != data.length) {
47698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Field packer length " + data.length +
47798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                               " not divisible by element size " + eSize + ".");
47898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
47998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(xoff, count, data);
48098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
48198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
48298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
48398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * This is only intended to be used by auto-generate code reflected from the
48498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * renderscript script files.
48598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
48698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param xoff
48798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param component_number
48898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param fp
48998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
49098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) {
49198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
49298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (component_number >= mType.mElement.mElements.length) {
49398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Component_number " + component_number + " out of range.");
49498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
49598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(xoff < 0) {
49698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Offset must be >= 0.");
49798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
49898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
49998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        final byte[] data = fp.getData();
50098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int eSize = mType.mElement.mElements[component_number].getBytesSize();
50198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        eSize *= mType.mElement.mArraySizes[component_number];
50298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
50398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (data.length != eSize) {
50498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Field packer sizelength " + data.length +
50598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                               " does not match component size " + eSize + ".");
50698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
50798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
50898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationElementData1D(getIDSafe(), xoff, mSelectedLOD,
50998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                     component_number, data, data.length);
51098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
51198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
51298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void data1DChecks(int off, int count, int len, int dataSize) {
51398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
51498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(off < 0) {
51598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Offset must be >= 0.");
51698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
51798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(count < 1) {
51898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Count must be >= 1.");
51998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
52098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if((off + count) > mCurrentCount) {
52198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Overflow, Available count " + mCurrentCount +
52298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                               ", got " + count + " at offset " + off + ".");
52398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
52498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(len < dataSize) {
52598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Array too small for allocation type.");
52698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
52798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
52898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
52998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
53098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Generate a mipmap chain.  Requires the type of the allocation
53198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * include mipmaps.
53298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
53398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * This function will generate a complete set of mipmaps from
53498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * the top level lod and place them into the script memoryspace.
53598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
53698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * If the allocation is also using other memory spaces a
53798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * followup sync will be required.
53898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
53998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void generateMipmaps() {
54098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationGenerateMipmaps(getID(mRS));
54198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
54298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
54398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
54498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy part of an allocation from an array.  This variant is
54598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * not type checked which allows an application to fill in
54698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * structured data from an array.
54798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
54898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param off The offset of the first element to be copied.
54998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count The number of elements to be copied.
55098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
55198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
55298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy1DRangeFromUnchecked(int off, int count, int[] d) {
55398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int dataSize = mType.mElement.getBytesSize() * count;
55498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        data1DChecks(off, count, d.length * 4, dataSize);
55598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
55698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
55798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
55898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy part of an allocation from an array.  This variant is
55998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * not type checked which allows an application to fill in
56098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * structured data from an array.
56198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
56298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param off The offset of the first element to be copied.
56398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count The number of elements to be copied.
56498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
56598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
56698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy1DRangeFromUnchecked(int off, int count, short[] d) {
56798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int dataSize = mType.mElement.getBytesSize() * count;
56898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        data1DChecks(off, count, d.length * 2, dataSize);
56998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
57098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
57198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
57298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy part of an allocation from an array.  This variant is
57398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * not type checked which allows an application to fill in
57498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * structured data from an array.
57598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
57698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param off The offset of the first element to be copied.
57798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count The number of elements to be copied.
57898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
57998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
58098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy1DRangeFromUnchecked(int off, int count, byte[] d) {
58198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int dataSize = mType.mElement.getBytesSize() * count;
58298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        data1DChecks(off, count, d.length, dataSize);
58398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
58498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
58598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
58698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy part of an allocation from an array.  This variant is
58798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * not type checked which allows an application to fill in
58898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * structured data from an array.
58998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
59098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param off The offset of the first element to be copied.
59198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count The number of elements to be copied.
59298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
59398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
59498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy1DRangeFromUnchecked(int off, int count, float[] d) {
59598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int dataSize = mType.mElement.getBytesSize() * count;
59698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        data1DChecks(off, count, d.length * 4, dataSize);
59798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
59898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
59998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
60098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
60198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy part of an allocation from an array.  This variant is
60298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * type checked and will generate exceptions if the Allocation
60398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * type is not a 32 bit integer type.
60498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
60598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param off The offset of the first element to be copied.
60698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count The number of elements to be copied.
60798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
60898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
60998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy1DRangeFrom(int off, int count, int[] d) {
61098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateIsInt32();
61198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(off, count, d);
61298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
61398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
61498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
61598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy part of an allocation from an array.  This variant is
61698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * type checked and will generate exceptions if the Allocation
61798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * type is not a 16 bit integer type.
61898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
61998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param off The offset of the first element to be copied.
62098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count The number of elements to be copied.
62198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
62298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
62398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy1DRangeFrom(int off, int count, short[] d) {
62498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateIsInt16();
62598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(off, count, d);
62698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
62798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
62898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
62998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy part of an allocation from an array.  This variant is
63098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * type checked and will generate exceptions if the Allocation
63198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * type is not a 8 bit integer type.
63298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
63398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param off The offset of the first element to be copied.
63498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count The number of elements to be copied.
63598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array
63698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
63798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy1DRangeFrom(int off, int count, byte[] d) {
63898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateIsInt8();
63998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(off, count, d);
64098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
64198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
64298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
64398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy part of an allocation from an array.  This variant is
64498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * type checked and will generate exceptions if the Allocation
64598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * type is not a 32 bit float type.
64698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
64798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param off The offset of the first element to be copied.
64898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count The number of elements to be copied.
64998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d the source data array.
65098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
65198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy1DRangeFrom(int off, int count, float[] d) {
65298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateIsFloat32();
65398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        copy1DRangeFromUnchecked(off, count, d);
65498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
65598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
65698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     /**
65798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy part of an allocation from another allocation.
65898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
65998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param off The offset of the first element to be copied.
66098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count The number of elements to be copied.
66198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param data the source data allocation.
66298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dataOff off The offset of the first element in data to
66398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *          be copied.
66498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
66598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy1DRangeFrom(int off, int count, Allocation data, int dataOff) {
66698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData2D(getIDSafe(), off, 0,
66798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              mSelectedLOD, mSelectedFace.mID,
66898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              count, 1, data.getID(mRS), dataOff, 0,
66998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              data.mSelectedLOD, data.mSelectedFace.mID);
67098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
67198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
67298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void validate2DRange(int xoff, int yoff, int w, int h) {
67398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mAdaptedAllocation != null) {
67498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
67598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        } else {
67698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
67798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (xoff < 0 || yoff < 0) {
67898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Offset cannot be negative.");
67998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
68098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (h < 0 || w < 0) {
68198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Height or width cannot be negative.");
68298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
68398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
68498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Updated region larger than allocation.");
68598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
68698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
68798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
68898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
68998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
69098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy a rectangular region from the array into the allocation.
69198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * The incoming array is assumed to be tightly packed.
69298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
69398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param xoff X offset of the region to update
69498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param yoff Y offset of the region to update
69598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param w Width of the incoming region to update
69698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param h Height of the incoming region to update
69798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param data to be placed into the allocation
69898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
69998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, byte[] data) {
70098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
70198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate2DRange(xoff, yoff, w, h);
70298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
70398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              w, h, data, data.length);
70498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
70598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
70698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, short[] data) {
70798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
70898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate2DRange(xoff, yoff, w, h);
70998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
71098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              w, h, data, data.length * 2);
71198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
71298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
71398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, int[] data) {
71498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
71598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate2DRange(xoff, yoff, w, h);
71698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
71798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              w, h, data, data.length * 4);
71898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
71998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
72098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, float[] data) {
72198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
72298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate2DRange(xoff, yoff, w, h);
72398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
72498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              w, h, data, data.length * 4);
72598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
72698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
72798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
72898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy a rectangular region into the allocation from another
72998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * allocation.
73098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
73198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param xoff X offset of the region to update.
73298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param yoff Y offset of the region to update.
73398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param w Width of the incoming region to update.
73498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param h Height of the incoming region to update.
73598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param data source allocation.
73698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dataXoff X offset in data of the region to update.
73798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dataYoff Y offset in data of the region to update.
73898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
73998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy2DRangeFrom(int xoff, int yoff, int w, int h,
74098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                Allocation data, int dataXoff, int dataYoff) {
74198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
74298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate2DRange(xoff, yoff, w, h);
74398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff,
74498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              mSelectedLOD, mSelectedFace.mID,
74598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              w, h, data.getID(mRS), dataXoff, dataYoff,
74698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                              data.mSelectedLOD, data.mSelectedFace.mID);
74798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
74898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
74998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
75098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy a bitmap into an allocation.  The height and width of
75198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * the update will use the height and width of the incoming
75298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * bitmap.
75398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
75498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param xoff X offset of the region to update
75598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param yoff Y offset of the region to update
75698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param data the bitmap to be copied
75798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
75898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copy2DRangeFrom(int xoff, int yoff, Bitmap data) {
75998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
76098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateBitmapFormat(data);
76198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate2DRange(xoff, yoff, data.getWidth(), data.getHeight());
76298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID, data);
76398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
76498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
76598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
76698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
76798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy from the Allocation into a Bitmap.  The bitmap must
76898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * match the dimensions of the Allocation.
76998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
77098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param b The bitmap to be set from the Allocation.
77198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
77298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyTo(Bitmap b) {
77398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
77498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateBitmapFormat(b);
77598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateBitmapSize(b);
77698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationCopyToBitmap(getID(mRS), b);
77798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
77898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
77998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
78098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy from the Allocation into a byte array.  The array must
78198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * be at least as large as the Allocation.  The allocation must
78298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * be of an 8 bit elemental type.
78398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
78498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d The array to be set from the Allocation.
78598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
78698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyTo(byte[] d) {
78798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateIsInt8();
78898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
78998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationRead(getID(mRS), d);
79098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
79198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
79298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
79398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy from the Allocation into a short array.  The array must
79498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * be at least as large as the Allocation.  The allocation must
79598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * be of an 16 bit elemental type.
79698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
79798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d The array to be set from the Allocation.
79898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
79998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyTo(short[] d) {
80098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateIsInt16();
80198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
80298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationRead(getID(mRS), d);
80398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
80498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
80598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
80698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy from the Allocation into a int array.  The array must be
80798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * at least as large as the Allocation.  The allocation must be
80898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * of an 32 bit elemental type.
80998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
81098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d The array to be set from the Allocation.
81198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
81298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyTo(int[] d) {
81398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateIsInt32();
81498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
81598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationRead(getID(mRS), d);
81698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
81798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
81898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
81998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Copy from the Allocation into a float array.  The array must
82098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * be at least as large as the Allocation.  The allocation must
82198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * be of an 32 bit float elemental type.
82298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
82398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param d The array to be set from the Allocation.
82498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
82598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void copyTo(float[] d) {
82698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validateIsFloat32();
82798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
82898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationRead(getID(mRS), d);
82998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
83098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
83198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
83298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Resize a 1D allocation.  The contents of the allocation are
83398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * preserved.  If new elements are allocated objects are created
83498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * with null contents and the new region is otherwise undefined.
83598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
83698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * If the new region is smaller the references of any objects
83798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * outside the new region will be released.
83898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
83998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * A new type will be created with the new dimension.
84098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
84198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dimX The new size of the allocation.
84298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
84398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /*public synchronized void resize(int dimX) {
84498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
84598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSInvalidStateException("Resize only support for 1D allocations at this time.");
84698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
84798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationResize1D(getID(mRS), dimX);
84898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.finish();  // Necessary because resize is fifoed and update is async.
84998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
85098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int typeID = mRS.nAllocationGetType(getID(mRS));
85198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mType = new Type(typeID, mRS);
85298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mType.updateFromNative();
85398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        updateCacheInfo(mType);
85498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }*/
85598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
85698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
85798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Resize a 2D allocation.  The contents of the allocation are
85898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * preserved.  If new elements are allocated objects are created
85998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * with null contents and the new region is otherwise undefined.
86098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
86198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * If the new region is smaller the references of any objects
86298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * outside the new region will be released.
86398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
86498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * A new type will be created with the new dimension.
86598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
86698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @hide
86798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dimX The new size of the allocation.
86898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dimY The new size of the allocation.
86998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
87098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /*public void resize(int dimX, int dimY) {
87198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
87298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSInvalidStateException(
87398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                "Resize only support for 2D allocations at this time.");
87498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
87598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mType.getY() == 0) {
87698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSInvalidStateException(
87798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                "Resize only support for 2D allocations at this time.");
87898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
87998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nAllocationResize2D(getID(mRS), dimX, dimY);
88098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.finish();  // Necessary because resize is fifoed and update is async.
88198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
88298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int typeID = mRS.nAllocationGetType(getID(mRS));
88398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mType = new Type(typeID, mRS);
88498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mType.updateFromNative();
88598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        updateCacheInfo(mType);
88698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }*/
88798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
88898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
88998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
89098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    // creation
89198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
89298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
89398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static {
89498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mBitmapOptions.inScaled = false;
89598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
89698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
89798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
89898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
89998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param type renderscript type describing data layout
90098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param mips specifies desired mipmap behaviour for the
90198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *             allocation
90298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param usage bit field specifying how the allocation is
90398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *              utilized
90498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
90598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createTyped(RenderScript rs, Type type, MipmapControl mips, int usage) {
90698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rs.validate();
90798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (type.getID(rs) == 0) {
90898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSInvalidStateException("Bad Type");
90998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
91098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int id = rs.nAllocationCreateTyped(type.getID(rs), mips.mID, usage, 0);
91198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (id == 0) {
91298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSRuntimeException("Allocation creation failed.");
91398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
91498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return new Allocation(id, rs, type, usage);
91598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
91698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
91798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
91898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a renderscript allocation with the size specified by
91998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * the type and no mipmaps generated by default
92098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
92198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
92298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param type renderscript type describing data layout
92398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param usage bit field specifying how the allocation is
92498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *              utilized
92598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
92698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return allocation
92798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
92898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createTyped(RenderScript rs, Type type, int usage) {
92998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return createTyped(rs, type, MipmapControl.MIPMAP_NONE, usage);
93098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
93198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
93298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
93398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a renderscript allocation for use by the script with
93498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * the size specified by the type and no mipmaps generated by
93598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * default
93698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
93798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
93898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param type renderscript type describing data layout
93998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
94098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return allocation
94198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
94298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createTyped(RenderScript rs, Type type) {
94398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return createTyped(rs, type, MipmapControl.MIPMAP_NONE, USAGE_SCRIPT);
94498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
94598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
94698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
94798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a renderscript allocation with a specified number of
94898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * given elements
94998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
95098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
95198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param e describes what each element of an allocation is
95298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count specifies the number of element in the allocation
95398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param usage bit field specifying how the allocation is
95498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *              utilized
95598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
95698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return allocation
95798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
95898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createSized(RenderScript rs, Element e,
95998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                         int count, int usage) {
96098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rs.validate();
96198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Type.Builder b = new Type.Builder(rs, e);
96298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        b.setX(count);
96398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Type t = b.create();
96498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
96598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int id = rs.nAllocationCreateTyped(t.getID(rs), MipmapControl.MIPMAP_NONE.mID, usage, 0);
96698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (id == 0) {
96798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSRuntimeException("Allocation creation failed.");
96898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
96998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return new Allocation(id, rs, t, usage);
97098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
97198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
97298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
97398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a renderscript allocation with a specified number of
97498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * given elements
97598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
97698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
97798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param e describes what each element of an allocation is
97898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param count specifies the number of element in the allocation
97998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
98098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return allocation
98198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
98298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createSized(RenderScript rs, Element e, int count) {
98398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return createSized(rs, e, count, USAGE_SCRIPT);
98498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
98598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
98698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static Element elementFromBitmap(RenderScript rs, Bitmap b) {
98798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        final Bitmap.Config bc = b.getConfig();
98898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (bc == Bitmap.Config.ALPHA_8) {
98998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return Element.A_8(rs);
99098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
99198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (bc == Bitmap.Config.ARGB_4444) {
99298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return Element.RGBA_4444(rs);
99398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
99498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (bc == Bitmap.Config.ARGB_8888) {
99598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return Element.RGBA_8888(rs);
99698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
99798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (bc == Bitmap.Config.RGB_565) {
99898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return Element.RGB_565(rs);
99998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
100098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        throw new RSInvalidStateException("Bad bitmap type: " + bc);
100198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
100298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
100398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static Type typeFromBitmap(RenderScript rs, Bitmap b,
100498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                       MipmapControl mip) {
100598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Element e = elementFromBitmap(rs, b);
100698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Type.Builder tb = new Type.Builder(rs, e);
100798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setX(b.getWidth());
100898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setY(b.getHeight());
100998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setMipmaps(mip == MipmapControl.MIPMAP_FULL);
101098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return tb.create();
101198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
101298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
101398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
101498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a renderscript allocation from a bitmap
101598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
101698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
101798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param b bitmap source for the allocation data
101898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param mips specifies desired mipmap behaviour for the
101998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *             allocation
102098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param usage bit field specifying how the allocation is
102198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *              utilized
102298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
102398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return renderscript allocation containing bitmap data
102498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
102598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
102698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createFromBitmap(RenderScript rs, Bitmap b,
102798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                              MipmapControl mips,
102898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                              int usage) {
102998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rs.validate();
103098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Type t = typeFromBitmap(rs, b, mips);
103198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
103298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int id = rs.nAllocationCreateFromBitmap(t.getID(rs), mips.mID, b, usage);
103398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (id == 0) {
103498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSRuntimeException("Load failed.");
103598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
103698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return new Allocation(id, rs, t, usage);
103798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
103898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
103998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
104098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a non-mipmapped renderscript allocation to use as a
104198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * graphics texture
104298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
104398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
104498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param b bitmap source for the allocation data
104598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
104698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return renderscript allocation containing bitmap data
104798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
104898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
104998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createFromBitmap(RenderScript rs, Bitmap b) {
105098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return createFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
105198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                USAGE_GRAPHICS_TEXTURE);
105298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
105398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
105498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
105598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a cubemap allocation from a bitmap containing the
105698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * horizontal list of cube faces. Each individual face must be
105798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * the same size and power of 2
105898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
105998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
106098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param b bitmap with cubemap faces layed out in the following
106198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *          format: right, left, top, bottom, front, back
106298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param mips specifies desired mipmap behaviour for the cubemap
106398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param usage bit field specifying how the cubemap is utilized
106498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
106598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return allocation containing cubemap data
106698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
106798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
106898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createCubemapFromBitmap(RenderScript rs, Bitmap b,
106998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     MipmapControl mips,
107098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     int usage) {
107198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rs.validate();
107298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
107398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int height = b.getHeight();
107498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int width = b.getWidth();
107598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
107698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (width % 6 != 0) {
107798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Cubemap height must be multiple of 6");
107898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
107998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (width / 6 != height) {
108098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Only square cube map faces supported");
108198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
108298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean isPow2 = (height & (height - 1)) == 0;
108398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (!isPow2) {
108498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Only power of 2 cube faces supported");
108598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
108698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
108798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Element e = elementFromBitmap(rs, b);
108898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Type.Builder tb = new Type.Builder(rs, e);
108998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setX(height);
109098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setY(height);
109198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setFaces(true);
109298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL);
109398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Type t = tb.create();
109498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
109598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int id = rs.nAllocationCubeCreateFromBitmap(t.getID(rs), mips.mID, b, usage);
109698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(id == 0) {
109798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e);
109898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
109998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return new Allocation(id, rs, t, usage);
110098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
110198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
110298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
110398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a non-mipmapped cubemap allocation for use as a
110498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * graphics texture from a bitmap containing the horizontal list
110598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * of cube faces. Each individual face must be the same size and
110698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * power of 2
110798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
110898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
110998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param b bitmap with cubemap faces layed out in the following
111098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *          format: right, left, top, bottom, front, back
111198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
111298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return allocation containing cubemap data
111398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
111498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
111598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createCubemapFromBitmap(RenderScript rs,
111698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                     Bitmap b) {
111798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return createCubemapFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
111898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                       USAGE_GRAPHICS_TEXTURE);
111998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
112098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
112198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
112298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a cubemap allocation from 6 bitmaps containing
112398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * the cube faces. All the faces must be the same size and
112498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * power of 2
112598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
112698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
112798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param xpos cubemap face in the positive x direction
112898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param xneg cubemap face in the negative x direction
112998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param ypos cubemap face in the positive y direction
113098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param yneg cubemap face in the negative y direction
113198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param zpos cubemap face in the positive z direction
113298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param zneg cubemap face in the negative z direction
113398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param mips specifies desired mipmap behaviour for the cubemap
113498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param usage bit field specifying how the cubemap is utilized
113598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
113698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return allocation containing cubemap data
113798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
113898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
113998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createCubemapFromCubeFaces(RenderScript rs,
114098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap xpos,
114198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap xneg,
114298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap ypos,
114398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap yneg,
114498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap zpos,
114598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap zneg,
114698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        MipmapControl mips,
114798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        int usage) {
114898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int height = xpos.getHeight();
114998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (xpos.getWidth() != height ||
115098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            xneg.getWidth() != height || xneg.getHeight() != height ||
115198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            ypos.getWidth() != height || ypos.getHeight() != height ||
115298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            yneg.getWidth() != height || yneg.getHeight() != height ||
115398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            zpos.getWidth() != height || zpos.getHeight() != height ||
115498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            zneg.getWidth() != height || zneg.getHeight() != height) {
115598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Only square cube map faces supported");
115698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
115798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean isPow2 = (height & (height - 1)) == 0;
115898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (!isPow2) {
115998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Only power of 2 cube faces supported");
116098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
116198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
116298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Element e = elementFromBitmap(rs, xpos);
116398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Type.Builder tb = new Type.Builder(rs, e);
116498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setX(height);
116598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setY(height);
116698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setFaces(true);
116798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL);
116898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Type t = tb.create();
116998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Allocation cubemap = Allocation.createTyped(rs, t, mips, usage);
117098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
117198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        AllocationAdapter adapter = AllocationAdapter.create2D(rs, cubemap);
117298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.setFace(Type.CubemapFace.POSITIVE_X);
117398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.copyFrom(xpos);
117498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.setFace(Type.CubemapFace.NEGATIVE_X);
117598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.copyFrom(xneg);
117698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.setFace(Type.CubemapFace.POSITIVE_Y);
117798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.copyFrom(ypos);
117898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.setFace(Type.CubemapFace.NEGATIVE_Y);
117998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.copyFrom(yneg);
118098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.setFace(Type.CubemapFace.POSITIVE_Z);
118198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.copyFrom(zpos);
118298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.setFace(Type.CubemapFace.NEGATIVE_Z);
118398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        adapter.copyFrom(zneg);
118498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
118598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return cubemap;
118698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
118798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
118898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
118998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Creates a non-mipmapped cubemap allocation for use as a
119098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * graphics texture from 6 bitmaps containing
119198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * the cube faces. All the faces must be the same size and
119298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * power of 2
119398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
119498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the allocation will belong.
119598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param xpos cubemap face in the positive x direction
119698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param xneg cubemap face in the negative x direction
119798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param ypos cubemap face in the positive y direction
119898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param yneg cubemap face in the negative y direction
119998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param zpos cubemap face in the positive z direction
120098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param zneg cubemap face in the negative z direction
120198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
120298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return allocation containing cubemap data
120398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
120498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
120598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static public Allocation createCubemapFromCubeFaces(RenderScript rs,
120698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap xpos,
120798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap xneg,
120898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap ypos,
120998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap yneg,
121098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap zpos,
121198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                                        Bitmap zneg) {
121298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return createCubemapFromCubeFaces(rs, xpos, xneg, ypos, yneg,
121398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                          zpos, zneg, MipmapControl.MIPMAP_NONE,
121498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                          USAGE_GRAPHICS_TEXTURE);
121598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
121698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
121798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
121898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1219