Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 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 #include "SkPaint.h" | 9 #include "SkPaint.h" |
| 10 #include "SkAnnotation.h" | 10 #include "SkAnnotation.h" |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 28 #include "SkScalerContext.h" | 28 #include "SkScalerContext.h" |
| 29 #include "SkShader.h" | 29 #include "SkShader.h" |
| 30 #include "SkStringUtils.h" | 30 #include "SkStringUtils.h" |
| 31 #include "SkStroke.h" | 31 #include "SkStroke.h" |
| 32 #include "SkTextFormatParams.h" | 32 #include "SkTextFormatParams.h" |
| 33 #include "SkTextToPathIter.h" | 33 #include "SkTextToPathIter.h" |
| 34 #include "SkTLazy.h" | 34 #include "SkTLazy.h" |
| 35 #include "SkTypeface.h" | 35 #include "SkTypeface.h" |
| 36 #include "SkXfermode.h" | 36 #include "SkXfermode.h" |
| 37 | 37 |
| 38 bool SkPaintParts::operator==(const SkPaintParts& other) const { | |
|
mtklein
2014/04/15 14:32:44
Give him his own .cpp?
reed1
2014/04/18 14:04:31
Eventually yes.
| |
| 39 #define EQUAL(field) (this->field == other.field) | |
| 40 return EQUAL(fTypeface) | |
| 41 && EQUAL(fPathEffect) | |
| 42 && EQUAL(fShader) | |
| 43 && EQUAL(fXfermode) | |
| 44 && EQUAL(fMaskFilter) | |
| 45 && EQUAL(fColorFilter) | |
| 46 && EQUAL(fRasterizer) | |
| 47 && EQUAL(fLooper) | |
| 48 && EQUAL(fImageFilter) | |
| 49 && EQUAL(fAnnotation) | |
| 50 && EQUAL(fTextSize) | |
| 51 && EQUAL(fTextScaleX) | |
| 52 && EQUAL(fTextSkewX) | |
| 53 && EQUAL(fColor) | |
| 54 && EQUAL(fWidth) | |
| 55 && EQUAL(fMiterLimit) | |
| 56 && EQUAL(fBitfields) | |
| 57 ; | |
| 58 #undef EQUAL | |
| 59 } | |
| 60 | |
| 61 /////////// | |
| 62 | |
| 63 | |
| 38 enum { | 64 enum { |
| 39 kColor_DirtyBit = 1 << 0, | 65 kColor_DirtyBit = 1 << 0, |
| 40 kBitfields_DirtyBit = 1 << 1, | 66 kBitfields_DirtyBit = 1 << 1, |
| 41 kTextSize_DirtyBit = 1 << 2, | 67 kTextSize_DirtyBit = 1 << 2, |
| 42 kTextScaleX_DirtyBit = 1 << 3, | 68 kTextScaleX_DirtyBit = 1 << 3, |
| 43 kTextSkewX_DirtyBit = 1 << 4, | 69 kTextSkewX_DirtyBit = 1 << 4, |
| 44 kStrokeWidth_DirtyBit = 1 << 5, | 70 kStrokeWidth_DirtyBit = 1 << 5, |
| 45 kStrokeMiter_DirtyBit = 1 << 6, | 71 kStrokeMiter_DirtyBit = 1 << 6, |
| 46 kPathEffect_DirtyBit = 1 << 7, | 72 kPathEffect_DirtyBit = 1 << 7, |
| 47 kShader_DirtyBit = 1 << 8, | 73 kShader_DirtyBit = 1 << 8, |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 62 | 88 |
| 63 #ifdef SK_BUILD_FOR_ANDROID | 89 #ifdef SK_BUILD_FOR_ANDROID |
| 64 #define GEN_ID_INC fGenerationID++ | 90 #define GEN_ID_INC fGenerationID++ |
| 65 #define GEN_ID_INC_EVAL(expression) if (expression) { fGenerationID++; } | 91 #define GEN_ID_INC_EVAL(expression) if (expression) { fGenerationID++; } |
| 66 #else | 92 #else |
| 67 #define GEN_ID_INC | 93 #define GEN_ID_INC |
| 68 #define GEN_ID_INC_EVAL(expression) | 94 #define GEN_ID_INC_EVAL(expression) |
| 69 #endif | 95 #endif |
| 70 | 96 |
| 71 SkPaint::SkPaint() { | 97 SkPaint::SkPaint() { |
| 72 fTypeface = NULL; | 98 // set any non-zero values in fParts |
| 73 fPathEffect = NULL; | |
| 74 fShader = NULL; | |
| 75 fXfermode = NULL; | |
| 76 fMaskFilter = NULL; | |
| 77 fColorFilter = NULL; | |
| 78 fRasterizer = NULL; | |
| 79 fLooper = NULL; | |
| 80 fImageFilter = NULL; | |
| 81 fAnnotation = NULL; | |
| 82 | 99 |
| 83 fTextSize = SkPaintDefaults_TextSize; | 100 fParts.fTextSize = SkPaintDefaults_TextSize; |
| 84 fTextScaleX = SK_Scalar1; | 101 fParts.fTextScaleX = SK_Scalar1; |
| 85 fTextSkewX = 0; | 102 fParts.fColor = SK_ColorBLACK; |
| 86 fColor = SK_ColorBLACK; | 103 fParts.fMiterLimit = SkPaintDefaults_MiterLimit; |
| 87 fWidth = 0; | |
| 88 fMiterLimit = SkPaintDefaults_MiterLimit; | |
| 89 | 104 |
| 90 // Zero all bitfields, then set some non-zero defaults. | 105 fParts.fFlags = SkPaintDefaults_Flags; |
| 91 fBitfields = 0; | 106 fParts.fCapType = SkPaintParts::kDefault_Cap; |
| 92 fFlags = SkPaintDefaults_Flags; | 107 fParts.fJoinType = SkPaintParts::kDefault_Join; |
| 93 fCapType = kDefault_Cap; | 108 fParts.fTextAlign = SkPaintParts::kLeft_Align; |
| 94 fJoinType = kDefault_Join; | 109 fParts.fStyle = SkPaintParts::kFill_Style; |
| 95 fTextAlign = kLeft_Align; | 110 fParts.fTextEncoding = kUTF8_TextEncoding; |
| 96 fStyle = kFill_Style; | 111 fParts.fHinting = SkPaintDefaults_Hinting; |
| 97 fTextEncoding = kUTF8_TextEncoding; | |
| 98 fHinting = SkPaintDefaults_Hinting; | |
| 99 | 112 |
| 100 fDirtyBits = 0; | 113 fDirtyBits = 0; |
| 101 #ifdef SK_BUILD_FOR_ANDROID | 114 #ifdef SK_BUILD_FOR_ANDROID |
| 102 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid; | 115 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid; |
| 103 fGenerationID = 0; | 116 fGenerationID = 0; |
| 104 #endif | 117 #endif |
| 105 } | 118 } |
| 106 | 119 |
| 107 SkPaint::SkPaint(const SkPaint& src) { | 120 SkPaint::SkPaint(const SkPaint& src) { |
| 108 #define COPY(field) field = src.field | 121 #define COPY(field) fParts.field = src.fParts.field |
| 109 #define REF_COPY(field) field = SkSafeRef(src.field) | 122 #define REF_COPY(field) fParts.field = SkSafeRef(src.fParts.field) |
| 110 | 123 |
|
tomhudson
2014/04/16 11:41:31
operator= asserts that the argument isn't *(NULL).
| |
| 111 REF_COPY(fTypeface); | 124 REF_COPY(fTypeface); |
| 112 REF_COPY(fPathEffect); | 125 REF_COPY(fPathEffect); |
| 113 REF_COPY(fShader); | 126 REF_COPY(fShader); |
| 114 REF_COPY(fXfermode); | 127 REF_COPY(fXfermode); |
| 115 REF_COPY(fMaskFilter); | 128 REF_COPY(fMaskFilter); |
| 116 REF_COPY(fColorFilter); | 129 REF_COPY(fColorFilter); |
| 117 REF_COPY(fRasterizer); | 130 REF_COPY(fRasterizer); |
| 118 REF_COPY(fLooper); | 131 REF_COPY(fLooper); |
| 119 REF_COPY(fImageFilter); | 132 REF_COPY(fImageFilter); |
| 120 REF_COPY(fAnnotation); | 133 REF_COPY(fAnnotation); |
| 121 | 134 |
| 122 COPY(fTextSize); | 135 COPY(fTextSize); |
| 123 COPY(fTextScaleX); | 136 COPY(fTextScaleX); |
| 124 COPY(fTextSkewX); | 137 COPY(fTextSkewX); |
| 125 COPY(fColor); | 138 COPY(fColor); |
| 126 COPY(fWidth); | 139 COPY(fWidth); |
| 127 COPY(fMiterLimit); | 140 COPY(fMiterLimit); |
| 128 COPY(fBitfields); | 141 COPY(fBitfields); |
| 129 COPY(fDirtyBits); | 142 |
| 143 fDirtyBits = src.fDirtyBits; | |
| 130 | 144 |
| 131 #ifdef SK_BUILD_FOR_ANDROID | 145 #ifdef SK_BUILD_FOR_ANDROID |
| 132 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); | 146 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); |
| 133 COPY(fGenerationID); | 147 COPY(fGenerationID); |
| 134 #endif | 148 #endif |
| 135 | 149 |
| 136 #undef COPY | 150 #undef COPY |
| 137 #undef REF_COPY | 151 #undef REF_COPY |
| 138 } | 152 } |
| 139 | 153 |
| 140 SkPaint::~SkPaint() { | 154 SkPaint::~SkPaint() { |
| 141 SkSafeUnref(fTypeface); | 155 SkSafeUnref(fParts.fTypeface); |
| 142 SkSafeUnref(fPathEffect); | 156 SkSafeUnref(fParts.fPathEffect); |
| 143 SkSafeUnref(fShader); | 157 SkSafeUnref(fParts.fShader); |
| 144 SkSafeUnref(fXfermode); | 158 SkSafeUnref(fParts.fXfermode); |
| 145 SkSafeUnref(fMaskFilter); | 159 SkSafeUnref(fParts.fMaskFilter); |
| 146 SkSafeUnref(fColorFilter); | 160 SkSafeUnref(fParts.fColorFilter); |
| 147 SkSafeUnref(fRasterizer); | 161 SkSafeUnref(fParts.fRasterizer); |
| 148 SkSafeUnref(fLooper); | 162 SkSafeUnref(fParts.fLooper); |
| 149 SkSafeUnref(fImageFilter); | 163 SkSafeUnref(fParts.fImageFilter); |
| 150 SkSafeUnref(fAnnotation); | 164 SkSafeUnref(fParts.fAnnotation); |
| 151 } | 165 } |
| 152 | 166 |
| 153 SkPaint& SkPaint::operator=(const SkPaint& src) { | 167 SkPaint& SkPaint::operator=(const SkPaint& src) { |
| 154 #define COPY(field) field = src.field | 168 #define COPY(field) fParts.field = src.fParts.field |
| 155 #define REF_COPY(field) SkSafeUnref(field); field = SkSafeRef(src.field) | 169 #define REF_COPY(field) SkSafeUnref(fParts.field); fParts.field = SkSafeRef(src. fParts.field) |
| 156 | 170 |
| 157 SkASSERT(&src); | 171 SkASSERT(&src); |
| 158 | 172 |
| 159 REF_COPY(fTypeface); | 173 REF_COPY(fTypeface); |
| 160 REF_COPY(fPathEffect); | 174 REF_COPY(fPathEffect); |
| 161 REF_COPY(fShader); | 175 REF_COPY(fShader); |
| 162 REF_COPY(fXfermode); | 176 REF_COPY(fXfermode); |
| 163 REF_COPY(fMaskFilter); | 177 REF_COPY(fMaskFilter); |
| 164 REF_COPY(fColorFilter); | 178 REF_COPY(fColorFilter); |
| 165 REF_COPY(fRasterizer); | 179 REF_COPY(fRasterizer); |
| 166 REF_COPY(fLooper); | 180 REF_COPY(fLooper); |
| 167 REF_COPY(fImageFilter); | 181 REF_COPY(fImageFilter); |
| 168 REF_COPY(fAnnotation); | 182 REF_COPY(fAnnotation); |
| 169 | 183 |
| 170 COPY(fTextSize); | 184 COPY(fTextSize); |
| 171 COPY(fTextScaleX); | 185 COPY(fTextScaleX); |
| 172 COPY(fTextSkewX); | 186 COPY(fTextSkewX); |
| 173 COPY(fColor); | 187 COPY(fColor); |
| 174 COPY(fWidth); | 188 COPY(fWidth); |
| 175 COPY(fMiterLimit); | 189 COPY(fMiterLimit); |
| 176 COPY(fBitfields); | 190 COPY(fBitfields); |
| 177 COPY(fDirtyBits); | 191 |
| 192 fDirtyBits = src.fDirtyBits; | |
| 178 | 193 |
| 179 #ifdef SK_BUILD_FOR_ANDROID | 194 #ifdef SK_BUILD_FOR_ANDROID |
| 180 fPaintOptionsAndroid.~SkPaintOptionsAndroid(); | 195 fPaintOptionsAndroid.~SkPaintOptionsAndroid(); |
| 181 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); | 196 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); |
| 182 ++fGenerationID; | 197 ++fGenerationID; |
| 183 #endif | 198 #endif |
| 184 | 199 |
| 185 return *this; | 200 return *this; |
| 186 | 201 |
| 187 #undef COPY | 202 #undef COPY |
| 188 #undef REF_COPY | 203 #undef REF_COPY |
| 189 } | 204 } |
| 190 | 205 |
| 191 bool operator==(const SkPaint& a, const SkPaint& b) { | 206 bool operator==(const SkPaint& a, const SkPaint& b) { |
| 192 #define EQUAL(field) (a.field == b.field) | 207 if (a.fParts != b.fParts) { |
| 193 // Don't check fGenerationID or fDirtyBits, which can be different for logic ally equal paints. | 208 return false; |
| 194 return EQUAL(fTypeface) | 209 } |
| 195 && EQUAL(fPathEffect) | |
| 196 && EQUAL(fShader) | |
| 197 && EQUAL(fXfermode) | |
| 198 && EQUAL(fMaskFilter) | |
| 199 && EQUAL(fColorFilter) | |
| 200 && EQUAL(fRasterizer) | |
| 201 && EQUAL(fLooper) | |
| 202 && EQUAL(fImageFilter) | |
| 203 && EQUAL(fAnnotation) | |
| 204 && EQUAL(fTextSize) | |
| 205 && EQUAL(fTextScaleX) | |
| 206 && EQUAL(fTextSkewX) | |
| 207 && EQUAL(fColor) | |
| 208 && EQUAL(fWidth) | |
| 209 && EQUAL(fMiterLimit) | |
| 210 && EQUAL(fBitfields) | |
| 211 #ifdef SK_BUILD_FOR_ANDROID | 210 #ifdef SK_BUILD_FOR_ANDROID |
| 212 && EQUAL(fPaintOptionsAndroid) | 211 if (fPaintOptionsAndroid != b.fPaintOptionsAndroid) { |
|
mtklein
2014/04/15 14:32:44
It makes me very happy that these are not moving i
| |
| 212 return false; | |
| 213 } | |
| 213 #endif | 214 #endif |
| 214 ; | 215 return true; |
| 215 #undef EQUAL | |
| 216 } | 216 } |
| 217 | 217 |
| 218 void SkPaint::reset() { | 218 void SkPaint::reset() { |
| 219 SkPaint init; | 219 SkPaint init; |
| 220 | 220 |
| 221 #ifdef SK_BUILD_FOR_ANDROID | 221 #ifdef SK_BUILD_FOR_ANDROID |
| 222 uint32_t oldGenerationID = fGenerationID; | 222 uint32_t oldGenerationID = fGenerationID; |
| 223 #endif | 223 #endif |
| 224 *this = init; | 224 *this = init; |
| 225 #ifdef SK_BUILD_FOR_ANDROID | 225 #ifdef SK_BUILD_FOR_ANDROID |
| (...skipping 2458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2684 } | 2684 } |
| 2685 #ifdef SK_BUILD_FOR_ANDROID | 2685 #ifdef SK_BUILD_FOR_ANDROID |
| 2686 if (dirty & kPaintOptionsAndroid_DirtyBit) { | 2686 if (dirty & kPaintOptionsAndroid_DirtyBit) { |
| 2687 SkPaintOptionsAndroid options; | 2687 SkPaintOptionsAndroid options; |
| 2688 options.unflatten(buffer); | 2688 options.unflatten(buffer); |
| 2689 paint->setPaintOptionsAndroid(options); | 2689 paint->setPaintOptionsAndroid(options); |
| 2690 } | 2690 } |
| 2691 #endif | 2691 #endif |
| 2692 SkASSERT(dirty == paint->fDirtyBits); | 2692 SkASSERT(dirty == paint->fDirtyBits); |
| 2693 } | 2693 } |
| OLD | NEW |