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

Unified Diff: Source/platform/graphics/GraphicsContext.cpp

Issue 669123002: Fixed Shadow blur for transparent objects (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Added opacity check Created 6 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 side-by-side diff with in-line comments
Download patch
Index: Source/platform/graphics/GraphicsContext.cpp
diff --git a/Source/platform/graphics/GraphicsContext.cpp b/Source/platform/graphics/GraphicsContext.cpp
index 38d4105bd7b6f85283bc7d9e443f692781b8ef1a..20387f524490e8823b3be9f9433afefce515e883 100644
--- a/Source/platform/graphics/GraphicsContext.cpp
+++ b/Source/platform/graphics/GraphicsContext.cpp
@@ -51,6 +51,7 @@
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/effects/SkBlurMaskFilter.h"
#include "third_party/skia/include/effects/SkCornerPathEffect.h"
+#include "third_party/skia/include/effects/SkDropShadowImageFilter.h"
#include "third_party/skia/include/effects/SkLumaColorFilter.h"
#include "third_party/skia/include/effects/SkMatrixImageFilter.h"
#include "third_party/skia/include/effects/SkPictureImageFilter.h"
@@ -326,6 +327,14 @@ void GraphicsContext::setShadow(const FloatSize& offset, float blur, const Color
drawLooperBuilder->addUnmodifiedContent();
}
setDrawLooper(drawLooperBuilder.release());
+
+ // The image filter MUST be set after the draw looper, because setting the draw looper will reset the image filter
Stephen White 2014/10/23 01:45:47 I think we should just have setDrawLooper leave th
sugoi1 2014/10/23 17:43:17 Done.
+ if (shadowTransformMode == DrawLooperBuilder::ShadowIgnoresTransforms
+ && shadowAlphaMode == DrawLooperBuilder::ShadowRespectsAlpha) {
Justin Novosad 2014/10/23 02:29:21 With this condition, you will regress performance
sugoi1 2014/10/23 17:43:17 This image filter will only be used to replace the
+ SkColor skColor = color.rgb();
+ const SkScalar sigma = 0.288675f * blur + 0.5f;
+ setImageFilter(adoptRef(SkDropShadowImageFilter::Create(offset.width(), offset.height(), sigma, sigma, skColor)));
Stephen White 2014/10/23 01:45:47 I think we should put this in a RefPtr<SkImageFilt
Justin Novosad 2014/10/23 02:29:21 You are not supporting the shadowMode==ShadowOnly
sugoi1 2014/10/23 17:43:17 Done.
sugoi1 2014/10/23 17:43:17 I'm not going to fix this now, so I'll skip this p
+ }
}
void GraphicsContext::setDrawLooper(PassOwnPtr<DrawLooperBuilder> drawLooperBuilder)
@@ -334,6 +343,8 @@ void GraphicsContext::setDrawLooper(PassOwnPtr<DrawLooperBuilder> drawLooperBuil
return;
mutableState()->setDrawLooper(drawLooperBuilder->detachDrawLooper());
+ // If the draw looper is overwritten externally, remove the image filter, as it is no longer equivalent to the draw looper
+ clearImageFilter();
Stephen White 2014/10/23 01:45:47 So if you agree with the above, remove this.
sugoi1 2014/10/23 17:43:17 Done.
}
void GraphicsContext::clearDrawLooper()
@@ -342,11 +353,29 @@ void GraphicsContext::clearDrawLooper()
return;
mutableState()->clearDrawLooper();
+ // If the draw looper is overwritten externally, remove the image filter, as it is no longer equivalent to the draw looper
+ clearImageFilter();
Stephen White 2014/10/23 01:45:47 And this.
sugoi1 2014/10/23 17:43:17 Done.
+}
+
+void GraphicsContext::setImageFilter(PassRefPtr<SkImageFilter> imageFilter)
+{
+ if (contextDisabled())
+ return;
+
+ mutableState()->setImageFilter(imageFilter);
+}
+
+void GraphicsContext::clearImageFilter()
+{
+ if (contextDisabled())
+ return;
+
+ mutableState()->clearImageFilter();
}
bool GraphicsContext::hasShadow() const
{
- return !!immutableState()->drawLooper();
+ return !!immutableState()->drawLooper() || !!immutableState()->imageFilter();
}
bool GraphicsContext::getTransformedClipBounds(FloatRect* bounds) const
@@ -1967,13 +1996,18 @@ void GraphicsContext::preparePaintForDrawRectToRect(
const SkRect& destRect,
CompositeOperator compositeOp,
WebBlendMode blendMode,
+ bool isOpaque,
bool isLazyDecoded,
bool isDataComplete) const
{
paint->setXfermodeMode(WebCoreCompositeToSkiaComposite(compositeOp, blendMode));
paint->setColorFilter(this->colorFilter());
paint->setAlpha(this->getNormalizedAlpha());
- paint->setLooper(this->drawLooper());
+ if (this->imageFilter() && !isOpaque) {
+ paint->setImageFilter(this->imageFilter());
+ } else {
+ paint->setLooper(this->drawLooper());
+ }
paint->setAntiAlias(shouldDrawAntiAliased(this, destRect));
InterpolationQuality resampling;

Powered by Google App Engine
This is Rietveld 408576698