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 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 // For clamp modes, we're only interested in the clip region, whether | 935 // For clamp modes, we're only interested in the clip region, whether |
936 // or not the main bitmap is in it. | 936 // or not the main bitmap is in it. |
937 SkShader::TileMode tileModes[2]; | 937 SkShader::TileMode tileModes[2]; |
938 tileModes[0] = state.fImageTileModes[0]; | 938 tileModes[0] = state.fImageTileModes[0]; |
939 tileModes[1] = state.fImageTileModes[1]; | 939 tileModes[1] = state.fImageTileModes[1]; |
940 if (tileModes[0] != SkShader::kClamp_TileMode || | 940 if (tileModes[0] != SkShader::kClamp_TileMode || |
941 tileModes[1] != SkShader::kClamp_TileMode) { | 941 tileModes[1] != SkShader::kClamp_TileMode) { |
942 deviceBounds.join(bitmapBounds); | 942 deviceBounds.join(bitmapBounds); |
943 } | 943 } |
944 | 944 |
945 SkMatrix unflip; | |
946 unflip.setTranslate(0, SkScalarRoundToScalar(deviceBounds.height())); | |
947 unflip.preScale(SK_Scalar1, -SK_Scalar1); | |
948 SkISize size = SkISize::Make(SkScalarRoundToInt(deviceBounds.width()), | 945 SkISize size = SkISize::Make(SkScalarRoundToInt(deviceBounds.width()), |
949 SkScalarRoundToInt(deviceBounds.height())); | 946 SkScalarRoundToInt(deviceBounds.height())); |
950 // TODO(edisonn): should we pass here the DCT encoder of the destination dev
ice? | 947 SkAutoTUnref<SkPDFDevice> patternDevice( |
951 // TODO(edisonn): NYI Perspective, use SkPDFDeviceFlattener. | 948 SkPDFDevice::CreateUnflipped(size, 72.0f, NULL)); |
952 SkPDFDevice pattern(size, size, unflip); | 949 SkCanvas canvas(patternDevice.get()); |
953 SkCanvas canvas(&pattern); | |
954 | 950 |
955 SkRect patternBBox; | 951 SkRect patternBBox; |
956 image->getBounds(&patternBBox); | 952 image->getBounds(&patternBBox); |
957 | 953 |
958 // Translate the canvas so that the bitmap origin is at (0, 0). | 954 // Translate the canvas so that the bitmap origin is at (0, 0). |
959 canvas.translate(-deviceBounds.left(), -deviceBounds.top()); | 955 canvas.translate(-deviceBounds.left(), -deviceBounds.top()); |
960 patternBBox.offset(-deviceBounds.left(), -deviceBounds.top()); | 956 patternBBox.offset(-deviceBounds.left(), -deviceBounds.top()); |
961 // Undo the translation in the final matrix | 957 // Undo the translation in the final matrix |
962 finalMatrix.preTranslate(deviceBounds.left(), deviceBounds.top()); | 958 finalMatrix.preTranslate(deviceBounds.left(), deviceBounds.top()); |
963 | 959 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 if (tileModes[0] == SkShader::kMirror_TileMode) { | 1097 if (tileModes[0] == SkShader::kMirror_TileMode) { |
1102 bottomMatrix.postScale(-1, 1); | 1098 bottomMatrix.postScale(-1, 1); |
1103 bottomMatrix.postTranslate(2 * width, 0); | 1099 bottomMatrix.postTranslate(2 * width, 0); |
1104 drawBitmapMatrix(&canvas, bottom, bottomMatrix); | 1100 drawBitmapMatrix(&canvas, bottom, bottomMatrix); |
1105 } | 1101 } |
1106 patternBBox.fBottom = deviceBounds.height(); | 1102 patternBBox.fBottom = deviceBounds.height(); |
1107 } | 1103 } |
1108 } | 1104 } |
1109 | 1105 |
1110 // Put the canvas into the pattern stream (fContent). | 1106 // Put the canvas into the pattern stream (fContent). |
1111 SkAutoTDelete<SkStream> content(pattern.content()); | 1107 SkAutoTDelete<SkStream> content(patternDevice->content()); |
1112 | 1108 |
1113 SkPDFImageShader* imageShader = | 1109 SkPDFImageShader* imageShader = |
1114 SkNEW_ARGS(SkPDFImageShader, (autoState->detach())); | 1110 SkNEW_ARGS(SkPDFImageShader, (autoState->detach())); |
1115 imageShader->setData(content.get()); | 1111 imageShader->setData(content.get()); |
1116 | 1112 |
1117 populate_tiling_pattern_dict(imageShader, patternBBox, | 1113 populate_tiling_pattern_dict(imageShader, |
1118 pattern.getResourceDict(), finalMatrix); | 1114 patternBBox, |
| 1115 patternDevice->getResourceDict(), |
| 1116 finalMatrix); |
1119 | 1117 |
1120 imageShader->fShaderState->fImage.unlockPixels(); | 1118 imageShader->fShaderState->fImage.unlockPixels(); |
1121 | 1119 |
1122 SkPDFCanon::GetCanon().addImageShader(imageShader); | 1120 SkPDFCanon::GetCanon().addImageShader(imageShader); |
1123 return imageShader; | 1121 return imageShader; |
1124 } | 1122 } |
1125 | 1123 |
1126 bool SkPDFShader::State::operator==(const SkPDFShader::State& b) const { | 1124 bool SkPDFShader::State::operator==(const SkPDFShader::State& b) const { |
1127 if (fType != b.fType || | 1125 if (fType != b.fType || |
1128 fCanvasTransform != b.fCanvasTransform || | 1126 fCanvasTransform != b.fCanvasTransform || |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1315 return false; | 1313 return false; |
1316 } | 1314 } |
1317 | 1315 |
1318 void SkPDFShader::State::AllocateGradientInfoStorage() { | 1316 void SkPDFShader::State::AllocateGradientInfoStorage() { |
1319 fColorData.set(sk_malloc_throw( | 1317 fColorData.set(sk_malloc_throw( |
1320 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); | 1318 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); |
1321 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); | 1319 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); |
1322 fInfo.fColorOffsets = | 1320 fInfo.fColorOffsets = |
1323 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); | 1321 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); |
1324 } | 1322 } |
OLD | NEW |