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

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

Issue 15137009: Refactor shadow rendering logic. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: merge upstream changes Created 7 years, 7 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/core/platform/graphics/GraphicsContext.cpp
diff --git a/Source/core/platform/graphics/GraphicsContext.cpp b/Source/core/platform/graphics/GraphicsContext.cpp
index 47f89636c62eae4a8b8c930cf052031559dbe21c..188bf134c9c8211450ad0317a228be6c31a347ad 100644
--- a/Source/core/platform/graphics/GraphicsContext.cpp
+++ b/Source/core/platform/graphics/GraphicsContext.cpp
@@ -40,8 +40,8 @@
#include "third_party/skia/include/core/SkAnnotation.h"
#include "third_party/skia/include/core/SkColorFilter.h"
#include "third_party/skia/include/core/SkData.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
#include "third_party/skia/include/effects/SkBlurMaskFilter.h"
-#include "third_party/skia/include/effects/SkLayerDrawLooper.h"
#include <wtf/Assertions.h>
#include <wtf/MathExtras.h>
@@ -181,97 +181,47 @@ void GraphicsContext::setStrokeColor(const Color& color, ColorSpace colorSpace)
m_state->m_strokePattern.clear();
}
-void GraphicsContext::setShadow(const FloatSize& size, float blur, const Color& color, ColorSpace colorSpace)
+void GraphicsContext::setShadow(const FloatSize& offset, float blur, const Color& color, DrawLooper::ShadowAlphaMode shadowAlphaMode)
{
if (paintingDisabled())
return;
- m_state->m_shadowOffset = size;
- m_state->m_shadowBlur = blur;
- m_state->m_shadowColor = color;
- m_state->m_shadowColorSpace = colorSpace;
-
- // Detect when there's no effective shadow and clear the looper.
- if (!size.width() && !size.height() && !blur) {
- setDrawLooper(0);
+ if (!color.isValid() || !color.alpha() || (!offset.width() && !offset.height() && !blur)) {
+ clearShadow();
return;
}
- double width = size.width();
- double height = size.height();
-
- uint32_t mfFlags = SkBlurMaskFilter::kHighQuality_BlurFlag;
-
+ DrawLooper::ShadowTransformMode shadowTransformMode;
if (m_state->m_shadowsIgnoreTransforms)
- mfFlags |= SkBlurMaskFilter::kIgnoreTransform_BlurFlag;
-
- SkColor c;
- if (color.isValid())
- c = color.rgb();
+ shadowTransformMode = DrawLooper::ShadowIgnoresTransforms;
else
- c = SkColorSetARGB(0xFF/3, 0, 0, 0); // "std" apple shadow color.
-
- // TODO(tc): Should we have a max value for the blur? CG clamps at 1000.0
- // for perf reasons.
-
- SkLayerDrawLooper* dl = new SkLayerDrawLooper;
- SkAutoUnref aur(dl);
-
- // top layer, we just draw unchanged
- dl->addLayer();
-
- // lower layer contains our offset, blur, and colorfilter
- SkLayerDrawLooper::LayerInfo info;
-
- // Since CSS box-shadow ignores the original alpha, we used to default to kSrc_Mode here and
- // only switch to kDst_Mode for Canvas. But that precaution is not really necessary because
- // RenderBoxModelObject performs a dedicated shadow fill with opaque black to ensure
- // cross-platform consistent results.
- info.fColorMode = SkXfermode::kDst_Mode;
- info.fPaintBits |= SkLayerDrawLooper::kMaskFilter_Bit; // our blur
- info.fPaintBits |= SkLayerDrawLooper::kColorFilter_Bit;
- info.fOffset.set(width, height);
- info.fPostTranslate = m_state->m_shadowsIgnoreTransforms;
-
- SkMaskFilter* mf = SkBlurMaskFilter::Create((double)blur / 2.0, SkBlurMaskFilter::kNormal_BlurStyle, mfFlags);
+ shadowTransformMode = DrawLooper::ShadowRespectsTransforms;
- SkColorFilter* cf = SkColorFilter::CreateModeFilter(c, SkXfermode::kSrcIn_Mode);
+ DrawLooper drawLooper;
+ drawLooper.addUnmodifiedContent();
+ drawLooper.addShadow(offset, blur, color, shadowTransformMode, shadowAlphaMode);
+ setDrawLooper(drawLooper);
+}
- SkPaint* paint = dl->addLayer(info);
- SkSafeUnref(paint->setMaskFilter(mf));
- SkSafeUnref(paint->setColorFilter(cf));
+void GraphicsContext::setDrawLooper(DrawLooper& drawLooper)
+{
+ if (paintingDisabled())
+ return;
- // dl is now built, just install it
- setDrawLooper(dl);
+ setDrawLooper(drawLooper.skDrawLooper());
}
-void GraphicsContext::clearShadow()
+void GraphicsContext::clearDrawLooper()
{
if (paintingDisabled())
return;
- m_state->m_shadowOffset = FloatSize();
- m_state->m_shadowBlur = 0;
- m_state->m_shadowColor = Color();
- m_state->m_shadowColorSpace = ColorSpaceDeviceRGB;
-
setDrawLooper(0);
}
bool GraphicsContext::hasShadow() const
{
- return m_state->m_shadowColor.isValid() && m_state->m_shadowColor.alpha()
- && (m_state->m_shadowBlur || m_state->m_shadowOffset.width() || m_state->m_shadowOffset.height());
-}
-
-bool GraphicsContext::getShadow(FloatSize& offset, float& blur, Color& color, ColorSpace& colorSpace) const
-{
- offset = m_state->m_shadowOffset;
- blur = m_state->m_shadowBlur;
- color = m_state->m_shadowColor;
- colorSpace = m_state->m_shadowColorSpace;
-
- return hasShadow();
+ return !!m_state->m_looper;
}
float GraphicsContext::strokeThickness() const
« no previous file with comments | « Source/core/platform/graphics/GraphicsContext.h ('k') | Source/core/platform/graphics/GraphicsContextState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698