rsAdapter.cpp revision 326e0ddf89e8df2837752fbfd7a014814b32082c
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsAdapter1D::Adapter1D() 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams reset(); 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 29326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsAdapter1D::Adapter1D(Allocation *a) 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams reset(); 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams setAllocation(a); 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Adapter1D::reset() 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mY = 0; 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mZ = 0; 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLOD = 0; 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mFace = 0; 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid * Adapter1D::getElement(uint32_t x) 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation.get()); 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getPtr()); 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getType()); 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr()); 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ptr += mAllocation->getType()->getLODOffset(mLOD, x, mY); 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return ptr; 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Adapter1D::subData(uint32_t xoff, uint32_t count, const void *data) 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mAllocation.get() && mAllocation.get()->getType()) { 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void *ptr = getElement(xoff); 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams count *= mAllocation.get()->getType()->getElementSizeBytes(); 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams memcpy(ptr, data, count); 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Adapter1D::data(const void *data) 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams memcpy(getElement(0), 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams data, 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mAllocation.get()->getType()->getSizeBytes()); 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 72326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsAdapter1D rsi_Adapter1DCreate(Context *rsc) 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return new Adapter1D(); 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 77326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter1DDestroy(Context *rsc, RsAdapter1D va) 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter1D * a = static_cast<Adapter1D *>(va); 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->decRef(); 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter1DBindAllocation(Context *rsc, RsAdapter1D va, RsAllocation valloc) 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter1D * a = static_cast<Adapter1D *>(va); 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation * alloc = static_cast<Allocation *>(valloc); 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setAllocation(alloc); 88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter1DSetConstraint(Context *rsc, RsAdapter1D va, RsDimension dim, uint32_t value) 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter1D * a = static_cast<Adapter1D *>(va); 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams switch(dim) { 94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_X: 95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Cannot contrain X in an 1D adapter"); 96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Y: 98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setY(value); 99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Z: 101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setZ(value); 102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_LOD: 104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setLOD(value); 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_FACE: 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setFace(value); 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams default: 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Unimplemented constraint"); 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter1DSubData(Context *rsc, RsAdapter1D va, uint32_t xoff, uint32_t count, const void *data) 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter1D * a = static_cast<Adapter1D *>(va); 118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->subData(xoff, count, data); 119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 121326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter1DData(Context *rsc, RsAdapter1D va, const void *data) 122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter1D * a = static_cast<Adapter1D *>(va); 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->data(data); 125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams////////////////////////// 131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 132326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsAdapter2D::Adapter2D() 133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams reset(); 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 137326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsAdapter2D::Adapter2D(Allocation *a) 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams reset(); 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams setAllocation(a); 141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Adapter2D::reset() 144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mZ = 0; 146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLOD = 0; 147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mFace = 0; 148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid * Adapter2D::getElement(uint32_t x, uint32_t y) const 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation.get()); 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getPtr()); 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getType()); 155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr()); 156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ptr += mAllocation->getType()->getLODOffset(mLOD, x, y); 157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return ptr; 158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 160326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Adapter2D::subData(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data) 161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation.get()); 163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getPtr()); 164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getType()); 165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t eSize = mAllocation.get()->getType()->getElementSizeBytes(); 167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t lineSize = eSize * w; 168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t destW = getDimX(); 169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const uint8_t *src = static_cast<const uint8_t *>(data); 171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t line=yoff; line < (yoff+h); line++) { 172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams memcpy(getElement(xoff, line), src, lineSize); 173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams src += lineSize; 174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 177326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Adapter2D::data(const void *data) 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams memcpy(getElement(0,0), 180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams data, 181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mAllocation.get()->getType()->getSizeBytes()); 182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 186326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 187326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 189326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsAdapter2D rsi_Adapter2DCreate(Context *rsc) 190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return new Adapter2D(); 192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 194326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter2DDestroy(Context *rsc, RsAdapter2D va) 195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter2D * a = static_cast<Adapter2D *>(va); 197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->decRef(); 198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 200326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter2DBindAllocation(Context *rsc, RsAdapter2D va, RsAllocation valloc) 201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter2D * a = static_cast<Adapter2D *>(va); 203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation * alloc = static_cast<Allocation *>(valloc); 204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setAllocation(alloc); 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter2DSetConstraint(Context *rsc, RsAdapter2D va, RsDimension dim, uint32_t value) 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter2D * a = static_cast<Adapter2D *>(va); 210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams switch(dim) { 211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_X: 212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Cannot contrain X in an 2D adapter"); 213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Y: 215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Cannot contrain Y in an 2D adapter"); 216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Z: 218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setZ(value); 219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_LOD: 221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setLOD(value); 222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_FACE: 224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setFace(value); 225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams default: 227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Unimplemented constraint"); 228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 231326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 232326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter2DData(Context *rsc, RsAdapter2D va, const void *data) 233326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter2D * a = static_cast<Adapter2D *>(va); 235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->data(data); 236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 238326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_Adapter2DSubData(Context *rsc, RsAdapter2D va, uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data) 239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter2D * a = static_cast<Adapter2D *>(va); 241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->subData(xoff, yoff, w, h, data); 242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 245326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 246