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

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

Issue 179343005: Add a class to allocate small objects w/o extra calls to new. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Rename the .h file Created 6 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
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"
11 #include "SkCanvas.h" 11 #include "SkCanvas.h"
12 #include "SkColorPriv.h" 12 #include "SkColorPriv.h"
13 #include "SkDevice.h" 13 #include "SkDevice.h"
14 #include "SkDeviceLooper.h" 14 #include "SkDeviceLooper.h"
15 #include "SkFixed.h" 15 #include "SkFixed.h"
16 #include "SkMaskFilter.h" 16 #include "SkMaskFilter.h"
17 #include "SkPaint.h" 17 #include "SkPaint.h"
18 #include "SkPathEffect.h" 18 #include "SkPathEffect.h"
19 #include "SkRasterClip.h" 19 #include "SkRasterClip.h"
20 #include "SkRasterizer.h" 20 #include "SkRasterizer.h"
21 #include "SkRRect.h" 21 #include "SkRRect.h"
22 #include "SkScan.h" 22 #include "SkScan.h"
23 #include "SkShader.h" 23 #include "SkShader.h"
24 #include "SkSmallAllocator.h"
24 #include "SkString.h" 25 #include "SkString.h"
25 #include "SkStroke.h" 26 #include "SkStroke.h"
26 #include "SkTemplatesPriv.h"
27 #include "SkTLazy.h" 27 #include "SkTLazy.h"
28 #include "SkUtils.h" 28 #include "SkUtils.h"
29 29
30 #include "SkAutoKern.h" 30 #include "SkAutoKern.h"
31 #include "SkBitmapProcShader.h" 31 #include "SkBitmapProcShader.h"
32 #include "SkDrawProcs.h" 32 #include "SkDrawProcs.h"
33 #include "SkMatrixUtils.h" 33 #include "SkMatrixUtils.h"
34 34
35
35 //#define TRACE_BITMAP_DRAWS 36 //#define TRACE_BITMAP_DRAWS
36 37
37 #define kBlitterStorageLongCount (sizeof(SkBitmapProcShader) >> 2)
38 38
39 /** Helper for allocating small blitters on the stack. 39 /** Helper for allocating small blitters on the stack.
40 */ 40 */
41 class SkAutoBlitterChoose : SkNoncopyable { 41 class SkAutoBlitterChoose : SkNoncopyable {
42 public: 42 public:
43 SkAutoBlitterChoose() { 43 SkAutoBlitterChoose() {
44 fBlitter = NULL; 44 fBlitter = NULL;
45 } 45 }
46 SkAutoBlitterChoose(const SkBitmap& device, const SkMatrix& matrix, 46 SkAutoBlitterChoose(const SkBitmap& device, const SkMatrix& matrix,
47 const SkPaint& paint, bool drawCoverage = false) { 47 const SkPaint& paint, bool drawCoverage = false) {
48 fBlitter = SkBlitter::Choose(device, matrix, paint, 48 fBlitter = SkBlitter::Choose(device, matrix, paint, &fAllocator,
49 fStorage, sizeof(fStorage), drawCoverage); 49 drawCoverage);
50 }
51
52 ~SkAutoBlitterChoose() {
53 if ((void*)fBlitter == (void*)fStorage) {
54 fBlitter->~SkBlitter();
55 } else {
56 SkDELETE(fBlitter);
57 }
58 } 50 }
59 51
60 SkBlitter* operator->() { return fBlitter; } 52 SkBlitter* operator->() { return fBlitter; }
61 SkBlitter* get() const { return fBlitter; } 53 SkBlitter* get() const { return fBlitter; }
62 54
63 void choose(const SkBitmap& device, const SkMatrix& matrix, 55 void choose(const SkBitmap& device, const SkMatrix& matrix,
64 const SkPaint& paint) { 56 const SkPaint& paint) {
65 SkASSERT(!fBlitter); 57 SkASSERT(!fBlitter);
66 fBlitter = SkBlitter::Choose(device, matrix, paint, 58 fBlitter = SkBlitter::Choose(device, matrix, paint, &fAllocator);
67 fStorage, sizeof(fStorage));
68 } 59 }
69 60
70 private: 61 private:
71 SkBlitter* fBlitter; 62 // Owned by fAllocator, which will handle the delete.
72 uint32_t fStorage[kBlitterStorageLongCount]; 63 SkBlitter* fBlitter;
64 SkTBlitterAllocator fAllocator;
73 }; 65 };
74 #define SkAutoBlitterChoose(...) SK_REQUIRE_LOCAL_VAR(SkAutoBlitterChoose) 66 #define SkAutoBlitterChoose(...) SK_REQUIRE_LOCAL_VAR(SkAutoBlitterChoose)
75 67
76 /** 68 /**
77 * Since we are providing the storage for the shader (to avoid the perf cost 69 * Since we are providing the storage for the shader (to avoid the perf cost
78 * of calling new) we insist that in our destructor we can account for all 70 * of calling new) we insist that in our destructor we can account for all
79 * owners of the shader. 71 * owners of the shader.
80 */ 72 */
81 class SkAutoBitmapShaderInstall : SkNoncopyable { 73 class SkAutoBitmapShaderInstall : SkNoncopyable {
82 public: 74 public:
83 SkAutoBitmapShaderInstall(const SkBitmap& src, const SkPaint& paint) 75 SkAutoBitmapShaderInstall(const SkBitmap& src, const SkPaint& paint)
84 : fPaint(paint) /* makes a copy of the paint */ { 76 : fPaint(paint) /* makes a copy of the paint */ {
85 fPaint.setShader(SkShader::CreateBitmapShader(src, 77 fPaint.setShader(CreateBitmapShader(src, SkShader::kClamp_TileMode,
86 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, 78 SkShader::kClamp_TileMode,
87 fStorage, sizeof(fStorage))); 79 &fAllocator));
88 // we deliberately left the shader with an owner-count of 2 80 // we deliberately left the shader with an owner-count of 2
89 SkASSERT(2 == fPaint.getShader()->getRefCnt()); 81 SkASSERT(2 == fPaint.getShader()->getRefCnt());
90 } 82 }
91 83
92 ~SkAutoBitmapShaderInstall() { 84 ~SkAutoBitmapShaderInstall() {
93 SkShader* shader = fPaint.getShader(); 85 // since fAllocator will destroy shader, we insist that owners == 2
94 // since we manually destroy shader, we insist that owners == 2 86 SkASSERT(2 == fPaint.getShader()->getRefCnt());
95 SkASSERT(2 == shader->getRefCnt());
96 87
97 fPaint.setShader(NULL); // unref the shader by 1 88 fPaint.setShader(NULL); // unref the shader by 1
98 89
99 // now destroy to take care of the 2nd owner-count
100 if ((void*)shader == (void*)fStorage) {
101 shader->~SkShader();
102 } else {
103 SkDELETE(shader);
104 }
105 } 90 }
106 91
107 // return the new paint that has the shader applied 92 // return the new paint that has the shader applied
108 const SkPaint& paintWithShader() const { return fPaint; } 93 const SkPaint& paintWithShader() const { return fPaint; }
109 94
110 private: 95 private:
111 SkPaint fPaint; // copy of caller's paint (which we then modify) 96 // copy of caller's paint (which we then modify)
112 uint32_t fStorage[kBlitterStorageLongCount]; 97 SkPaint fPaint;
98 // Stores the shader.
99 SkTBlitterAllocator fAllocator;
113 }; 100 };
114 #define SkAutoBitmapShaderInstall(...) SK_REQUIRE_LOCAL_VAR(SkAutoBitmapShaderIn stall) 101 #define SkAutoBitmapShaderInstall(...) SK_REQUIRE_LOCAL_VAR(SkAutoBitmapShaderIn stall)
115 102
116 /////////////////////////////////////////////////////////////////////////////// 103 ///////////////////////////////////////////////////////////////////////////////
117 104
118 SkDraw::SkDraw() { 105 SkDraw::SkDraw() {
119 sk_bzero(this, sizeof(*this)); 106 sk_bzero(this, sizeof(*this));
120 } 107 }
121 108
122 SkDraw::SkDraw(const SkDraw& src) { 109 SkDraw::SkDraw(const SkDraw& src) {
(...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1316 // It is safe to call lock pixels now, since we know the matrix is 1303 // It is safe to call lock pixels now, since we know the matrix is
1317 // (more or less) identity. 1304 // (more or less) identity.
1318 // 1305 //
1319 SkAutoLockPixels alp(bitmap); 1306 SkAutoLockPixels alp(bitmap);
1320 if (!bitmap.readyToDraw()) { 1307 if (!bitmap.readyToDraw()) {
1321 return; 1308 return;
1322 } 1309 }
1323 int ix = SkScalarRoundToInt(matrix.getTranslateX()); 1310 int ix = SkScalarRoundToInt(matrix.getTranslateX());
1324 int iy = SkScalarRoundToInt(matrix.getTranslateY()); 1311 int iy = SkScalarRoundToInt(matrix.getTranslateY());
1325 if (clipHandlesSprite(*fRC, ix, iy, bitmap)) { 1312 if (clipHandlesSprite(*fRC, ix, iy, bitmap)) {
1326 uint32_t storage[kBlitterStorageLongCount]; 1313 SkTBlitterAllocator allocator;
1327 SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitma p, 1314 // blitter will be owned by the allocator.
1328 ix, iy, storage, sizeof(storage) ); 1315 SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitmap ,
1316 ix, iy, &allocator);
1329 if (blitter) { 1317 if (blitter) {
1330 SkAutoTPlacementDelete<SkBlitter> ad(blitter, storage);
1331
1332 SkIRect ir; 1318 SkIRect ir;
1333 ir.set(ix, iy, ix + bitmap.width(), iy + bitmap.height()); 1319 ir.set(ix, iy, ix + bitmap.width(), iy + bitmap.height());
1334 1320
1335 SkScan::FillIRect(ir, *fRC, blitter); 1321 SkScan::FillIRect(ir, *fRC, blitter);
1336 return; 1322 return;
1337 } 1323 }
1338 } 1324 }
1339 } 1325 }
1340 1326
1341 // now make a temp draw on the stack, and use it 1327 // now make a temp draw on the stack, and use it
(...skipping 29 matching lines...) Expand all
1371 bounds.set(x, y, x + bitmap.width(), y + bitmap.height()); 1357 bounds.set(x, y, x + bitmap.width(), y + bitmap.height());
1372 1358
1373 if (fRC->quickReject(bounds)) { 1359 if (fRC->quickReject(bounds)) {
1374 return; // nothing to draw 1360 return; // nothing to draw
1375 } 1361 }
1376 1362
1377 SkPaint paint(origPaint); 1363 SkPaint paint(origPaint);
1378 paint.setStyle(SkPaint::kFill_Style); 1364 paint.setStyle(SkPaint::kFill_Style);
1379 1365
1380 if (NULL == paint.getColorFilter() && clipHandlesSprite(*fRC, x, y, bitmap)) { 1366 if (NULL == paint.getColorFilter() && clipHandlesSprite(*fRC, x, y, bitmap)) {
1381 uint32_t storage[kBlitterStorageLongCount]; 1367 SkTBlitterAllocator allocator;
1382 SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitmap, 1368 // blitter will be owned by the allocator.
1383 x, y, storage, sizeof(storage)); 1369 SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitmap,
1370 x, y, &allocator);
1384 1371
1385 if (blitter) { 1372 if (blitter) {
1386 SkAutoTPlacementDelete<SkBlitter> ad(blitter, storage);
1387
1388 if (fBounder && !fBounder->doIRect(bounds)) { 1373 if (fBounder && !fBounder->doIRect(bounds)) {
1389 return; 1374 return;
1390 } 1375 }
1391 1376
1392 SkScan::FillIRect(bounds, *fRC, blitter); 1377 SkScan::FillIRect(bounds, *fRC, blitter);
1393 return; 1378 return;
1394 } 1379 }
1395 } 1380 }
1396 1381
1397 SkAutoBitmapShaderInstall install(bitmap, paint); 1382 SkAutoBitmapShaderInstall install(bitmap, paint);
(...skipping 1422 matching lines...) Expand 10 before | Expand all | Expand 10 after
2820 mask->fImage = SkMask::AllocImage(size); 2805 mask->fImage = SkMask::AllocImage(size);
2821 memset(mask->fImage, 0, mask->computeImageSize()); 2806 memset(mask->fImage, 0, mask->computeImageSize());
2822 } 2807 }
2823 2808
2824 if (SkMask::kJustComputeBounds_CreateMode != mode) { 2809 if (SkMask::kJustComputeBounds_CreateMode != mode) {
2825 draw_into_mask(*mask, devPath, style); 2810 draw_into_mask(*mask, devPath, style);
2826 } 2811 }
2827 2812
2828 return true; 2813 return true;
2829 } 2814 }
OLDNEW
« no previous file with comments | « src/core/SkCoreBlitters.h ('k') | src/core/SkShader.cpp » ('j') | src/core/SkSmallAllocator.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698