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