Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(321)

Side by Side Diff: src/core/SkPaint.cpp

Issue 1771613002: Revert of add setter on SkPaint that takes sk_sp (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/core/SkPaint.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
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 "SkPaint.h" 8 #include "SkPaint.h"
9 #include "SkAutoKern.h" 9 #include "SkAutoKern.h"
10 #include "SkChecksum.h" 10 #include "SkChecksum.h"
(...skipping 26 matching lines...) Expand all
37 37
38 static inline uint32_t set_clear_mask(uint32_t bits, bool cond, uint32_t mask) { 38 static inline uint32_t set_clear_mask(uint32_t bits, bool cond, uint32_t mask) {
39 return cond ? bits | mask : bits & ~mask; 39 return cond ? bits | mask : bits & ~mask;
40 } 40 }
41 41
42 // define this to get a printf for out-of-range parameter in setters 42 // define this to get a printf for out-of-range parameter in setters
43 // e.g. setTextSize(-1) 43 // e.g. setTextSize(-1)
44 //#define SK_REPORT_API_RANGE_CHECK 44 //#define SK_REPORT_API_RANGE_CHECK
45 45
46 SkPaint::SkPaint() { 46 SkPaint::SkPaint() {
47 fTypeface = nullptr;
48 fPathEffect = nullptr;
49 fShader = nullptr;
50 fXfermode = nullptr;
51 fMaskFilter = nullptr;
52 fColorFilter = nullptr;
53 fRasterizer = nullptr;
54 fLooper = nullptr;
55 fImageFilter = nullptr;
56
47 fTextSize = SkPaintDefaults_TextSize; 57 fTextSize = SkPaintDefaults_TextSize;
48 fTextScaleX = SK_Scalar1; 58 fTextScaleX = SK_Scalar1;
49 fTextSkewX = 0; 59 fTextSkewX = 0;
50 fColor = SK_ColorBLACK; 60 fColor = SK_ColorBLACK;
51 fWidth = 0; 61 fWidth = 0;
52 fMiterLimit = SkPaintDefaults_MiterLimit; 62 fMiterLimit = SkPaintDefaults_MiterLimit;
53 63
54 // Zero all bitfields, then set some non-zero defaults. 64 // Zero all bitfields, then set some non-zero defaults.
55 fBitfieldsUInt = 0; 65 fBitfieldsUInt = 0;
56 fBitfields.fFlags = SkPaintDefaults_Flags; 66 fBitfields.fFlags = SkPaintDefaults_Flags;
57 fBitfields.fCapType = kDefault_Cap; 67 fBitfields.fCapType = kDefault_Cap;
58 fBitfields.fJoinType = kDefault_Join; 68 fBitfields.fJoinType = kDefault_Join;
59 fBitfields.fTextAlign = kLeft_Align; 69 fBitfields.fTextAlign = kLeft_Align;
60 fBitfields.fStyle = kFill_Style; 70 fBitfields.fStyle = kFill_Style;
61 fBitfields.fTextEncoding = kUTF8_TextEncoding; 71 fBitfields.fTextEncoding = kUTF8_TextEncoding;
62 fBitfields.fHinting = SkPaintDefaults_Hinting; 72 fBitfields.fHinting = SkPaintDefaults_Hinting;
63 } 73 }
64 74
65 SkPaint::SkPaint(const SkPaint& src) 75 SkPaint::SkPaint(const SkPaint& src) {
66 #define COPY_CTR(field) field(src.field)
67 : COPY_CTR(fTypeface)
68 , COPY_CTR(fPathEffect)
69 , COPY_CTR(fShader)
70 , COPY_CTR(fXfermode)
71 , COPY_CTR(fMaskFilter)
72 , COPY_CTR(fColorFilter)
73 , COPY_CTR(fRasterizer)
74 , COPY_CTR(fLooper)
75 , COPY_CTR(fImageFilter)
76 {
77 #define COPY(field) field = src.field 76 #define COPY(field) field = src.field
77 #define REF_COPY(field) field = SkSafeRef(src.field)
78
79 REF_COPY(fTypeface);
80 REF_COPY(fPathEffect);
81 REF_COPY(fShader);
82 REF_COPY(fXfermode);
83 REF_COPY(fMaskFilter);
84 REF_COPY(fColorFilter);
85 REF_COPY(fRasterizer);
86 REF_COPY(fLooper);
87 REF_COPY(fImageFilter);
88
78 COPY(fTextSize); 89 COPY(fTextSize);
79 COPY(fTextScaleX); 90 COPY(fTextScaleX);
80 COPY(fTextSkewX); 91 COPY(fTextSkewX);
81 COPY(fColor); 92 COPY(fColor);
82 COPY(fWidth); 93 COPY(fWidth);
83 COPY(fMiterLimit); 94 COPY(fMiterLimit);
84 COPY(fBitfields); 95 COPY(fBitfields);
85 96
86 #undef COPY 97 #undef COPY
87 #undef COPY_CTR 98 #undef REF_COPY
88 } 99 }
89 100
90 SkPaint::SkPaint(SkPaint&& src) { 101 SkPaint::SkPaint(SkPaint&& src) {
91 #define MOVE(field) field = std::move(src.field) 102 #define MOVE(field) field = std::move(src.field)
92 #define REF_MOVE(field) field = src.field; src.field = nullptr 103 #define REF_MOVE(field) field = src.field; src.field = nullptr
93 104
94 REF_MOVE(fTypeface); 105 REF_MOVE(fTypeface);
95 REF_MOVE(fPathEffect); 106 REF_MOVE(fPathEffect);
96 REF_MOVE(fShader); 107 REF_MOVE(fShader);
97 REF_MOVE(fXfermode); 108 REF_MOVE(fXfermode);
98 REF_MOVE(fMaskFilter); 109 REF_MOVE(fMaskFilter);
99 REF_MOVE(fColorFilter); 110 REF_MOVE(fColorFilter);
100 REF_MOVE(fRasterizer); 111 REF_MOVE(fRasterizer);
101 REF_MOVE(fLooper); 112 REF_MOVE(fLooper);
102 REF_MOVE(fImageFilter); 113 REF_MOVE(fImageFilter);
103 114
104 MOVE(fTextSize); 115 MOVE(fTextSize);
105 MOVE(fTextScaleX); 116 MOVE(fTextScaleX);
106 MOVE(fTextSkewX); 117 MOVE(fTextSkewX);
107 MOVE(fColor); 118 MOVE(fColor);
108 MOVE(fWidth); 119 MOVE(fWidth);
109 MOVE(fMiterLimit); 120 MOVE(fMiterLimit);
110 MOVE(fBitfields); 121 MOVE(fBitfields);
111 122
112 #undef MOVE 123 #undef MOVE
113 #undef REF_MOVE 124 #undef REF_MOVE
114 } 125 }
115 126
116 SkPaint::~SkPaint() {} 127 SkPaint::~SkPaint() {
128 SkSafeUnref(fTypeface);
129 SkSafeUnref(fPathEffect);
130 SkSafeUnref(fShader);
131 SkSafeUnref(fXfermode);
132 SkSafeUnref(fMaskFilter);
133 SkSafeUnref(fColorFilter);
134 SkSafeUnref(fRasterizer);
135 SkSafeUnref(fLooper);
136 SkSafeUnref(fImageFilter);
137 }
117 138
118 SkPaint& SkPaint::operator=(const SkPaint& src) { 139 SkPaint& SkPaint::operator=(const SkPaint& src) {
119 if (this == &src) { 140 if (this == &src) {
120 return *this; 141 return *this;
121 } 142 }
122 143
123 #define COPY(field) field = src.field 144 #define COPY(field) field = src.field
145 #define REF_COPY(field) SkSafeUnref(field); field = SkSafeRef(src.field)
124 146
125 COPY(fTypeface); 147 REF_COPY(fTypeface);
126 COPY(fPathEffect); 148 REF_COPY(fPathEffect);
127 COPY(fShader); 149 REF_COPY(fShader);
128 COPY(fXfermode); 150 REF_COPY(fXfermode);
129 COPY(fMaskFilter); 151 REF_COPY(fMaskFilter);
130 COPY(fColorFilter); 152 REF_COPY(fColorFilter);
131 COPY(fRasterizer); 153 REF_COPY(fRasterizer);
132 COPY(fLooper); 154 REF_COPY(fLooper);
133 COPY(fImageFilter); 155 REF_COPY(fImageFilter);
156
134 COPY(fTextSize); 157 COPY(fTextSize);
135 COPY(fTextScaleX); 158 COPY(fTextScaleX);
136 COPY(fTextSkewX); 159 COPY(fTextSkewX);
137 COPY(fColor); 160 COPY(fColor);
138 COPY(fWidth); 161 COPY(fWidth);
139 COPY(fMiterLimit); 162 COPY(fMiterLimit);
140 COPY(fBitfields); 163 COPY(fBitfields);
141 164
142 return *this; 165 return *this;
143 166
144 #undef COPY 167 #undef COPY
168 #undef REF_COPY
145 } 169 }
146 170
147 SkPaint& SkPaint::operator=(SkPaint&& src) { 171 SkPaint& SkPaint::operator=(SkPaint&& src) {
148 if (this == &src) { 172 if (this == &src) {
149 return *this; 173 return *this;
150 } 174 }
151 175
152 #define MOVE(field) field = std::move(src.field) 176 #define MOVE(field) field = std::move(src.field)
177 #define REF_MOVE(field) SkSafeUnref(field); field = src.field; src.field = nullp tr
153 178
154 MOVE(fTypeface); 179 REF_MOVE(fTypeface);
155 MOVE(fPathEffect); 180 REF_MOVE(fPathEffect);
156 MOVE(fShader); 181 REF_MOVE(fShader);
157 MOVE(fXfermode); 182 REF_MOVE(fXfermode);
158 MOVE(fMaskFilter); 183 REF_MOVE(fMaskFilter);
159 MOVE(fColorFilter); 184 REF_MOVE(fColorFilter);
160 MOVE(fRasterizer); 185 REF_MOVE(fRasterizer);
161 MOVE(fLooper); 186 REF_MOVE(fLooper);
162 MOVE(fImageFilter); 187 REF_MOVE(fImageFilter);
188
163 MOVE(fTextSize); 189 MOVE(fTextSize);
164 MOVE(fTextScaleX); 190 MOVE(fTextScaleX);
165 MOVE(fTextSkewX); 191 MOVE(fTextSkewX);
166 MOVE(fColor); 192 MOVE(fColor);
167 MOVE(fWidth); 193 MOVE(fWidth);
168 MOVE(fMiterLimit); 194 MOVE(fMiterLimit);
169 MOVE(fBitfields); 195 MOVE(fBitfields);
170 196
171 return *this; 197 return *this;
172 198
173 #undef MOVE 199 #undef MOVE
200 #undef REF_MOVE
174 } 201 }
175 202
176 bool operator==(const SkPaint& a, const SkPaint& b) { 203 bool operator==(const SkPaint& a, const SkPaint& b) {
177 #define EQUAL(field) (a.field == b.field) 204 #define EQUAL(field) (a.field == b.field)
178 return EQUAL(fTypeface) 205 return EQUAL(fTypeface)
179 && EQUAL(fPathEffect) 206 && EQUAL(fPathEffect)
180 && EQUAL(fShader) 207 && EQUAL(fShader)
181 && EQUAL(fXfermode) 208 && EQUAL(fXfermode)
182 && EQUAL(fMaskFilter) 209 && EQUAL(fMaskFilter)
183 && EQUAL(fColorFilter) 210 && EQUAL(fColorFilter)
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 fBitfields.fTextEncoding = encoding; 385 fBitfields.fTextEncoding = encoding;
359 } else { 386 } else {
360 #ifdef SK_REPORT_API_RANGE_CHECK 387 #ifdef SK_REPORT_API_RANGE_CHECK
361 SkDebugf("SkPaint::setTextEncoding(%d) out of range\n", encoding); 388 SkDebugf("SkPaint::setTextEncoding(%d) out of range\n", encoding);
362 #endif 389 #endif
363 } 390 }
364 } 391 }
365 392
366 /////////////////////////////////////////////////////////////////////////////// 393 ///////////////////////////////////////////////////////////////////////////////
367 394
368 #define MOVE_FIELD(Field) void SkPaint::set##Field(sk_sp<Sk##Field> f) { f##Fiel d = std::move(f); } 395 SkTypeface* SkPaint::setTypeface(SkTypeface* font) {
369 MOVE_FIELD(Typeface) 396 SkRefCnt_SafeAssign(fTypeface, font);
370 MOVE_FIELD(Rasterizer) 397 return font;
371 MOVE_FIELD(ImageFilter) 398 }
372 MOVE_FIELD(Shader)
373 MOVE_FIELD(ColorFilter)
374 MOVE_FIELD(Xfermode)
375 MOVE_FIELD(PathEffect)
376 MOVE_FIELD(MaskFilter)
377 #undef MOVE_FIELD
378 void SkPaint::setLooper(sk_sp<SkDrawLooper> looper) { fLooper = std::move(looper ); }
379 399
380 #define SET_PTR(Field) \ 400 SkRasterizer* SkPaint::setRasterizer(SkRasterizer* r) {
381 Sk##Field* SkPaint::set##Field(Sk##Field* f) { \ 401 SkRefCnt_SafeAssign(fRasterizer, r);
382 this->f##Field.reset(SkSafeRef(f)); \ 402 return r;
383 return f; \ 403 }
384 }
385 SET_PTR(Typeface)
386 SET_PTR(Rasterizer)
387 SET_PTR(ImageFilter)
388 SET_PTR(Shader)
389 SET_PTR(ColorFilter)
390 SET_PTR(Xfermode)
391 SET_PTR(PathEffect)
392 SET_PTR(MaskFilter)
393 #undef SET_PTR
394 404
395 SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) { 405 SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) {
396 fLooper.reset(SkSafeRef(looper)); 406 SkRefCnt_SafeAssign(fLooper, looper);
397 return looper; 407 return looper;
398 } 408 }
399 409
400 SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) { 410 SkImageFilter* SkPaint::setImageFilter(SkImageFilter* imageFilter) {
401 fXfermode.reset(SkXfermode::Create(mode)); 411 SkRefCnt_SafeAssign(fImageFilter, imageFilter);
402 return fXfermode.get(); 412 return imageFilter;
403 } 413 }
404 414
405 /////////////////////////////////////////////////////////////////////////////// 415 ///////////////////////////////////////////////////////////////////////////////
406 416
407 static SkScalar mag2(SkScalar x, SkScalar y) { 417 static SkScalar mag2(SkScalar x, SkScalar y) {
408 return x * x + y * y; 418 return x * x + y * y;
409 } 419 }
410 420
411 static bool tooBig(const SkMatrix& m, SkScalar ma2max) { 421 static bool tooBig(const SkMatrix& m, SkScalar ma2max) {
412 return mag2(m[SkMatrix::kMScaleX], m[SkMatrix::kMSkewY]) > ma2max 422 return mag2(m[SkMatrix::kMScaleX], m[SkMatrix::kMSkewY]) > ma2max
(...skipping 1296 matching lines...) Expand 10 before | Expand all | Expand 10 after
1709 SkDescriptor* desc = ad.getDesc(); 1719 SkDescriptor* desc = ad.getDesc();
1710 1720
1711 write_out_descriptor(desc, rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, descSize); 1721 write_out_descriptor(desc, rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, descSize);
1712 1722
1713 SkASSERT(descSize == desc->getLength()); 1723 SkASSERT(descSize == desc->getLength());
1714 1724
1715 #ifdef TEST_DESC 1725 #ifdef TEST_DESC
1716 test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize); 1726 test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize);
1717 #endif 1727 #endif
1718 1728
1719 proc(fTypeface.get(), desc, context); 1729 proc(fTypeface, desc, context);
1720 } 1730 }
1721 1731
1722 SkGlyphCache* SkPaint::detachCache(const SkSurfaceProps* surfaceProps, 1732 SkGlyphCache* SkPaint::detachCache(const SkSurfaceProps* surfaceProps,
1723 FakeGamma fakeGamma, 1733 FakeGamma fakeGamma,
1724 const SkMatrix* deviceMatrix) const { 1734 const SkMatrix* deviceMatrix) const {
1725 SkGlyphCache* cache; 1735 SkGlyphCache* cache;
1726 this->descriptorProc(surfaceProps, fakeGamma, deviceMatrix, DetachDescProc, &cache); 1736 this->descriptorProc(surfaceProps, fakeGamma, deviceMatrix, DetachDescProc, &cache);
1727 return cache; 1737 return cache;
1728 } 1738 }
1729 1739
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1965 this->setXfermode(nullptr); 1975 this->setXfermode(nullptr);
1966 this->setMaskFilter(nullptr); 1976 this->setMaskFilter(nullptr);
1967 this->setColorFilter(nullptr); 1977 this->setColorFilter(nullptr);
1968 this->setRasterizer(nullptr); 1978 this->setRasterizer(nullptr);
1969 this->setLooper(nullptr); 1979 this->setLooper(nullptr);
1970 this->setImageFilter(nullptr); 1980 this->setImageFilter(nullptr);
1971 } 1981 }
1972 } 1982 }
1973 1983
1974 /////////////////////////////////////////////////////////////////////////////// 1984 ///////////////////////////////////////////////////////////////////////////////
1985
1986 SkShader* SkPaint::setShader(SkShader* shader) {
1987 SkRefCnt_SafeAssign(fShader, shader);
1988 return shader;
1989 }
1990
1991 SkColorFilter* SkPaint::setColorFilter(SkColorFilter* filter) {
1992 SkRefCnt_SafeAssign(fColorFilter, filter);
1993 return filter;
1994 }
1995
1996 SkXfermode* SkPaint::setXfermode(SkXfermode* mode) {
1997 SkRefCnt_SafeAssign(fXfermode, mode);
1998 return mode;
1999 }
2000
2001 SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) {
2002 SkSafeUnref(fXfermode);
2003 fXfermode = SkXfermode::Create(mode);
2004 return fXfermode;
2005 }
2006
2007 SkPathEffect* SkPaint::setPathEffect(SkPathEffect* effect) {
2008 SkRefCnt_SafeAssign(fPathEffect, effect);
2009 return effect;
2010 }
2011
2012 SkMaskFilter* SkPaint::setMaskFilter(SkMaskFilter* filter) {
2013 SkRefCnt_SafeAssign(fMaskFilter, filter);
2014 return filter;
2015 }
2016
2017 ///////////////////////////////////////////////////////////////////////////////
1975 2018
1976 bool SkPaint::getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect , 2019 bool SkPaint::getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect ,
1977 SkScalar resScale) const { 2020 SkScalar resScale) const {
1978 SkStrokeRec rec(*this, resScale); 2021 SkStrokeRec rec(*this, resScale);
1979 2022
1980 const SkPath* srcPtr = &src; 2023 const SkPath* srcPtr = &src;
1981 SkPath tmpPath; 2024 SkPath tmpPath;
1982 2025
1983 if (fPathEffect && fPathEffect->filterPath(&tmpPath, src, &rec, cullRect)) { 2026 if (fPathEffect && fPathEffect->filterPath(&tmpPath, src, &rec, cullRect)) {
1984 srcPtr = &tmpPath; 2027 srcPtr = &tmpPath;
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
2343 // TODO: check if we should allow imagefilters to broadcast that they don't affect alpha 2386 // TODO: check if we should allow imagefilters to broadcast that they don't affect alpha
2344 // ala colorfilters 2387 // ala colorfilters
2345 return imf != nullptr; 2388 return imf != nullptr;
2346 } 2389 }
2347 2390
2348 bool SkPaint::nothingToDraw() const { 2391 bool SkPaint::nothingToDraw() const {
2349 if (fLooper) { 2392 if (fLooper) {
2350 return false; 2393 return false;
2351 } 2394 }
2352 SkXfermode::Mode mode; 2395 SkXfermode::Mode mode;
2353 if (SkXfermode::AsMode(fXfermode.get(), &mode)) { 2396 if (SkXfermode::AsMode(fXfermode, &mode)) {
2354 switch (mode) { 2397 switch (mode) {
2355 case SkXfermode::kSrcOver_Mode: 2398 case SkXfermode::kSrcOver_Mode:
2356 case SkXfermode::kSrcATop_Mode: 2399 case SkXfermode::kSrcATop_Mode:
2357 case SkXfermode::kDstOut_Mode: 2400 case SkXfermode::kDstOut_Mode:
2358 case SkXfermode::kDstOver_Mode: 2401 case SkXfermode::kDstOver_Mode:
2359 case SkXfermode::kPlus_Mode: 2402 case SkXfermode::kPlus_Mode:
2360 if (0 == this->getAlpha()) { 2403 if (0 == this->getAlpha()) {
2361 return !affects_alpha(fColorFilter.get()) && !affects_alpha( fImageFilter.get()); 2404 return !affects_alpha(fColorFilter) && !affects_alpha(fImage Filter);
2362 } 2405 }
2363 break; 2406 break;
2364 case SkXfermode::kDst_Mode: 2407 case SkXfermode::kDst_Mode:
2365 return true; 2408 return true;
2366 default: 2409 default:
2367 break; 2410 break;
2368 } 2411 }
2369 } 2412 }
2370 return false; 2413 return false;
2371 } 2414 }
2372 2415
2373 uint32_t SkPaint::getHash() const { 2416 uint32_t SkPaint::getHash() const {
2374 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB itfields, 2417 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB itfields,
2375 // so fBitfields should be 10 pointers and 6 32-bit values from the start. 2418 // so fBitfields should be 10 pointers and 6 32-bit values from the start.
2376 static_assert(offsetof(SkPaint, fBitfields) == 9 * sizeof(void*) + 6 * sizeo f(uint32_t), 2419 static_assert(offsetof(SkPaint, fBitfields) == 9 * sizeof(void*) + 6 * sizeo f(uint32_t),
2377 "SkPaint_notPackedTightly"); 2420 "SkPaint_notPackedTightly");
2378 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(this), 2421 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(this),
2379 offsetof(SkPaint, fBitfields) + sizeof(fBitfields )); 2422 offsetof(SkPaint, fBitfields) + sizeof(fBitfields ));
2380 } 2423 }
OLDNEW
« no previous file with comments | « include/core/SkPaint.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698