GrTextureAccess.cpp revision b8eb2e89edf914caf5479baeffcb670d3e93f496
1047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com/* 2047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com * Copyright 2012 Google Inc. 3047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com * 4047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 5047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com * found in the LICENSE file. 6047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com */ 7047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 8047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com#include "GrTextureAccess.h" 9b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com#include "GrColor.h" 106d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com#include "GrTexture.h" 116d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 126d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.comGrTextureAccess::GrTextureAccess() { 136d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com#if GR_DEBUG 146d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com memcpy(fSwizzle, "void", 5); 156d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com fSwizzleMask = 0xbeeffeed; 166d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com#endif 176d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com} 186d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 191ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comGrTextureAccess::GrTextureAccess(GrTexture* texture, const GrTextureParams& params) { 201ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com this->reset(texture, params); 216d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com} 226d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 231ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comGrTextureAccess::GrTextureAccess(GrTexture* texture, 241ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com bool bilerp, 251ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY) { 261ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com this->reset(texture, bilerp, tileXAndY); 27047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com} 28047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 291ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comGrTextureAccess::GrTextureAccess(GrTexture* texture, 301ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const char* swizzle, 311ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const GrTextureParams& params) { 321ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com this->reset(texture, swizzle, params); 331ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com} 341ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 351ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comGrTextureAccess::GrTextureAccess(GrTexture* texture, 361ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const char* swizzle, 371ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com bool bilerp, 381ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY) { 391ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com this->reset(texture, swizzle, bilerp, tileXAndY); 401ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com} 411ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 421ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comvoid GrTextureAccess::reset(GrTexture* texture, 431ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const char* swizzle, 441ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const GrTextureParams& params) { 456d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com GrAssert(NULL != texture); 466d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com GrAssert(strlen(swizzle) >= 1 && strlen(swizzle) <= 4); 476d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 481ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fParams = params; 491ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTexture.reset(SkRef(texture)); 501ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com this->setSwizzle(swizzle); 511ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com} 521ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 531ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comvoid GrTextureAccess::reset(GrTexture* texture, 541ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const char* swizzle, 551ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com bool bilerp, 561ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY) { 571ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrAssert(NULL != texture); 581ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrAssert(strlen(swizzle) >= 1 && strlen(swizzle) <= 4); 591ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 601ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fParams.reset(tileXAndY, bilerp); 611ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTexture.reset(SkRef(texture)); 621ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com this->setSwizzle(swizzle); 631ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com} 641ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 651ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comvoid GrTextureAccess::reset(GrTexture* texture, 661ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const GrTextureParams& params) { 671ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrAssert(NULL != texture); 681ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTexture.reset(SkRef(texture)); 691ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fParams = params; 701ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com memcpy(fSwizzle, "rgba", 5); 71b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com fSwizzleMask = kRGBA_GrColorComponentFlags; 721ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com} 731ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 741ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comvoid GrTextureAccess::reset(GrTexture* texture, 751ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com bool bilerp, 761ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY) { 771ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrAssert(NULL != texture); 781ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTexture.reset(SkRef(texture)); 791ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fParams.reset(tileXAndY, bilerp); 801ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com memcpy(fSwizzle, "rgba", 5); 81b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com fSwizzleMask = kRGBA_GrColorComponentFlags; 821ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com} 836d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 841ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comvoid GrTextureAccess::setSwizzle(const char* swizzle) { 856d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com fSwizzleMask = 0; 861ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com memset(fSwizzle, '\0', 5); 871ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com for (int i = 0; i < 4 && '\0' != swizzle[i]; ++i) { 886d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com fSwizzle[i] = swizzle[i]; 896d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com switch (swizzle[i]) { 906d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com case 'r': 91b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com fSwizzleMask |= kR_GrColorComponentFlag; 926d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com break; 936d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com case 'g': 94b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com fSwizzleMask |= kG_GrColorComponentFlag; 956d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com break; 966d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com case 'b': 97b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com fSwizzleMask |= kB_GrColorComponentFlag; 986d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com break; 996d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com case 'a': 100b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com fSwizzleMask |= kA_GrColorComponentFlag; 1016d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com break; 1026d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com default: 1036d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com GrCrash("Unexpected swizzle string character."); 1046d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com break; 1056d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com } 1061ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 1076d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com} 108