OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 #include "SkData.h" | 8 #include "SkData.h" |
9 #include "SkPaint.h" | 9 #include "SkPaint.h" |
10 #include "SkPDFCanon.h" | 10 #include "SkPDFCanon.h" |
11 #include "SkPDFFormXObject.h" | 11 #include "SkPDFFormXObject.h" |
12 #include "SkPDFGraphicState.h" | 12 #include "SkPDFGraphicState.h" |
13 #include "SkPDFUtils.h" | 13 #include "SkPDFUtils.h" |
14 | 14 |
15 static const char* as_blend_mode(SkXfermode::Mode mode) { | 15 static const char* as_blend_mode(SkBlendMode mode) { |
16 switch (mode) { | 16 switch (mode) { |
17 case SkXfermode::kSrcOver_Mode: | 17 case SkBlendMode::kSrcOver: |
18 return "Normal"; | 18 return "Normal"; |
19 case SkXfermode::kMultiply_Mode: | 19 case SkBlendMode::kMultiply: |
20 return "Multiply"; | 20 return "Multiply"; |
21 case SkXfermode::kScreen_Mode: | 21 case SkBlendMode::kScreen: |
22 return "Screen"; | 22 return "Screen"; |
23 case SkXfermode::kOverlay_Mode: | 23 case SkBlendMode::kOverlay: |
24 return "Overlay"; | 24 return "Overlay"; |
25 case SkXfermode::kDarken_Mode: | 25 case SkBlendMode::kDarken: |
26 return "Darken"; | 26 return "Darken"; |
27 case SkXfermode::kLighten_Mode: | 27 case SkBlendMode::kLighten: |
28 return "Lighten"; | 28 return "Lighten"; |
29 case SkXfermode::kColorDodge_Mode: | 29 case SkBlendMode::kColorDodge: |
30 return "ColorDodge"; | 30 return "ColorDodge"; |
31 case SkXfermode::kColorBurn_Mode: | 31 case SkBlendMode::kColorBurn: |
32 return "ColorBurn"; | 32 return "ColorBurn"; |
33 case SkXfermode::kHardLight_Mode: | 33 case SkBlendMode::kHardLight: |
34 return "HardLight"; | 34 return "HardLight"; |
35 case SkXfermode::kSoftLight_Mode: | 35 case SkBlendMode::kSoftLight: |
36 return "SoftLight"; | 36 return "SoftLight"; |
37 case SkXfermode::kDifference_Mode: | 37 case SkBlendMode::kDifference: |
38 return "Difference"; | 38 return "Difference"; |
39 case SkXfermode::kExclusion_Mode: | 39 case SkBlendMode::kExclusion: |
40 return "Exclusion"; | 40 return "Exclusion"; |
41 case SkXfermode::kHue_Mode: | 41 case SkBlendMode::kHue: |
42 return "Hue"; | 42 return "Hue"; |
43 case SkXfermode::kSaturation_Mode: | 43 case SkBlendMode::kSaturation: |
44 return "Saturation"; | 44 return "Saturation"; |
45 case SkXfermode::kColor_Mode: | 45 case SkBlendMode::kColor: |
46 return "Color"; | 46 return "Color"; |
47 case SkXfermode::kLuminosity_Mode: | 47 case SkBlendMode::kLuminosity: |
48 return "Luminosity"; | 48 return "Luminosity"; |
49 | 49 |
50 // These are handled in SkPDFDevice::setUpContentEntry. | 50 // These are handled in SkPDFDevice::setUpContentEntry. |
51 case SkXfermode::kClear_Mode: | 51 case SkBlendMode::kClear: |
52 case SkXfermode::kSrc_Mode: | 52 case SkBlendMode::kSrc: |
53 case SkXfermode::kDst_Mode: | 53 case SkBlendMode::kDst: |
54 case SkXfermode::kDstOver_Mode: | 54 case SkBlendMode::kDstOver: |
55 case SkXfermode::kSrcIn_Mode: | 55 case SkBlendMode::kSrcIn: |
56 case SkXfermode::kDstIn_Mode: | 56 case SkBlendMode::kDstIn: |
57 case SkXfermode::kSrcOut_Mode: | 57 case SkBlendMode::kSrcOut: |
58 case SkXfermode::kDstOut_Mode: | 58 case SkBlendMode::kDstOut: |
59 case SkXfermode::kSrcATop_Mode: | 59 case SkBlendMode::kSrcATop: |
60 case SkXfermode::kDstATop_Mode: | 60 case SkBlendMode::kDstATop: |
61 case SkXfermode::kModulate_Mode: | 61 case SkBlendMode::kModulate: |
62 return "Normal"; | 62 return "Normal"; |
63 | 63 |
64 // TODO(vandebo): Figure out if we can support more of these modes. | 64 // TODO(vandebo): Figure out if we can support more of these modes. |
65 case SkXfermode::kXor_Mode: | 65 case SkBlendMode::kXor: |
66 case SkXfermode::kPlus_Mode: | 66 case SkBlendMode::kPlus: |
67 return nullptr; | 67 return nullptr; |
68 } | 68 } |
69 return nullptr; | 69 return nullptr; |
70 } | 70 } |
71 | 71 |
72 // If a SkXfermode is unsupported in PDF, this function returns | 72 // If a SkXfermode is unsupported in PDF, this function returns |
73 // SrcOver, otherwise, it returns that Xfermode as a Mode. | 73 // SrcOver, otherwise, it returns that Xfermode as a Mode. |
74 static SkXfermode::Mode mode_for_pdf(const SkXfermode* xfermode) { | 74 static SkBlendMode mode_for_pdf(SkBlendMode mode) { |
75 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode; | |
76 if (xfermode) { | |
77 xfermode->asMode(&mode); | |
78 } | |
79 switch (mode) { | 75 switch (mode) { |
80 case SkXfermode::kSrcOver_Mode: | 76 case SkBlendMode::kSrcOver: |
81 case SkXfermode::kMultiply_Mode: | 77 case SkBlendMode::kMultiply: |
82 case SkXfermode::kScreen_Mode: | 78 case SkBlendMode::kScreen: |
83 case SkXfermode::kOverlay_Mode: | 79 case SkBlendMode::kOverlay: |
84 case SkXfermode::kDarken_Mode: | 80 case SkBlendMode::kDarken: |
85 case SkXfermode::kLighten_Mode: | 81 case SkBlendMode::kLighten: |
86 case SkXfermode::kColorDodge_Mode: | 82 case SkBlendMode::kColorDodge: |
87 case SkXfermode::kColorBurn_Mode: | 83 case SkBlendMode::kColorBurn: |
88 case SkXfermode::kHardLight_Mode: | 84 case SkBlendMode::kHardLight: |
89 case SkXfermode::kSoftLight_Mode: | 85 case SkBlendMode::kSoftLight: |
90 case SkXfermode::kDifference_Mode: | 86 case SkBlendMode::kDifference: |
91 case SkXfermode::kExclusion_Mode: | 87 case SkBlendMode::kExclusion: |
92 case SkXfermode::kHue_Mode: | 88 case SkBlendMode::kHue: |
93 case SkXfermode::kSaturation_Mode: | 89 case SkBlendMode::kSaturation: |
94 case SkXfermode::kColor_Mode: | 90 case SkBlendMode::kColor: |
95 case SkXfermode::kLuminosity_Mode: | 91 case SkBlendMode::kLuminosity: |
96 // Mode is suppported and handled by pdf graphics state. | 92 // Mode is suppported and handled by pdf graphics state. |
97 return mode; | 93 return mode; |
98 default: | 94 default: |
99 return SkXfermode::kSrcOver_Mode; // Default mode. | 95 return SkBlendMode::kSrcOver; // Default mode. |
100 } | 96 } |
101 } | 97 } |
102 | 98 |
103 SkPDFGraphicState::SkPDFGraphicState(const SkPaint& p) | 99 SkPDFGraphicState::SkPDFGraphicState(const SkPaint& p) |
104 : fStrokeWidth(p.getStrokeWidth()) | 100 : fStrokeWidth(p.getStrokeWidth()) |
105 , fStrokeMiter(p.getStrokeMiter()) | 101 , fStrokeMiter(p.getStrokeMiter()) |
106 , fAlpha(p.getAlpha()) | 102 , fAlpha(p.getAlpha()) |
107 , fStrokeCap(SkToU8(p.getStrokeCap())) | 103 , fStrokeCap(SkToU8(p.getStrokeCap())) |
108 , fStrokeJoin(SkToU8(p.getStrokeJoin())) | 104 , fStrokeJoin(SkToU8(p.getStrokeJoin())) |
109 , fMode(SkToU8(mode_for_pdf(p.getXfermode()))) {} | 105 , fMode(SkToU8((unsigned)mode_for_pdf(p.getBlendMode()))) {} |
110 | 106 |
111 // static | 107 // static |
112 SkPDFGraphicState* SkPDFGraphicState::GetGraphicStateForPaint( | 108 SkPDFGraphicState* SkPDFGraphicState::GetGraphicStateForPaint( |
113 SkPDFCanon* canon, const SkPaint& paint) { | 109 SkPDFCanon* canon, const SkPaint& paint) { |
114 SkASSERT(canon); | 110 SkASSERT(canon); |
115 SkPDFGraphicState key(paint); | 111 SkPDFGraphicState key(paint); |
116 if (const SkPDFGraphicState* canonGS = canon->findGraphicState(key)) { | 112 if (const SkPDFGraphicState* canonGS = canon->findGraphicState(key)) { |
117 // The returned SkPDFGraphicState must be made non-const, | 113 // The returned SkPDFGraphicState must be made non-const, |
118 // since the emitObject() interface is non-const. But We | 114 // since the emitObject() interface is non-const. But We |
119 // promise that there is no way to mutate this object from | 115 // promise that there is no way to mutate this object from |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 const SkPDFObjNumMap& objNumMap) const { | 175 const SkPDFObjNumMap& objNumMap) const { |
180 auto dict = sk_make_sp<SkPDFDict>("ExtGState"); | 176 auto dict = sk_make_sp<SkPDFDict>("ExtGState"); |
181 dict->insertName("Type", "ExtGState"); | 177 dict->insertName("Type", "ExtGState"); |
182 | 178 |
183 SkScalar alpha = SkIntToScalar(fAlpha) / 0xFF; | 179 SkScalar alpha = SkIntToScalar(fAlpha) / 0xFF; |
184 dict->insertScalar("CA", alpha); | 180 dict->insertScalar("CA", alpha); |
185 dict->insertScalar("ca", alpha); | 181 dict->insertScalar("ca", alpha); |
186 | 182 |
187 SkPaint::Cap strokeCap = (SkPaint::Cap)fStrokeCap; | 183 SkPaint::Cap strokeCap = (SkPaint::Cap)fStrokeCap; |
188 SkPaint::Join strokeJoin = (SkPaint::Join)fStrokeJoin; | 184 SkPaint::Join strokeJoin = (SkPaint::Join)fStrokeJoin; |
189 SkXfermode::Mode xferMode = (SkXfermode::Mode)fMode; | |
190 | 185 |
191 static_assert(SkPaint::kButt_Cap == 0, "paint_cap_mismatch"); | 186 static_assert(SkPaint::kButt_Cap == 0, "paint_cap_mismatch"); |
192 static_assert(SkPaint::kRound_Cap == 1, "paint_cap_mismatch"); | 187 static_assert(SkPaint::kRound_Cap == 1, "paint_cap_mismatch"); |
193 static_assert(SkPaint::kSquare_Cap == 2, "paint_cap_mismatch"); | 188 static_assert(SkPaint::kSquare_Cap == 2, "paint_cap_mismatch"); |
194 static_assert(SkPaint::kCapCount == 3, "paint_cap_mismatch"); | 189 static_assert(SkPaint::kCapCount == 3, "paint_cap_mismatch"); |
195 SkASSERT(strokeCap >= 0 && strokeCap <= 2); | 190 SkASSERT(strokeCap >= 0 && strokeCap <= 2); |
196 dict->insertInt("LC", strokeCap); | 191 dict->insertInt("LC", strokeCap); |
197 | 192 |
198 static_assert(SkPaint::kMiter_Join == 0, "paint_join_mismatch"); | 193 static_assert(SkPaint::kMiter_Join == 0, "paint_join_mismatch"); |
199 static_assert(SkPaint::kRound_Join == 1, "paint_join_mismatch"); | 194 static_assert(SkPaint::kRound_Join == 1, "paint_join_mismatch"); |
200 static_assert(SkPaint::kBevel_Join == 2, "paint_join_mismatch"); | 195 static_assert(SkPaint::kBevel_Join == 2, "paint_join_mismatch"); |
201 static_assert(SkPaint::kJoinCount == 3, "paint_join_mismatch"); | 196 static_assert(SkPaint::kJoinCount == 3, "paint_join_mismatch"); |
202 SkASSERT(strokeJoin >= 0 && strokeJoin <= 2); | 197 SkASSERT(strokeJoin >= 0 && strokeJoin <= 2); |
203 dict->insertInt("LJ", strokeJoin); | 198 dict->insertInt("LJ", strokeJoin); |
204 | 199 |
205 dict->insertScalar("LW", fStrokeWidth); | 200 dict->insertScalar("LW", fStrokeWidth); |
206 dict->insertScalar("ML", fStrokeMiter); | 201 dict->insertScalar("ML", fStrokeMiter); |
207 dict->insertBool("SA", true); // SA = Auto stroke adjustment. | 202 dict->insertBool("SA", true); // SA = Auto stroke adjustment. |
208 dict->insertName("BM", as_blend_mode(xferMode)); | 203 dict->insertName("BM", as_blend_mode((SkBlendMode)fMode)); |
209 dict->emitObject(stream, objNumMap); | 204 dict->emitObject(stream, objNumMap); |
210 } | 205 } |
OLD | NEW |