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

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

Issue 2878573003: Initial skeleton of high-contrast mode. (Closed)
Patch Set: Created 3 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: third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp
index 30a55cec58df16a5b07df1cab050bb37c76067c9..fd2cd6b915a916ed871945d632b3aa17f0496588 100644
--- a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp
@@ -47,8 +47,10 @@
#include "third_party/skia/include/core/SkData.h"
#include "third_party/skia/include/core/SkRRect.h"
#include "third_party/skia/include/core/SkRefCnt.h"
+#include "third_party/skia/include/effects/SkHighContrastFilter.h"
#include "third_party/skia/include/effects/SkLumaColorFilter.h"
#include "third_party/skia/include/effects/SkPictureImageFilter.h"
+#include "third_party/skia/include/effects/SkTableColorFilter.h"
#include "third_party/skia/include/pathops/SkPathOps.h"
#include "third_party/skia/include/utils/SkNullCanvas.h"
@@ -140,6 +142,41 @@ unsigned GraphicsContext::SaveCount() const {
}
#endif
+void GraphicsContext::SetHighContrast(const HighContrastSettings& settings) {
chrishtr 2017/06/01 04:10:51 PaintRecordBuilder, and a couple of other cases, c
dmazzoni 2017/06/01 21:44:01 OK, I made it an optional constructor parameter an
chrishtr 2017/06/02 21:12:30 Do you care about anything except the mainline cas
+ SkHighContrastConfig config;
+
+ switch (settings.mode) {
+ case HighContrastMode::kOff:
+ high_contrast_filter_.reset(nullptr);
+ return;
+ case HighContrastMode::kSimpleInvertForTesting: {
+ uint8_t identity[256], invert[256];
+ for (int i = 0; i < 256; ++i) {
+ identity[i] = i;
+ invert[i] = 255 - i;
+ }
+ high_contrast_filter_ =
+ SkTableColorFilter::MakeARGB(identity, invert, invert, invert);
+ return;
+ }
+ case HighContrastMode::kInvertBrightness:
+ config.fInvertStyle =
+ SkHighContrastConfig::InvertStyle::kInvertBrightness;
+ break;
+ case HighContrastMode::kInvertLightness:
+ config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertLightness;
+ break;
+ default:
chrishtr 2017/06/01 04:10:51 I don't think you need this, since there are label
dmazzoni 2017/06/01 21:44:01 Done.
+ NOTREACHED();
+ high_contrast_filter_.reset(nullptr);
+ return;
+ }
+
+ config.fGrayscale = settings.grayscale;
+ config.fContrast = settings.contrast;
+ high_contrast_filter_ = SkHighContrastFilter::Make(config);
+}
+
void GraphicsContext::SaveLayer(const SkRect* bounds, const PaintFlags* flags) {
if (ContextDisabled())
return;
@@ -351,13 +388,15 @@ int GraphicsContext::FocusRingOutsetExtent(int offset, int width) {
void GraphicsContext::DrawFocusRingPath(const SkPath& path,
const Color& color,
float width) {
- DrawPlatformFocusRing(path, canvas_, color.Rgb(), width);
+ DrawPlatformFocusRing(path, canvas_, ApplyHighContrastFilter(color).Rgb(),
+ width);
}
void GraphicsContext::DrawFocusRingRect(const SkRect& rect,
const Color& color,
float width) {
- DrawPlatformFocusRing(rect, canvas_, color.Rgb(), width);
+ DrawPlatformFocusRing(rect, canvas_, ApplyHighContrastFilter(color).Rgb(),
+ width);
}
void GraphicsContext::DrawFocusRing(const Path& focus_ring_path,
@@ -423,7 +462,7 @@ static inline FloatRect AreaCastingShadowInHole(
}
void GraphicsContext::DrawInnerShadow(const FloatRoundedRect& rect,
- const Color& shadow_color,
+ const Color& orig_shadow_color,
const FloatSize& shadow_offset,
float shadow_blur,
float shadow_spread,
@@ -431,6 +470,8 @@ void GraphicsContext::DrawInnerShadow(const FloatRoundedRect& rect,
if (ContextDisabled())
return;
+ Color shadow_color = ApplyHighContrastFilter(orig_shadow_color);
+
FloatRect hole_rect(rect.Rect());
hole_rect.Inflate(-shadow_spread);
@@ -537,7 +578,8 @@ void GraphicsContext::DrawLine(const IntPoint& point1, const IntPoint& point2) {
}
AdjustLineToPixelBoundaries(p1, p2, width, pen_style);
- canvas_->drawLine(p1.X(), p1.Y(), p2.X(), p2.Y(), flags);
+ canvas_->drawLine(p1.X(), p1.Y(), p2.X(), p2.Y(),
+ ApplyHighContrastFilter(&flags));
}
void GraphicsContext::DrawLineForText(const FloatPoint& pt, float width) {
@@ -614,8 +656,10 @@ void GraphicsContext::DrawTextInternal(const Font& font,
if (ContextDisabled())
return;
- if (font.DrawText(canvas_, text_info, point, device_scale_factor_, flags))
+ if (font.DrawText(canvas_, text_info, point, device_scale_factor_,
+ ApplyHighContrastFilter(&flags))) {
paint_controller_.SetTextPainted();
+ }
}
void GraphicsContext::DrawText(const Font& font,
@@ -659,7 +703,8 @@ void GraphicsContext::DrawTextInternal(const Font& font,
return;
DrawTextPasses([&font, &text_info, &point, this](const PaintFlags& flags) {
- if (font.DrawText(canvas_, text_info, point, device_scale_factor_, flags))
+ if (font.DrawText(canvas_, text_info, point, device_scale_factor_,
+ ApplyHighContrastFilter(&flags)))
paint_controller_.SetTextPainted();
});
}
@@ -687,7 +732,8 @@ void GraphicsContext::DrawEmphasisMarksInternal(const Font& font,
DrawTextPasses(
[&font, &text_info, &mark, &point, this](const PaintFlags& flags) {
font.DrawEmphasisMarks(canvas_, text_info, mark, point,
- device_scale_factor_, flags);
+ device_scale_factor_,
+ ApplyHighContrastFilter(&flags));
});
}
@@ -717,7 +763,7 @@ void GraphicsContext::DrawBidiText(
this](const PaintFlags& flags) {
if (font.DrawBidiText(canvas_, run_info, point,
custom_font_not_ready_action, device_scale_factor_,
- flags))
+ ApplyHighContrastFilter(&flags)))
paint_controller_.SetTextPainted();
});
}
@@ -871,7 +917,7 @@ void GraphicsContext::DrawOval(const SkRect& oval, const PaintFlags& flags) {
return;
DCHECK(canvas_);
- canvas_->drawOval(oval, flags);
+ canvas_->drawOval(oval, ApplyHighContrastFilter(&flags));
}
void GraphicsContext::DrawPath(const SkPath& path, const PaintFlags& flags) {
@@ -879,7 +925,7 @@ void GraphicsContext::DrawPath(const SkPath& path, const PaintFlags& flags) {
return;
DCHECK(canvas_);
- canvas_->drawPath(path, flags);
+ canvas_->drawPath(path, ApplyHighContrastFilter(&flags));
}
void GraphicsContext::DrawRect(const SkRect& rect, const PaintFlags& flags) {
@@ -887,7 +933,7 @@ void GraphicsContext::DrawRect(const SkRect& rect, const PaintFlags& flags) {
return;
DCHECK(canvas_);
- canvas_->drawRect(rect, flags);
+ canvas_->drawRect(rect, ApplyHighContrastFilter(&flags));
}
void GraphicsContext::DrawRRect(const SkRRect& rrect, const PaintFlags& flags) {
@@ -895,7 +941,7 @@ void GraphicsContext::DrawRRect(const SkRRect& rrect, const PaintFlags& flags) {
return;
DCHECK(canvas_);
- canvas_->drawRRect(rrect, flags);
+ canvas_->drawRRect(rrect, ApplyHighContrastFilter(&flags));
}
void GraphicsContext::FillPath(const Path& path_to_fill) {
@@ -1015,7 +1061,7 @@ void GraphicsContext::FillDRRect(const FloatRoundedRect& outer,
canvas_->drawDRRect(outer, inner, ImmutableState()->FillFlags());
} else {
PaintFlags flags(ImmutableState()->FillFlags());
- flags.setColor(color.Rgb());
+ flags.setColor(ApplyHighContrastFilter(color).Rgb());
canvas_->drawDRRect(outer, inner, flags);
}
@@ -1028,7 +1074,7 @@ void GraphicsContext::FillDRRect(const FloatRoundedRect& outer,
stroke_r_rect.inset(stroke_width / 2, stroke_width / 2);
PaintFlags stroke_flags(ImmutableState()->FillFlags());
- stroke_flags.setColor(color.Rgb());
+ stroke_flags.setColor(ApplyHighContrastFilter(color).Rgb());
stroke_flags.setStyle(PaintFlags::kStroke_Style);
stroke_flags.setStrokeWidth(stroke_width);
@@ -1220,7 +1266,7 @@ void GraphicsContext::FillRectWithRoundedHole(
return;
PaintFlags flags(ImmutableState()->FillFlags());
- flags.setColor(color.Rgb());
+ flags.setColor(ApplyHighContrastFilter(color).Rgb());
canvas_->drawDRRect(SkRRect::MakeRect(rect), rounded_hole_rect, flags);
}
@@ -1277,4 +1323,31 @@ sk_sp<SkColorFilter> GraphicsContext::WebCoreColorFilterToSkiaColorFilter(
return nullptr;
}
+Color GraphicsContext::ApplyHighContrastFilter(const Color& input) const {
+ if (!high_contrast_filter_)
+ return input;
+
+ SkColor sk_input =
+ SkColorSetARGB(input.Alpha(), input.Red(), input.Green(), input.Blue());
+ SkColor sk_output = high_contrast_filter_->filterColor(sk_input);
+ return Color(MakeRGBA(SkColorGetR(sk_output), SkColorGetG(sk_output),
+ SkColorGetB(sk_output), SkColorGetA(sk_output)));
+}
+
+PaintFlags GraphicsContext::ApplyHighContrastFilter(
+ const PaintFlags* input) const {
+ if (input && !high_contrast_filter_)
+ return *input;
+
+ PaintFlags output;
+ if (input)
+ output = *input;
+ if (output.getShader()) {
+ output.setColorFilter(high_contrast_filter_);
+ } else {
+ output.setColor(high_contrast_filter_->filterColor(output.getColor()));
+ }
+ return output;
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698