| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkPDFShader.h" | 10 #include "SkPDFShader.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 SkScalar inv = mag ? SkScalarInvert(mag) : 0; | 36 SkScalar inv = mag ? SkScalarInvert(mag) : 0; |
| 37 | 37 |
| 38 vec.scale(inv); | 38 vec.scale(inv); |
| 39 matrix->setSinCos(vec.fY, vec.fX); | 39 matrix->setSinCos(vec.fY, vec.fX); |
| 40 matrix->preTranslate(pts[0].fX, pts[0].fY); | 40 matrix->preTranslate(pts[0].fX, pts[0].fY); |
| 41 matrix->preScale(mag, mag); | 41 matrix->preScale(mag, mag); |
| 42 } | 42 } |
| 43 | 43 |
| 44 /* Assumes t + startOffset is on the stack and does a linear interpolation on t | 44 /* Assumes t + startOffset is on the stack and does a linear interpolation on t |
| 45 between startOffset and endOffset from prevColor to curColor (for each color | 45 between startOffset and endOffset from prevColor to curColor (for each color |
| 46 component), leaving the result in component order on the stack. | 46 component), leaving the result in component order on the stack. It assumes |
| 47 there are always 3 components per color. |
| 47 @param range endOffset - startOffset | 48 @param range endOffset - startOffset |
| 48 @param curColor[components] The current color components. | 49 @param curColor[components] The current color components. |
| 49 @param prevColor[components] The previous color components. | 50 @param prevColor[components] The previous color components. |
| 50 @param result The result ps function. | 51 @param result The result ps function. |
| 51 */ | 52 */ |
| 52 static void interpolateColorCode(SkScalar range, SkScalar* curColor, | 53 static void interpolateColorCode(SkScalar range, SkScalar* curColor, |
| 53 SkScalar* prevColor, int components, | 54 SkScalar* prevColor, SkString* result) { |
| 54 SkString* result) { | 55 static const int kColorComponents = 3; |
| 56 |
| 55 // Figure out how to scale each color component. | 57 // Figure out how to scale each color component. |
| 56 SkAutoSTMalloc<4, SkScalar> multiplierAlloc(components); | 58 SkScalar multiplier[kColorComponents]; |
| 57 SkScalar *multiplier = multiplierAlloc.get(); | 59 for (int i = 0; i < kColorComponents; i++) { |
| 58 for (int i = 0; i < components; i++) { | |
| 59 multiplier[i] = SkScalarDiv(curColor[i] - prevColor[i], range); | 60 multiplier[i] = SkScalarDiv(curColor[i] - prevColor[i], range); |
| 60 } | 61 } |
| 61 | 62 |
| 62 // Calculate when we no longer need to keep a copy of the input parameter t. | 63 // Calculate when we no longer need to keep a copy of the input parameter t. |
| 63 // If the last component to use t is i, then dupInput[0..i - 1] = true | 64 // If the last component to use t is i, then dupInput[0..i - 1] = true |
| 64 // and dupInput[i .. components] = false. | 65 // and dupInput[i .. components] = false. |
| 65 SkAutoSTMalloc<4, bool> dupInputAlloc(components); | 66 bool dupInput[kColorComponents]; |
| 66 bool *dupInput = dupInputAlloc.get(); | 67 dupInput[kColorComponents - 1] = false; |
| 67 dupInput[components - 1] = false; | 68 for (int i = kColorComponents - 2; i >= 0; i--) { |
| 68 for (int i = components - 2; i >= 0; i--) { | |
| 69 dupInput[i] = dupInput[i + 1] || multiplier[i + 1] != 0; | 69 dupInput[i] = dupInput[i + 1] || multiplier[i + 1] != 0; |
| 70 } | 70 } |
| 71 | 71 |
| 72 if (!dupInput[0] && multiplier[0] == 0) { | 72 if (!dupInput[0] && multiplier[0] == 0) { |
| 73 result->append("pop "); | 73 result->append("pop "); |
| 74 } | 74 } |
| 75 | 75 |
| 76 for (int i = 0; i < components; i++) { | 76 for (int i = 0; i < kColorComponents; i++) { |
| 77 // If the next components needs t and this component will consume a | 77 // If the next components needs t and this component will consume a |
| 78 // copy, make another copy. | 78 // copy, make another copy. |
| 79 if (dupInput[i] && multiplier[i] != 0) { | 79 if (dupInput[i] && multiplier[i] != 0) { |
| 80 result->append("dup "); | 80 result->append("dup "); |
| 81 } | 81 } |
| 82 | 82 |
| 83 if (multiplier[i] == 0) { | 83 if (multiplier[i] == 0) { |
| 84 result->appendScalar(prevColor[i]); | 84 result->appendScalar(prevColor[i]); |
| 85 result->append(" "); | 85 result->append(" "); |
| 86 } else { | 86 } else { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 for (int i = 1 ; i < info.fColorCount; i++) { | 152 for (int i = 1 ; i < info.fColorCount; i++) { |
| 153 result->append("{dup "); | 153 result->append("{dup "); |
| 154 result->appendScalar(info.fColorOffsets[i]); | 154 result->appendScalar(info.fColorOffsets[i]); |
| 155 result->append(" le {"); | 155 result->append(" le {"); |
| 156 if (info.fColorOffsets[i - 1] != 0) { | 156 if (info.fColorOffsets[i - 1] != 0) { |
| 157 result->appendScalar(info.fColorOffsets[i - 1]); | 157 result->appendScalar(info.fColorOffsets[i - 1]); |
| 158 result->append(" sub\n"); | 158 result->append(" sub\n"); |
| 159 } | 159 } |
| 160 | 160 |
| 161 interpolateColorCode(info.fColorOffsets[i] - info.fColorOffsets[i - 1], | 161 interpolateColorCode(info.fColorOffsets[i] - info.fColorOffsets[i - 1], |
| 162 colorData[i], colorData[i - 1], kColorComponents, | 162 colorData[i], colorData[i - 1], result); |
| 163 result); | |
| 164 result->append("}\n"); | 163 result->append("}\n"); |
| 165 } | 164 } |
| 166 | 165 |
| 167 // Clamp the final color. | 166 // Clamp the final color. |
| 168 result->append("{pop "); | 167 result->append("{pop "); |
| 169 result->appendScalar(colorData[info.fColorCount - 1][0]); | 168 result->appendScalar(colorData[info.fColorCount - 1][0]); |
| 170 result->append(" "); | 169 result->append(" "); |
| 171 result->appendScalar(colorData[info.fColorCount - 1][1]); | 170 result->appendScalar(colorData[info.fColorCount - 1][1]); |
| 172 result->append(" "); | 171 result->append(" "); |
| 173 result->appendScalar(colorData[info.fColorCount - 1][2]); | 172 result->appendScalar(colorData[info.fColorCount - 1][2]); |
| (...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 fPixelGeneration = fImage.getGenerationID(); | 954 fPixelGeneration = fImage.getGenerationID(); |
| 956 } else { | 955 } else { |
| 957 fColorData.set(sk_malloc_throw( | 956 fColorData.set(sk_malloc_throw( |
| 958 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); | 957 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); |
| 959 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); | 958 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); |
| 960 fInfo.fColorOffsets = | 959 fInfo.fColorOffsets = |
| 961 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); | 960 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); |
| 962 shader.asAGradient(&fInfo); | 961 shader.asAGradient(&fInfo); |
| 963 } | 962 } |
| 964 } | 963 } |
| OLD | NEW |