fix the error that path is inversed for stroke and strokeAndFill styles.

However, because hairline stroke + fill = fill (see src/core/SkStrokeRec.cpp), strokeAndFill will be thought as fill style when paint.getStrokeWidth() <= 0, this edge case can be inverse-filled.

BUG=skia:2222
R=bsalomon@google.com, reed@google.com

Author: yunchao.he@intel.com

Review URL: https://codereview.chromium.org/183683010

git-svn-id: http://skia.googlecode.com/svn/trunk@14561 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
commit-bot@chromium.org 2014-05-04 03:43:20 +00:00
parent 92f93264e7
commit 1f99d933e5
5 changed files with 28 additions and 6 deletions

View File

@ -37,3 +37,16 @@
# This change removes an API that this GM was testing. If/when it lands and sticks,
# I will likely just delete the GM.
canvas-layer-state
# yunchao: https://codereview.chromium.org/183683010/
# This change fixed the error that path is inversed for Stroke and StrokeAndFill
# styles. These GM cases need to be rebaselined:
inverse_paths
degeneratesegments
quadclosepath
quadpath
lineclosepath
linepath
cubicclosepath
cubicpath
emptypath

View File

@ -2076,7 +2076,7 @@ void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
const SkRect& r = path.getBounds();
if (r.width() <= 0 && r.height() <= 0) {
if (path.isInverseFillType()) {
if (path.isInverseFillType() && SkPaint::kFill_Style == paint.getStyle()) {
this->internalDrawPaint(paint);
}
return;

View File

@ -1119,6 +1119,13 @@ void SkDraw::drawPath(const SkPath& origSrcPath, const SkPaint& origPaint,
SkAutoBlitterChoose blitter(*fBitmap, *fMatrix, *paint, drawCoverage);
// make sure the path will not be inverse-stroked. hairlineStroke + fill = fill,
// they can be inverse-filled.
if (devPathPtr->isInverseFillType() && (SkPaint::kStroke_Style == paint->getStyle() ||
(SkPaint::kStrokeAndFill_Style == paint->getStyle() && paint->getStrokeWidth() > 0))) {
devPathPtr->toggleInverseFillType();
}
if (paint->getMaskFilter()) {
SkPaint::Style style = doFill ? SkPaint::kFill_Style :
SkPaint::kStroke_Style;

View File

@ -562,8 +562,9 @@ void SkStroke::strokePath(const SkPath& src, SkPath* dst) const {
SkPath::Direction dir;
if (src.isRect(&isClosed, &dir) && isClosed) {
this->strokeRect(src.getBounds(), dst, dir);
// our answer should preserve the inverseness of the src
if (src.isInverseFillType()) {
// our answer should preserve the inverseness of the src, but the
// rect should not be inverse-stroked.
if (src.isInverseFillType() && fWidth < 0) {
SkASSERT(!dst->isInverseFillType());
dst->toggleInverseFillType();
}
@ -646,8 +647,9 @@ DONE:
#endif
}
// our answer should preserve the inverseness of the src
if (src.isInverseFillType()) {
// our answer should preserve the inverseness of the src, but the path
// should not be inverse-stroked.
if (src.isInverseFillType() && fWidth < 0) {
SkASSERT(!dst->isInverseFillType());
dst->toggleInverseFillType();
}

View File

@ -71,7 +71,7 @@ bool GrStencilAndCoverPathRenderer::onDrawPath(const SkPath& path,
SkAutoTUnref<GrPath> p(fGpu->getContext()->createPath(path, stroke));
if (path.isInverseFillType()) {
if (path.isInverseFillType() && SkStrokeRec::kFill_Style == stroke.getStyle()) {
GR_STATIC_CONST_SAME_STENCIL(kInvertedStencilPass,
kZero_StencilOp,
kZero_StencilOp,