| 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 |