Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2010 The Android Open Source Project | 3 * Copyright 2010 The Android Open Source Project |
| 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 #ifndef SkPDFGraphicState_DEFINED | 10 #ifndef SkPDFGraphicState_DEFINED |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 66 SkPDFSMaskMode sMaskMode); | 66 SkPDFSMaskMode sMaskMode); |
| 67 | 67 |
| 68 /** Get a graphic state that only unsets the soft mask. The reference | 68 /** Get a graphic state that only unsets the soft mask. The reference |
| 69 * count of the object is incremented and it is the caller's responsibility | 69 * count of the object is incremented and it is the caller's responsibility |
| 70 * to unreference it when done. This is needed to accommodate the weak | 70 * to unreference it when done. This is needed to accommodate the weak |
| 71 * reference pattern used when the returned object is new and has no | 71 * reference pattern used when the returned object is new and has no |
| 72 * other references. | 72 * other references. |
| 73 */ | 73 */ |
| 74 static SkPDFGraphicState* GetNoSMaskGraphicState(); | 74 static SkPDFGraphicState* GetNoSMaskGraphicState(); |
| 75 | 75 |
| 76 bool equals(const SkPaint&) const; | |
|
mtklein
2015/01/20 21:59:52
If you're going to inline this, do it here?
bool
hal.canary
2015/01/21 17:07:51
Done.
| |
| 77 | |
| 76 private: | 78 private: |
| 77 const SkPaint fPaint; | 79 const SkPaint fPaint; |
| 78 SkTDArray<SkPDFObject*> fResources; | 80 SkTDArray<SkPDFObject*> fResources; |
| 79 bool fPopulated; | 81 bool fPopulated; |
| 80 bool fSMask; | 82 bool fSMask; |
| 81 | 83 |
| 82 class GSCanonicalEntry { | |
| 83 public: | |
| 84 SkPDFGraphicState* fGraphicState; | |
| 85 const SkPaint* fPaint; | |
| 86 | |
| 87 bool operator==(const GSCanonicalEntry& b) const; | |
| 88 explicit GSCanonicalEntry(SkPDFGraphicState* gs) | |
| 89 : fGraphicState(gs), | |
| 90 fPaint(&gs->fPaint) {} | |
| 91 explicit GSCanonicalEntry(const SkPaint* paint) | |
| 92 : fGraphicState(NULL), | |
| 93 fPaint(paint) {} | |
| 94 }; | |
| 95 | |
| 96 // This should be made a hash table if performance is a problem. | |
| 97 static SkTDArray<GSCanonicalEntry>& CanonicalPaints(); | |
| 98 static SkBaseMutex& CanonicalPaintsMutex(); | |
| 99 | |
| 100 SkPDFGraphicState(); | 84 SkPDFGraphicState(); |
| 101 explicit SkPDFGraphicState(const SkPaint& paint); | 85 explicit SkPDFGraphicState(const SkPaint& paint); |
| 102 | 86 |
| 103 void populateDict(); | 87 void populateDict(); |
| 104 | 88 |
| 105 static SkPDFObject* GetInvertFunction(); | 89 static SkPDFObject* GetInvertFunction(); |
| 106 | 90 |
| 107 static int Find(const SkPaint& paint); | 91 static bool PDFPaintEquality(const SkPaint&, const SkPaint&); |
| 92 static const char* PDFBlendModeFromXfermode(SkXfermode::Mode); | |
| 93 | |
| 108 typedef SkPDFDict INHERITED; | 94 typedef SkPDFDict INHERITED; |
| 109 }; | 95 }; |
| 110 | 96 |
| 97 inline const char* SkPDFGraphicState::PDFBlendModeFromXfermode( | |
|
mtklein
2015/01/20 21:59:51
Same deal. Seems like these two giant methods don
hal.canary
2015/01/21 17:07:51
Done.
| |
| 98 SkXfermode::Mode mode) { | |
| 99 switch (mode) { | |
| 100 case SkXfermode::kSrcOver_Mode: | |
| 101 return "Normal"; | |
| 102 case SkXfermode::kMultiply_Mode: | |
| 103 return "Multiply"; | |
| 104 case SkXfermode::kScreen_Mode: | |
| 105 return "Screen"; | |
| 106 case SkXfermode::kOverlay_Mode: | |
| 107 return "Overlay"; | |
| 108 case SkXfermode::kDarken_Mode: | |
| 109 return "Darken"; | |
| 110 case SkXfermode::kLighten_Mode: | |
| 111 return "Lighten"; | |
| 112 case SkXfermode::kColorDodge_Mode: | |
| 113 return "ColorDodge"; | |
| 114 case SkXfermode::kColorBurn_Mode: | |
| 115 return "ColorBurn"; | |
| 116 case SkXfermode::kHardLight_Mode: | |
| 117 return "HardLight"; | |
| 118 case SkXfermode::kSoftLight_Mode: | |
| 119 return "SoftLight"; | |
| 120 case SkXfermode::kDifference_Mode: | |
| 121 return "Difference"; | |
| 122 case SkXfermode::kExclusion_Mode: | |
| 123 return "Exclusion"; | |
| 124 case SkXfermode::kHue_Mode: | |
| 125 return "Hue"; | |
| 126 case SkXfermode::kSaturation_Mode: | |
| 127 return "Saturation"; | |
| 128 case SkXfermode::kColor_Mode: | |
| 129 return "Color"; | |
| 130 case SkXfermode::kLuminosity_Mode: | |
| 131 return "Luminosity"; | |
| 132 | |
| 133 // These are handled in SkPDFDevice::setUpContentEntry. | |
| 134 case SkXfermode::kClear_Mode: | |
| 135 case SkXfermode::kSrc_Mode: | |
| 136 case SkXfermode::kDst_Mode: | |
| 137 case SkXfermode::kDstOver_Mode: | |
| 138 case SkXfermode::kSrcIn_Mode: | |
| 139 case SkXfermode::kDstIn_Mode: | |
| 140 case SkXfermode::kSrcOut_Mode: | |
| 141 case SkXfermode::kDstOut_Mode: | |
| 142 case SkXfermode::kSrcATop_Mode: | |
| 143 case SkXfermode::kDstATop_Mode: | |
| 144 case SkXfermode::kModulate_Mode: | |
| 145 return "Normal"; | |
| 146 | |
| 147 // TODO(vandebo): Figure out if we can support more of these modes. | |
| 148 case SkXfermode::kXor_Mode: | |
| 149 case SkXfermode::kPlus_Mode: | |
| 150 return NULL; | |
| 151 } | |
| 152 return NULL; | |
| 153 } | |
| 154 | |
| 155 inline bool SkPDFGraphicState::equals(const SkPaint& paint) const { | |
| 156 return SkPDFGraphicState::PDFPaintEquality(paint, fPaint); | |
| 157 } | |
| 158 | |
| 159 inline bool SkPDFGraphicState::PDFPaintEquality(const SkPaint& a, | |
|
mtklein
2015/01/20 21:59:52
I keep glazing over reading these names.. consider
hal.canary
2015/01/21 17:07:51
Done.
| |
| 160 const SkPaint& b) { | |
| 161 // We're only interested in some fields of the SkPaint, so we have | |
| 162 // a custom equality function. | |
| 163 if (SkColorGetA(a.getColor()) != SkColorGetA(b.getColor()) || | |
| 164 a.getStrokeCap() != b.getStrokeCap() || | |
| 165 a.getStrokeJoin() != b.getStrokeJoin() || | |
| 166 a.getStrokeWidth() != b.getStrokeWidth() || | |
| 167 a.getStrokeMiter() != b.getStrokeMiter()) { | |
| 168 return false; | |
| 169 } | |
| 170 | |
| 171 SkXfermode::Mode aXfermodeName = SkXfermode::kSrcOver_Mode; | |
| 172 SkXfermode* aXfermode = a.getXfermode(); | |
| 173 if (aXfermode) { | |
| 174 aXfermode->asMode(&aXfermodeName); | |
| 175 } | |
| 176 if (aXfermodeName < 0 || aXfermodeName > SkXfermode::kLastMode || | |
| 177 PDFBlendModeFromXfermode(aXfermodeName) == NULL) { | |
| 178 aXfermodeName = SkXfermode::kSrcOver_Mode; | |
| 179 } | |
| 180 const char* aXfermodeString = PDFBlendModeFromXfermode(aXfermodeName); | |
| 181 SkASSERT(aXfermodeString != NULL); | |
| 182 | |
| 183 SkXfermode::Mode bXfermodeName = SkXfermode::kSrcOver_Mode; | |
| 184 SkXfermode* bXfermode = b.getXfermode(); | |
| 185 if (bXfermode) { | |
| 186 bXfermode->asMode(&bXfermodeName); | |
| 187 } | |
| 188 if (bXfermodeName < 0 || bXfermodeName > SkXfermode::kLastMode || | |
| 189 PDFBlendModeFromXfermode(bXfermodeName) == NULL) { | |
| 190 bXfermodeName = SkXfermode::kSrcOver_Mode; | |
| 191 } | |
| 192 const char* bXfermodeString = PDFBlendModeFromXfermode(bXfermodeName); | |
| 193 SkASSERT(bXfermodeString != NULL); | |
| 194 | |
| 195 return strcmp(aXfermodeString, bXfermodeString) == 0; | |
| 196 } | |
| 197 | |
| 111 #endif | 198 #endif |
| OLD | NEW |