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