зеркало из https://github.com/mozilla/moz-skia.git
Fixing the drawing of blurred shodows for hairline paths with software rendering
BUG=http://code.google.com/p/chromium/issues/detail?id=121251 REVIEW=http://codereview.appspot.com/5981053/ git-svn-id: http://skia.googlecode.com/svn/trunk@3592 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
Родитель
26be399261
Коммит
2ac4ef5e6e
|
@ -77,7 +77,8 @@ public:
|
|||
*/
|
||||
static bool DrawToMask(const SkPath& devPath, const SkIRect* clipBounds,
|
||||
SkMaskFilter* filter, const SkMatrix* filterMatrix,
|
||||
SkMask* mask, SkMask::CreateMode mode);
|
||||
SkMask* mask, SkMask::CreateMode mode,
|
||||
SkPaint::Style style);
|
||||
|
||||
enum RectType {
|
||||
kHair_RectType,
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include "SkFlattenable.h"
|
||||
#include "SkMask.h"
|
||||
#include "SkPaint.h"
|
||||
|
||||
class SkBlitter;
|
||||
class SkBounder;
|
||||
|
@ -103,7 +104,8 @@ private:
|
|||
This method is not exported to java.
|
||||
*/
|
||||
bool filterPath(const SkPath& devPath, const SkMatrix& devMatrix,
|
||||
const SkRasterClip&, SkBounder*, SkBlitter* blitter);
|
||||
const SkRasterClip&, SkBounder*, SkBlitter* blitter,
|
||||
SkPaint::Style style);
|
||||
|
||||
typedef SkFlattenable INHERITED;
|
||||
};
|
||||
|
|
|
@ -985,11 +985,14 @@ void SkDraw::drawPath(const SkPath& origSrcPath, const SkPaint& origPaint,
|
|||
|
||||
SkAutoBlitterChoose blitter(*fBitmap, *fMatrix, *paint);
|
||||
|
||||
// how does filterPath() know to fill or hairline the path??? <mrr>
|
||||
if (paint->getMaskFilter() &&
|
||||
paint->getMaskFilter()->filterPath(*devPathPtr, *fMatrix, *fRC,
|
||||
fBounder, blitter.get())) {
|
||||
return; // filterPath() called the blitter, so we're done
|
||||
if (paint->getMaskFilter()) {
|
||||
SkPaint::Style style = doFill ? SkPaint::kFill_Style :
|
||||
SkPaint::kStroke_Style;
|
||||
if (paint->getMaskFilter()->filterPath(*devPathPtr, *fMatrix, *fRC,
|
||||
fBounder, blitter.get(),
|
||||
style)) {
|
||||
return; // filterPath() called the blitter, so we're done
|
||||
}
|
||||
}
|
||||
|
||||
if (fBounder && !fBounder->doPath(*devPathPtr, *paint, doFill)) {
|
||||
|
@ -2585,7 +2588,8 @@ static bool compute_bounds(const SkPath& devPath, const SkIRect* clipBounds,
|
|||
return true;
|
||||
}
|
||||
|
||||
static void draw_into_mask(const SkMask& mask, const SkPath& devPath) {
|
||||
static void draw_into_mask(const SkMask& mask, const SkPath& devPath,
|
||||
SkPaint::Style style) {
|
||||
SkBitmap bm;
|
||||
SkDraw draw;
|
||||
SkRasterClip clip;
|
||||
|
@ -2605,12 +2609,14 @@ static void draw_into_mask(const SkMask& mask, const SkPath& devPath) {
|
|||
draw.fMatrix = &matrix;
|
||||
draw.fBounder = NULL;
|
||||
paint.setAntiAlias(true);
|
||||
paint.setStyle(style);
|
||||
draw.drawPath(devPath, paint);
|
||||
}
|
||||
|
||||
bool SkDraw::DrawToMask(const SkPath& devPath, const SkIRect* clipBounds,
|
||||
SkMaskFilter* filter, const SkMatrix* filterMatrix,
|
||||
SkMask* mask, SkMask::CreateMode mode) {
|
||||
SkMask* mask, SkMask::CreateMode mode,
|
||||
SkPaint::Style style) {
|
||||
if (SkMask::kJustRenderImage_CreateMode != mode) {
|
||||
if (!compute_bounds(devPath, clipBounds, filter, filterMatrix, &mask->fBounds))
|
||||
return false;
|
||||
|
@ -2629,7 +2635,7 @@ bool SkDraw::DrawToMask(const SkPath& devPath, const SkIRect* clipBounds,
|
|||
}
|
||||
|
||||
if (SkMask::kJustComputeBounds_CreateMode != mode) {
|
||||
draw_into_mask(*mask, devPath);
|
||||
draw_into_mask(*mask, devPath, style);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -21,11 +21,12 @@ bool SkMaskFilter::filterMask(SkMask*, const SkMask&, const SkMatrix&,
|
|||
|
||||
bool SkMaskFilter::filterPath(const SkPath& devPath, const SkMatrix& matrix,
|
||||
const SkRasterClip& clip, SkBounder* bounder,
|
||||
SkBlitter* blitter) {
|
||||
SkBlitter* blitter, SkPaint::Style style) {
|
||||
SkMask srcM, dstM;
|
||||
|
||||
if (!SkDraw::DrawToMask(devPath, &clip.getBounds(), this, &matrix, &srcM,
|
||||
SkMask::kComputeBoundsAndRenderImage_CreateMode)) {
|
||||
SkMask::kComputeBoundsAndRenderImage_CreateMode,
|
||||
style)) {
|
||||
return false;
|
||||
}
|
||||
SkAutoMaskFreeImage autoSrc(srcM.fImage);
|
||||
|
|
|
@ -43,6 +43,7 @@ bool SkRasterizer::onRasterize(const SkPath& fillPath, const SkMatrix& matrix,
|
|||
SkPath devPath;
|
||||
|
||||
fillPath.transform(matrix, &devPath);
|
||||
return SkDraw::DrawToMask(devPath, clipBounds, NULL, NULL, mask, mode);
|
||||
return SkDraw::DrawToMask(devPath, clipBounds, NULL, NULL, mask, mode,
|
||||
SkPaint::kFill_Style);
|
||||
}
|
||||
|
||||
|
|
|
@ -1784,7 +1784,8 @@ void SkXPSDevice::drawPath(const SkDraw& d,
|
|||
filter, //just to compute how much to draw.
|
||||
&matrix,
|
||||
&rasteredMask,
|
||||
SkMask::kComputeBoundsAndRenderImage_CreateMode)) {
|
||||
SkMask::kComputeBoundsAndRenderImage_CreateMode,
|
||||
SkPaint::kFill_Style)) {
|
||||
|
||||
SkAutoMaskFreeImage rasteredAmi(rasteredMask.fImage);
|
||||
mask = &rasteredMask;
|
||||
|
|
|
@ -74,7 +74,8 @@ static bool compute_bounds(const SkDeque& layers, const SkPath& path,
|
|||
SkMask mask;
|
||||
if (!SkDraw::DrawToMask(devPath, clipBounds, paint.getMaskFilter(),
|
||||
&matrix, &mask,
|
||||
SkMask::kJustComputeBounds_CreateMode)) {
|
||||
SkMask::kJustComputeBounds_CreateMode,
|
||||
SkPaint::kFill_Style)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -899,7 +899,8 @@ bool drawWithMaskFilter(GrContext* context, const SkPath& path,
|
|||
SkMask srcM, dstM;
|
||||
|
||||
if (!SkDraw::DrawToMask(path, &clip.getBounds(), filter, &matrix, &srcM,
|
||||
SkMask::kComputeBoundsAndRenderImage_CreateMode)) {
|
||||
SkMask::kComputeBoundsAndRenderImage_CreateMode,
|
||||
SkPaint::kFill_Style)) {
|
||||
return false;
|
||||
}
|
||||
SkAutoMaskFreeImage autoSrc(srcM.fImage);
|
||||
|
|
Загрузка…
Ссылка в новой задаче