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 
GrTextureAccess()12 GrTextureAccess::GrTextureAccess() {
13 #ifdef SK_DEBUG
14     memcpy(fSwizzle, "void", 5);
15     fSwizzleMask = 0xbeeffeed;
16 #endif
17 }
18 
GrTextureAccess(GrTexture * texture,const GrTextureParams & params)19 GrTextureAccess::GrTextureAccess(GrTexture* texture, const GrTextureParams& params) {
20     this->reset(texture, params);
21 }
22 
GrTextureAccess(GrTexture * texture,GrTextureParams::FilterMode filterMode,SkShader::TileMode tileXAndY)23 GrTextureAccess::GrTextureAccess(GrTexture* texture,
24                                  GrTextureParams::FilterMode filterMode,
25                                  SkShader::TileMode tileXAndY) {
26     this->reset(texture, filterMode, tileXAndY);
27 }
28 
GrTextureAccess(GrTexture * texture,const char * swizzle,const GrTextureParams & params)29 GrTextureAccess::GrTextureAccess(GrTexture* texture,
30                                  const char* swizzle,
31                                  const GrTextureParams& params) {
32     this->reset(texture, swizzle, params);
33 }
34 
GrTextureAccess(GrTexture * texture,const char * swizzle,GrTextureParams::FilterMode filterMode,SkShader::TileMode tileXAndY)35 GrTextureAccess::GrTextureAccess(GrTexture* texture,
36                                  const char* swizzle,
37                                  GrTextureParams::FilterMode filterMode,
38                                  SkShader::TileMode tileXAndY) {
39     this->reset(texture, swizzle, filterMode, tileXAndY);
40 }
41 
reset(GrTexture * texture,const char * swizzle,const GrTextureParams & params)42 void 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), kRead_GrIOType);
50     this->setSwizzle(swizzle);
51 }
52 
reset(GrTexture * texture,const char * swizzle,GrTextureParams::FilterMode filterMode,SkShader::TileMode tileXAndY)53 void 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), kRead_GrIOType);
62     this->setSwizzle(swizzle);
63 }
64 
reset(GrTexture * texture,const GrTextureParams & params)65 void GrTextureAccess::reset(GrTexture* texture,
66                             const GrTextureParams& params) {
67     SkASSERT(texture);
68     fTexture.set(SkRef(texture), kRead_GrIOType);
69     fParams = params;
70     memcpy(fSwizzle, "rgba", 5);
71     fSwizzleMask = kRGBA_GrColorComponentFlags;
72 }
73 
reset(GrTexture * texture,GrTextureParams::FilterMode filterMode,SkShader::TileMode tileXAndY)74 void GrTextureAccess::reset(GrTexture* texture,
75                             GrTextureParams::FilterMode filterMode,
76                             SkShader::TileMode tileXAndY) {
77     SkASSERT(texture);
78     fTexture.set(SkRef(texture), kRead_GrIOType);
79     fParams.reset(tileXAndY, filterMode);
80     memcpy(fSwizzle, "rgba", 5);
81     fSwizzleMask = kRGBA_GrColorComponentFlags;
82 }
83 
setSwizzle(const char * swizzle)84 void 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