Commit b47924e0 authored by Aran Gilman's avatar Aran Gilman Committed by Commit Bot

Factor most Dark Mode code out of GraphicsContext.

This is a clean-up CL in preparation for adding an image-specific
filter.

Bug: 954318
Change-Id: I002e09c2ebd384c0f0d667dcb00eebc7550aee71
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1574629
Commit-Queue: Aran Gilman <gilmanmh@google.com>
Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Cr-Commit-Position: refs/heads/master@{#652679}
parent 92ecc62f
...@@ -892,6 +892,8 @@ jumbo_component("platform") { ...@@ -892,6 +892,8 @@ jumbo_component("platform") {
"graphics/dark_mode_bitmap_image_classifier.h", "graphics/dark_mode_bitmap_image_classifier.h",
"graphics/dark_mode_color_classifier.cc", "graphics/dark_mode_color_classifier.cc",
"graphics/dark_mode_color_classifier.h", "graphics/dark_mode_color_classifier.h",
"graphics/dark_mode_filter.cc",
"graphics/dark_mode_filter.h",
"graphics/dark_mode_settings.h", "graphics/dark_mode_settings.h",
"graphics/darkmode/darkmode_classifier.cc", "graphics/darkmode/darkmode_classifier.cc",
"graphics/darkmode/darkmode_classifier.h", "graphics/darkmode/darkmode_classifier.h",
......
#include "third_party/blink/renderer/platform/graphics/dark_mode_filter.h"
#include "third_party/skia/include/core/SkColorFilter.h"
#include "third_party/skia/include/effects/SkHighContrastFilter.h"
#include "third_party/skia/include/effects/SkTableColorFilter.h"
namespace blink {
DarkModeFilter::DarkModeFilter() : default_filter_(nullptr) {
settings_.mode = DarkMode::kOff;
settings_.image_policy = DarkModeImagePolicy::kFilterNone;
}
void DarkModeFilter::UpdateSettings(const DarkModeSettings& new_settings) {
settings_ = new_settings;
SkHighContrastConfig config;
switch (settings_.mode) {
case DarkMode::kOff:
default_filter_.reset(nullptr);
return;
case DarkMode::kSimpleInvertForTesting: {
uint8_t identity[256], invert[256];
for (int i = 0; i < 256; ++i) {
identity[i] = i;
invert[i] = 255 - i;
}
default_filter_ =
SkTableColorFilter::MakeARGB(identity, invert, invert, invert);
return;
}
case DarkMode::kInvertBrightness:
config.fInvertStyle =
SkHighContrastConfig::InvertStyle::kInvertBrightness;
break;
case DarkMode::kInvertLightness:
config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertLightness;
break;
}
config.fGrayscale = settings_.grayscale;
config.fContrast = settings_.contrast;
default_filter_ = SkHighContrastFilter::Make(config);
}
sk_sp<SkColorFilter> DarkModeFilter::GetColorFilter() {
return default_filter_;
}
bool DarkModeFilter::ShouldApplyToImage(Image& image,
const FloatRect& src_rect) {
if (!GetColorFilter())
return false;
switch (settings_.image_policy) {
case DarkModeImagePolicy::kFilterSmart:
return image.ShouldApplyDarkModeFilter(src_rect);
case DarkModeImagePolicy::kFilterAll:
return true;
default:
return false;
}
}
Color DarkModeFilter::Apply(const Color& color) {
sk_sp<SkColorFilter> filter = GetColorFilter();
if (!filter)
return color;
return Color(filter->filterColor(color.Rgb()));
}
} // namespace blink
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_DARK_MODE_FILTER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_DARK_MODE_FILTER_H_
#include "third_party/blink/renderer/platform/geometry/float_rect.h"
#include "third_party/blink/renderer/platform/graphics/color.h"
#include "third_party/blink/renderer/platform/graphics/dark_mode_settings.h"
#include "third_party/blink/renderer/platform/graphics/image.h"
#include "third_party/skia/include/core/SkRefCnt.h"
class SkColorFilter;
namespace blink {
class DarkModeFilter {
public:
DarkModeFilter();
const DarkModeSettings& settings() const { return settings_; }
void UpdateSettings(const DarkModeSettings& new_settings);
sk_sp<SkColorFilter> GetColorFilter();
bool ShouldApplyToImage(Image& image, const FloatRect& src_rect);
Color Apply(const Color& color);
private:
DarkModeSettings settings_;
sk_sp<SkColorFilter> default_filter_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_DARK_MODE_FILTER_H_
...@@ -64,16 +64,16 @@ class GraphicsContext::DarkModeFlags final { ...@@ -64,16 +64,16 @@ class GraphicsContext::DarkModeFlags final {
public: public:
// This helper's lifetime should never exceed |flags|'. // This helper's lifetime should never exceed |flags|'.
DarkModeFlags(const GraphicsContext* gc, const PaintFlags& flags) { DarkModeFlags(GraphicsContext* gc, const PaintFlags& flags) {
if (!gc->dark_mode_filter_) { sk_sp<SkColorFilter> filter = gc->dark_mode_filter_.GetColorFilter();
if (!filter) {
flags_ = &flags; flags_ = &flags;
} else { } else {
dark_mode_flags_ = flags; dark_mode_flags_ = flags;
if (flags.HasShader()) { if (flags.HasShader()) {
dark_mode_flags_->setColorFilter(gc->dark_mode_filter_); dark_mode_flags_->setColorFilter(filter);
} else { } else {
dark_mode_flags_->setColor( dark_mode_flags_->setColor(filter->filterColor(flags.getColor()));
gc->dark_mode_filter_->filterColor(flags.getColor()));
} }
flags_ = &dark_mode_flags_.value(); flags_ = &dark_mode_flags_.value();
...@@ -171,35 +171,7 @@ unsigned GraphicsContext::SaveCount() const { ...@@ -171,35 +171,7 @@ unsigned GraphicsContext::SaveCount() const {
#endif #endif
void GraphicsContext::SetDarkMode(const DarkModeSettings& settings) { void GraphicsContext::SetDarkMode(const DarkModeSettings& settings) {
dark_mode_settings_ = settings; dark_mode_filter_.UpdateSettings(settings);
SkHighContrastConfig config;
switch (dark_mode_settings_.mode) {
case DarkMode::kOff:
dark_mode_filter_.reset(nullptr);
return;
case DarkMode::kSimpleInvertForTesting: {
uint8_t identity[256], invert[256];
for (int i = 0; i < 256; ++i) {
identity[i] = i;
invert[i] = 255 - i;
}
dark_mode_filter_ =
SkTableColorFilter::MakeARGB(identity, invert, invert, invert);
return;
}
case DarkMode::kInvertBrightness:
config.fInvertStyle =
SkHighContrastConfig::InvertStyle::kInvertBrightness;
break;
case DarkMode::kInvertLightness:
config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertLightness;
break;
}
config.fGrayscale = dark_mode_settings_.grayscale;
config.fContrast = dark_mode_settings_.contrast;
dark_mode_filter_ = SkHighContrastFilter::Make(config);
} }
void GraphicsContext::SaveLayer(const SkRect* bounds, const PaintFlags* flags) { void GraphicsContext::SaveLayer(const SkRect* bounds, const PaintFlags* flags) {
...@@ -415,13 +387,15 @@ int GraphicsContext::FocusRingOutsetExtent(int offset, ...@@ -415,13 +387,15 @@ int GraphicsContext::FocusRingOutsetExtent(int offset,
void GraphicsContext::DrawFocusRingPath(const SkPath& path, void GraphicsContext::DrawFocusRingPath(const SkPath& path,
const Color& color, const Color& color,
float width) { float width) {
DrawPlatformFocusRing(path, canvas_, ApplyDarkModeFilter(color).Rgb(), width); DrawPlatformFocusRing(path, canvas_, dark_mode_filter_.Apply(color).Rgb(),
width);
} }
void GraphicsContext::DrawFocusRingRect(const SkRect& rect, void GraphicsContext::DrawFocusRingRect(const SkRect& rect,
const Color& color, const Color& color,
float width) { float width) {
DrawPlatformFocusRing(rect, canvas_, ApplyDarkModeFilter(color).Rgb(), width); DrawPlatformFocusRing(rect, canvas_, dark_mode_filter_.Apply(color).Rgb(),
width);
} }
void GraphicsContext::DrawFocusRing(const Path& focus_ring_path, void GraphicsContext::DrawFocusRing(const Path& focus_ring_path,
...@@ -496,7 +470,7 @@ void GraphicsContext::DrawInnerShadow(const FloatRoundedRect& rect, ...@@ -496,7 +470,7 @@ void GraphicsContext::DrawInnerShadow(const FloatRoundedRect& rect,
if (ContextDisabled()) if (ContextDisabled())
return; return;
Color shadow_color = ApplyDarkModeFilter(orig_shadow_color); Color shadow_color = dark_mode_filter_.Apply(orig_shadow_color);
FloatRect hole_rect(rect.Rect()); FloatRect hole_rect(rect.Rect());
hole_rect.Inflate(-shadow_spread); hole_rect.Inflate(-shadow_spread);
...@@ -899,8 +873,10 @@ void GraphicsContext::DrawImage( ...@@ -899,8 +873,10 @@ void GraphicsContext::DrawImage(
image_flags.setBlendMode(op); image_flags.setBlendMode(op);
image_flags.setColor(SK_ColorBLACK); image_flags.setColor(SK_ColorBLACK);
image_flags.setFilterQuality(ComputeFilterQuality(image, dest, src)); image_flags.setFilterQuality(ComputeFilterQuality(image, dest, src));
if (ShouldApplyDarkModeFilterToImage(*image, src)) if (dark_mode_filter_.ShouldApplyToImage(*image, src)) {
image_flags.setColorFilter(dark_mode_filter_); image_flags.setColorFilter(dark_mode_filter_.GetColorFilter());
}
image->Draw(canvas_, image_flags, dest, src, should_respect_image_orientation, image->Draw(canvas_, image_flags, dest, src, should_respect_image_orientation,
Image::kClampImageToSourceRect, decode_mode); Image::kClampImageToSourceRect, decode_mode);
paint_controller_.SetImagePainted(); paint_controller_.SetImagePainted();
...@@ -934,8 +910,9 @@ void GraphicsContext::DrawImageRRect( ...@@ -934,8 +910,9 @@ void GraphicsContext::DrawImageRRect(
image_flags.setColor(SK_ColorBLACK); image_flags.setColor(SK_ColorBLACK);
image_flags.setFilterQuality( image_flags.setFilterQuality(
ComputeFilterQuality(image, dest.Rect(), src_rect)); ComputeFilterQuality(image, dest.Rect(), src_rect));
if (ShouldApplyDarkModeFilterToImage(*image, src_rect)) if (dark_mode_filter_.ShouldApplyToImage(*image, src_rect)) {
image_flags.setColorFilter(dark_mode_filter_); image_flags.setColorFilter(dark_mode_filter_.GetColorFilter());
}
bool use_shader = (visible_src == src_rect) && bool use_shader = (visible_src == src_rect) &&
(respect_orientation == kDoNotRespectImageOrientation); (respect_orientation == kDoNotRespectImageOrientation);
...@@ -1145,7 +1122,7 @@ void GraphicsContext::FillDRRect(const FloatRoundedRect& outer, ...@@ -1145,7 +1122,7 @@ void GraphicsContext::FillDRRect(const FloatRoundedRect& outer,
canvas_->drawDRRect(outer, inner, ImmutableState()->FillFlags()); canvas_->drawDRRect(outer, inner, ImmutableState()->FillFlags());
} else { } else {
PaintFlags flags(ImmutableState()->FillFlags()); PaintFlags flags(ImmutableState()->FillFlags());
flags.setColor(ApplyDarkModeFilter(color).Rgb()); flags.setColor(dark_mode_filter_.Apply(color).Rgb());
canvas_->drawDRRect(outer, inner, flags); canvas_->drawDRRect(outer, inner, flags);
} }
...@@ -1158,7 +1135,7 @@ void GraphicsContext::FillDRRect(const FloatRoundedRect& outer, ...@@ -1158,7 +1135,7 @@ void GraphicsContext::FillDRRect(const FloatRoundedRect& outer,
stroke_r_rect.inset(stroke_width / 2, stroke_width / 2); stroke_r_rect.inset(stroke_width / 2, stroke_width / 2);
PaintFlags stroke_flags(ImmutableState()->FillFlags()); PaintFlags stroke_flags(ImmutableState()->FillFlags());
stroke_flags.setColor(ApplyDarkModeFilter(color).Rgb()); stroke_flags.setColor(dark_mode_filter_.Apply(color).Rgb());
stroke_flags.setStyle(PaintFlags::kStroke_Style); stroke_flags.setStyle(PaintFlags::kStroke_Style);
stroke_flags.setStrokeWidth(stroke_width); stroke_flags.setStrokeWidth(stroke_width);
...@@ -1353,7 +1330,7 @@ void GraphicsContext::FillRectWithRoundedHole( ...@@ -1353,7 +1330,7 @@ void GraphicsContext::FillRectWithRoundedHole(
return; return;
PaintFlags flags(ImmutableState()->FillFlags()); PaintFlags flags(ImmutableState()->FillFlags());
flags.setColor(ApplyDarkModeFilter(color).Rgb()); flags.setColor(dark_mode_filter_.Apply(color).Rgb());
canvas_->drawDRRect(SkRRect::MakeRect(rect), rounded_hole_rect, flags); canvas_->drawDRRect(SkRRect::MakeRect(rect), rounded_hole_rect, flags);
} }
...@@ -1399,26 +1376,4 @@ sk_sp<SkColorFilter> GraphicsContext::WebCoreColorFilterToSkiaColorFilter( ...@@ -1399,26 +1376,4 @@ sk_sp<SkColorFilter> GraphicsContext::WebCoreColorFilterToSkiaColorFilter(
return nullptr; return nullptr;
} }
bool GraphicsContext::ShouldApplyDarkModeFilterToImage(
Image& image,
const FloatRect& src_rect) {
if (!dark_mode_filter_)
return false;
switch (dark_mode_settings_.image_policy) {
case DarkModeImagePolicy::kFilterSmart:
return image.ShouldApplyDarkModeFilter(src_rect);
case DarkModeImagePolicy::kFilterAll:
return true;
default:
return false;
}
}
Color GraphicsContext::ApplyDarkModeFilter(const Color& input) const {
if (!dark_mode_filter_)
return input;
return Color(dark_mode_filter_->filterColor(input.Rgb()));
}
} // namespace blink } // namespace blink
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "cc/paint/node_holder.h" #include "cc/paint/node_holder.h"
#include "third_party/blink/renderer/platform/fonts/font.h" #include "third_party/blink/renderer/platform/fonts/font.h"
#include "third_party/blink/renderer/platform/graphics/dark_mode_filter.h"
#include "third_party/blink/renderer/platform/graphics/dark_mode_settings.h" #include "third_party/blink/renderer/platform/graphics/dark_mode_settings.h"
#include "third_party/blink/renderer/platform/graphics/dash_array.h" #include "third_party/blink/renderer/platform/graphics/dash_array.h"
#include "third_party/blink/renderer/platform/graphics/draw_looper_builder.h" #include "third_party/blink/renderer/platform/graphics/draw_looper_builder.h"
...@@ -88,7 +89,7 @@ class PLATFORM_EXPORT GraphicsContext { ...@@ -88,7 +89,7 @@ class PLATFORM_EXPORT GraphicsContext {
bool ContextDisabled() const { return disabled_state_; } bool ContextDisabled() const { return disabled_state_; }
const DarkModeSettings& dark_mode_settings() const { const DarkModeSettings& dark_mode_settings() const {
return dark_mode_settings_; return dark_mode_filter_.settings();
} }
// ---------- State management methods ----------------- // ---------- State management methods -----------------
...@@ -458,9 +459,6 @@ class PLATFORM_EXPORT GraphicsContext { ...@@ -458,9 +459,6 @@ class PLATFORM_EXPORT GraphicsContext {
const Color&); const Color&);
class DarkModeFlags; class DarkModeFlags;
bool ShouldApplyDarkModeFilterToImage(Image& image,
const FloatRect& src_rect);
Color ApplyDarkModeFilter(const Color& input) const;
// null indicates painting is contextDisabled. Never delete this object. // null indicates painting is contextDisabled. Never delete this object.
cc::PaintCanvas* canvas_; cc::PaintCanvas* canvas_;
...@@ -491,8 +489,8 @@ class PLATFORM_EXPORT GraphicsContext { ...@@ -491,8 +489,8 @@ class PLATFORM_EXPORT GraphicsContext {
float device_scale_factor_; float device_scale_factor_;
DarkModeSettings dark_mode_settings_; // TODO(gilmanmh): Investigate making this base::Optional<DarkModeFilter>
sk_sp<SkColorFilter> dark_mode_filter_; DarkModeFilter dark_mode_filter_;
unsigned printing_ : 1; unsigned printing_ : 1;
unsigned in_drawing_recorder_ : 1; unsigned in_drawing_recorder_ : 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment