1b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/*
29069ee88cb62a62395e895eb6b3333a1dfcead73Stephen Hines * Copyright (C) 2008-2012 The Android Open Source Project
3b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
4b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * you may not use this file except in compliance with the License.
6b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * You may obtain a copy of the License at
7b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
8b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
10b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Unless required by applicable law or agreed to in writing, software
11b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * See the License for the specific language governing permissions and
14b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * limitations under the License.
15b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams */
16b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
17b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspackage android.renderscript;
18b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
19b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport java.io.IOException;
20b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport java.io.InputStream;
21739c8263a10d34f5acba7fce2052012d1545d10bJason Samsimport java.util.HashMap;
22b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.content.res.Resources;
23650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guyimport android.content.res.AssetManager;
24b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.graphics.Bitmap;
25b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.graphics.BitmapFactory;
26fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Samsimport android.view.Surface;
27615e7cee03d1a53072b0369fa9f247811ac56845Jason Samsimport android.graphics.SurfaceTexture;
28b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.util.Log;
29650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guyimport android.util.TypedValue;
30abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murrayimport android.graphics.Canvas;
316d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murrayimport android.os.Trace;
32b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
339c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
34c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p> This class provides the primary method through which data is passed to
35c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * and from RenderScript kernels.  An Allocation provides the backing store for
36c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * a given {@link android.renderscript.Type}.  </p>
37a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams *
38c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>An Allocation also contains a set of usage flags that denote how the
39c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Allocation could be used. For example, an Allocation may have usage flags
40c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * specifying that it can be used from a script as well as input to a {@link
41c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Sampler}. A developer must synchronize across these
42c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * different usages using {@link android.renderscript.Allocation#syncAll} in
43c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * order to ensure that different users of the Allocation have a consistent view
44c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * of memory. For example, in the case where an Allocation is used as the output
45c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * of one kernel and as Sampler input in a later kernel, a developer must call
46c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * {@link #syncAll syncAll(Allocation.USAGE_SCRIPT)} prior to launching the
47c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * second kernel to ensure correctness.
48a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams *
49c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>An Allocation can be populated with the {@link #copyFrom} routines. For
50c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * more complex Element types, the {@link #copyFromUnchecked} methods can be
51c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * used to copy from byte arrays or similar constructs.</p>
52b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
533aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
543aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
55c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>For more information about creating an application that uses RenderScript, read the
56c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
573aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
58b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams **/
59b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspublic class Allocation extends BaseObj {
6043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    Type mType;
618a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams    Bitmap mBitmap;
625476b450e50939940dcf3f15c92335cee2fc572dJason Sams    int mUsage;
63ba862d1544a06528151550be1784a926ee986580Jason Sams    Allocation mAdaptedAllocation;
642f2472c42be8e80f00019594036744d902e09dcbTim Murray    int mSize;
65ba862d1544a06528151550be1784a926ee986580Jason Sams
66ba862d1544a06528151550be1784a926ee986580Jason Sams    boolean mConstrainedLOD;
67ba862d1544a06528151550be1784a926ee986580Jason Sams    boolean mConstrainedFace;
68ba862d1544a06528151550be1784a926ee986580Jason Sams    boolean mConstrainedY;
69ba862d1544a06528151550be1784a926ee986580Jason Sams    boolean mConstrainedZ;
70615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams    boolean mReadAllowed = true;
71615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams    boolean mWriteAllowed = true;
72ba862d1544a06528151550be1784a926ee986580Jason Sams    int mSelectedY;
73ba862d1544a06528151550be1784a926ee986580Jason Sams    int mSelectedZ;
74ba862d1544a06528151550be1784a926ee986580Jason Sams    int mSelectedLOD;
75ba862d1544a06528151550be1784a926ee986580Jason Sams    Type.CubemapFace mSelectedFace = Type.CubemapFace.POSITIVE_X;
76ba862d1544a06528151550be1784a926ee986580Jason Sams
77ba862d1544a06528151550be1784a926ee986580Jason Sams    int mCurrentDimX;
78ba862d1544a06528151550be1784a926ee986580Jason Sams    int mCurrentDimY;
79ba862d1544a06528151550be1784a926ee986580Jason Sams    int mCurrentDimZ;
80ba862d1544a06528151550be1784a926ee986580Jason Sams    int mCurrentCount;
81739c8263a10d34f5acba7fce2052012d1545d10bJason Sams    static HashMap<Integer, Allocation> mAllocationMap =
82739c8263a10d34f5acba7fce2052012d1545d10bJason Sams            new HashMap<Integer, Allocation>();
8342ef238208679813daa204bf110f776ab02c2bebJason Sams    OnBufferAvailableListener mBufferNotifier;
84ba862d1544a06528151550be1784a926ee986580Jason Sams
859c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
86c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The usage of the Allocation.  These signal to RenderScript where to place
87c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * the Allocation in memory.
88f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
89c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     */
90c11e25c4e653124def1fb18e203b894f42106cbeTim Murray
91c11e25c4e653124def1fb18e203b894f42106cbeTim Murray    /**
92c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The Allocation will be bound to and accessed by scripts.
93f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     */
945476b450e50939940dcf3f15c92335cee2fc572dJason Sams    public static final int USAGE_SCRIPT = 0x0001;
95f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
969c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
97c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The Allocation will be used as a texture source by one or more graphics
98c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * programs.
99f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
100f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     */
1015476b450e50939940dcf3f15c92335cee2fc572dJason Sams    public static final int USAGE_GRAPHICS_TEXTURE = 0x0002;
102f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
1039c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
104c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The Allocation will be used as a graphics mesh.
105c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
106c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * This was deprecated in API level 16.
107f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
108f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     */
1095476b450e50939940dcf3f15c92335cee2fc572dJason Sams    public static final int USAGE_GRAPHICS_VERTEX = 0x0004;
110f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
111f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
1129c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
113c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The Allocation will be used as the source of shader constants by one or
114c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * more programs.
115c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
116c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * This was deprecated in API level 16.
117f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
118f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     */
1195476b450e50939940dcf3f15c92335cee2fc572dJason Sams    public static final int USAGE_GRAPHICS_CONSTANTS = 0x0008;
1205476b450e50939940dcf3f15c92335cee2fc572dJason Sams
1219c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
122c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The Allocation will be used as a target for offscreen rendering
123c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
124c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * This was deprecated in API level 16.
1258e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk     *
1268e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk     */
1278e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    public static final int USAGE_GRAPHICS_RENDER_TARGET = 0x0010;
1288e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1299c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
130c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The Allocation will be used as a {@link android.graphics.SurfaceTexture}
131c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * consumer.  This usage will cause the Allocation to be created as
132c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * read-only.
133615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams     *
134615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams     */
135fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams    public static final int USAGE_IO_INPUT = 0x0020;
1369069ee88cb62a62395e895eb6b3333a1dfcead73Stephen Hines
1379c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
138c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The Allocation will be used as a {@link android.graphics.SurfaceTexture}
139c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * producer.  The dimensions and format of the {@link
140c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.graphics.SurfaceTexture} will be forced to those of the
141c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Allocation.
142615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams     *
143615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams     */
144fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams    public static final int USAGE_IO_OUTPUT = 0x0040;
14543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
1469c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
147c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The Allocation's backing store will be inherited from another object
148c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * (usually a {@link android.graphics.Bitmap}); copying to or from the
149c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * original source Bitmap will cause a synchronization rather than a full
150c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * copy.  {@link #syncAll} may also be used to synchronize the Allocation
151c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and the source Bitmap.
15200bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray     *
153c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * <p>This is set by default for allocations created with {@link
154c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * #createFromBitmap} in API version 18 and higher.</p>
15500bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray     *
15600bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray     */
15700bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray    public static final int USAGE_SHARED = 0x0080;
15800bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray
15900bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray    /**
160c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Controls mipmap behavior when using the bitmap creation and update
161c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * functions.
162f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     */
1634ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    public enum MipmapControl {
1649c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
165c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * No mipmaps will be generated and the type generated from the incoming
166c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * bitmap will not contain additional LODs.
167f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams         */
1685476b450e50939940dcf3f15c92335cee2fc572dJason Sams        MIPMAP_NONE(0),
169f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
1709c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
171c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * A full mipmap chain will be created in script memory.  The Type of
172c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * the Allocation will contain a full mipmap chain.  On upload, the full
173c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * chain will be transferred.
174f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams         */
1755476b450e50939940dcf3f15c92335cee2fc572dJason Sams        MIPMAP_FULL(1),
176f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
1779c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
178c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * The Type of the Allocation will be the same as MIPMAP_NONE.  It will
179c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * not contain mipmaps.  On upload, the allocation data will contain a
180c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * full mipmap chain generated from the top level in script memory.
181f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams         */
1825476b450e50939940dcf3f15c92335cee2fc572dJason Sams        MIPMAP_ON_SYNC_TO_TEXTURE(2);
1835476b450e50939940dcf3f15c92335cee2fc572dJason Sams
1845476b450e50939940dcf3f15c92335cee2fc572dJason Sams        int mID;
1854ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams        MipmapControl(int id) {
1865476b450e50939940dcf3f15c92335cee2fc572dJason Sams            mID = id;
1875476b450e50939940dcf3f15c92335cee2fc572dJason Sams        }
188b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
189b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
19048fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams
19148fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams    private int getIDSafe() {
19248fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        if (mAdaptedAllocation != null) {
193e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            return mAdaptedAllocation.getID(mRS);
19448fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        }
195e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        return getID(mRS);
19648fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams    }
19748fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams
19803d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams
1999c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines   /**
200c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Get the {@link android.renderscript.Element} of the {@link
201c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.renderscript.Type} of the Allocation.
20203d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     *
203c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @return Element
20403d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     *
20503d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     */
20603d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams    public Element getElement() {
20703d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams        return mType.getElement();
20803d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams    }
20903d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams
2109c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
21103d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     * Get the usage flags of the Allocation.
21203d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     *
213c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @return usage this Allocation's set of the USAGE_* flags OR'd together
21403d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     *
21503d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     */
21603d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams    public int getUsage() {
21703d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams        return mUsage;
21803d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams    }
21903d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams
2209c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
22136c0f6465896c1ad2f5e4811c275c6aa9f8ae874Jason Sams     * Get the size of the Allocation in bytes.
22236c0f6465896c1ad2f5e4811c275c6aa9f8ae874Jason Sams     *
223918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk     * @return size of the Allocation in bytes.
22436c0f6465896c1ad2f5e4811c275c6aa9f8ae874Jason Sams     *
22536c0f6465896c1ad2f5e4811c275c6aa9f8ae874Jason Sams     */
226918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    public int getBytesSize() {
227918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk        return mType.getCount() * mType.getElement().getBytesSize();
22836c0f6465896c1ad2f5e4811c275c6aa9f8ae874Jason Sams    }
22936c0f6465896c1ad2f5e4811c275c6aa9f8ae874Jason Sams
230452a7661e8b06459b75493b441d33244939c1153Jason Sams    private void updateCacheInfo(Type t) {
231452a7661e8b06459b75493b441d33244939c1153Jason Sams        mCurrentDimX = t.getX();
232452a7661e8b06459b75493b441d33244939c1153Jason Sams        mCurrentDimY = t.getY();
233452a7661e8b06459b75493b441d33244939c1153Jason Sams        mCurrentDimZ = t.getZ();
234452a7661e8b06459b75493b441d33244939c1153Jason Sams        mCurrentCount = mCurrentDimX;
235452a7661e8b06459b75493b441d33244939c1153Jason Sams        if (mCurrentDimY > 1) {
236452a7661e8b06459b75493b441d33244939c1153Jason Sams            mCurrentCount *= mCurrentDimY;
237452a7661e8b06459b75493b441d33244939c1153Jason Sams        }
238452a7661e8b06459b75493b441d33244939c1153Jason Sams        if (mCurrentDimZ > 1) {
239452a7661e8b06459b75493b441d33244939c1153Jason Sams            mCurrentCount *= mCurrentDimZ;
240452a7661e8b06459b75493b441d33244939c1153Jason Sams        }
241452a7661e8b06459b75493b441d33244939c1153Jason Sams    }
242ba862d1544a06528151550be1784a926ee986580Jason Sams
243a314551d69098537337c970da615a8f8af58e1f1Tim Murray    private void setBitmap(Bitmap b) {
244a314551d69098537337c970da615a8f8af58e1f1Tim Murray        mBitmap = b;
245a314551d69098537337c970da615a8f8af58e1f1Tim Murray    }
246a314551d69098537337c970da615a8f8af58e1f1Tim Murray
2475476b450e50939940dcf3f15c92335cee2fc572dJason Sams    Allocation(int id, RenderScript rs, Type t, int usage) {
2480de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
24949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        if ((usage & ~(USAGE_SCRIPT |
25049a05d7b82956009f03acbb92a064eed054eb031Jason Sams                       USAGE_GRAPHICS_TEXTURE |
25149a05d7b82956009f03acbb92a064eed054eb031Jason Sams                       USAGE_GRAPHICS_VERTEX |
2528e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                       USAGE_GRAPHICS_CONSTANTS |
253615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams                       USAGE_GRAPHICS_RENDER_TARGET |
254615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams                       USAGE_IO_INPUT |
25500bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray                       USAGE_IO_OUTPUT |
25600bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray                       USAGE_SHARED)) != 0) {
2575476b450e50939940dcf3f15c92335cee2fc572dJason Sams            throw new RSIllegalArgumentException("Unknown usage specified.");
2585476b450e50939940dcf3f15c92335cee2fc572dJason Sams        }
259615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams
260fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams        if ((usage & USAGE_IO_INPUT) != 0) {
261615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams            mWriteAllowed = false;
262615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams
263fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams            if ((usage & ~(USAGE_IO_INPUT |
264615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams                           USAGE_GRAPHICS_TEXTURE |
265615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams                           USAGE_SCRIPT)) != 0) {
266615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams                throw new RSIllegalArgumentException("Invalid usage combination.");
267615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams            }
268615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams        }
2699bf189228fdb0ec14b284f8bd543d5f9137997ccJason Sams
2705476b450e50939940dcf3f15c92335cee2fc572dJason Sams        mType = t;
271615e7cee03d1a53072b0369fa9f247811ac56845Jason Sams        mUsage = usage;
272ba862d1544a06528151550be1784a926ee986580Jason Sams
273452a7661e8b06459b75493b441d33244939c1153Jason Sams        if (t != null) {
27488990da58d0231b5a1b9a27b32c37839e95c7487Stephen Hines            // TODO: A3D doesn't have Type info during creation, so we can't
27588990da58d0231b5a1b9a27b32c37839e95c7487Stephen Hines            // calculate the size ahead of time. We can possibly add a method
27688990da58d0231b5a1b9a27b32c37839e95c7487Stephen Hines            // to update the size in the future if it seems reasonable.
27788990da58d0231b5a1b9a27b32c37839e95c7487Stephen Hines            mSize = mType.getCount() * mType.getElement().getBytesSize();
278452a7661e8b06459b75493b441d33244939c1153Jason Sams            updateCacheInfo(t);
279ba862d1544a06528151550be1784a926ee986580Jason Sams        }
2802f2472c42be8e80f00019594036744d902e09dcbTim Murray        try {
2812f2472c42be8e80f00019594036744d902e09dcbTim Murray            RenderScript.registerNativeAllocation.invoke(RenderScript.sRuntime, mSize);
2822f2472c42be8e80f00019594036744d902e09dcbTim Murray        } catch (Exception e) {
2832f2472c42be8e80f00019594036744d902e09dcbTim Murray            Log.e(RenderScript.LOG_TAG, "Couldn't invoke registerNativeAllocation:" + e);
2842f2472c42be8e80f00019594036744d902e09dcbTim Murray            throw new RSRuntimeException("Couldn't invoke registerNativeAllocation:" + e);
2852f2472c42be8e80f00019594036744d902e09dcbTim Murray        }
2862f2472c42be8e80f00019594036744d902e09dcbTim Murray    }
2872f2472c42be8e80f00019594036744d902e09dcbTim Murray
2882f2472c42be8e80f00019594036744d902e09dcbTim Murray    protected void finalize() throws Throwable {
2892f2472c42be8e80f00019594036744d902e09dcbTim Murray        RenderScript.registerNativeFree.invoke(RenderScript.sRuntime, mSize);
2902f2472c42be8e80f00019594036744d902e09dcbTim Murray        super.finalize();
29180a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk    }
29280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk
293b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    private void validateIsInt32() {
294b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        if ((mType.mElement.mType == Element.DataType.SIGNED_32) ||
295b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.UNSIGNED_32)) {
296b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            return;
297b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        }
298b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        throw new RSIllegalArgumentException(
299b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            "32 bit integer source does not match allocation type " + mType.mElement.mType);
300b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    }
301b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams
302b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    private void validateIsInt16() {
303b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        if ((mType.mElement.mType == Element.DataType.SIGNED_16) ||
304b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.UNSIGNED_16)) {
305b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            return;
306b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        }
307b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        throw new RSIllegalArgumentException(
308b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            "16 bit integer source does not match allocation type " + mType.mElement.mType);
309b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    }
310b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams
311b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    private void validateIsInt8() {
312b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        if ((mType.mElement.mType == Element.DataType.SIGNED_8) ||
313b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.UNSIGNED_8)) {
314b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            return;
315b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        }
316b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        throw new RSIllegalArgumentException(
317b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            "8 bit integer source does not match allocation type " + mType.mElement.mType);
318b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    }
319b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams
320b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    private void validateIsFloat32() {
321b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        if (mType.mElement.mType == Element.DataType.FLOAT_32) {
322b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            return;
323b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        }
324b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        throw new RSIllegalArgumentException(
325b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            "32 bit float source does not match allocation type " + mType.mElement.mType);
326b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    }
327b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams
328b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    private void validateIsObject() {
329b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        if ((mType.mElement.mType == Element.DataType.RS_ELEMENT) ||
330b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.RS_TYPE) ||
331b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.RS_ALLOCATION) ||
332b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.RS_SAMPLER) ||
333b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.RS_SCRIPT) ||
334b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.RS_MESH) ||
335b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.RS_PROGRAM_FRAGMENT) ||
336b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.RS_PROGRAM_VERTEX) ||
337b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.RS_PROGRAM_RASTER) ||
338b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            (mType.mElement.mType == Element.DataType.RS_PROGRAM_STORE)) {
339b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            return;
340b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        }
341b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        throw new RSIllegalArgumentException(
342b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            "Object source does not match allocation type " + mType.mElement.mType);
343b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    }
344b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams
345dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    @Override
346dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    void updateFromNative() {
34706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        super.updateFromNative();
348e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int typeID = mRS.nAllocationGetType(getID(mRS));
349dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        if(typeID != 0) {
350dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mType = new Type(typeID, mRS);
351dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mType.updateFromNative();
352ad37cb26cd8d8a05077152ebc5b841a5629cfbbdJason Sams            updateCacheInfo(mType);
353dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
354dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
355dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
3569c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
357c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Get the {@link android.renderscript.Type} of the Allocation.
35803d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     *
35903d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     * @return Type
36003d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     *
36103d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     */
362ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams    public Type getType() {
363ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams        return mType;
364ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams    }
365ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams
3669c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
367c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Propagate changes from one usage of the Allocation to the
368c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * other usages of the Allocation.
36903d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     *
37003d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     */
3715476b450e50939940dcf3f15c92335cee2fc572dJason Sams    public void syncAll(int srcLocation) {
3726d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "syncAll");
3735476b450e50939940dcf3f15c92335cee2fc572dJason Sams        switch (srcLocation) {
37478e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray        case USAGE_GRAPHICS_TEXTURE:
3755476b450e50939940dcf3f15c92335cee2fc572dJason Sams        case USAGE_SCRIPT:
37678e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray            if ((mUsage & USAGE_SHARED) != 0) {
37778e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray                copyFrom(mBitmap);
37878e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray            }
37978e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray            break;
3805476b450e50939940dcf3f15c92335cee2fc572dJason Sams        case USAGE_GRAPHICS_CONSTANTS:
3815476b450e50939940dcf3f15c92335cee2fc572dJason Sams        case USAGE_GRAPHICS_VERTEX:
3825476b450e50939940dcf3f15c92335cee2fc572dJason Sams            break;
38378e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray        case USAGE_SHARED:
38478e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray            if ((mUsage & USAGE_SHARED) != 0) {
38578e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray                copyTo(mBitmap);
38678e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray            }
38778e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray            break;
3885476b450e50939940dcf3f15c92335cee2fc572dJason Sams        default:
3895476b450e50939940dcf3f15c92335cee2fc572dJason Sams            throw new RSIllegalArgumentException("Source must be exactly one usage type.");
3905476b450e50939940dcf3f15c92335cee2fc572dJason Sams        }
3915476b450e50939940dcf3f15c92335cee2fc572dJason Sams        mRS.validate();
39248fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationSyncAll(getIDSafe(), srcLocation);
3936d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
3945476b450e50939940dcf3f15c92335cee2fc572dJason Sams    }
3955476b450e50939940dcf3f15c92335cee2fc572dJason Sams
3969c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
397c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Send a buffer to the output stream.  The contents of the Allocation will
398c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * be undefined after this operation. This operation is only valid if {@link
399c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * #USAGE_IO_OUTPUT} is set on the Allocation.
400c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
401163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams     *
402163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams     */
403c5f519c5ec57400f04f1d0bdc69f7bfddf47f8cbJason Sams    public void ioSend() {
4046d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "ioSend");
405163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams        if ((mUsage & USAGE_IO_OUTPUT) == 0) {
406163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams            throw new RSIllegalArgumentException(
407163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams                "Can only send buffer if IO_OUTPUT usage specified.");
408163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams        }
409163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams        mRS.validate();
410e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationIoSend(getID(mRS));
4116d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
412163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    }
413163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
4149c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
415c5f519c5ec57400f04f1d0bdc69f7bfddf47f8cbJason Sams     * Delete once code is updated.
416c5f519c5ec57400f04f1d0bdc69f7bfddf47f8cbJason Sams     * @hide
417c5f519c5ec57400f04f1d0bdc69f7bfddf47f8cbJason Sams     */
418c5f519c5ec57400f04f1d0bdc69f7bfddf47f8cbJason Sams    public void ioSendOutput() {
419c5f519c5ec57400f04f1d0bdc69f7bfddf47f8cbJason Sams        ioSend();
420c5f519c5ec57400f04f1d0bdc69f7bfddf47f8cbJason Sams    }
421c5f519c5ec57400f04f1d0bdc69f7bfddf47f8cbJason Sams
4229c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
423c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Receive the latest input into the Allocation. This operation
424c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * is only valid if {@link #USAGE_IO_INPUT} is set on the Allocation.
425163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams     *
426163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams     */
427c5f519c5ec57400f04f1d0bdc69f7bfddf47f8cbJason Sams    public void ioReceive() {
4286d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "ioReceive");
429163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams        if ((mUsage & USAGE_IO_INPUT) == 0) {
430163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams            throw new RSIllegalArgumentException(
431fe1d5ffd1b6c4977a9f301997d2ad90e5b049a3bJason Sams                "Can only receive if IO_INPUT usage specified.");
432163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams        }
433163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams        mRS.validate();
434e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationIoReceive(getID(mRS));
4356d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
436163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    }
437163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
4389c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
439c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an array of RS objects to the Allocation.
44003d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     *
44103d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     * @param d Source array.
44203d2d00dc8ce40528d232fdf81eb0b05e92023a7Jason Sams     */
443bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public void copyFrom(BaseObj[] d) {
4446d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFrom");
445bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        mRS.validate();
446b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        validateIsObject();
447ba862d1544a06528151550be1784a926ee986580Jason Sams        if (d.length != mCurrentCount) {
448bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            throw new RSIllegalArgumentException("Array size mismatch, allocation sizeX = " +
449ba862d1544a06528151550be1784a926ee986580Jason Sams                                                 mCurrentCount + ", array length = " + d.length);
450bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
451bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int i[] = new int[d.length];
452bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        for (int ct=0; ct < d.length; ct++) {
453e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            i[ct] = d[ct].getID(mRS);
454bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
455ba862d1544a06528151550be1784a926ee986580Jason Sams        copy1DRangeFromUnchecked(0, mCurrentCount, i);
4566d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
457bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    }
458bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
459fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams    private void validateBitmapFormat(Bitmap b) {
460252c07802f7039f15f723751162e64a6621e6998Jason Sams        Bitmap.Config bc = b.getConfig();
461abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray        if (bc == null) {
462abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            throw new RSIllegalArgumentException("Bitmap has an unsupported format for this operation");
463abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray        }
464252c07802f7039f15f723751162e64a6621e6998Jason Sams        switch (bc) {
465252c07802f7039f15f723751162e64a6621e6998Jason Sams        case ALPHA_8:
466252c07802f7039f15f723751162e64a6621e6998Jason Sams            if (mType.getElement().mKind != Element.DataKind.PIXEL_A) {
467252c07802f7039f15f723751162e64a6621e6998Jason Sams                throw new RSIllegalArgumentException("Allocation kind is " +
468252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     mType.getElement().mKind + ", type " +
469252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     mType.getElement().mType +
470918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk                                                     " of " + mType.getElement().getBytesSize() +
471252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     " bytes, passed bitmap was " + bc);
472252c07802f7039f15f723751162e64a6621e6998Jason Sams            }
473252c07802f7039f15f723751162e64a6621e6998Jason Sams            break;
474252c07802f7039f15f723751162e64a6621e6998Jason Sams        case ARGB_8888:
475252c07802f7039f15f723751162e64a6621e6998Jason Sams            if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
476918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk                (mType.getElement().getBytesSize() != 4)) {
477252c07802f7039f15f723751162e64a6621e6998Jason Sams                throw new RSIllegalArgumentException("Allocation kind is " +
478252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     mType.getElement().mKind + ", type " +
479252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     mType.getElement().mType +
480918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk                                                     " of " + mType.getElement().getBytesSize() +
481252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     " bytes, passed bitmap was " + bc);
482252c07802f7039f15f723751162e64a6621e6998Jason Sams            }
483252c07802f7039f15f723751162e64a6621e6998Jason Sams            break;
484252c07802f7039f15f723751162e64a6621e6998Jason Sams        case RGB_565:
485252c07802f7039f15f723751162e64a6621e6998Jason Sams            if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGB) ||
486918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk                (mType.getElement().getBytesSize() != 2)) {
487252c07802f7039f15f723751162e64a6621e6998Jason Sams                throw new RSIllegalArgumentException("Allocation kind is " +
488252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     mType.getElement().mKind + ", type " +
489252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     mType.getElement().mType +
490918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk                                                     " of " + mType.getElement().getBytesSize() +
491252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     " bytes, passed bitmap was " + bc);
492252c07802f7039f15f723751162e64a6621e6998Jason Sams            }
493252c07802f7039f15f723751162e64a6621e6998Jason Sams            break;
494252c07802f7039f15f723751162e64a6621e6998Jason Sams        case ARGB_4444:
495252c07802f7039f15f723751162e64a6621e6998Jason Sams            if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
496918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk                (mType.getElement().getBytesSize() != 2)) {
497252c07802f7039f15f723751162e64a6621e6998Jason Sams                throw new RSIllegalArgumentException("Allocation kind is " +
498252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     mType.getElement().mKind + ", type " +
499252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     mType.getElement().mType +
500918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk                                                     " of " + mType.getElement().getBytesSize() +
501252c07802f7039f15f723751162e64a6621e6998Jason Sams                                                     " bytes, passed bitmap was " + bc);
502252c07802f7039f15f723751162e64a6621e6998Jason Sams            }
503252c07802f7039f15f723751162e64a6621e6998Jason Sams            break;
504252c07802f7039f15f723751162e64a6621e6998Jason Sams
505252c07802f7039f15f723751162e64a6621e6998Jason Sams        }
5064ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    }
5074ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams
508fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams    private void validateBitmapSize(Bitmap b) {
509ba862d1544a06528151550be1784a926ee986580Jason Sams        if((mCurrentDimX != b.getWidth()) || (mCurrentDimY != b.getHeight())) {
510fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams            throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch");
511fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        }
512fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams    }
513fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams
5149c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
515c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy into this Allocation from an array. This method does not guarantee
516c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * that the Allocation is compatible with the input buffer; it copies memory
517c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * without reinterpretation.
5184fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
5194fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
5204fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
5214fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    public void copyFromUnchecked(int[] d) {
5226d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFromUnchecked");
5234fa3eed8e03348e2629abd539b3476a86b44135eJason Sams        mRS.validate();
524b05d689653b1bc94836f716f29e9578677c29075Jason Sams        if (mCurrentDimZ > 0) {
525b05d689653b1bc94836f716f29e9578677c29075Jason Sams            copy3DRangeFromUnchecked(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
526b05d689653b1bc94836f716f29e9578677c29075Jason Sams        } else if (mCurrentDimY > 0) {
527a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy2DRangeFromUnchecked(0, 0, mCurrentDimX, mCurrentDimY, d);
528a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        } else {
529a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy1DRangeFromUnchecked(0, mCurrentCount, d);
530a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        }
5316d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
5324fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    }
5336d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray
5349c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
535c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy into this Allocation from an array. This method does not guarantee
536c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * that the Allocation is compatible with the input buffer; it copies memory
537c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * without reinterpretation.
5384fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
5394fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
5404fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
5414fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    public void copyFromUnchecked(short[] d) {
5426d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFromUnchecked");
5434fa3eed8e03348e2629abd539b3476a86b44135eJason Sams        mRS.validate();
544b05d689653b1bc94836f716f29e9578677c29075Jason Sams        if (mCurrentDimZ > 0) {
545b05d689653b1bc94836f716f29e9578677c29075Jason Sams            copy3DRangeFromUnchecked(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
546b05d689653b1bc94836f716f29e9578677c29075Jason Sams        } else if (mCurrentDimY > 0) {
547a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy2DRangeFromUnchecked(0, 0, mCurrentDimX, mCurrentDimY, d);
548a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        } else {
549a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy1DRangeFromUnchecked(0, mCurrentCount, d);
550a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        }
5516d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
5524fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    }
5536d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray
5549c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
555c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy into this Allocation from an array. This method does not guarantee
556c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * that the Allocation is compatible with the input buffer; it copies memory
557c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * without reinterpretation.
5584fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
5594fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
5604fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
5614fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    public void copyFromUnchecked(byte[] d) {
5626d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFromUnchecked");
5634fa3eed8e03348e2629abd539b3476a86b44135eJason Sams        mRS.validate();
564b05d689653b1bc94836f716f29e9578677c29075Jason Sams        if (mCurrentDimZ > 0) {
565b05d689653b1bc94836f716f29e9578677c29075Jason Sams            copy3DRangeFromUnchecked(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
566b05d689653b1bc94836f716f29e9578677c29075Jason Sams        } else if (mCurrentDimY > 0) {
567a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy2DRangeFromUnchecked(0, 0, mCurrentDimX, mCurrentDimY, d);
568a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        } else {
569a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy1DRangeFromUnchecked(0, mCurrentCount, d);
570a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        }
5716d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
5724fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    }
5736d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray
5749c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
575c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy into this Allocation from an array. This method does not guarantee
576c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * that the Allocation is compatible with the input buffer; it copies memory
577c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * without reinterpretation.
5784fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
5794fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
5804fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
5814fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    public void copyFromUnchecked(float[] d) {
5826d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFromUnchecked");
5834fa3eed8e03348e2629abd539b3476a86b44135eJason Sams        mRS.validate();
584b05d689653b1bc94836f716f29e9578677c29075Jason Sams        if (mCurrentDimZ > 0) {
585b05d689653b1bc94836f716f29e9578677c29075Jason Sams            copy3DRangeFromUnchecked(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
586b05d689653b1bc94836f716f29e9578677c29075Jason Sams        } else if (mCurrentDimY > 0) {
587a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy2DRangeFromUnchecked(0, 0, mCurrentDimX, mCurrentDimY, d);
588a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        } else {
589a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy1DRangeFromUnchecked(0, mCurrentCount, d);
590a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        }
5916d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
5924fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    }
5934fa3eed8e03348e2629abd539b3476a86b44135eJason Sams
5946d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray
5959c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
596c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy into this Allocation from an array.  This variant is type checked
597c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and will generate exceptions if the Allocation's {@link
598c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.renderscript.Element} is not a 32 bit integer type.
5994fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
6004fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
6014fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
602bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public void copyFrom(int[] d) {
6036d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFrom");
604771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
605b05d689653b1bc94836f716f29e9578677c29075Jason Sams        if (mCurrentDimZ > 0) {
606b05d689653b1bc94836f716f29e9578677c29075Jason Sams            copy3DRangeFrom(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
607b05d689653b1bc94836f716f29e9578677c29075Jason Sams        } else if (mCurrentDimY > 0) {
608a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, d);
609a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        } else {
610a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy1DRangeFrom(0, mCurrentCount, d);
611a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        }
6126d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
613768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
6144fa3eed8e03348e2629abd539b3476a86b44135eJason Sams
6159c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
616c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy into this Allocation from an array.  This variant is type checked
617c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and will generate exceptions if the Allocation's {@link
618c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.renderscript.Element} is not a 16 bit integer type.
6194fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
6204fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
6214fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
622bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public void copyFrom(short[] d) {
6236d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFrom");
624771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
625b05d689653b1bc94836f716f29e9578677c29075Jason Sams        if (mCurrentDimZ > 0) {
626b05d689653b1bc94836f716f29e9578677c29075Jason Sams            copy3DRangeFrom(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
627b05d689653b1bc94836f716f29e9578677c29075Jason Sams        } else if (mCurrentDimY > 0) {
628a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, d);
629a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        } else {
630a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy1DRangeFrom(0, mCurrentCount, d);
631a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        }
6326d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
633768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
6344fa3eed8e03348e2629abd539b3476a86b44135eJason Sams
6359c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
636c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy into this Allocation from an array.  This variant is type checked
637c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and will generate exceptions if the Allocation's {@link
638c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.renderscript.Element} is not an 8 bit integer type.
6394fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
6404fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
6414fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
642bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public void copyFrom(byte[] d) {
6436d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFrom");
644771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
645b05d689653b1bc94836f716f29e9578677c29075Jason Sams        if (mCurrentDimZ > 0) {
646b05d689653b1bc94836f716f29e9578677c29075Jason Sams            copy3DRangeFrom(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
647b05d689653b1bc94836f716f29e9578677c29075Jason Sams        } else if (mCurrentDimY > 0) {
648a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, d);
649a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        } else {
650a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy1DRangeFrom(0, mCurrentCount, d);
651a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        }
6526d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
653b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
6544fa3eed8e03348e2629abd539b3476a86b44135eJason Sams
6559c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
656c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy into this Allocation from an array.  This variant is type checked
657c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and will generate exceptions if the Allocation's {@link
658c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.renderscript.Element} is not a 32 bit float type.
6594fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
6604fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
6614fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
662bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public void copyFrom(float[] d) {
6636d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFrom");
664771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
665b05d689653b1bc94836f716f29e9578677c29075Jason Sams        if (mCurrentDimZ > 0) {
666b05d689653b1bc94836f716f29e9578677c29075Jason Sams            copy3DRangeFrom(0, 0, 0, mCurrentDimX, mCurrentDimY, mCurrentDimZ, d);
667b05d689653b1bc94836f716f29e9578677c29075Jason Sams        } else if (mCurrentDimY > 0) {
668a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, d);
669a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        } else {
670a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines            copy1DRangeFrom(0, mCurrentCount, d);
671a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        }
6726d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
673b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
6744fa3eed8e03348e2629abd539b3476a86b44135eJason Sams
6759c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
676c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy into an Allocation from a {@link android.graphics.Bitmap}.  The
677c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * height, width, and format of the bitmap must match the existing
678c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * allocation.
679c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
680c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * <p>If the {@link android.graphics.Bitmap} is the same as the {@link
681c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.graphics.Bitmap} used to create the Allocation with {@link
682c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * #createFromBitmap} and {@link #USAGE_SHARED} is set on the Allocation,
683c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * this will synchronize the Allocation with the latest data from the {@link
684c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.graphics.Bitmap}, potentially avoiding the actual copy.</p>
6854fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
6864fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param b the source bitmap
6874fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
688bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public void copyFrom(Bitmap b) {
6896d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFrom");
690fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        mRS.validate();
691abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray        if (b.getConfig() == null) {
692abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            Bitmap newBitmap = Bitmap.createBitmap(b.getWidth(), b.getHeight(), Bitmap.Config.ARGB_8888);
693abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            Canvas c = new Canvas(newBitmap);
694abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            c.drawBitmap(b, 0, 0, null);
695abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            copyFrom(newBitmap);
696abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            return;
697abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray        }
698fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validateBitmapSize(b);
699fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validateBitmapFormat(b);
700e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationCopyFromBitmap(getID(mRS), b);
7016d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
7024ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams    }
70326ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk
7049c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
705c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an Allocation from an Allocation.  The types of both allocations
706f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray     * must be identical.
707f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray     *
708f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray     * @param a the source allocation
709f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray     */
710f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray    public void copyFrom(Allocation a) {
7116d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyFrom");
712f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray        mRS.validate();
713f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray        if (!mType.equals(a.getType())) {
714f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray            throw new RSIllegalArgumentException("Types of allocations must match.");
715f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray        }
716f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray        copy2DRangeFrom(0, 0, mCurrentDimX, mCurrentDimY, a, 0, 0);
7176d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
718f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray    }
719f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray
720f671fb0b35e945e5fc1416603e3b9a1c61d9dab9Tim Murray    /**
721c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * This is only intended to be used by auto-generated code reflected from
722c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * the RenderScript script files and should not be used by developers.
723fa445b9353972735d8d65e8a936786b1afe9886dJason Sams     *
724fa445b9353972735d8d65e8a936786b1afe9886dJason Sams     * @param xoff
725fa445b9353972735d8d65e8a936786b1afe9886dJason Sams     * @param fp
726fa445b9353972735d8d65e8a936786b1afe9886dJason Sams     */
72721b4103e42cb0fa004cc4a978f49f63e7668ab0bJason Sams    public void setFromFieldPacker(int xoff, FieldPacker fp) {
728f70b0fc880edb7c47d5bcc97edbc125b575bc90dJason Sams        mRS.validate();
729918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk        int eSize = mType.mElement.getBytesSize();
730a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        final byte[] data = fp.getData();
731a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
732a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        int count = data.length / eSize;
733a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        if ((eSize * count) != data.length) {
73406d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSIllegalArgumentException("Field packer length " + data.length +
735a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams                                               " not divisible by element size " + eSize + ".");
736a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
737ba862d1544a06528151550be1784a926ee986580Jason Sams        copy1DRangeFromUnchecked(xoff, count, data);
73849bdaf0293408159df18a1d8540360f9623c40f7Jason Sams    }
73949bdaf0293408159df18a1d8540360f9623c40f7Jason Sams
7409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
741c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * This is only intended to be used by auto-generated code reflected from
742c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * the RenderScript script files.
743fa445b9353972735d8d65e8a936786b1afe9886dJason Sams     *
744fa445b9353972735d8d65e8a936786b1afe9886dJason Sams     * @param xoff
745fa445b9353972735d8d65e8a936786b1afe9886dJason Sams     * @param component_number
746fa445b9353972735d8d65e8a936786b1afe9886dJason Sams     * @param fp
747fa445b9353972735d8d65e8a936786b1afe9886dJason Sams     */
74821b4103e42cb0fa004cc4a978f49f63e7668ab0bJason Sams    public void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) {
749f70b0fc880edb7c47d5bcc97edbc125b575bc90dJason Sams        mRS.validate();
75049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams        if (component_number >= mType.mElement.mElements.length) {
75106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSIllegalArgumentException("Component_number " + component_number + " out of range.");
75249bdaf0293408159df18a1d8540360f9623c40f7Jason Sams        }
75349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams        if(xoff < 0) {
75406d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSIllegalArgumentException("Offset must be >= 0.");
75549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams        }
75649bdaf0293408159df18a1d8540360f9623c40f7Jason Sams
75749bdaf0293408159df18a1d8540360f9623c40f7Jason Sams        final byte[] data = fp.getData();
758918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk        int eSize = mType.mElement.mElements[component_number].getBytesSize();
759bf3c3f2ab1067b647038170cb201cdd1a9a1c6d2Alex Sakhartchouk        eSize *= mType.mElement.mArraySizes[component_number];
76049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams
76149bdaf0293408159df18a1d8540360f9623c40f7Jason Sams        if (data.length != eSize) {
76206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSIllegalArgumentException("Field packer sizelength " + data.length +
76349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams                                               " does not match component size " + eSize + ".");
76449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams        }
76549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams
76648fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationElementData1D(getIDSafe(), xoff, mSelectedLOD,
767ba862d1544a06528151550be1784a926ee986580Jason Sams                                     component_number, data, data.length);
768a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
769a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
770768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    private void data1DChecks(int off, int count, int len, int dataSize) {
771771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
772a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        if(off < 0) {
77306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSIllegalArgumentException("Offset must be >= 0.");
774a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
775a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        if(count < 1) {
77606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSIllegalArgumentException("Count must be >= 1.");
777a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
778ba862d1544a06528151550be1784a926ee986580Jason Sams        if((off + count) > mCurrentCount) {
779ba862d1544a06528151550be1784a926ee986580Jason Sams            throw new RSIllegalArgumentException("Overflow, Available count " + mCurrentCount +
780a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams                                               ", got " + count + " at offset " + off + ".");
781768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
782ba862d1544a06528151550be1784a926ee986580Jason Sams        if(len < dataSize) {
78306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSIllegalArgumentException("Array too small for allocation type.");
784768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
785b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
786b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
7879c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
788c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Generate a mipmap chain. This is only valid if the Type of the Allocation
789c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * includes mipmaps.
790f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
791c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * <p>This function will generate a complete set of mipmaps from the top
792c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * level LOD and place them into the script memory space.</p>
793f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
794c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * <p>If the Allocation is also using other memory spaces, a call to {@link
795c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * #syncAll syncAll(Allocation.USAGE_SCRIPT)} is required.</p>
796f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     */
797f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    public void generateMipmaps() {
798e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationGenerateMipmaps(getID(mRS));
799f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    }
800f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams
8019c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
802c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an array into part of this Allocation.  This method does not
803c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * guarantee that the Allocation is compatible with the input buffer.
8044fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
8054fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param off The offset of the first element to be copied.
8064fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param count The number of elements to be copied.
8074fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
8084fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
8094fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    public void copy1DRangeFromUnchecked(int off, int count, int[] d) {
8106d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFromUnchecked");
811918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk        int dataSize = mType.mElement.getBytesSize() * count;
812768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        data1DChecks(off, count, d.length * 4, dataSize);
81348fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
8146d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
815768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
8166d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray
8179c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
818c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an array into part of this Allocation.  This method does not
819c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * guarantee that the Allocation is compatible with the input buffer.
8204fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
8214fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param off The offset of the first element to be copied.
8224fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param count The number of elements to be copied.
8234fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
8244fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
8254fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    public void copy1DRangeFromUnchecked(int off, int count, short[] d) {
8266d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFromUnchecked");
827918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk        int dataSize = mType.mElement.getBytesSize() * count;
828768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        data1DChecks(off, count, d.length * 2, dataSize);
82948fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
8306d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
831768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
8326d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray
8339c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
834c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an array into part of this Allocation.  This method does not
835c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * guarantee that the Allocation is compatible with the input buffer.
8364fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
8374fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param off The offset of the first element to be copied.
8384fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param count The number of elements to be copied.
8394fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
8404fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
8414fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    public void copy1DRangeFromUnchecked(int off, int count, byte[] d) {
8426d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFromUnchecked");
843918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk        int dataSize = mType.mElement.getBytesSize() * count;
844768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        data1DChecks(off, count, d.length, dataSize);
84548fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
8466d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
847768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
8486d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray
8499c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
850c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an array into part of this Allocation.  This method does not
851c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * guarantee that the Allocation is compatible with the input buffer.
8524fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
8534fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param off The offset of the first element to be copied.
8544fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param count The number of elements to be copied.
8554fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
8564fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
8574fa3eed8e03348e2629abd539b3476a86b44135eJason Sams    public void copy1DRangeFromUnchecked(int off, int count, float[] d) {
8586d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFromUnchecked");
859918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk        int dataSize = mType.mElement.getBytesSize() * count;
860768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        data1DChecks(off, count, d.length * 4, dataSize);
86148fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData1D(getIDSafe(), off, mSelectedLOD, count, d, dataSize);
8626d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
863b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
864b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
8659c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
866c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an array into part of this Allocation.  This variant is type checked
867c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and will generate exceptions if the Allocation type is not a 32 bit
868c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * integer type.
8694fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
8704fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param off The offset of the first element to be copied.
8714fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param count The number of elements to be copied.
8724fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
8734fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
874b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    public void copy1DRangeFrom(int off, int count, int[] d) {
8756d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFrom");
876b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        validateIsInt32();
877b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        copy1DRangeFromUnchecked(off, count, d);
8786d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
879b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    }
8804fa3eed8e03348e2629abd539b3476a86b44135eJason Sams
8819c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
882c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an array into part of this Allocation.  This variant is type checked
883c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and will generate exceptions if the Allocation type is not a 16 bit
884c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * integer type.
8854fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
8864fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param off The offset of the first element to be copied.
8874fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param count The number of elements to be copied.
8884fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
8894fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
890b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    public void copy1DRangeFrom(int off, int count, short[] d) {
8916d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFrom");
892b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        validateIsInt16();
893b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        copy1DRangeFromUnchecked(off, count, d);
8946d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
895b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    }
8964fa3eed8e03348e2629abd539b3476a86b44135eJason Sams
8979c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
898c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an array into part of this Allocation.  This variant is type checked
899c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and will generate exceptions if the Allocation type is not an 8 bit
900c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * integer type.
9014fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
9024fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param off The offset of the first element to be copied.
9034fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param count The number of elements to be copied.
9044fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param d the source data array
9054fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
906b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    public void copy1DRangeFrom(int off, int count, byte[] d) {
9076d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFrom");
908b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        validateIsInt8();
909b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        copy1DRangeFromUnchecked(off, count, d);
9106d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
911b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    }
9124fa3eed8e03348e2629abd539b3476a86b44135eJason Sams
9139c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
914c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy an array into part of this Allocation.  This variant is type checked
915c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and will generate exceptions if the Allocation type is not a 32 bit float
916c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * type.
9174fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     *
9184fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param off The offset of the first element to be copied.
9194fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     * @param count The number of elements to be copied.
920304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param d the source data array.
9214fa3eed8e03348e2629abd539b3476a86b44135eJason Sams     */
922b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    public void copy1DRangeFrom(int off, int count, float[] d) {
9236d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFrom");
924b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        validateIsFloat32();
925b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        copy1DRangeFromUnchecked(off, count, d);
9266d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
927b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams    }
9289c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines     /**
929c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy part of an Allocation into this Allocation.
930304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     *
931304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param off The offset of the first element to be copied.
932304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param count The number of elements to be copied.
933304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param data the source data allocation.
934304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param dataOff off The offset of the first element in data to
935304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     *          be copied.
936304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     */
937304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    public void copy1DRangeFrom(int off, int count, Allocation data, int dataOff) {
9386d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy1DRangeFrom");
93948fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData2D(getIDSafe(), off, 0,
940ba862d1544a06528151550be1784a926ee986580Jason Sams                              mSelectedLOD, mSelectedFace.mID,
941e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                              count, 1, data.getID(mRS), dataOff, 0,
942ba862d1544a06528151550be1784a926ee986580Jason Sams                              data.mSelectedLOD, data.mSelectedFace.mID);
943304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    }
944304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
945fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams    private void validate2DRange(int xoff, int yoff, int w, int h) {
946ba862d1544a06528151550be1784a926ee986580Jason Sams        if (mAdaptedAllocation != null) {
947ba862d1544a06528151550be1784a926ee986580Jason Sams
948ba862d1544a06528151550be1784a926ee986580Jason Sams        } else {
949ba862d1544a06528151550be1784a926ee986580Jason Sams
950ba862d1544a06528151550be1784a926ee986580Jason Sams            if (xoff < 0 || yoff < 0) {
951ba862d1544a06528151550be1784a926ee986580Jason Sams                throw new RSIllegalArgumentException("Offset cannot be negative.");
952ba862d1544a06528151550be1784a926ee986580Jason Sams            }
953ba862d1544a06528151550be1784a926ee986580Jason Sams            if (h < 0 || w < 0) {
954ba862d1544a06528151550be1784a926ee986580Jason Sams                throw new RSIllegalArgumentException("Height or width cannot be negative.");
955ba862d1544a06528151550be1784a926ee986580Jason Sams            }
956ba862d1544a06528151550be1784a926ee986580Jason Sams            if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
957ba862d1544a06528151550be1784a926ee986580Jason Sams                throw new RSIllegalArgumentException("Updated region larger than allocation.");
958ba862d1544a06528151550be1784a926ee986580Jason Sams            }
959fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        }
960fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams    }
961768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
962a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    void copy2DRangeFromUnchecked(int xoff, int yoff, int w, int h, byte[] data) {
9636d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFromUnchecked");
964fa445b9353972735d8d65e8a936786b1afe9886dJason Sams        mRS.validate();
965fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validate2DRange(xoff, yoff, w, h);
96648fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
967ba862d1544a06528151550be1784a926ee986580Jason Sams                              w, h, data, data.length);
9686d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
969fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    }
970fa445b9353972735d8d65e8a936786b1afe9886dJason Sams
971a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    void copy2DRangeFromUnchecked(int xoff, int yoff, int w, int h, short[] data) {
9726d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFromUnchecked");
973fa445b9353972735d8d65e8a936786b1afe9886dJason Sams        mRS.validate();
974fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validate2DRange(xoff, yoff, w, h);
97548fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
976ba862d1544a06528151550be1784a926ee986580Jason Sams                              w, h, data, data.length * 2);
9776d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
978fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    }
979fa445b9353972735d8d65e8a936786b1afe9886dJason Sams
980a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    void copy2DRangeFromUnchecked(int xoff, int yoff, int w, int h, int[] data) {
9816d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFromUnchecked");
982771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
983fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validate2DRange(xoff, yoff, w, h);
98448fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
985ba862d1544a06528151550be1784a926ee986580Jason Sams                              w, h, data, data.length * 4);
9866d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
987b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
988b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
989a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    void copy2DRangeFromUnchecked(int xoff, int yoff, int w, int h, float[] data) {
9906d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFromUnchecked");
991771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
992fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validate2DRange(xoff, yoff, w, h);
99348fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
994ba862d1544a06528151550be1784a926ee986580Jason Sams                              w, h, data, data.length * 4);
9956d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
996b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
997b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
998a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    /**
999c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy from an array into a rectangular region in this Allocation.  The
1000c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * array is assumed to be tightly packed.
1001a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines     *
1002c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param xoff X offset of the region to update in this Allocation
1003c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param yoff Y offset of the region to update in this Allocation
1004c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param w Width of the region to update
1005c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param h Height of the region to update
1006c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param data to be placed into the Allocation
1007a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines     */
1008a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, byte[] data) {
10096d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFrom");
10105f528becb09b0956bcad15b32639f87b87f40f13Stephen Hines        validateIsInt8();
1011a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        copy2DRangeFromUnchecked(xoff, yoff, w, h, data);
10126d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1013a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    }
1014a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines
1015c11e25c4e653124def1fb18e203b894f42106cbeTim Murray    /**
1016c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy from an array into a rectangular region in this Allocation.  The
1017c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * array is assumed to be tightly packed.
1018c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
1019c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param xoff X offset of the region to update in this Allocation
1020c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param yoff Y offset of the region to update in this Allocation
1021c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param w Width of the region to update
1022c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param h Height of the region to update
1023c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param data to be placed into the Allocation
1024c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     */
1025a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, short[] data) {
10266d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFrom");
10275f528becb09b0956bcad15b32639f87b87f40f13Stephen Hines        validateIsInt16();
1028a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        copy2DRangeFromUnchecked(xoff, yoff, w, h, data);
10296d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1030a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    }
1031a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines
1032c11e25c4e653124def1fb18e203b894f42106cbeTim Murray    /**
1033c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy from an array into a rectangular region in this Allocation.  The
1034c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * array is assumed to be tightly packed.
1035c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
1036c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param xoff X offset of the region to update in this Allocation
1037c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param yoff Y offset of the region to update in this Allocation
1038c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param w Width of the region to update
1039c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param h Height of the region to update
1040c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param data to be placed into the Allocation
1041c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     */
1042a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, int[] data) {
10436d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFrom");
10445f528becb09b0956bcad15b32639f87b87f40f13Stephen Hines        validateIsInt32();
1045a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        copy2DRangeFromUnchecked(xoff, yoff, w, h, data);
10466d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1047a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    }
1048a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines
1049c11e25c4e653124def1fb18e203b894f42106cbeTim Murray    /**
1050c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy from an array into a rectangular region in this Allocation.  The
1051c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * array is assumed to be tightly packed.
1052c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
1053c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param xoff X offset of the region to update in this Allocation
1054c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param yoff Y offset of the region to update in this Allocation
1055c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param w Width of the region to update
1056c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param h Height of the region to update
1057c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param data to be placed into the Allocation
1058c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     */
1059a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, float[] data) {
10606d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFrom");
10615f528becb09b0956bcad15b32639f87b87f40f13Stephen Hines        validateIsFloat32();
1062a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines        copy2DRangeFromUnchecked(xoff, yoff, w, h, data);
10636d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1064a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines    }
1065a9a7b3740598c79792cbcebca6a00d1595324ae9Stephen Hines
10669c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1067c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy a rectangular region from an Allocation into a rectangular region in
1068c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * this Allocation.
1069304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     *
1070c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param xoff X offset of the region in this Allocation
1071c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param yoff Y offset of the region in this Allocation
1072c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param w Width of the region to update.
1073c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param h Height of the region to update.
1074c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param data source Allocation.
1075c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param dataXoff X offset in source Allocation
1076c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param dataYoff Y offset in source Allocation
1077304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     */
1078304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    public void copy2DRangeFrom(int xoff, int yoff, int w, int h,
1079304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                                Allocation data, int dataXoff, int dataYoff) {
10806d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFrom");
1081304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk        mRS.validate();
1082304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk        validate2DRange(xoff, yoff, w, h);
108348fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff,
1084ba862d1544a06528151550be1784a926ee986580Jason Sams                              mSelectedLOD, mSelectedFace.mID,
1085e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                              w, h, data.getID(mRS), dataXoff, dataYoff,
1086ba862d1544a06528151550be1784a926ee986580Jason Sams                              data.mSelectedLOD, data.mSelectedFace.mID);
10876d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1088304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    }
1089304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
10909c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1091c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy a {@link android.graphics.Bitmap} into an Allocation.  The height
1092c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and width of the update will use the height and width of the {@link
1093c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.graphics.Bitmap}.
1094f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
1095c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param xoff X offset of the region to update in this Allocation
1096c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param yoff Y offset of the region to update in this Allocation
1097c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param data the Bitmap to be copied
1098f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     */
1099f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams    public void copy2DRangeFrom(int xoff, int yoff, Bitmap data) {
11006d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copy2DRangeFrom");
1101fa445b9353972735d8d65e8a936786b1afe9886dJason Sams        mRS.validate();
1102abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray        if (data.getConfig() == null) {
1103abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            Bitmap newBitmap = Bitmap.createBitmap(data.getWidth(), data.getHeight(), Bitmap.Config.ARGB_8888);
1104abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            Canvas c = new Canvas(newBitmap);
1105abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            c.drawBitmap(data, 0, 0, null);
1106abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            copy2DRangeFrom(xoff, yoff, newBitmap);
1107b05d689653b1bc94836f716f29e9578677c29075Jason Sams            return;
1108abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray        }
1109fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validateBitmapFormat(data);
1110fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validate2DRange(xoff, yoff, data.getWidth(), data.getHeight());
111148fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams        mRS.nAllocationData2D(getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace.mID, data);
11126d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1113fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    }
1114fa445b9353972735d8d65e8a936786b1afe9886dJason Sams
1115b05d689653b1bc94836f716f29e9578677c29075Jason Sams    private void validate3DRange(int xoff, int yoff, int zoff, int w, int h, int d) {
1116b05d689653b1bc94836f716f29e9578677c29075Jason Sams        if (mAdaptedAllocation != null) {
1117b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1118b05d689653b1bc94836f716f29e9578677c29075Jason Sams        } else {
1119b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1120b05d689653b1bc94836f716f29e9578677c29075Jason Sams            if (xoff < 0 || yoff < 0 || zoff < 0) {
1121b05d689653b1bc94836f716f29e9578677c29075Jason Sams                throw new RSIllegalArgumentException("Offset cannot be negative.");
1122b05d689653b1bc94836f716f29e9578677c29075Jason Sams            }
1123b05d689653b1bc94836f716f29e9578677c29075Jason Sams            if (h < 0 || w < 0 || d < 0) {
1124b05d689653b1bc94836f716f29e9578677c29075Jason Sams                throw new RSIllegalArgumentException("Height or width cannot be negative.");
1125b05d689653b1bc94836f716f29e9578677c29075Jason Sams            }
1126b05d689653b1bc94836f716f29e9578677c29075Jason Sams            if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY) || ((zoff + d) > mCurrentDimZ)) {
1127b05d689653b1bc94836f716f29e9578677c29075Jason Sams                throw new RSIllegalArgumentException("Updated region larger than allocation.");
1128b05d689653b1bc94836f716f29e9578677c29075Jason Sams            }
1129b05d689653b1bc94836f716f29e9578677c29075Jason Sams        }
1130b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1131b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1132b05d689653b1bc94836f716f29e9578677c29075Jason Sams    /**
1133b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @hide
1134b05d689653b1bc94836f716f29e9578677c29075Jason Sams     *
1135b05d689653b1bc94836f716f29e9578677c29075Jason Sams     */
1136b05d689653b1bc94836f716f29e9578677c29075Jason Sams    void copy3DRangeFromUnchecked(int xoff, int yoff, int zoff, int w, int h, int d, byte[] data) {
1137b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.validate();
1138b05d689653b1bc94836f716f29e9578677c29075Jason Sams        validate3DRange(xoff, yoff, zoff, w, h, d);
1139b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
1140b05d689653b1bc94836f716f29e9578677c29075Jason Sams                              w, h, d, data, data.length);
1141b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1142b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1143b05d689653b1bc94836f716f29e9578677c29075Jason Sams    /**
1144b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @hide
1145b05d689653b1bc94836f716f29e9578677c29075Jason Sams     *
1146b05d689653b1bc94836f716f29e9578677c29075Jason Sams     */
1147b05d689653b1bc94836f716f29e9578677c29075Jason Sams    void copy3DRangeFromUnchecked(int xoff, int yoff, int zoff, int w, int h, int d, short[] data) {
1148b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.validate();
1149b05d689653b1bc94836f716f29e9578677c29075Jason Sams        validate3DRange(xoff, yoff, zoff, w, h, d);
1150b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
1151b05d689653b1bc94836f716f29e9578677c29075Jason Sams                              w, h, d, data, data.length * 2);
1152b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1153b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1154b05d689653b1bc94836f716f29e9578677c29075Jason Sams    /**
1155b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @hide
1156b05d689653b1bc94836f716f29e9578677c29075Jason Sams     *
1157b05d689653b1bc94836f716f29e9578677c29075Jason Sams     */
1158b05d689653b1bc94836f716f29e9578677c29075Jason Sams    void copy3DRangeFromUnchecked(int xoff, int yoff, int zoff, int w, int h, int d, int[] data) {
1159b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.validate();
1160b05d689653b1bc94836f716f29e9578677c29075Jason Sams        validate3DRange(xoff, yoff, zoff, w, h, d);
1161b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
1162b05d689653b1bc94836f716f29e9578677c29075Jason Sams                              w, h, d, data, data.length * 4);
1163b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1164b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1165b05d689653b1bc94836f716f29e9578677c29075Jason Sams    /**
1166b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @hide
1167b05d689653b1bc94836f716f29e9578677c29075Jason Sams     *
1168b05d689653b1bc94836f716f29e9578677c29075Jason Sams     */
1169b05d689653b1bc94836f716f29e9578677c29075Jason Sams    void copy3DRangeFromUnchecked(int xoff, int yoff, int zoff, int w, int h, int d, float[] data) {
1170b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.validate();
1171b05d689653b1bc94836f716f29e9578677c29075Jason Sams        validate3DRange(xoff, yoff, zoff, w, h, d);
1172b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
1173b05d689653b1bc94836f716f29e9578677c29075Jason Sams                              w, h, d, data, data.length * 4);
1174b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1175b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1176b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1177b05d689653b1bc94836f716f29e9578677c29075Jason Sams    /**
1178b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @hide
1179b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * Copy a rectangular region from the array into the allocation.
1180c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * The array is assumed to be tightly packed.
1181c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
1182c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param xoff X offset of the region to update in this Allocation
1183c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param yoff Y offset of the region to update in this Allocation
1184c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param zoff Z offset of the region to update in this Allocation
1185c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param w Width of the region to update
1186c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param h Height of the region to update
1187c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param d Depth of the region to update
1188b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @param data to be placed into the allocation
1189b05d689653b1bc94836f716f29e9578677c29075Jason Sams     */
1190b05d689653b1bc94836f716f29e9578677c29075Jason Sams    public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, byte[] data) {
1191b05d689653b1bc94836f716f29e9578677c29075Jason Sams        validateIsInt8();
1192b05d689653b1bc94836f716f29e9578677c29075Jason Sams        copy3DRangeFromUnchecked(xoff, yoff, zoff, w, h, d, data);
1193b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1194b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1195b05d689653b1bc94836f716f29e9578677c29075Jason Sams    /**
1196b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @hide
1197b05d689653b1bc94836f716f29e9578677c29075Jason Sams     *
1198b05d689653b1bc94836f716f29e9578677c29075Jason Sams     */
1199b05d689653b1bc94836f716f29e9578677c29075Jason Sams    public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, short[] data) {
1200b05d689653b1bc94836f716f29e9578677c29075Jason Sams        validateIsInt16();
1201b05d689653b1bc94836f716f29e9578677c29075Jason Sams        copy3DRangeFromUnchecked(xoff, yoff, zoff, w, h, d, data);
1202b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1203b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1204b05d689653b1bc94836f716f29e9578677c29075Jason Sams    /**
1205b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @hide
1206b05d689653b1bc94836f716f29e9578677c29075Jason Sams     *
1207b05d689653b1bc94836f716f29e9578677c29075Jason Sams     */
1208b05d689653b1bc94836f716f29e9578677c29075Jason Sams    public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, int[] data) {
1209b05d689653b1bc94836f716f29e9578677c29075Jason Sams        validateIsInt32();
1210b05d689653b1bc94836f716f29e9578677c29075Jason Sams        copy3DRangeFromUnchecked(xoff, yoff, zoff, w, h, d, data);
1211b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1212b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1213b05d689653b1bc94836f716f29e9578677c29075Jason Sams    /**
1214b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @hide
1215b05d689653b1bc94836f716f29e9578677c29075Jason Sams     *
1216b05d689653b1bc94836f716f29e9578677c29075Jason Sams     */
1217b05d689653b1bc94836f716f29e9578677c29075Jason Sams    public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d, float[] data) {
1218b05d689653b1bc94836f716f29e9578677c29075Jason Sams        validateIsFloat32();
1219b05d689653b1bc94836f716f29e9578677c29075Jason Sams        copy3DRangeFromUnchecked(xoff, yoff, zoff, w, h, d, data);
1220b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1221b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1222b05d689653b1bc94836f716f29e9578677c29075Jason Sams    /**
1223b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @hide
1224b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * Copy a rectangular region into the allocation from another
1225b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * allocation.
1226b05d689653b1bc94836f716f29e9578677c29075Jason Sams     *
1227c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param xoff X offset of the region to update in this Allocation
1228c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param yoff Y offset of the region to update in this Allocation
1229c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param zoff Z offset of the region to update in this Allocation
1230c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param w Width of the region to update.
1231c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param h Height of the region to update.
1232c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param d Depth of the region to update.
1233b05d689653b1bc94836f716f29e9578677c29075Jason Sams     * @param data source allocation.
1234c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param dataXoff X offset of the region in the source Allocation
1235c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param dataYoff Y offset of the region in the source Allocation
1236c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param dataZoff Z offset of the region in the source Allocation
1237b05d689653b1bc94836f716f29e9578677c29075Jason Sams     */
1238b05d689653b1bc94836f716f29e9578677c29075Jason Sams    public void copy3DRangeFrom(int xoff, int yoff, int zoff, int w, int h, int d,
1239b05d689653b1bc94836f716f29e9578677c29075Jason Sams                                Allocation data, int dataXoff, int dataYoff, int dataZoff) {
1240b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.validate();
1241b05d689653b1bc94836f716f29e9578677c29075Jason Sams        validate3DRange(xoff, yoff, zoff, w, h, d);
1242b05d689653b1bc94836f716f29e9578677c29075Jason Sams        mRS.nAllocationData3D(getIDSafe(), xoff, yoff, zoff, mSelectedLOD,
1243b05d689653b1bc94836f716f29e9578677c29075Jason Sams                              w, h, d, data.getID(mRS), dataXoff, dataYoff, dataZoff,
1244b05d689653b1bc94836f716f29e9578677c29075Jason Sams                              data.mSelectedLOD);
1245b05d689653b1bc94836f716f29e9578677c29075Jason Sams    }
1246b05d689653b1bc94836f716f29e9578677c29075Jason Sams
1247fa445b9353972735d8d65e8a936786b1afe9886dJason Sams
12489c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1249c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy from the Allocation into a {@link android.graphics.Bitmap}.  The
1250c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * bitmap must match the dimensions of the Allocation.
125148fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     *
125248fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     * @param b The bitmap to be set from the Allocation.
125348fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     */
1254fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    public void copyTo(Bitmap b) {
12556d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo");
1256fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        mRS.validate();
1257fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validateBitmapFormat(b);
1258fb9f82ca4f11cf7e43a001f3e6fd1b381cc86210Jason Sams        validateBitmapSize(b);
1259e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationCopyToBitmap(getID(mRS), b);
12606d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1261fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    }
1262fa445b9353972735d8d65e8a936786b1afe9886dJason Sams
12639c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1264c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy from the Allocation into a byte array.  The array must be at least
1265c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * as large as the Allocation.  The allocation must be of an 8 bit integer
1266c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * {@link android.renderscript.Element} type.
126748fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     *
126848fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     * @param d The array to be set from the Allocation.
126948fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     */
1270fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    public void copyTo(byte[] d) {
12716d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo");
1272b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        validateIsInt8();
1273fa445b9353972735d8d65e8a936786b1afe9886dJason Sams        mRS.validate();
1274e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationRead(getID(mRS), d);
12756d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1276fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    }
1277fa445b9353972735d8d65e8a936786b1afe9886dJason Sams
12789c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1279c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy from the Allocation into a short array.  The array must be at least
1280c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * as large as the Allocation.  The allocation must be of an 16 bit integer
1281c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * {@link android.renderscript.Element} type.
128248fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     *
128348fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     * @param d The array to be set from the Allocation.
128448fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     */
1285fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    public void copyTo(short[] d) {
12866d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo");
1287b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        validateIsInt16();
1288fa445b9353972735d8d65e8a936786b1afe9886dJason Sams        mRS.validate();
1289e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationRead(getID(mRS), d);
12906d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1291fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    }
1292fa445b9353972735d8d65e8a936786b1afe9886dJason Sams
12939c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1294c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy from the Allocation into a int array.  The array must be at least as
1295c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * large as the Allocation.  The allocation must be of an 32 bit integer
1296c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * {@link android.renderscript.Element} type.
129748fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     *
129848fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     * @param d The array to be set from the Allocation.
129948fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     */
1300fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    public void copyTo(int[] d) {
13016d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo");
1302b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        validateIsInt32();
1303771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
1304e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationRead(getID(mRS), d);
13056d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
130640a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams    }
130740a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams
13089c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1309c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Copy from the Allocation into a float array.  The array must be at least
1310c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * as large as the Allocation.  The allocation must be of an 32 bit float
1311c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * {@link android.renderscript.Element} type.
131248fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     *
131348fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     * @param d The array to be set from the Allocation.
131448fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams     */
1315fa445b9353972735d8d65e8a936786b1afe9886dJason Sams    public void copyTo(float[] d) {
13166d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo");
1317b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams        validateIsFloat32();
1318771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
1319e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationRead(getID(mRS), d);
13206d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
132140a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams    }
132240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams
13239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1324c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Resize a 1D allocation.  The contents of the allocation are preserved.
1325c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * If new elements are allocated objects are created with null contents and
1326c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * the new region is otherwise undefined.
1327f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
1328c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * <p>If the new region is smaller the references of any objects outside the
1329c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * new region will be released.</p>
1330f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
1331c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * <p>A new type will be created with the new dimension.</p>
1332f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     *
1333f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     * @param dimX The new size of the allocation.
1334b05d689653b1bc94836f716f29e9578677c29075Jason Sams     *
1335c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @deprecated RenderScript objects should be immutable once created.  The
1336c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * replacement is to create a new allocation and copy the contents.
1337f7086090cfc8d97b5bd3b4d7801a27af11f7c207Jason Sams     */
133831a7e42f4baa059352f0db119de38428e655eab2Jason Sams    public synchronized void resize(int dimX) {
1339bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
134006d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSInvalidStateException("Resize only support for 1D allocations at this time.");
13415edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams        }
1342e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationResize1D(getID(mRS), dimX);
1343d26297fa562d8bb203df1bb5e6ded7f62c56cdb7Jason Sams        mRS.finish();  // Necessary because resize is fifoed and update is async.
134431a7e42f4baa059352f0db119de38428e655eab2Jason Sams
1345e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int typeID = mRS.nAllocationGetType(getID(mRS));
134631a7e42f4baa059352f0db119de38428e655eab2Jason Sams        mType = new Type(typeID, mRS);
134731a7e42f4baa059352f0db119de38428e655eab2Jason Sams        mType.updateFromNative();
1348452a7661e8b06459b75493b441d33244939c1153Jason Sams        updateCacheInfo(mType);
13495edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams    }
13505edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams
1351b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
1352b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    // creation
1353b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
135449a05d7b82956009f03acbb92a064eed054eb031Jason Sams    static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
1355b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    static {
1356b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        mBitmapOptions.inScaled = false;
1357b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
1358b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
13599c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1360c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates a new Allocation with the given {@link
1361c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.renderscript.Type}, mipmap flag, and usage flags.
1362623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1363c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param type RenderScript type describing data layout
1364623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param mips specifies desired mipmap behaviour for the
1365623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *             allocation
1366c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param usage bit field specifying how the Allocation is
1367623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *              utilized
1368623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
1369623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk    static public Allocation createTyped(RenderScript rs, Type type, MipmapControl mips, int usage) {
13706d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "createTyped");
1371771bebb94054d06f97284379c93a2620613513c3Jason Sams        rs.validate();
1372e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        if (type.getID(rs) == 0) {
137306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSInvalidStateException("Bad Type");
137406d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        }
1375e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int id = rs.nAllocationCreateTyped(type.getID(rs), mips.mID, usage, 0);
1376857d0c7017da763a420e825fffa2f260eb982c97Jason Sams        if (id == 0) {
1377857d0c7017da763a420e825fffa2f260eb982c97Jason Sams            throw new RSRuntimeException("Allocation creation failed.");
1378857d0c7017da763a420e825fffa2f260eb982c97Jason Sams        }
13796d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
1380857d0c7017da763a420e825fffa2f260eb982c97Jason Sams        return new Allocation(id, rs, type, usage);
1381857d0c7017da763a420e825fffa2f260eb982c97Jason Sams    }
1382857d0c7017da763a420e825fffa2f260eb982c97Jason Sams
13839c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1384c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates an Allocation with the size specified by the type and no mipmaps
1385c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * generated by default
1386623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1387f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1388623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param type renderscript type describing data layout
1389623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param usage bit field specifying how the allocation is
1390623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *              utilized
1391623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1392623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @return allocation
1393623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
1394e5d3712d9eaef7ebbf142b508bd740414d930cb0Jason Sams    static public Allocation createTyped(RenderScript rs, Type type, int usage) {
1395e5d3712d9eaef7ebbf142b508bd740414d930cb0Jason Sams        return createTyped(rs, type, MipmapControl.MIPMAP_NONE, usage);
1396e5d3712d9eaef7ebbf142b508bd740414d930cb0Jason Sams    }
1397e5d3712d9eaef7ebbf142b508bd740414d930cb0Jason Sams
13989c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1399c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates an Allocation for use by scripts with a given {@link
1400c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * android.renderscript.Type} and no mipmaps
1401623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1402c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param rs Context to which the Allocation will belong.
1403c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param type RenderScript Type describing data layout
1404623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1405623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @return allocation
1406623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
14075476b450e50939940dcf3f15c92335cee2fc572dJason Sams    static public Allocation createTyped(RenderScript rs, Type type) {
1408d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams        return createTyped(rs, type, MipmapControl.MIPMAP_NONE, USAGE_SCRIPT);
14095476b450e50939940dcf3f15c92335cee2fc572dJason Sams    }
14101bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
14119c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1412c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates an Allocation with a specified number of given elements
1413623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1414c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param rs Context to which the Allocation will belong.
1415c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param e Element to use in the Allocation
1416c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param count the number of Elements in the Allocation
1417c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param usage bit field specifying how the Allocation is
1418623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *              utilized
1419623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1420623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @return allocation
1421623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
14225476b450e50939940dcf3f15c92335cee2fc572dJason Sams    static public Allocation createSized(RenderScript rs, Element e,
14235476b450e50939940dcf3f15c92335cee2fc572dJason Sams                                         int count, int usage) {
14246d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "createSized");
1425771bebb94054d06f97284379c93a2620613513c3Jason Sams        rs.validate();
1426768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        Type.Builder b = new Type.Builder(rs, e);
1427bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        b.setX(count);
1428768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        Type t = b.create();
1429768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
1430e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int id = rs.nAllocationCreateTyped(t.getID(rs), MipmapControl.MIPMAP_NONE.mID, usage, 0);
14315476b450e50939940dcf3f15c92335cee2fc572dJason Sams        if (id == 0) {
143206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSRuntimeException("Allocation creation failed.");
1433b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
14346d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
14355476b450e50939940dcf3f15c92335cee2fc572dJason Sams        return new Allocation(id, rs, t, usage);
14365476b450e50939940dcf3f15c92335cee2fc572dJason Sams    }
14375476b450e50939940dcf3f15c92335cee2fc572dJason Sams
14389c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1439c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates an Allocation with a specified number of given elements
1440623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1441c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param rs Context to which the Allocation will belong.
1442c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param e Element to use in the Allocation
1443c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param count the number of Elements in the Allocation
1444623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1445623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @return allocation
1446623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
14475476b450e50939940dcf3f15c92335cee2fc572dJason Sams    static public Allocation createSized(RenderScript rs, Element e, int count) {
1448d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams        return createSized(rs, e, count, USAGE_SCRIPT);
1449b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
1450b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
145149a05d7b82956009f03acbb92a064eed054eb031Jason Sams    static Element elementFromBitmap(RenderScript rs, Bitmap b) {
14528a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        final Bitmap.Config bc = b.getConfig();
14538a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        if (bc == Bitmap.Config.ALPHA_8) {
14548a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams            return Element.A_8(rs);
14558a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        }
14568a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        if (bc == Bitmap.Config.ARGB_4444) {
14578a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams            return Element.RGBA_4444(rs);
14588a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        }
14598a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        if (bc == Bitmap.Config.ARGB_8888) {
14608a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams            return Element.RGBA_8888(rs);
14618a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        }
14628a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        if (bc == Bitmap.Config.RGB_565) {
14638a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams            return Element.RGB_565(rs);
14648a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        }
14654bd1a3dbcad2ae424293e276434b45ebee97248dJeff Sharkey        throw new RSInvalidStateException("Bad bitmap type: " + bc);
14668a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams    }
14678a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
146849a05d7b82956009f03acbb92a064eed054eb031Jason Sams    static Type typeFromBitmap(RenderScript rs, Bitmap b,
14694ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams                                       MipmapControl mip) {
14708a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        Element e = elementFromBitmap(rs, b);
14718a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        Type.Builder tb = new Type.Builder(rs, e);
1472bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        tb.setX(b.getWidth());
1473bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        tb.setY(b.getHeight());
14744ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams        tb.setMipmaps(mip == MipmapControl.MIPMAP_FULL);
14758a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams        return tb.create();
14768a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams    }
14778a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
14789c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1479c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates an Allocation from a {@link android.graphics.Bitmap}.
1480623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1481f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1482c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param b Bitmap source for the allocation data
1483623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param mips specifies desired mipmap behaviour for the
1484623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *             allocation
1485623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param usage bit field specifying how the allocation is
1486623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *              utilized
1487623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1488c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @return Allocation containing bitmap data
1489623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1490623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
149167f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk    static public Allocation createFromBitmap(RenderScript rs, Bitmap b,
14924ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams                                              MipmapControl mips,
14935476b450e50939940dcf3f15c92335cee2fc572dJason Sams                                              int usage) {
14946d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceBegin(RenderScript.TRACE_TAG, "createFromBitmap");
1495771bebb94054d06f97284379c93a2620613513c3Jason Sams        rs.validate();
1496abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray
1497abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray        // WAR undocumented color formats
1498abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray        if (b.getConfig() == null) {
1499abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            if ((usage & USAGE_SHARED) != 0) {
1500abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray                throw new RSIllegalArgumentException("USAGE_SHARED cannot be used with a Bitmap that has a null config.");
1501abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            }
1502abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            Bitmap newBitmap = Bitmap.createBitmap(b.getWidth(), b.getHeight(), Bitmap.Config.ARGB_8888);
1503abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            Canvas c = new Canvas(newBitmap);
1504abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            c.drawBitmap(b, 0, 0, null);
1505abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray            return createFromBitmap(rs, newBitmap, mips, usage);
1506abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray        }
1507abd5db9d37839bb47c77e03b28d00042582fbfe2Tim Murray
15085476b450e50939940dcf3f15c92335cee2fc572dJason Sams        Type t = typeFromBitmap(rs, b, mips);
15098a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
1510a314551d69098537337c970da615a8f8af58e1f1Tim Murray        // enable optimized bitmap path only with no mipmap and script-only usage
1511a314551d69098537337c970da615a8f8af58e1f1Tim Murray        if (mips == MipmapControl.MIPMAP_NONE &&
1512a314551d69098537337c970da615a8f8af58e1f1Tim Murray            t.getElement().isCompatible(Element.RGBA_8888(rs)) &&
151378e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray            usage == (USAGE_SHARED | USAGE_SCRIPT | USAGE_GRAPHICS_TEXTURE)) {
1514a314551d69098537337c970da615a8f8af58e1f1Tim Murray            int id = rs.nAllocationCreateBitmapBackedAllocation(t.getID(rs), mips.mID, b, usage);
1515a314551d69098537337c970da615a8f8af58e1f1Tim Murray            if (id == 0) {
1516a314551d69098537337c970da615a8f8af58e1f1Tim Murray                throw new RSRuntimeException("Load failed.");
1517a314551d69098537337c970da615a8f8af58e1f1Tim Murray            }
1518a314551d69098537337c970da615a8f8af58e1f1Tim Murray
1519a314551d69098537337c970da615a8f8af58e1f1Tim Murray            // keep a reference to the Bitmap around to prevent GC
1520a314551d69098537337c970da615a8f8af58e1f1Tim Murray            Allocation alloc = new Allocation(id, rs, t, usage);
1521a314551d69098537337c970da615a8f8af58e1f1Tim Murray            alloc.setBitmap(b);
1522a314551d69098537337c970da615a8f8af58e1f1Tim Murray            return alloc;
1523a314551d69098537337c970da615a8f8af58e1f1Tim Murray        }
1524a314551d69098537337c970da615a8f8af58e1f1Tim Murray
15259bf189228fdb0ec14b284f8bd543d5f9137997ccJason Sams
1526e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int id = rs.nAllocationCreateFromBitmap(t.getID(rs), mips.mID, b, usage);
15275476b450e50939940dcf3f15c92335cee2fc572dJason Sams        if (id == 0) {
152806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSRuntimeException("Load failed.");
1529718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
15306d7a53cbddbffba30f7e9f82ced9c1ab46214f5aTim Murray        Trace.traceEnd(RenderScript.TRACE_TAG);
15315476b450e50939940dcf3f15c92335cee2fc572dJason Sams        return new Allocation(id, rs, t, usage);
15325476b450e50939940dcf3f15c92335cee2fc572dJason Sams    }
15335476b450e50939940dcf3f15c92335cee2fc572dJason Sams
15349c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1535c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Returns the handle to a raw buffer that is being managed by the screen
1536c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * compositor. This operation is only valid for Allocations with {@link
1537c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * #USAGE_IO_INPUT}.
1538fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams     *
1539918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk     * @return Surface object associated with allocation
1540fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams     *
1541163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams     */
1542fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams    public Surface getSurface() {
154372226e0543461133b9e177a3e78ae50b0c65e797Jason Sams        if ((mUsage & USAGE_IO_INPUT) == 0) {
154472226e0543461133b9e177a3e78ae50b0c65e797Jason Sams            throw new RSInvalidStateException("Allocation is not a surface texture.");
154572226e0543461133b9e177a3e78ae50b0c65e797Jason Sams        }
154672226e0543461133b9e177a3e78ae50b0c65e797Jason Sams        return mRS.nAllocationGetSurface(getID(mRS));
1547fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams    }
1548fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams
15499c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1550c089c2fc00054d6dde24b98e78226923a5364564Jason Sams     * @hide
1551c089c2fc00054d6dde24b98e78226923a5364564Jason Sams     */
1552c089c2fc00054d6dde24b98e78226923a5364564Jason Sams    public void setSurfaceTexture(SurfaceTexture st) {
1553c089c2fc00054d6dde24b98e78226923a5364564Jason Sams        setSurface(new Surface(st));
1554c089c2fc00054d6dde24b98e78226923a5364564Jason Sams    }
1555c089c2fc00054d6dde24b98e78226923a5364564Jason Sams
1556c089c2fc00054d6dde24b98e78226923a5364564Jason Sams    /**
1557c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Associate a {@link android.view.Surface} with this Allocation. This
1558c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * operation is only valid for Allocations with {@link #USAGE_IO_OUTPUT}.
1559918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk     *
1560918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk     * @param sur Surface to associate with allocation
1561fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams     */
1562fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams    public void setSurface(Surface sur) {
1563fb9aa9f3ef11878caaf6fcfb5ea49ffb9f7abf33Jason Sams        mRS.validate();
1564163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams        if ((mUsage & USAGE_IO_OUTPUT) == 0) {
1565163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams            throw new RSInvalidStateException("Allocation is not USAGE_IO_OUTPUT.");
1566163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams        }
1567163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
1568e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nAllocationSetSurface(getID(mRS), sur);
1569163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams    }
1570163766cbe798baf8e86eb8201bc6c3def931d59aJason Sams
15719c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1572c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates an Allocation from a {@link android.graphics.Bitmap}.
157300bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray     *
1574c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * <p>With target API version 18 or greater, this Allocation will be created
1575c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * with {@link #USAGE_SHARED}, {@link #USAGE_SCRIPT}, and {@link
1576c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * #USAGE_GRAPHICS_TEXTURE}. With target API version 17 or lower, this
1577c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Allocation will be created with {@link #USAGE_GRAPHICS_TEXTURE}.</p>
1578623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1579f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1580623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param b bitmap source for the allocation data
1581623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1582c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @return Allocation containing bitmap data
1583623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1584623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
15856d8eb266dd398abf0511685fdaf98abba3396174Jason Sams    static public Allocation createFromBitmap(RenderScript rs, Bitmap b) {
158600bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray        if (rs.getApplicationContext().getApplicationInfo().targetSdkVersion >= 18) {
158700bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray            return createFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
158878e64945602fc9df6f4e3f8050a794b17ba0f22cTim Murray                                    USAGE_SHARED | USAGE_SCRIPT | USAGE_GRAPHICS_TEXTURE);
158900bb454bd0b26c05e1dea5651b5edfd9c69ef2e0Tim Murray        }
15906d8eb266dd398abf0511685fdaf98abba3396174Jason Sams        return createFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
15916d8eb266dd398abf0511685fdaf98abba3396174Jason Sams                                USAGE_GRAPHICS_TEXTURE);
15928a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams    }
15938a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams
15949c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1595c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates a cubemap Allocation from a {@link android.graphics.Bitmap}
1596c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * containing the horizontal list of cube faces. Each face must be a square,
1597c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * have the same size as all other faces, and have a width that is a power
1598c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * of 2.
1599623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1600f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1601c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @param b Bitmap with cubemap faces layed out in the following
1602623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *          format: right, left, top, bottom, front, back
1603623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param mips specifies desired mipmap behaviour for the cubemap
1604623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param usage bit field specifying how the cubemap is utilized
1605623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1606623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @return allocation containing cubemap data
1607623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1608623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
160967f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk    static public Allocation createCubemapFromBitmap(RenderScript rs, Bitmap b,
16104ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams                                                     MipmapControl mips,
16115476b450e50939940dcf3f15c92335cee2fc572dJason Sams                                                     int usage) {
161267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        rs.validate();
16135476b450e50939940dcf3f15c92335cee2fc572dJason Sams
161467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        int height = b.getHeight();
161567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        int width = b.getWidth();
161667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
1617fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk        if (width % 6 != 0) {
161867f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk            throw new RSIllegalArgumentException("Cubemap height must be multiple of 6");
161967f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        }
1620fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk        if (width / 6 != height) {
1621dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk            throw new RSIllegalArgumentException("Only square cube map faces supported");
162267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        }
1623fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk        boolean isPow2 = (height & (height - 1)) == 0;
162467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        if (!isPow2) {
162567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk            throw new RSIllegalArgumentException("Only power of 2 cube faces supported");
162667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        }
162767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
162867f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        Element e = elementFromBitmap(rs, b);
162967f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        Type.Builder tb = new Type.Builder(rs, e);
1630fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk        tb.setX(height);
1631fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk        tb.setY(height);
1632bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        tb.setFaces(true);
16334ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams        tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL);
163467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        Type t = tb.create();
163567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
1636e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int id = rs.nAllocationCubeCreateFromBitmap(t.getID(rs), mips.mID, b, usage);
163767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        if(id == 0) {
163867f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk            throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e);
163967f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk        }
16405476b450e50939940dcf3f15c92335cee2fc572dJason Sams        return new Allocation(id, rs, t, usage);
16415476b450e50939940dcf3f15c92335cee2fc572dJason Sams    }
16425476b450e50939940dcf3f15c92335cee2fc572dJason Sams
16439c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1644c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates a non-mipmapped cubemap Allocation for use as a graphics texture
1645c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * from a {@link android.graphics.Bitmap} containing the horizontal list of
1646c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * cube faces. Each face must be a square, have the same size as all other
1647c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * faces, and have a width that is a power of 2.
1648623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1649f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1650623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param b bitmap with cubemap faces layed out in the following
1651623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *          format: right, left, top, bottom, front, back
1652623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1653623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @return allocation containing cubemap data
1654623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1655623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
1656dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk    static public Allocation createCubemapFromBitmap(RenderScript rs,
1657dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                     Bitmap b) {
16586d8eb266dd398abf0511685fdaf98abba3396174Jason Sams        return createCubemapFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
1659fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk                                       USAGE_GRAPHICS_TEXTURE);
166067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk    }
166167f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk
16629c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1663c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates a cubemap Allocation from 6 {@link android.graphics.Bitmap}
1664c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * objects containing the cube faces. Each face must be a square, have the
1665c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * same size as all other faces, and have a width that is a power of 2.
1666623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1667f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1668623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param xpos cubemap face in the positive x direction
1669623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param xneg cubemap face in the negative x direction
1670623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param ypos cubemap face in the positive y direction
1671623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param yneg cubemap face in the negative y direction
1672623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param zpos cubemap face in the positive z direction
1673623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param zneg cubemap face in the negative z direction
1674623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param mips specifies desired mipmap behaviour for the cubemap
1675623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param usage bit field specifying how the cubemap is utilized
1676623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1677623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @return allocation containing cubemap data
1678623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1679623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
1680dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk    static public Allocation createCubemapFromCubeFaces(RenderScript rs,
1681dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap xpos,
1682dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap xneg,
1683dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap ypos,
1684dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap yneg,
1685dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap zpos,
1686dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap zneg,
1687dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        MipmapControl mips,
1688dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        int usage) {
1689dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        int height = xpos.getHeight();
1690dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        if (xpos.getWidth() != height ||
1691dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk            xneg.getWidth() != height || xneg.getHeight() != height ||
1692dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk            ypos.getWidth() != height || ypos.getHeight() != height ||
1693dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk            yneg.getWidth() != height || yneg.getHeight() != height ||
1694dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk            zpos.getWidth() != height || zpos.getHeight() != height ||
1695dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk            zneg.getWidth() != height || zneg.getHeight() != height) {
1696dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk            throw new RSIllegalArgumentException("Only square cube map faces supported");
1697dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        }
1698dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        boolean isPow2 = (height & (height - 1)) == 0;
1699dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        if (!isPow2) {
1700dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk            throw new RSIllegalArgumentException("Only power of 2 cube faces supported");
1701dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        }
1702dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk
1703dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        Element e = elementFromBitmap(rs, xpos);
1704dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        Type.Builder tb = new Type.Builder(rs, e);
1705dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        tb.setX(height);
1706dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        tb.setY(height);
1707dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        tb.setFaces(true);
1708dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL);
1709dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        Type t = tb.create();
1710dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        Allocation cubemap = Allocation.createTyped(rs, t, mips, usage);
1711dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk
1712dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        AllocationAdapter adapter = AllocationAdapter.create2D(rs, cubemap);
171320fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        adapter.setFace(Type.CubemapFace.POSITIVE_X);
1714dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        adapter.copyFrom(xpos);
1715dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        adapter.setFace(Type.CubemapFace.NEGATIVE_X);
1716dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        adapter.copyFrom(xneg);
171720fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        adapter.setFace(Type.CubemapFace.POSITIVE_Y);
1718dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        adapter.copyFrom(ypos);
1719dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        adapter.setFace(Type.CubemapFace.NEGATIVE_Y);
1720dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        adapter.copyFrom(yneg);
172120fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        adapter.setFace(Type.CubemapFace.POSITIVE_Z);
1722dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        adapter.copyFrom(zpos);
1723dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        adapter.setFace(Type.CubemapFace.NEGATIVE_Z);
1724dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        adapter.copyFrom(zneg);
1725dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk
1726dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        return cubemap;
1727dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk    }
1728dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk
17299c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1730c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates a non-mipmapped cubemap Allocation for use as a sampler input
1731c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * from 6 {@link android.graphics.Bitmap} objects containing the cube
1732c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * faces. Each face must be a square, have the same size as all other faces,
1733c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * and have a width that is a power of 2.
1734623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1735f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1736623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param xpos cubemap face in the positive x direction
1737623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param xneg cubemap face in the negative x direction
1738623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param ypos cubemap face in the positive y direction
1739623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param yneg cubemap face in the negative y direction
1740623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param zpos cubemap face in the positive z direction
1741623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param zneg cubemap face in the negative z direction
1742623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1743623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @return allocation containing cubemap data
1744623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1745623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
1746dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk    static public Allocation createCubemapFromCubeFaces(RenderScript rs,
1747dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap xpos,
1748dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap xneg,
1749dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap ypos,
1750dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap yneg,
1751dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap zpos,
1752dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                                        Bitmap zneg) {
1753dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk        return createCubemapFromCubeFaces(rs, xpos, xneg, ypos, yneg,
1754dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                          zpos, zneg, MipmapControl.MIPMAP_NONE,
1755dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk                                          USAGE_GRAPHICS_TEXTURE);
1756dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk    }
1757dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk
17589c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1759c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates an Allocation from the Bitmap referenced
1760c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * by resource ID.
1761623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1762f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1763623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param res application resources
1764623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param id resource id to load the data from
1765623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param mips specifies desired mipmap behaviour for the
1766623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *             allocation
1767623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param usage bit field specifying how the allocation is
1768623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *              utilized
1769623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1770c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @return Allocation containing resource data
1771623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1772623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
17735476b450e50939940dcf3f15c92335cee2fc572dJason Sams    static public Allocation createFromBitmapResource(RenderScript rs,
17745476b450e50939940dcf3f15c92335cee2fc572dJason Sams                                                      Resources res,
17755476b450e50939940dcf3f15c92335cee2fc572dJason Sams                                                      int id,
17764ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams                                                      MipmapControl mips,
17775476b450e50939940dcf3f15c92335cee2fc572dJason Sams                                                      int usage) {
1778b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
1779771bebb94054d06f97284379c93a2620613513c3Jason Sams        rs.validate();
17803ece2f3268a0629383b37604d0712e3f48968ad9Jason Sams        if ((usage & (USAGE_SHARED | USAGE_IO_INPUT | USAGE_IO_OUTPUT)) != 0) {
17813ece2f3268a0629383b37604d0712e3f48968ad9Jason Sams            throw new RSIllegalArgumentException("Unsupported usage specified.");
17823ece2f3268a0629383b37604d0712e3f48968ad9Jason Sams        }
17835476b450e50939940dcf3f15c92335cee2fc572dJason Sams        Bitmap b = BitmapFactory.decodeResource(res, id);
17845476b450e50939940dcf3f15c92335cee2fc572dJason Sams        Allocation alloc = createFromBitmap(rs, b, mips, usage);
17855476b450e50939940dcf3f15c92335cee2fc572dJason Sams        b.recycle();
17865476b450e50939940dcf3f15c92335cee2fc572dJason Sams        return alloc;
17875476b450e50939940dcf3f15c92335cee2fc572dJason Sams    }
1788650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy
17899c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1790c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates a non-mipmapped Allocation to use as a graphics texture from the
1791c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * {@link android.graphics.Bitmap} referenced by resource ID.
1792623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1793c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * <p>With target API version 18 or greater, this allocation will be created
1794c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * with {@link #USAGE_SCRIPT} and {@link #USAGE_GRAPHICS_TEXTURE}. With
1795c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * target API version 17 or lower, this allocation will be created with
1796c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * {@link #USAGE_GRAPHICS_TEXTURE}.</p>
1797455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams     *
1798f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1799623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param res application resources
1800623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param id resource id to load the data from
1801623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1802c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * @return Allocation containing resource data
1803623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1804623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
18055476b450e50939940dcf3f15c92335cee2fc572dJason Sams    static public Allocation createFromBitmapResource(RenderScript rs,
18065476b450e50939940dcf3f15c92335cee2fc572dJason Sams                                                      Resources res,
18076d8eb266dd398abf0511685fdaf98abba3396174Jason Sams                                                      int id) {
1808455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        if (rs.getApplicationContext().getApplicationInfo().targetSdkVersion >= 18) {
1809455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams            return createFromBitmapResource(rs, res, id,
1810455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams                                            MipmapControl.MIPMAP_NONE,
18113ece2f3268a0629383b37604d0712e3f48968ad9Jason Sams                                            USAGE_SCRIPT | USAGE_GRAPHICS_TEXTURE);
1812455d64426615e5d269a3bd05cd91b67c3811fcdfJason Sams        }
18136d8eb266dd398abf0511685fdaf98abba3396174Jason Sams        return createFromBitmapResource(rs, res, id,
18146d8eb266dd398abf0511685fdaf98abba3396174Jason Sams                                        MipmapControl.MIPMAP_NONE,
18156d8eb266dd398abf0511685fdaf98abba3396174Jason Sams                                        USAGE_GRAPHICS_TEXTURE);
18166d8eb266dd398abf0511685fdaf98abba3396174Jason Sams    }
18176d8eb266dd398abf0511685fdaf98abba3396174Jason Sams
18189c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1819c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Creates an Allocation containing string data encoded in UTF-8 format.
1820623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1821f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the allocation will belong.
1822623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param str string to create the allocation from
1823623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     * @param usage bit field specifying how the allocaiton is
1824623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *              utilized
1825623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     *
1826623c54dd1605d802bb6bfdd0d266a191d4f2d88cAlex Sakhartchouk     */
18275476b450e50939940dcf3f15c92335cee2fc572dJason Sams    static public Allocation createFromString(RenderScript rs,
18285476b450e50939940dcf3f15c92335cee2fc572dJason Sams                                              String str,
18295476b450e50939940dcf3f15c92335cee2fc572dJason Sams                                              int usage) {
18305476b450e50939940dcf3f15c92335cee2fc572dJason Sams        rs.validate();
18319b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        byte[] allocArray = null;
18329b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        try {
18339b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk            allocArray = str.getBytes("UTF-8");
18345476b450e50939940dcf3f15c92335cee2fc572dJason Sams            Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length, usage);
1835bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            alloc.copyFrom(allocArray);
18369b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk            return alloc;
18379b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        }
18389b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        catch (Exception e) {
183906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            throw new RSRuntimeException("Could not convert string to utf-8.");
18409b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        }
18419b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    }
1842739c8263a10d34f5acba7fce2052012d1545d10bJason Sams
1843739c8263a10d34f5acba7fce2052012d1545d10bJason Sams    /**
1844c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Interface to handle notification when new buffers are available via
1845c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * {@link #USAGE_IO_INPUT}. An application will receive one notification
1846c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * when a buffer is available. Additional buffers will not trigger new
1847c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * notifications until a buffer is processed.
1848739c8263a10d34f5acba7fce2052012d1545d10bJason Sams     */
184942ef238208679813daa204bf110f776ab02c2bebJason Sams    public interface OnBufferAvailableListener {
1850739c8263a10d34f5acba7fce2052012d1545d10bJason Sams        public void onBufferAvailable(Allocation a);
1851739c8263a10d34f5acba7fce2052012d1545d10bJason Sams    }
1852739c8263a10d34f5acba7fce2052012d1545d10bJason Sams
1853739c8263a10d34f5acba7fce2052012d1545d10bJason Sams    /**
1854c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Set a notification handler for {@link #USAGE_IO_INPUT}.
1855739c8263a10d34f5acba7fce2052012d1545d10bJason Sams     *
185642ef238208679813daa204bf110f776ab02c2bebJason Sams     * @param callback instance of the OnBufferAvailableListener
185742ef238208679813daa204bf110f776ab02c2bebJason Sams     *                 class to be called when buffer arrive.
1858739c8263a10d34f5acba7fce2052012d1545d10bJason Sams     */
185942ef238208679813daa204bf110f776ab02c2bebJason Sams    public void setOnBufferAvailableListener(OnBufferAvailableListener callback) {
1860739c8263a10d34f5acba7fce2052012d1545d10bJason Sams        synchronized(mAllocationMap) {
1861739c8263a10d34f5acba7fce2052012d1545d10bJason Sams            mAllocationMap.put(new Integer(getID(mRS)), this);
1862739c8263a10d34f5acba7fce2052012d1545d10bJason Sams            mBufferNotifier = callback;
1863739c8263a10d34f5acba7fce2052012d1545d10bJason Sams        }
1864739c8263a10d34f5acba7fce2052012d1545d10bJason Sams    }
1865739c8263a10d34f5acba7fce2052012d1545d10bJason Sams
1866739c8263a10d34f5acba7fce2052012d1545d10bJason Sams    static void sendBufferNotification(int id) {
1867739c8263a10d34f5acba7fce2052012d1545d10bJason Sams        synchronized(mAllocationMap) {
1868739c8263a10d34f5acba7fce2052012d1545d10bJason Sams            Allocation a = mAllocationMap.get(new Integer(id));
1869739c8263a10d34f5acba7fce2052012d1545d10bJason Sams
1870739c8263a10d34f5acba7fce2052012d1545d10bJason Sams            if ((a != null) && (a.mBufferNotifier != null)) {
1871739c8263a10d34f5acba7fce2052012d1545d10bJason Sams                a.mBufferNotifier.onBufferAvailable(a);
1872739c8263a10d34f5acba7fce2052012d1545d10bJason Sams            }
1873739c8263a10d34f5acba7fce2052012d1545d10bJason Sams        }
1874739c8263a10d34f5acba7fce2052012d1545d10bJason Sams    }
1875739c8263a10d34f5acba7fce2052012d1545d10bJason Sams
1876b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams}
1877b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
1878