OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SKSL_INDEX | 8 #ifndef SKSL_INDEX |
9 #define SKSL_INDEX | 9 #define SKSL_INDEX |
10 | 10 |
11 #include "SkSLExpression.h" | 11 #include "SkSLExpression.h" |
12 #include "SkSLUtil.h" | 12 #include "SkSLUtil.h" |
13 | 13 |
14 namespace SkSL { | 14 namespace SkSL { |
15 | 15 |
16 /** | 16 /** |
17 * Given a type, returns the type that will result from extracting an array valu
e from it. | 17 * Given a type, returns the type that will result from extracting an array valu
e from it. |
18 */ | 18 */ |
19 static const Type& index_type(const Type& type) { | 19 static std::shared_ptr<Type> index_type(const Type& type) { |
20 if (type.kind() == Type::kMatrix_Kind) { | 20 if (type.kind() == Type::kMatrix_Kind) { |
21 if (type.componentType() == *kFloat_Type) { | 21 if (type.componentType() == kFloat_Type) { |
22 switch (type.columns()) { | 22 switch (type.columns()) { |
23 case 2: return *kVec2_Type; | 23 case 2: return kVec2_Type; |
24 case 3: return *kVec3_Type; | 24 case 3: return kVec3_Type; |
25 case 4: return *kVec4_Type; | 25 case 4: return kVec4_Type; |
26 default: ASSERT(false); | 26 default: ASSERT(false); |
27 } | 27 } |
28 } else { | 28 } else { |
29 ASSERT(type.componentType() == *kDouble_Type); | 29 ASSERT(type.componentType() == kDouble_Type); |
30 switch (type.columns()) { | 30 switch (type.columns()) { |
31 case 2: return *kDVec2_Type; | 31 case 2: return kDVec2_Type; |
32 case 3: return *kDVec3_Type; | 32 case 3: return kDVec3_Type; |
33 case 4: return *kDVec4_Type; | 33 case 4: return kDVec4_Type; |
34 default: ASSERT(false); | 34 default: ASSERT(false); |
35 } | 35 } |
36 } | 36 } |
37 } | 37 } |
38 return type.componentType(); | 38 return type.componentType(); |
39 } | 39 } |
40 | 40 |
41 /** | 41 /** |
42 * An expression which extracts a value from an array or matrix, as in 'm[2]'. | 42 * An expression which extracts a value from an array or matrix, as in 'm[2]'. |
43 */ | 43 */ |
44 struct IndexExpression : public Expression { | 44 struct IndexExpression : public Expression { |
45 IndexExpression(std::unique_ptr<Expression> base, std::unique_ptr<Expression
> index) | 45 IndexExpression(std::unique_ptr<Expression> base, std::unique_ptr<Expression
> index) |
46 : INHERITED(base->fPosition, kIndex_Kind, index_type(base->fType)) | 46 : INHERITED(base->fPosition, kIndex_Kind, index_type(*base->fType)) |
47 , fBase(std::move(base)) | 47 , fBase(std::move(base)) |
48 , fIndex(std::move(index)) { | 48 , fIndex(std::move(index)) { |
49 ASSERT(fIndex->fType == *kInt_Type); | 49 ASSERT(fIndex->fType == kInt_Type); |
50 } | 50 } |
51 | 51 |
52 std::string description() const override { | 52 std::string description() const override { |
53 return fBase->description() + "[" + fIndex->description() + "]"; | 53 return fBase->description() + "[" + fIndex->description() + "]"; |
54 } | 54 } |
55 | 55 |
56 const std::unique_ptr<Expression> fBase; | 56 const std::unique_ptr<Expression> fBase; |
57 const std::unique_ptr<Expression> fIndex; | 57 const std::unique_ptr<Expression> fIndex; |
58 | 58 |
59 typedef Expression INHERITED; | 59 typedef Expression INHERITED; |
60 }; | 60 }; |
61 | 61 |
62 } // namespace | 62 } // namespace |
63 | 63 |
64 #endif | 64 #endif |
OLD | NEW |