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#ifndef GrTextureAccess_DEFINED 9047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com#define GrTextureAccess_DEFINED 10047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 116d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com#include "SkRefCnt.h" 121ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com#include "SkShader.h" 13a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org#include "SkTypes.h" 14047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 15047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.comclass GrTexture; 16047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 171ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com/** 181ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com * Represents the filtering and tile modes used to access a texture. It is mostly used with 191ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com * GrTextureAccess (defined below). Also, some of the texture cache methods require knowledge about 201ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com * filtering and tiling to perform a cache lookup. If it wasn't for this latter usage this would 2191a798f121a2238639f8e2d08cc776d4f0236cebcommit-bot@chromium.org * be folded into GrTextureAccess. The default is clamp tile modes and no filtering. 221ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com */ 231ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comclass GrTextureParams { 241ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.compublic: 251ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrTextureParams() { 261ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com this->reset(); 271ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 28956b310f13c7412c035406c658ff16ca85eac656skia.committer@gmail.com 29b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com enum FilterMode { 30b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com kNone_FilterMode, 31b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com kBilerp_FilterMode, 32b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com kMipMap_FilterMode 33b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com }; 34b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com 35b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams(SkShader::TileMode tileXAndY, FilterMode filterMode) { 36b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com this->reset(tileXAndY, filterMode); 371ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 381ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 39bc91fd71faa2c5fd14423fecd18e50701c922cedcommit-bot@chromium.org GrTextureParams(const SkShader::TileMode tileModes[2], FilterMode filterMode) { 40b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com this->reset(tileModes, filterMode); 411ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 421ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 431ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrTextureParams(const GrTextureParams& params) { 441ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com *this = params; 451ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 461ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 471ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrTextureParams& operator= (const GrTextureParams& params) { 481ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTileModes[0] = params.fTileModes[0]; 491ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTileModes[1] = params.fTileModes[1]; 50b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com fFilterMode = params.fFilterMode; 511ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com return *this; 521ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 531ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 541ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void reset() { 55b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com this->reset(SkShader::kClamp_TileMode, kNone_FilterMode); 561ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 571ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 58b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com void reset(SkShader::TileMode tileXAndY, FilterMode filterMode) { 591ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTileModes[0] = fTileModes[1] = tileXAndY; 60b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com fFilterMode = filterMode; 611ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 621ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 63bc91fd71faa2c5fd14423fecd18e50701c922cedcommit-bot@chromium.org void reset(const SkShader::TileMode tileModes[2], FilterMode filterMode) { 641ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTileModes[0] = tileModes[0]; 651ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTileModes[1] = tileModes[1]; 66b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com fFilterMode = filterMode; 671ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 681ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 691ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void setClampNoFilter() { 701ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTileModes[0] = fTileModes[1] = SkShader::kClamp_TileMode; 71b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com fFilterMode = kNone_FilterMode; 721ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 731ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 741ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void setClamp() { 751ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTileModes[0] = fTileModes[1] = SkShader::kClamp_TileMode; 761ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 771ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 78b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com void setFilterMode(FilterMode filterMode) { fFilterMode = filterMode; } 791ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 801ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void setTileModeX(const SkShader::TileMode tm) { fTileModes[0] = tm; } 811ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void setTileModeY(const SkShader::TileMode tm) { fTileModes[1] = tm; } 821ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void setTileModeXAndY(const SkShader::TileMode tm) { fTileModes[0] = fTileModes[1] = tm; } 831ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 841ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode getTileModeX() const { return fTileModes[0]; } 851ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 861ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode getTileModeY() const { return fTileModes[1]; } 871ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 881ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com bool isTiled() const { 891ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com return SkShader::kClamp_TileMode != fTileModes[0] || 901ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::kClamp_TileMode != fTileModes[1]; 911ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 921ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 93b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com FilterMode filterMode() const { return fFilterMode; } 941ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 951ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com bool operator== (const GrTextureParams& other) const { 961ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com return fTileModes[0] == other.fTileModes[0] && 971ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com fTileModes[1] == other.fTileModes[1] && 98b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com fFilterMode == other.fFilterMode; 991ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 1001ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 1011ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com bool operator!= (const GrTextureParams& other) const { return !(*this == other); } 1021ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 1031ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.comprivate: 1041ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 1051ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode fTileModes[2]; 106b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com FilterMode fFilterMode; 1071ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com}; 1081ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 1096d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com/** A class representing the swizzle access pattern for a texture. Note that if the texture is 1106d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com * an alpha-only texture then the alpha channel is substituted for other components. Any mangling 1116d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com * to handle the r,g,b->a conversions for alpha textures is automatically included in the stage 112a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com * key. However, if a GrEffect uses different swizzles based on its input then it must 1136d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com * consider that variation in its key-generation. 114047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com */ 115e3beb6bd7de7fa211681abbb0be58e80b19885e0commit-bot@chromium.orgclass GrTextureAccess : SkNoncopyable { 116047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.compublic: 1176d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com /** 118a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com * A default GrTextureAccess must have reset() called on it in a GrEffect subclass's 119a469c28c3c16214733a25201a286970f57b3d944bsalomon@google.com * constructor if it will be accessible via GrEffect::textureAccess(). 1206d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com */ 1216d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com GrTextureAccess(); 122047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 1236d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com /** 1241ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com * Uses the default swizzle, "rgba". 1256d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com */ 1261ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrTextureAccess(GrTexture*, const GrTextureParams&); 1271ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com explicit GrTextureAccess(GrTexture*, 128b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams::FilterMode = GrTextureParams::kNone_FilterMode, 1291ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY = SkShader::kClamp_TileMode); 130047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 1316d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com /** 1321ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com * swizzle must be a string between one and four (inclusive) characters containing only 'r', 1331ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com * 'g', 'b', and/or 'a'. 1346d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com */ 1351ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrTextureAccess(GrTexture*, const char* swizzle, const GrTextureParams&); 1361ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrTextureAccess(GrTexture*, 1371ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const char* swizzle, 138b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams::FilterMode = GrTextureParams::kNone_FilterMode, 1391ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY = SkShader::kClamp_TileMode); 140047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 1411ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void reset(GrTexture*, const GrTextureParams&); 1421ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void reset(GrTexture*, 143b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams::FilterMode = GrTextureParams::kNone_FilterMode, 1441ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY = SkShader::kClamp_TileMode); 1451ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void reset(GrTexture*, const char* swizzle, const GrTextureParams&); 1461ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void reset(GrTexture*, 1471ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const char* swizzle, 148b86add1ad37776818e1f730359ec587c9fdbff5fhumper@google.com GrTextureParams::FilterMode = GrTextureParams::kNone_FilterMode, 1491ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com SkShader::TileMode tileXAndY = SkShader::kClamp_TileMode); 1501ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 1511ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com bool operator== (const GrTextureAccess& other) const { 152515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 1531ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com // below assumes all chars in fSwizzle are initialized even if string is < 4 chars long. 154f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(memcmp(fSwizzle, other.fSwizzle, sizeof(fSwizzle)-1) == 1551ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com strcmp(fSwizzle, other.fSwizzle)); 1561ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com#endif 1571ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com return fParams == other.fParams && 158db545aec7267b10f1cb925204862f7e16753b724bsalomon@google.com (fTexture.get() == other.fTexture.get()) && 159db545aec7267b10f1cb925204862f7e16753b724bsalomon@google.com (0 == memcmp(fSwizzle, other.fSwizzle, sizeof(fSwizzle)-1)); 1601ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 1611ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 1621ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com bool operator!= (const GrTextureAccess& other) const { return !(*this == other); } 1636d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 1646d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com GrTexture* getTexture() const { return fTexture.get(); } 1656d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 1666d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com /** 1676d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com * Returns a string representing the swizzle. The string is is null-terminated. 1686d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com */ 1696d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com const char* getSwizzle() const { return fSwizzle; } 1706d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 171b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com /** Returns a mask indicating which components are referenced in the swizzle. The return 172b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com is a bitfield of GrColorComponentFlags. */ 1736d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com uint32_t swizzleMask() const { return fSwizzleMask; } 174047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 1751ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com const GrTextureParams& getParams() const { return fParams; } 1761ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 177047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.comprivate: 1781ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com void setSwizzle(const char*); 1791ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 1801ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com GrTextureParams fParams; 1816d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com SkAutoTUnref<GrTexture> fTexture; 1826d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com uint32_t fSwizzleMask; 1836d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com char fSwizzle[5]; 1841ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 185a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org typedef SkNoncopyable INHERITED; 186047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com}; 187047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com 188047696c1c67b2e0a73f2b951ce23ff5b155111bbbsalomon@google.com#endif 189