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() { 13515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_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, 24b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams::FilterMode filterMode, 251ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY) { 26b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com this->reset(texture, filterMode, 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, 37b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams::FilterMode filterMode, 381ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY) { 39b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com this->reset(texture, swizzle, filterMode, 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) { 4549f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(texture); 46f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(strlen(swizzle) >= 1 && strlen(swizzle) <= 4); 476d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 481ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fParams = params; 4945725db1d82615d43408ec488549aec6218f80e4bsalomon fTexture.set(SkRef(texture), GrIORef::kRead_IOType); 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, 55b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams::FilterMode filterMode, 561ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY) { 5749f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(texture); 58f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(strlen(swizzle) >= 1 && strlen(swizzle) <= 4); 591ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 60b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com fParams.reset(tileXAndY, filterMode); 6145725db1d82615d43408ec488549aec6218f80e4bsalomon fTexture.set(SkRef(texture), GrIORef::kRead_IOType); 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) { 6749f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(texture); 6845725db1d82615d43408ec488549aec6218f80e4bsalomon fTexture.set(SkRef(texture), GrIORef::kRead_IOType); 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, 75b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams::FilterMode filterMode, 761ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY) { 7749f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(texture); 7845725db1d82615d43408ec488549aec6218f80e4bsalomon fTexture.set(SkRef(texture), GrIORef::kRead_IOType); 79b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com fParams.reset(tileXAndY, filterMode); 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: 10388cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Unexpected swizzle string character."); 1046d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com break; 1056d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com } 1061ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 1076d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com} 108