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

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

Issue 2430343003: Use Analytic AA in SkAAClip (Closed)
Patch Set: Nit fixes Created 4 years, 2 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 | « no previous file | src/core/SkAnalyticEdge.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 2011 Google Inc. 2 * Copyright 2011 Google Inc.
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 "SkAAClip.h" 8 #include "SkAAClip.h"
9 #include "SkAtomics.h" 9 #include "SkAtomics.h"
10 #include "SkBlitter.h" 10 #include "SkBlitter.h"
(...skipping 1019 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 // so we ensure our row goes all the way to our right 1030 // so we ensure our row goes all the way to our right
1031 this->flushRowH(fCurrRow); 1031 this->flushRowH(fCurrRow);
1032 1032
1033 y -= fBounds.fTop; 1033 y -= fBounds.fTop;
1034 SkASSERT(y == fCurrRow->fY); 1034 SkASSERT(y == fCurrRow->fY);
1035 fCurrRow->fY = y + height - 1; 1035 fCurrRow->fY = y + height - 1;
1036 } 1036 }
1037 1037
1038 void addAntiRectRun(int x, int y, int width, int height, 1038 void addAntiRectRun(int x, int y, int width, int height,
1039 SkAlpha leftAlpha, SkAlpha rightAlpha) { 1039 SkAlpha leftAlpha, SkAlpha rightAlpha) {
1040 SkASSERT(fBounds.contains(x + width - 1 + 1040 // According to SkBlitter.cpp, no matter whether leftAlpha is 0 or posit ive,
1041 (leftAlpha > 0 ? 1 : 0) + (rightAlpha > 0 ? 1 : 0), 1041 // we should always consider [x, x+1] as the left-most column and [x+1, x+1+width]
1042 // as the rect with full alpha.
1043 SkASSERT(fBounds.contains(x + width + (rightAlpha > 0 ? 1 : 0),
1042 y + height - 1)); 1044 y + height - 1));
1043 SkASSERT(width >= 0); 1045 SkASSERT(width >= 0);
1044 1046
1045 // Conceptually we're always adding 3 runs, but we should 1047 // Conceptually we're always adding 3 runs, but we should
1046 // merge or omit them if possible. 1048 // merge or omit them if possible.
1047 if (leftAlpha == 0xFF) { 1049 if (leftAlpha == 0xFF) {
1048 width++; 1050 width++;
1049 } else if (leftAlpha > 0) { 1051 } else if (leftAlpha > 0) {
1050 this->addRun(x++, y, leftAlpha, 1); 1052 this->addRun(x++, y, leftAlpha, 1);
1053 } else {
1054 // leftAlpha is 0, ignore the left column
1055 x++;
1051 } 1056 }
1052 if (rightAlpha == 0xFF) { 1057 if (rightAlpha == 0xFF) {
1053 width++; 1058 width++;
1054 } 1059 }
1055 if (width > 0) { 1060 if (width > 0) {
1056 this->addRun(x, y, 0xFF, width); 1061 this->addRun(x, y, 0xFF, width);
1057 } 1062 }
1058 if (rightAlpha > 0 && rightAlpha < 255) { 1063 if (rightAlpha > 0 && rightAlpha < 255) {
1059 this->addRun(x + width, y, rightAlpha, 1); 1064 this->addRun(x + width, y, rightAlpha, 1);
1060 } 1065 }
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1267 } 1272 }
1268 1273
1269 /** 1274 /**
1270 Must evaluate clips in scan-line order, so don't want to allow blitV(), 1275 Must evaluate clips in scan-line order, so don't want to allow blitV(),
1271 but an AAClip can be clipped down to a single pixel wide, so we 1276 but an AAClip can be clipped down to a single pixel wide, so we
1272 must support it (given AntiRect semantics: minimum width is 2). 1277 must support it (given AntiRect semantics: minimum width is 2).
1273 Instead we'll rely on the runtime asserts to guarantee Y monotonicity; 1278 Instead we'll rely on the runtime asserts to guarantee Y monotonicity;
1274 any failure cases that misses may have minor artifacts. 1279 any failure cases that misses may have minor artifacts.
1275 */ 1280 */
1276 void blitV(int x, int y, int height, SkAlpha alpha) override { 1281 void blitV(int x, int y, int height, SkAlpha alpha) override {
1277 this->recordMinY(y); 1282 if (height == 1) {
1278 fBuilder->addColumn(x, y, alpha, height); 1283 // We're still in scan-line order if height is 1
1279 fLastY = y + height - 1; 1284 // This is useful for Analytic AA
1285 const SkAlpha alphas[2] = {alpha, 0};
1286 const int16_t runs[2] = {1, 0};
1287 this->blitAntiH(x, y, alphas, runs);
1288 } else {
1289 this->recordMinY(y);
1290 fBuilder->addColumn(x, y, alpha, height);
1291 fLastY = y + height - 1;
1292 }
1280 } 1293 }
1281 1294
1282 void blitRect(int x, int y, int width, int height) override { 1295 void blitRect(int x, int y, int width, int height) override {
1283 this->recordMinY(y); 1296 this->recordMinY(y);
1284 this->checkForYGap(y); 1297 this->checkForYGap(y);
1285 fBuilder->addRectRun(x, y, width, height); 1298 fBuilder->addRectRun(x, y, width, height);
1286 fLastY = y + height - 1; 1299 fLastY = y + height - 1;
1287 } 1300 }
1288 1301
1289 virtual void blitAntiRect(int x, int y, int width, int height, 1302 virtual void blitAntiRect(int x, int y, int width, int height,
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 } else { 1404 } else {
1392 if (ibounds.isEmpty() || !ibounds.intersect(clip->getBounds())) { 1405 if (ibounds.isEmpty() || !ibounds.intersect(clip->getBounds())) {
1393 return this->setEmpty(); 1406 return this->setEmpty();
1394 } 1407 }
1395 } 1408 }
1396 1409
1397 Builder builder(ibounds); 1410 Builder builder(ibounds);
1398 BuilderBlitter blitter(&builder); 1411 BuilderBlitter blitter(&builder);
1399 1412
1400 if (doAA) { 1413 if (doAA) {
1401 SkScan::AntiFillPath(path, *clip, &blitter, true); 1414 if (gSkUseAnalyticAA.load()) {
1415 SkScan::AAAFillPath(path, *clip, &blitter, true);
1416 } else {
1417 SkScan::AntiFillPath(path, *clip, &blitter, true);
1418 }
1402 } else { 1419 } else {
1403 SkScan::FillPath(path, *clip, &blitter); 1420 SkScan::FillPath(path, *clip, &blitter);
1404 } 1421 }
1405 1422
1406 blitter.finish(); 1423 blitter.finish();
1407 return builder.finish(this); 1424 return builder.finish(this);
1408 } 1425 }
1409 1426
1410 /////////////////////////////////////////////////////////////////////////////// 1427 ///////////////////////////////////////////////////////////////////////////////
1411 1428
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after
2211 rowMask.fBounds.fBottom = y + 1; 2228 rowMask.fBounds.fBottom = y + 1;
2212 fBlitter->blitMask(rowMask, rowMask.fBounds); 2229 fBlitter->blitMask(rowMask, rowMask.fBounds);
2213 src = (const void*)((const char*)src + srcRB); 2230 src = (const void*)((const char*)src + srcRB);
2214 } while (++y < localStopY); 2231 } while (++y < localStopY);
2215 } while (y < stopY); 2232 } while (y < stopY);
2216 } 2233 }
2217 2234
2218 const SkPixmap* SkAAClipBlitter::justAnOpaqueColor(uint32_t* value) { 2235 const SkPixmap* SkAAClipBlitter::justAnOpaqueColor(uint32_t* value) {
2219 return nullptr; 2236 return nullptr;
2220 } 2237 }
OLDNEW
« no previous file with comments | « no previous file | src/core/SkAnalyticEdge.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698