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

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

Issue 72603005: Guard against most unintentionally ephemeral SkAutoFoo instantiations. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: undo autoasciitolc Created 7 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « src/core/SkDescriptor.h ('k') | src/core/SkGlyphCache.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 * 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 "SkDraw.h" 8 #include "SkDraw.h"
9 #include "SkBlitter.h" 9 #include "SkBlitter.h"
10 #include "SkBounder.h" 10 #include "SkBounder.h"
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 public: 58 public:
59 SkAutoBlitterChoose() { 59 SkAutoBlitterChoose() {
60 fBlitter = NULL; 60 fBlitter = NULL;
61 } 61 }
62 SkAutoBlitterChoose(const SkBitmap& device, const SkMatrix& matrix, 62 SkAutoBlitterChoose(const SkBitmap& device, const SkMatrix& matrix,
63 const SkPaint& paint, bool drawCoverage = false) { 63 const SkPaint& paint, bool drawCoverage = false) {
64 fBlitter = SkBlitter::Choose(device, matrix, paint, 64 fBlitter = SkBlitter::Choose(device, matrix, paint,
65 fStorage, sizeof(fStorage), drawCoverage); 65 fStorage, sizeof(fStorage), drawCoverage);
66 } 66 }
67 67
68 ~SkAutoBlitterChoose(); 68 ~SkAutoBlitterChoose() {
69 if ((void*)fBlitter == (void*)fStorage) {
70 fBlitter->~SkBlitter();
71 } else {
72 SkDELETE(fBlitter);
73 }
74 }
69 75
70 SkBlitter* operator->() { return fBlitter; } 76 SkBlitter* operator->() { return fBlitter; }
71 SkBlitter* get() const { return fBlitter; } 77 SkBlitter* get() const { return fBlitter; }
72 78
73 void choose(const SkBitmap& device, const SkMatrix& matrix, 79 void choose(const SkBitmap& device, const SkMatrix& matrix,
74 const SkPaint& paint) { 80 const SkPaint& paint) {
75 SkASSERT(!fBlitter); 81 SkASSERT(!fBlitter);
76 fBlitter = SkBlitter::Choose(device, matrix, paint, 82 fBlitter = SkBlitter::Choose(device, matrix, paint,
77 fStorage, sizeof(fStorage)); 83 fStorage, sizeof(fStorage));
78 } 84 }
79 85
80 private: 86 private:
81 SkBlitter* fBlitter; 87 SkBlitter* fBlitter;
82 uint32_t fStorage[kBlitterStorageLongCount]; 88 uint32_t fStorage[kBlitterStorageLongCount];
83 }; 89 };
84 90 #define SkAutoBlitterChoose(...) SK_REQUIRE_LOCAL_VAR(SkAutoBlitterChoose)
85 SkAutoBlitterChoose::~SkAutoBlitterChoose() {
86 if ((void*)fBlitter == (void*)fStorage) {
87 fBlitter->~SkBlitter();
88 } else {
89 SkDELETE(fBlitter);
90 }
91 }
92 91
93 /** 92 /**
94 * Since we are providing the storage for the shader (to avoid the perf cost 93 * Since we are providing the storage for the shader (to avoid the perf cost
95 * of calling new) we insist that in our destructor we can account for all 94 * of calling new) we insist that in our destructor we can account for all
96 * owners of the shader. 95 * owners of the shader.
97 */ 96 */
98 class SkAutoBitmapShaderInstall : SkNoncopyable { 97 class SkAutoBitmapShaderInstall : SkNoncopyable {
99 public: 98 public:
100 SkAutoBitmapShaderInstall(const SkBitmap& src, const SkPaint& paint) 99 SkAutoBitmapShaderInstall(const SkBitmap& src, const SkPaint& paint)
101 : fPaint(paint) /* makes a copy of the paint */ { 100 : fPaint(paint) /* makes a copy of the paint */ {
(...skipping 19 matching lines...) Expand all
121 } 120 }
122 } 121 }
123 122
124 // return the new paint that has the shader applied 123 // return the new paint that has the shader applied
125 const SkPaint& paintWithShader() const { return fPaint; } 124 const SkPaint& paintWithShader() const { return fPaint; }
126 125
127 private: 126 private:
128 SkPaint fPaint; // copy of caller's paint (which we then modify) 127 SkPaint fPaint; // copy of caller's paint (which we then modify)
129 uint32_t fStorage[kBlitterStorageLongCount]; 128 uint32_t fStorage[kBlitterStorageLongCount];
130 }; 129 };
130 #define SkAutoBitmapShaderInstall(...) SK_REQUIRE_LOCAL_VAR(SkAutoBitmapShaderIn stall)
131 131
132 /////////////////////////////////////////////////////////////////////////////// 132 ///////////////////////////////////////////////////////////////////////////////
133 133
134 SkDraw::SkDraw() { 134 SkDraw::SkDraw() {
135 sk_bzero(this, sizeof(*this)); 135 sk_bzero(this, sizeof(*this));
136 } 136 }
137 137
138 SkDraw::SkDraw(const SkDraw& src) { 138 SkDraw::SkDraw(const SkDraw& src) {
139 memcpy(this, &src, sizeof(*this)); 139 memcpy(this, &src, sizeof(*this));
140 } 140 }
(...skipping 2738 matching lines...) Expand 10 before | Expand all | Expand 10 after
2879 mask->fImage = SkMask::AllocImage(size); 2879 mask->fImage = SkMask::AllocImage(size);
2880 memset(mask->fImage, 0, mask->computeImageSize()); 2880 memset(mask->fImage, 0, mask->computeImageSize());
2881 } 2881 }
2882 2882
2883 if (SkMask::kJustComputeBounds_CreateMode != mode) { 2883 if (SkMask::kJustComputeBounds_CreateMode != mode) {
2884 draw_into_mask(*mask, devPath, style); 2884 draw_into_mask(*mask, devPath, style);
2885 } 2885 }
2886 2886
2887 return true; 2887 return true;
2888 } 2888 }
OLDNEW
« no previous file with comments | « src/core/SkDescriptor.h ('k') | src/core/SkGlyphCache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698