1/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrTextureAccess.h"
9#include "GrColor.h"
10#include "GrTexture.h"
11
12GrTextureAccess::GrTextureAccess() {
13#ifdef SK_DEBUG
14    memcpy(fSwizzle, "void", 5);
15    fSwizzleMask = 0xbeeffeed;
16#endif
17}
18
19GrTextureAccess::GrTextureAccess(GrTexture* texture, const GrTextureParams& params) {
20    this->reset(texture, params);
21}
22
23GrTextureAccess::GrTextureAccess(GrTexture* texture,
24                                 GrTextureParams::FilterMode filterMode,
25                                 SkShader::TileMode tileXAndY) {
26    this->reset(texture, filterMode, tileXAndY);
27}
28
29GrTextureAccess::GrTextureAccess(GrTexture* texture,
30                                 const char* swizzle,
31                                 const GrTextureParams& params) {
32    this->reset(texture, swizzle, params);
33}
34
35GrTextureAccess::GrTextureAccess(GrTexture* texture,
36                                 const char* swizzle,
37                                 GrTextureParams::FilterMode filterMode,
38                                 SkShader::TileMode tileXAndY) {
39    this->reset(texture, swizzle, filterMode, tileXAndY);
40}
41
42void GrTextureAccess::reset(GrTexture* texture,
43                            const char* swizzle,
44                            const GrTextureParams& params) {
45    SkASSERT(texture);
46    SkASSERT(strlen(swizzle) >= 1 && strlen(swizzle) <= 4);
47
48    fParams = params;
49    fTexture.set(SkRef(texture), GrIORef::kRead_IOType);
50    this->setSwizzle(swizzle);
51}
52
53void GrTextureAccess::reset(GrTexture* texture,
54                            const char* swizzle,
55                            GrTextureParams::FilterMode filterMode,
56                            SkShader::TileMode tileXAndY) {
57    SkASSERT(texture);
58    SkASSERT(strlen(swizzle) >= 1 && strlen(swizzle) <= 4);
59
60    fParams.reset(tileXAndY, filterMode);
61    fTexture.set(SkRef(texture), GrIORef::kRead_IOType);
62    this->setSwizzle(swizzle);
63}
64
65void GrTextureAccess::reset(GrTexture* texture,
66                            const GrTextureParams& params) {
67    SkASSERT(texture);
68    fTexture.set(SkRef(texture), GrIORef::kRead_IOType);
69    fParams = params;
70    memcpy(fSwizzle, "rgba", 5);
71    fSwizzleMask = kRGBA_GrColorComponentFlags;
72}
73
74void GrTextureAccess::reset(GrTexture* texture,
75                            GrTextureParams::FilterMode filterMode,
76                            SkShader::TileMode tileXAndY) {
77    SkASSERT(texture);
78    fTexture.set(SkRef(texture), GrIORef::kRead_IOType);
79    fParams.reset(tileXAndY, filterMode);
80    memcpy(fSwizzle, "rgba", 5);
81    fSwizzleMask = kRGBA_GrColorComponentFlags;
82}
83
84void GrTextureAccess::setSwizzle(const char* swizzle) {
85    fSwizzleMask = 0;
86    memset(fSwizzle, '\0', 5);
87    for (int i = 0; i < 4 && '\0' != swizzle[i]; ++i) {
88        fSwizzle[i] = swizzle[i];
89        switch (swizzle[i]) {
90            case 'r':
91                fSwizzleMask |= kR_GrColorComponentFlag;
92                break;
93            case 'g':
94                fSwizzleMask |= kG_GrColorComponentFlag;
95                break;
96            case 'b':
97                fSwizzleMask |= kB_GrColorComponentFlag;
98                break;
99            case 'a':
100                fSwizzleMask |= kA_GrColorComponentFlag;
101                break;
102            default:
103                SkFAIL("Unexpected swizzle string character.");
104                break;
105        }
106    }
107}
108