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

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

Issue 169183003: Revert of Merge tomhudson and mtklein SkPaint shrinking approaches. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 10 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') | src/core/SkPictureFlat.h » ('j') | 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 /* 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
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 enum {
39 kColor_DirtyBit = 1 << 0,
40 kBitfields_DirtyBit = 1 << 1,
41 kTextSize_DirtyBit = 1 << 2,
42 kTextScaleX_DirtyBit = 1 << 3,
43 kTextSkewX_DirtyBit = 1 << 4,
44 kStrokeWidth_DirtyBit = 1 << 5,
45 kStrokeMiter_DirtyBit = 1 << 6,
46 kPathEffect_DirtyBit = 1 << 7,
47 kShader_DirtyBit = 1 << 8,
48 kXfermode_DirtyBit = 1 << 9,
49 kMaskFilter_DirtyBit = 1 << 10,
50 kColorFilter_DirtyBit = 1 << 11,
51 kRasterizer_DirtyBit = 1 << 12,
52 kLooper_DirtyBit = 1 << 13,
53 kImageFilter_DirtyBit = 1 << 14,
54 kTypeface_DirtyBit = 1 << 15,
55 kAnnotation_DirtyBit = 1 << 16,
56 kPaintOptionsAndroid_DirtyBit = 1 << 17,
57 };
58 38
59 // define this to get a printf for out-of-range parameter in setters 39 // define this to get a printf for out-of-range parameter in setters
60 // e.g. setTextSize(-1) 40 // e.g. setTextSize(-1)
61 //#define SK_REPORT_API_RANGE_CHECK 41 //#define SK_REPORT_API_RANGE_CHECK
62 42
63 #ifdef SK_BUILD_FOR_ANDROID 43 #ifdef SK_BUILD_FOR_ANDROID
64 #define GEN_ID_INC fGenerationID++ 44 #define GEN_ID_INC fGenerationID++
65 #define GEN_ID_INC_EVAL(expression) if (expression) { fGenerationID++; } 45 #define GEN_ID_INC_EVAL(expression) if (expression) { fGenerationID++; }
66 #else 46 #else
67 #define GEN_ID_INC 47 #define GEN_ID_INC
68 #define GEN_ID_INC_EVAL(expression) 48 #define GEN_ID_INC_EVAL(expression)
69 #endif 49 #endif
70 50
71 SkPaint::SkPaint() { 51 SkPaint::SkPaint() {
72 // since we may have padding, we zero everything so that our memcmp() call 52 // since we may have padding, we zero everything so that our memcmp() call
73 // in operator== will work correctly. 53 // in operator== will work correctly.
74 // with this, we can skip 0 and null individual initializations 54 // with this, we can skip 0 and null individual initializations
75 sk_bzero(this, sizeof(*this)); 55 sk_bzero(this, sizeof(*this));
76 56
77 #if 0 // not needed with the bzero call above 57 #if 0 // not needed with the bzero call above
78 fTypeface = NULL; 58 fTypeface = NULL;
79 fTextSkewX = 0; 59 fTextSkewX = 0;
80 fPathEffect = NULL; 60 fPathEffect = NULL;
81 fShader = NULL; 61 fShader = NULL;
82 fXfermode = NULL; 62 fXfermode = NULL;
83 fMaskFilter = NULL; 63 fMaskFilter = NULL;
84 fColorFilter = NULL; 64 fColorFilter = NULL;
85 fRasterizer = NULL; 65 fRasterizer = NULL;
86 fLooper = NULL; 66 fLooper = NULL;
87 fImageFilter = NULL; 67 fImageFilter = NULL;
88 fAnnotation = NULL; 68 fAnnotation = NULL;
89 fWidth = 0; 69 fWidth = 0;
90 fDirtyBits = 0;
91 #endif 70 #endif
92 71
93 fTextSize = SkPaintDefaults_TextSize; 72 fTextSize = SkPaintDefaults_TextSize;
94 fTextScaleX = SK_Scalar1; 73 fTextScaleX = SK_Scalar1;
95 fColor = SK_ColorBLACK; 74 fColor = SK_ColorBLACK;
96 fMiterLimit = SkPaintDefaults_MiterLimit; 75 fMiterLimit = SkPaintDefaults_MiterLimit;
97 fFlags = SkPaintDefaults_Flags; 76 fFlags = SkPaintDefaults_Flags;
98 fCapType = kDefault_Cap; 77 fCapType = kDefault_Cap;
99 fJoinType = kDefault_Join; 78 fJoinType = kDefault_Join;
100 fTextAlign = kLeft_Align; 79 fTextAlign = kLeft_Align;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 unsigned SkPaint::getBaseGlyphCount(SkUnichar text) const { 191 unsigned SkPaint::getBaseGlyphCount(SkUnichar text) const {
213 SkAutoGlyphCache autoCache(*this, NULL, NULL); 192 SkAutoGlyphCache autoCache(*this, NULL, NULL);
214 SkGlyphCache* cache = autoCache.getCache(); 193 SkGlyphCache* cache = autoCache.getCache();
215 return cache->getBaseGlyphCount(text); 194 return cache->getBaseGlyphCount(text);
216 } 195 }
217 196
218 void SkPaint::setPaintOptionsAndroid(const SkPaintOptionsAndroid& options) { 197 void SkPaint::setPaintOptionsAndroid(const SkPaintOptionsAndroid& options) {
219 if (options != fPaintOptionsAndroid) { 198 if (options != fPaintOptionsAndroid) {
220 fPaintOptionsAndroid = options; 199 fPaintOptionsAndroid = options;
221 GEN_ID_INC; 200 GEN_ID_INC;
222 fDirtyBits |= kPaintOptionsAndroid_DirtyBit;
223 } 201 }
224 } 202 }
225 #endif 203 #endif
226 204
227 SkPaint::FilterLevel SkPaint::getFilterLevel() const { 205 SkPaint::FilterLevel SkPaint::getFilterLevel() const {
228 int level = 0; 206 int level = 0;
229 if (fFlags & kFilterBitmap_Flag) { 207 if (fFlags & kFilterBitmap_Flag) {
230 level |= 1; 208 level |= 1;
231 } 209 }
232 if (fFlags & kHighQualityFilterBitmap_Flag) { 210 if (fFlags & kHighQualityFilterBitmap_Flag) {
(...skipping 10 matching lines...) Expand all
243 } 221 }
244 if (level & 2) { 222 if (level & 2) {
245 flags |= kHighQualityFilterBitmap_Flag; 223 flags |= kHighQualityFilterBitmap_Flag;
246 } 224 }
247 this->setFlags((fFlags & ~mask) | flags); 225 this->setFlags((fFlags & ~mask) | flags);
248 } 226 }
249 227
250 void SkPaint::setHinting(Hinting hintingLevel) { 228 void SkPaint::setHinting(Hinting hintingLevel) {
251 GEN_ID_INC_EVAL((unsigned) hintingLevel != fHinting); 229 GEN_ID_INC_EVAL((unsigned) hintingLevel != fHinting);
252 fHinting = hintingLevel; 230 fHinting = hintingLevel;
253 fDirtyBits |= kBitfields_DirtyBit;
254 } 231 }
255 232
256 void SkPaint::setFlags(uint32_t flags) { 233 void SkPaint::setFlags(uint32_t flags) {
257 GEN_ID_INC_EVAL(fFlags != flags); 234 GEN_ID_INC_EVAL(fFlags != flags);
258 fFlags = flags; 235 fFlags = flags;
259 fDirtyBits |= kBitfields_DirtyBit;
260 } 236 }
261 237
262 void SkPaint::setAntiAlias(bool doAA) { 238 void SkPaint::setAntiAlias(bool doAA) {
263 this->setFlags(SkSetClearMask(fFlags, doAA, kAntiAlias_Flag)); 239 this->setFlags(SkSetClearMask(fFlags, doAA, kAntiAlias_Flag));
264 } 240 }
265 241
266 void SkPaint::setDither(bool doDither) { 242 void SkPaint::setDither(bool doDither) {
267 this->setFlags(SkSetClearMask(fFlags, doDither, kDither_Flag)); 243 this->setFlags(SkSetClearMask(fFlags, doDither, kDither_Flag));
268 } 244 }
269 245
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 } 280 }
305 281
306 void SkPaint::setDevKernText(bool doDevKern) { 282 void SkPaint::setDevKernText(bool doDevKern) {
307 this->setFlags(SkSetClearMask(fFlags, doDevKern, kDevKernText_Flag)); 283 this->setFlags(SkSetClearMask(fFlags, doDevKern, kDevKernText_Flag));
308 } 284 }
309 285
310 void SkPaint::setStyle(Style style) { 286 void SkPaint::setStyle(Style style) {
311 if ((unsigned)style < kStyleCount) { 287 if ((unsigned)style < kStyleCount) {
312 GEN_ID_INC_EVAL((unsigned)style != fStyle); 288 GEN_ID_INC_EVAL((unsigned)style != fStyle);
313 fStyle = style; 289 fStyle = style;
314 fDirtyBits |= kBitfields_DirtyBit;
315 } else { 290 } else {
316 #ifdef SK_REPORT_API_RANGE_CHECK 291 #ifdef SK_REPORT_API_RANGE_CHECK
317 SkDebugf("SkPaint::setStyle(%d) out of range\n", style); 292 SkDebugf("SkPaint::setStyle(%d) out of range\n", style);
318 #endif 293 #endif
319 } 294 }
320 } 295 }
321 296
322 void SkPaint::setColor(SkColor color) { 297 void SkPaint::setColor(SkColor color) {
323 GEN_ID_INC_EVAL(color != fColor); 298 GEN_ID_INC_EVAL(color != fColor);
324 fColor = color; 299 fColor = color;
325 fDirtyBits |= kColor_DirtyBit;
326 } 300 }
327 301
328 void SkPaint::setAlpha(U8CPU a) { 302 void SkPaint::setAlpha(U8CPU a) {
329 this->setColor(SkColorSetARGB(a, SkColorGetR(fColor), 303 this->setColor(SkColorSetARGB(a, SkColorGetR(fColor),
330 SkColorGetG(fColor), SkColorGetB(fColor))); 304 SkColorGetG(fColor), SkColorGetB(fColor)));
331 } 305 }
332 306
333 void SkPaint::setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) { 307 void SkPaint::setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) {
334 this->setColor(SkColorSetARGB(a, r, g, b)); 308 this->setColor(SkColorSetARGB(a, r, g, b));
335 } 309 }
336 310
337 void SkPaint::setStrokeWidth(SkScalar width) { 311 void SkPaint::setStrokeWidth(SkScalar width) {
338 if (width >= 0) { 312 if (width >= 0) {
339 GEN_ID_INC_EVAL(width != fWidth); 313 GEN_ID_INC_EVAL(width != fWidth);
340 fWidth = width; 314 fWidth = width;
341 fDirtyBits |= kStrokeWidth_DirtyBit;
342 } else { 315 } else {
343 #ifdef SK_REPORT_API_RANGE_CHECK 316 #ifdef SK_REPORT_API_RANGE_CHECK
344 SkDebugf("SkPaint::setStrokeWidth() called with negative value\n"); 317 SkDebugf("SkPaint::setStrokeWidth() called with negative value\n");
345 #endif 318 #endif
346 } 319 }
347 } 320 }
348 321
349 void SkPaint::setStrokeMiter(SkScalar limit) { 322 void SkPaint::setStrokeMiter(SkScalar limit) {
350 if (limit >= 0) { 323 if (limit >= 0) {
351 GEN_ID_INC_EVAL(limit != fMiterLimit); 324 GEN_ID_INC_EVAL(limit != fMiterLimit);
352 fMiterLimit = limit; 325 fMiterLimit = limit;
353 fDirtyBits |= kStrokeMiter_DirtyBit;
354 } else { 326 } else {
355 #ifdef SK_REPORT_API_RANGE_CHECK 327 #ifdef SK_REPORT_API_RANGE_CHECK
356 SkDebugf("SkPaint::setStrokeMiter() called with negative value\n"); 328 SkDebugf("SkPaint::setStrokeMiter() called with negative value\n");
357 #endif 329 #endif
358 } 330 }
359 } 331 }
360 332
361 void SkPaint::setStrokeCap(Cap ct) { 333 void SkPaint::setStrokeCap(Cap ct) {
362 if ((unsigned)ct < kCapCount) { 334 if ((unsigned)ct < kCapCount) {
363 GEN_ID_INC_EVAL((unsigned)ct != fCapType); 335 GEN_ID_INC_EVAL((unsigned)ct != fCapType);
364 fCapType = SkToU8(ct); 336 fCapType = SkToU8(ct);
365 fDirtyBits |= kBitfields_DirtyBit;
366 } else { 337 } else {
367 #ifdef SK_REPORT_API_RANGE_CHECK 338 #ifdef SK_REPORT_API_RANGE_CHECK
368 SkDebugf("SkPaint::setStrokeCap(%d) out of range\n", ct); 339 SkDebugf("SkPaint::setStrokeCap(%d) out of range\n", ct);
369 #endif 340 #endif
370 } 341 }
371 } 342 }
372 343
373 void SkPaint::setStrokeJoin(Join jt) { 344 void SkPaint::setStrokeJoin(Join jt) {
374 if ((unsigned)jt < kJoinCount) { 345 if ((unsigned)jt < kJoinCount) {
375 GEN_ID_INC_EVAL((unsigned)jt != fJoinType); 346 GEN_ID_INC_EVAL((unsigned)jt != fJoinType);
376 fJoinType = SkToU8(jt); 347 fJoinType = SkToU8(jt);
377 fDirtyBits |= kBitfields_DirtyBit;
378 } else { 348 } else {
379 #ifdef SK_REPORT_API_RANGE_CHECK 349 #ifdef SK_REPORT_API_RANGE_CHECK
380 SkDebugf("SkPaint::setStrokeJoin(%d) out of range\n", jt); 350 SkDebugf("SkPaint::setStrokeJoin(%d) out of range\n", jt);
381 #endif 351 #endif
382 } 352 }
383 } 353 }
384 354
385 /////////////////////////////////////////////////////////////////////////////// 355 ///////////////////////////////////////////////////////////////////////////////
386 356
387 void SkPaint::setTextAlign(Align align) { 357 void SkPaint::setTextAlign(Align align) {
388 if ((unsigned)align < kAlignCount) { 358 if ((unsigned)align < kAlignCount) {
389 GEN_ID_INC_EVAL((unsigned)align != fTextAlign); 359 GEN_ID_INC_EVAL((unsigned)align != fTextAlign);
390 fTextAlign = SkToU8(align); 360 fTextAlign = SkToU8(align);
391 fDirtyBits |= kBitfields_DirtyBit;
392 } else { 361 } else {
393 #ifdef SK_REPORT_API_RANGE_CHECK 362 #ifdef SK_REPORT_API_RANGE_CHECK
394 SkDebugf("SkPaint::setTextAlign(%d) out of range\n", align); 363 SkDebugf("SkPaint::setTextAlign(%d) out of range\n", align);
395 #endif 364 #endif
396 } 365 }
397 } 366 }
398 367
399 void SkPaint::setTextSize(SkScalar ts) { 368 void SkPaint::setTextSize(SkScalar ts) {
400 if (ts >= 0) { 369 if (ts >= 0) {
401 GEN_ID_INC_EVAL(ts != fTextSize); 370 GEN_ID_INC_EVAL(ts != fTextSize);
402 fTextSize = ts; 371 fTextSize = ts;
403 fDirtyBits |= kTextSize_DirtyBit;
404 } else { 372 } else {
405 #ifdef SK_REPORT_API_RANGE_CHECK 373 #ifdef SK_REPORT_API_RANGE_CHECK
406 SkDebugf("SkPaint::setTextSize() called with negative value\n"); 374 SkDebugf("SkPaint::setTextSize() called with negative value\n");
407 #endif 375 #endif
408 } 376 }
409 } 377 }
410 378
411 void SkPaint::setTextScaleX(SkScalar scaleX) { 379 void SkPaint::setTextScaleX(SkScalar scaleX) {
412 GEN_ID_INC_EVAL(scaleX != fTextScaleX); 380 GEN_ID_INC_EVAL(scaleX != fTextScaleX);
413 fTextScaleX = scaleX; 381 fTextScaleX = scaleX;
414 fDirtyBits |= kTextScaleX_DirtyBit;
415 } 382 }
416 383
417 void SkPaint::setTextSkewX(SkScalar skewX) { 384 void SkPaint::setTextSkewX(SkScalar skewX) {
418 GEN_ID_INC_EVAL(skewX != fTextSkewX); 385 GEN_ID_INC_EVAL(skewX != fTextSkewX);
419 fTextSkewX = skewX; 386 fTextSkewX = skewX;
420 fDirtyBits |= kTextSkewX_DirtyBit;
421 } 387 }
422 388
423 void SkPaint::setTextEncoding(TextEncoding encoding) { 389 void SkPaint::setTextEncoding(TextEncoding encoding) {
424 if ((unsigned)encoding <= kGlyphID_TextEncoding) { 390 if ((unsigned)encoding <= kGlyphID_TextEncoding) {
425 GEN_ID_INC_EVAL((unsigned)encoding != fTextEncoding); 391 GEN_ID_INC_EVAL((unsigned)encoding != fTextEncoding);
426 fTextEncoding = encoding; 392 fTextEncoding = encoding;
427 fDirtyBits |= kBitfields_DirtyBit;
428 } else { 393 } else {
429 #ifdef SK_REPORT_API_RANGE_CHECK 394 #ifdef SK_REPORT_API_RANGE_CHECK
430 SkDebugf("SkPaint::setTextEncoding(%d) out of range\n", encoding); 395 SkDebugf("SkPaint::setTextEncoding(%d) out of range\n", encoding);
431 #endif 396 #endif
432 } 397 }
433 } 398 }
434 399
435 /////////////////////////////////////////////////////////////////////////////// 400 ///////////////////////////////////////////////////////////////////////////////
436 401
437 // Returns dst with the given bitmask enabled or disabled, depending on value.
438 inline static uint32_t set_mask(uint32_t dst, uint32_t bitmask, bool value) {
439 return value ? (dst | bitmask) : (dst & ~bitmask);
440 }
441
442 SkTypeface* SkPaint::setTypeface(SkTypeface* font) { 402 SkTypeface* SkPaint::setTypeface(SkTypeface* font) {
443 SkRefCnt_SafeAssign(fTypeface, font); 403 SkRefCnt_SafeAssign(fTypeface, font);
444 GEN_ID_INC; 404 GEN_ID_INC;
445 fDirtyBits = set_mask(fDirtyBits, kTypeface_DirtyBit, font != NULL);
446 return font; 405 return font;
447 } 406 }
448 407
449 SkRasterizer* SkPaint::setRasterizer(SkRasterizer* r) { 408 SkRasterizer* SkPaint::setRasterizer(SkRasterizer* r) {
450 SkRefCnt_SafeAssign(fRasterizer, r); 409 SkRefCnt_SafeAssign(fRasterizer, r);
451 GEN_ID_INC; 410 GEN_ID_INC;
452 fDirtyBits = set_mask(fDirtyBits, kRasterizer_DirtyBit, r != NULL);
453 return r; 411 return r;
454 } 412 }
455 413
456 SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) { 414 SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) {
457 SkRefCnt_SafeAssign(fLooper, looper); 415 SkRefCnt_SafeAssign(fLooper, looper);
458 GEN_ID_INC; 416 GEN_ID_INC;
459 fDirtyBits = set_mask(fDirtyBits, kLooper_DirtyBit, looper != NULL);
460 return looper; 417 return looper;
461 } 418 }
462 419
463 SkImageFilter* SkPaint::setImageFilter(SkImageFilter* imageFilter) { 420 SkImageFilter* SkPaint::setImageFilter(SkImageFilter* imageFilter) {
464 SkRefCnt_SafeAssign(fImageFilter, imageFilter); 421 SkRefCnt_SafeAssign(fImageFilter, imageFilter);
465 GEN_ID_INC; 422 GEN_ID_INC;
466 fDirtyBits = set_mask(fDirtyBits, kImageFilter_DirtyBit, imageFilter != NULL );
467 return imageFilter; 423 return imageFilter;
468 } 424 }
469 425
470 SkAnnotation* SkPaint::setAnnotation(SkAnnotation* annotation) { 426 SkAnnotation* SkPaint::setAnnotation(SkAnnotation* annotation) {
471 SkRefCnt_SafeAssign(fAnnotation, annotation); 427 SkRefCnt_SafeAssign(fAnnotation, annotation);
472 GEN_ID_INC; 428 GEN_ID_INC;
473 fDirtyBits = set_mask(fDirtyBits, kAnnotation_DirtyBit, annotation != NULL);
474 return annotation; 429 return annotation;
475 } 430 }
476 431
477 /////////////////////////////////////////////////////////////////////////////// 432 ///////////////////////////////////////////////////////////////////////////////
478 433
479 static SkScalar mag2(SkScalar x, SkScalar y) { 434 static SkScalar mag2(SkScalar x, SkScalar y) {
480 return x * x + y * y; 435 return x * x + y * y;
481 } 436 }
482 437
483 static bool tooBig(const SkMatrix& m, SkScalar ma2max) { 438 static bool tooBig(const SkMatrix& m, SkScalar ma2max) {
(...skipping 1703 matching lines...) Expand 10 before | Expand all | Expand 10 after
2187 this->setPaintOptionsAndroid(options); 2142 this->setPaintOptionsAndroid(options);
2188 #endif 2143 #endif
2189 } 2144 }
2190 } 2145 }
2191 2146
2192 /////////////////////////////////////////////////////////////////////////////// 2147 ///////////////////////////////////////////////////////////////////////////////
2193 2148
2194 SkShader* SkPaint::setShader(SkShader* shader) { 2149 SkShader* SkPaint::setShader(SkShader* shader) {
2195 GEN_ID_INC_EVAL(shader != fShader); 2150 GEN_ID_INC_EVAL(shader != fShader);
2196 SkRefCnt_SafeAssign(fShader, shader); 2151 SkRefCnt_SafeAssign(fShader, shader);
2197 fDirtyBits = set_mask(fDirtyBits, kShader_DirtyBit, shader != NULL);
2198 return shader; 2152 return shader;
2199 } 2153 }
2200 2154
2201 SkColorFilter* SkPaint::setColorFilter(SkColorFilter* filter) { 2155 SkColorFilter* SkPaint::setColorFilter(SkColorFilter* filter) {
2202 GEN_ID_INC_EVAL(filter != fColorFilter); 2156 GEN_ID_INC_EVAL(filter != fColorFilter);
2203 SkRefCnt_SafeAssign(fColorFilter, filter); 2157 SkRefCnt_SafeAssign(fColorFilter, filter);
2204 fDirtyBits = set_mask(fDirtyBits, kColorFilter_DirtyBit, filter != NULL);
2205 return filter; 2158 return filter;
2206 } 2159 }
2207 2160
2208 SkXfermode* SkPaint::setXfermode(SkXfermode* mode) { 2161 SkXfermode* SkPaint::setXfermode(SkXfermode* mode) {
2209 GEN_ID_INC_EVAL(mode != fXfermode); 2162 GEN_ID_INC_EVAL(mode != fXfermode);
2210 SkRefCnt_SafeAssign(fXfermode, mode); 2163 SkRefCnt_SafeAssign(fXfermode, mode);
2211 fDirtyBits = set_mask(fDirtyBits, kXfermode_DirtyBit, mode != NULL);
2212 return mode; 2164 return mode;
2213 } 2165 }
2214 2166
2215 SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) { 2167 SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) {
2216 SkSafeUnref(fXfermode); 2168 SkSafeUnref(fXfermode);
2217 fXfermode = SkXfermode::Create(mode); 2169 fXfermode = SkXfermode::Create(mode);
2218 GEN_ID_INC; 2170 GEN_ID_INC;
2219 fDirtyBits = set_mask(fDirtyBits, kXfermode_DirtyBit, fXfermode != NULL);
2220 return fXfermode; 2171 return fXfermode;
2221 } 2172 }
2222 2173
2223 SkPathEffect* SkPaint::setPathEffect(SkPathEffect* effect) { 2174 SkPathEffect* SkPaint::setPathEffect(SkPathEffect* effect) {
2224 GEN_ID_INC_EVAL(effect != fPathEffect); 2175 GEN_ID_INC_EVAL(effect != fPathEffect);
2225 SkRefCnt_SafeAssign(fPathEffect, effect); 2176 SkRefCnt_SafeAssign(fPathEffect, effect);
2226 fDirtyBits = set_mask(fDirtyBits, kPathEffect_DirtyBit, effect != NULL);
2227 return effect; 2177 return effect;
2228 } 2178 }
2229 2179
2230 SkMaskFilter* SkPaint::setMaskFilter(SkMaskFilter* filter) { 2180 SkMaskFilter* SkPaint::setMaskFilter(SkMaskFilter* filter) {
2231 GEN_ID_INC_EVAL(filter != fMaskFilter); 2181 GEN_ID_INC_EVAL(filter != fMaskFilter);
2232 SkRefCnt_SafeAssign(fMaskFilter, filter); 2182 SkRefCnt_SafeAssign(fMaskFilter, filter);
2233 fDirtyBits = set_mask(fDirtyBits, kMaskFilter_DirtyBit, filter != NULL);
2234 return filter; 2183 return filter;
2235 } 2184 }
2236 2185
2237 /////////////////////////////////////////////////////////////////////////////// 2186 ///////////////////////////////////////////////////////////////////////////////
2238 2187
2239 bool SkPaint::getFillPath(const SkPath& src, SkPath* dst, 2188 bool SkPaint::getFillPath(const SkPath& src, SkPath* dst,
2240 const SkRect* cullRect) const { 2189 const SkRect* cullRect) const {
2241 SkStrokeRec rec(*this); 2190 SkStrokeRec rec(*this);
2242 2191
2243 const SkPath* srcPtr = &src; 2192 const SkPath* srcPtr = &src;
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
2594 case SkXfermode::kPlus_Mode: 2543 case SkXfermode::kPlus_Mode:
2595 return 0 == this->getAlpha(); 2544 return 0 == this->getAlpha();
2596 case SkXfermode::kDst_Mode: 2545 case SkXfermode::kDst_Mode:
2597 return true; 2546 return true;
2598 default: 2547 default:
2599 break; 2548 break;
2600 } 2549 }
2601 } 2550 }
2602 return false; 2551 return false;
2603 } 2552 }
2604
2605 void SkPaint::setBitfields(uint32_t bitfields) {
2606 fBitfields = bitfields;
2607 fDirtyBits |= kBitfields_DirtyBit;
2608 }
2609
2610 inline static unsigned popcount(uint8_t x) {
2611 // As in Hacker's delight, adapted for just 8 bits.
2612 x = (x & 0x55) + ((x >> 1) & 0x55); // a b c d w x y z -> a+b c+d w+x y+z
2613 x = (x & 0x33) + ((x >> 2) & 0x33); // a+b c+d w+x y+z -> a+b+c+d w+x+y+z
2614 x = (x & 0x0F) + ((x >> 4) & 0x0F); // a+b+c+d w+x+y+z -> a+b+c+d+w+x+y+z
2615 return x;
2616 }
2617
2618 void SkPaint::FlatteningTraits::Flatten(SkWriteBuffer& buffer, const SkPaint& pa int) {
2619 const uint32_t dirty = paint.fDirtyBits;
2620
2621 // Each of the low 7 dirty bits corresponds to a 4-byte flat value, plus one for the dirty bits.
2622 const size_t flatBytes = 4 * (popcount(dirty & 127) + 1);
2623 SkASSERT(flatBytes <= 32);
2624 uint32_t* u32 = buffer.reserve(flatBytes);
2625 *u32++ = dirty;
2626 if (dirty == 0) {
2627 return;
2628 }
2629
2630 #define F(dst, field) if (dirty & k##field##_DirtyBit) *dst++ = paint.get##field ()
2631 F(u32, Color);
2632 F(u32, Bitfields);
2633 SkScalar* f32 = reinterpret_cast<SkScalar*>(u32);
2634 F(f32, TextSize);
2635 F(f32, TextScaleX);
2636 F(f32, TextSkewX);
2637 F(f32, StrokeWidth);
2638 F(f32, StrokeMiter);
2639 #undef F
2640 #define F(field) if (dirty & k##field##_DirtyBit) buffer.writeFlattenable(paint. get##field())
2641 F(PathEffect);
2642 F(Shader);
2643 F(Xfermode);
2644 F(MaskFilter);
2645 F(ColorFilter);
2646 F(Rasterizer);
2647 F(Looper);
2648 F(ImageFilter);
2649 #undef F
2650 if (dirty & kTypeface_DirtyBit) buffer.writeTypeface(paint.getTypeface());
2651 if (dirty & kAnnotation_DirtyBit) paint.getAnnotation()->writeToBuffer(buffe r);
2652 #ifdef SK_BUILD_FOR_ANDROID
2653 if (dirty & kPaintOptionsAndroid_DirtyBit) paint.getPaintOptionsAndroid().fl atten(buffer);
2654 #endif
2655 }
2656
2657 void SkPaint::FlatteningTraits::Unflatten(SkReadBuffer& buffer, SkPaint* paint) {
2658 const uint32_t dirty = buffer.readUInt();
2659 if (dirty == 0) {
2660 return;
2661 }
2662 #define F(field, reader) if (dirty & k##field##_DirtyBit) paint->set##field(buff er.reader())
2663 F(Color, readUInt);
2664 F(Bitfields, readUInt);
2665 F(TextSize, readScalar);
2666 F(TextScaleX, readScalar);
2667 F(TextSkewX, readScalar);
2668 F(StrokeWidth, readScalar);
2669 F(StrokeMiter, readScalar);
2670 F(PathEffect, readPathEffect);
2671 F(Shader, readShader);
2672 F(Xfermode, readXfermode);
2673 F(MaskFilter, readMaskFilter);
2674 F(ColorFilter, readColorFilter);
2675 F(Rasterizer, readRasterizer);
2676 F(Looper, readDrawLooper);
2677 F(ImageFilter, readImageFilter);
2678 F(Typeface, readTypeface);
2679 #undef F
2680 if (dirty & kAnnotation_DirtyBit) {
2681 paint->setAnnotation(SkNEW_ARGS(SkAnnotation, (buffer)))->unref();
2682 }
2683 #ifdef SK_BUILD_FOR_ANDROID
2684 if (dirty & kPaintOptionsAndroid_DirtyBit) {
2685 SkPaintOptionsAndroid options;
2686 options.unflatten(buffer);
2687 paint->setPaintOptionsAndroid(options);
2688 }
2689 #endif
2690 SkASSERT(dirty == paint->fDirtyBits);
2691 }
OLDNEW
« no previous file with comments | « include/core/SkPaint.h ('k') | src/core/SkPictureFlat.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698