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