rsAdapter.cpp revision afb743aca56c18beb7ab924e75cb6e070ef3e55a
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 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h" 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 27afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAdapter1D::Adapter1D(Context *rsc) : ObjectBase(rsc) { 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams reset(); 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 31afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAdapter1D::Adapter1D(Context *rsc, Allocation *a) : ObjectBase(rsc) { 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams reset(); 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams setAllocation(a); 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 36afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Adapter1D::reset() { 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mY = 0; 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mZ = 0; 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLOD = 0; 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mFace = 0; 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 43afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid * Adapter1D::getElement(uint32_t x) { 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation.get()); 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getPtr()); 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getType()); 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr()); 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ptr += mAllocation->getType()->getLODOffset(mLOD, x, mY); 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return ptr; 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 52afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Adapter1D::subData(uint32_t xoff, uint32_t count, const void *data) { 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (mAllocation.get() && mAllocation.get()->getType()) { 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams void *ptr = getElement(xoff); 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams count *= mAllocation.get()->getType()->getElementSizeBytes(); 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams memcpy(ptr, data, count); 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 60afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Adapter1D::data(const void *data) { 61d3c8de2efc8f4f9287e0a8dfdeefb03ba6aaec98Jason Sams memcpy(getElement(0), 62d3c8de2efc8f4f9287e0a8dfdeefb03ba6aaec98Jason Sams data, 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mAllocation.get()->getType()->getSizeBytes()); 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 66afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Adapter1D::serialize(OStream *stream) const { 67fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 68fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAdapter1D *Adapter1D::createFromStream(Context *rsc, IStream *stream) { 70fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 71fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 72fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 76afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsAdapter1D rsi_Adapter1DCreate(Context *rsc) { 77e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Adapter1D *a = new Adapter1D(rsc); 789397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams a->incUserRef(); 79d3c8de2efc8f4f9287e0a8dfdeefb03ba6aaec98Jason Sams return a; 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 82afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Adapter1DBindAllocation(Context *rsc, RsAdapter1D va, RsAllocation valloc) { 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter1D * a = static_cast<Adapter1D *>(va); 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation * alloc = static_cast<Allocation *>(valloc); 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setAllocation(alloc); 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 88afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Adapter1DSetConstraint(Context *rsc, RsAdapter1D va, RsDimension dim, uint32_t value) { 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter1D * a = static_cast<Adapter1D *>(va); 90afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (dim) { 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_X: 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Cannot contrain X in an 1D adapter"); 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Y: 95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setY(value); 96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Z: 98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setZ(value); 99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_LOD: 101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setLOD(value); 102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_FACE: 104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setFace(value); 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams default: 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Unimplemented constraint"); 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 112afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Adapter1DSubData(Context *rsc, RsAdapter1D va, uint32_t xoff, uint32_t count, const void *data) { 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter1D * a = static_cast<Adapter1D *>(va); 114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->subData(xoff, count, data); 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 117afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Adapter1DData(Context *rsc, RsAdapter1D va, const void *data) { 118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter1D * a = static_cast<Adapter1D *>(va); 119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->data(data); 120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams////////////////////////// 126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 127afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAdapter2D::Adapter2D(Context *rsc) : ObjectBase(rsc) { 128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams reset(); 129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 131afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAdapter2D::Adapter2D(Context *rsc, Allocation *a) : ObjectBase(rsc) { 132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams reset(); 133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams setAllocation(a); 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 136afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Adapter2D::reset() { 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mZ = 0; 138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mLOD = 0; 139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mFace = 0; 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 142afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid * Adapter2D::getElement(uint32_t x, uint32_t y) const { 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation.get()); 144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getPtr()); 145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getType()); 146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr()); 147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ptr += mAllocation->getType()->getLODOffset(mLOD, x, y); 148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return ptr; 149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 151afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Adapter2D::subData(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data) { 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation.get()); 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getPtr()); 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(mAllocation->getType()); 155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t eSize = mAllocation.get()->getType()->getElementSizeBytes(); 157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t lineSize = eSize * w; 158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const uint8_t *src = static_cast<const uint8_t *>(data); 160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t line=yoff; line < (yoff+h); line++) { 161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams memcpy(getElement(xoff, line), src, lineSize); 162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams src += lineSize; 163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 166afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Adapter2D::data(const void *data) { 167d3c8de2efc8f4f9287e0a8dfdeefb03ba6aaec98Jason Sams memcpy(getElement(0,0), 168d3c8de2efc8f4f9287e0a8dfdeefb03ba6aaec98Jason Sams data, 169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mAllocation.get()->getType()->getSizeBytes()); 170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 172afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Adapter2D::serialize(OStream *stream) const { 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 175afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAdapter2D *Adapter2D::createFromStream(Context *rsc, IStream *stream) { 176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 180326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 181326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 183afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsAdapter2D rsi_Adapter2DCreate(Context *rsc) { 184e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Adapter2D *a = new Adapter2D(rsc); 1859397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams a->incUserRef(); 186d3c8de2efc8f4f9287e0a8dfdeefb03ba6aaec98Jason Sams return a; 187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 189afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Adapter2DBindAllocation(Context *rsc, RsAdapter2D va, RsAllocation valloc) { 190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter2D * a = static_cast<Adapter2D *>(va); 191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation * alloc = static_cast<Allocation *>(valloc); 192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setAllocation(alloc); 193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 195afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Adapter2DSetConstraint(Context *rsc, RsAdapter2D va, RsDimension dim, uint32_t value) { 196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter2D * a = static_cast<Adapter2D *>(va); 197afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (dim) { 198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_X: 199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Cannot contrain X in an 2D adapter"); 200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Y: 202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Cannot contrain Y in an 2D adapter"); 203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_Z: 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setZ(value); 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_LOD: 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setLOD(value); 209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case RS_DIMENSION_FACE: 211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->setFace(value); 212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams default: 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!"Unimplemented constraint"); 215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return; 216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 219afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Adapter2DData(Context *rsc, RsAdapter2D va, const void *data) { 220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter2D * a = static_cast<Adapter2D *>(va); 221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->data(data); 222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 224afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Adapter2DSubData(Context *rsc, RsAdapter2D va, uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data) { 225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Adapter2D * a = static_cast<Adapter2D *>(va); 226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams a->subData(xoff, yoff, w, h, data); 227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 231