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