Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 40 #include "platform/instrumentation/tracing/TraceEvent.h" | 40 #include "platform/instrumentation/tracing/TraceEvent.h" |
| 41 #include "platform/weborigin/KURL.h" | 41 #include "platform/weborigin/KURL.h" |
| 42 #include "platform/wtf/Assertions.h" | 42 #include "platform/wtf/Assertions.h" |
| 43 #include "platform/wtf/MathExtras.h" | 43 #include "platform/wtf/MathExtras.h" |
| 44 #include "skia/ext/platform_canvas.h" | 44 #include "skia/ext/platform_canvas.h" |
| 45 #include "third_party/skia/include/core/SkAnnotation.h" | 45 #include "third_party/skia/include/core/SkAnnotation.h" |
| 46 #include "third_party/skia/include/core/SkColorFilter.h" | 46 #include "third_party/skia/include/core/SkColorFilter.h" |
| 47 #include "third_party/skia/include/core/SkData.h" | 47 #include "third_party/skia/include/core/SkData.h" |
| 48 #include "third_party/skia/include/core/SkRRect.h" | 48 #include "third_party/skia/include/core/SkRRect.h" |
| 49 #include "third_party/skia/include/core/SkRefCnt.h" | 49 #include "third_party/skia/include/core/SkRefCnt.h" |
| 50 #include "third_party/skia/include/effects/SkHighContrastFilter.h" | |
| 50 #include "third_party/skia/include/effects/SkLumaColorFilter.h" | 51 #include "third_party/skia/include/effects/SkLumaColorFilter.h" |
| 51 #include "third_party/skia/include/effects/SkPictureImageFilter.h" | 52 #include "third_party/skia/include/effects/SkPictureImageFilter.h" |
| 53 #include "third_party/skia/include/effects/SkTableColorFilter.h" | |
| 52 #include "third_party/skia/include/pathops/SkPathOps.h" | 54 #include "third_party/skia/include/pathops/SkPathOps.h" |
| 53 #include "third_party/skia/include/utils/SkNullCanvas.h" | 55 #include "third_party/skia/include/utils/SkNullCanvas.h" |
| 54 | 56 |
| 55 namespace blink { | 57 namespace blink { |
| 56 | 58 |
| 57 GraphicsContext::GraphicsContext(PaintController& paint_controller, | 59 GraphicsContext::GraphicsContext(PaintController& paint_controller, |
| 58 DisabledMode disable_context_or_painting, | 60 DisabledMode disable_context_or_painting, |
| 59 SkMetaData* meta_data) | 61 SkMetaData* meta_data) |
| 60 : canvas_(nullptr), | 62 : canvas_(nullptr), |
| 61 paint_controller_(paint_controller), | 63 paint_controller_(paint_controller), |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 133 // (on top of its own saveCount), except for the first frame. | 135 // (on top of its own saveCount), except for the first frame. |
| 134 unsigned count = paint_state_index_; | 136 unsigned count = paint_state_index_; |
| 135 DCHECK_GE(paint_state_stack_.size(), paint_state_index_); | 137 DCHECK_GE(paint_state_stack_.size(), paint_state_index_); |
| 136 for (unsigned i = 0; i <= paint_state_index_; ++i) | 138 for (unsigned i = 0; i <= paint_state_index_; ++i) |
| 137 count += paint_state_stack_[i]->SaveCount(); | 139 count += paint_state_stack_[i]->SaveCount(); |
| 138 | 140 |
| 139 return count; | 141 return count; |
| 140 } | 142 } |
| 141 #endif | 143 #endif |
| 142 | 144 |
| 145 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
| |
| 146 SkHighContrastConfig config; | |
| 147 | |
| 148 switch (settings.mode) { | |
| 149 case HighContrastMode::kOff: | |
| 150 high_contrast_filter_.reset(nullptr); | |
| 151 return; | |
| 152 case HighContrastMode::kSimpleInvertForTesting: { | |
| 153 uint8_t identity[256], invert[256]; | |
| 154 for (int i = 0; i < 256; ++i) { | |
| 155 identity[i] = i; | |
| 156 invert[i] = 255 - i; | |
| 157 } | |
| 158 high_contrast_filter_ = | |
| 159 SkTableColorFilter::MakeARGB(identity, invert, invert, invert); | |
| 160 return; | |
| 161 } | |
| 162 case HighContrastMode::kInvertBrightness: | |
| 163 config.fInvertStyle = | |
| 164 SkHighContrastConfig::InvertStyle::kInvertBrightness; | |
| 165 break; | |
| 166 case HighContrastMode::kInvertLightness: | |
| 167 config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertLightness; | |
| 168 break; | |
| 169 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.
| |
| 170 NOTREACHED(); | |
| 171 high_contrast_filter_.reset(nullptr); | |
| 172 return; | |
| 173 } | |
| 174 | |
| 175 config.fGrayscale = settings.grayscale; | |
| 176 config.fContrast = settings.contrast; | |
| 177 high_contrast_filter_ = SkHighContrastFilter::Make(config); | |
| 178 } | |
| 179 | |
| 143 void GraphicsContext::SaveLayer(const SkRect* bounds, const PaintFlags* flags) { | 180 void GraphicsContext::SaveLayer(const SkRect* bounds, const PaintFlags* flags) { |
| 144 if (ContextDisabled()) | 181 if (ContextDisabled()) |
| 145 return; | 182 return; |
| 146 | 183 |
| 147 DCHECK(canvas_); | 184 DCHECK(canvas_); |
| 148 canvas_->saveLayer(bounds, flags); | 185 canvas_->saveLayer(bounds, flags); |
| 149 } | 186 } |
| 150 | 187 |
| 151 void GraphicsContext::RestoreLayer() { | 188 void GraphicsContext::RestoreLayer() { |
| 152 if (ContextDisabled()) | 189 if (ContextDisabled()) |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 344 int GraphicsContext::FocusRingOutsetExtent(int offset, int width) { | 381 int GraphicsContext::FocusRingOutsetExtent(int offset, int width) { |
| 345 // Unlike normal outlines (whole width is outside of the offset), focus | 382 // Unlike normal outlines (whole width is outside of the offset), focus |
| 346 // rings are drawn with the center of the path aligned with the offset, so | 383 // rings are drawn with the center of the path aligned with the offset, so |
| 347 // only half of the width is outside of the offset. | 384 // only half of the width is outside of the offset. |
| 348 return AdjustedFocusRingOffset(offset) + (width + 1) / 2; | 385 return AdjustedFocusRingOffset(offset) + (width + 1) / 2; |
| 349 } | 386 } |
| 350 | 387 |
| 351 void GraphicsContext::DrawFocusRingPath(const SkPath& path, | 388 void GraphicsContext::DrawFocusRingPath(const SkPath& path, |
| 352 const Color& color, | 389 const Color& color, |
| 353 float width) { | 390 float width) { |
| 354 DrawPlatformFocusRing(path, canvas_, color.Rgb(), width); | 391 DrawPlatformFocusRing(path, canvas_, ApplyHighContrastFilter(color).Rgb(), |
| 392 width); | |
| 355 } | 393 } |
| 356 | 394 |
| 357 void GraphicsContext::DrawFocusRingRect(const SkRect& rect, | 395 void GraphicsContext::DrawFocusRingRect(const SkRect& rect, |
| 358 const Color& color, | 396 const Color& color, |
| 359 float width) { | 397 float width) { |
| 360 DrawPlatformFocusRing(rect, canvas_, color.Rgb(), width); | 398 DrawPlatformFocusRing(rect, canvas_, ApplyHighContrastFilter(color).Rgb(), |
| 399 width); | |
| 361 } | 400 } |
| 362 | 401 |
| 363 void GraphicsContext::DrawFocusRing(const Path& focus_ring_path, | 402 void GraphicsContext::DrawFocusRing(const Path& focus_ring_path, |
| 364 float width, | 403 float width, |
| 365 int offset, | 404 int offset, |
| 366 const Color& color) { | 405 const Color& color) { |
| 367 // FIXME: Implement support for offset. | 406 // FIXME: Implement support for offset. |
| 368 if (ContextDisabled()) | 407 if (ContextDisabled()) |
| 369 return; | 408 return; |
| 370 | 409 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 416 | 455 |
| 417 if (shadow_spread < 0) | 456 if (shadow_spread < 0) |
| 418 bounds.Inflate(-shadow_spread); | 457 bounds.Inflate(-shadow_spread); |
| 419 | 458 |
| 420 FloatRect offset_bounds = bounds; | 459 FloatRect offset_bounds = bounds; |
| 421 offset_bounds.Move(-shadow_offset); | 460 offset_bounds.Move(-shadow_offset); |
| 422 return UnionRect(bounds, offset_bounds); | 461 return UnionRect(bounds, offset_bounds); |
| 423 } | 462 } |
| 424 | 463 |
| 425 void GraphicsContext::DrawInnerShadow(const FloatRoundedRect& rect, | 464 void GraphicsContext::DrawInnerShadow(const FloatRoundedRect& rect, |
| 426 const Color& shadow_color, | 465 const Color& orig_shadow_color, |
| 427 const FloatSize& shadow_offset, | 466 const FloatSize& shadow_offset, |
| 428 float shadow_blur, | 467 float shadow_blur, |
| 429 float shadow_spread, | 468 float shadow_spread, |
| 430 Edges clipped_edges) { | 469 Edges clipped_edges) { |
| 431 if (ContextDisabled()) | 470 if (ContextDisabled()) |
| 432 return; | 471 return; |
| 433 | 472 |
| 473 Color shadow_color = ApplyHighContrastFilter(orig_shadow_color); | |
| 474 | |
| 434 FloatRect hole_rect(rect.Rect()); | 475 FloatRect hole_rect(rect.Rect()); |
| 435 hole_rect.Inflate(-shadow_spread); | 476 hole_rect.Inflate(-shadow_spread); |
| 436 | 477 |
| 437 if (hole_rect.IsEmpty()) { | 478 if (hole_rect.IsEmpty()) { |
| 438 FillRoundedRect(rect, shadow_color); | 479 FillRoundedRect(rect, shadow_color); |
| 439 return; | 480 return; |
| 440 } | 481 } |
| 441 | 482 |
| 442 if (clipped_edges & kLeftEdge) { | 483 if (clipped_edges & kLeftEdge) { |
| 443 hole_rect.Move(-std::max(shadow_offset.Width(), 0.0f) - shadow_blur, 0); | 484 hole_rect.Move(-std::max(shadow_offset.Width(), 0.0f) - shadow_blur, 0); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 530 if (is_vertical_line) { | 571 if (is_vertical_line) { |
| 531 p1.SetY(p1.Y() + width / 2.f); | 572 p1.SetY(p1.Y() + width / 2.f); |
| 532 p2.SetY(p2.Y() - width / 2.f); | 573 p2.SetY(p2.Y() - width / 2.f); |
| 533 } else { | 574 } else { |
| 534 p1.SetX(p1.X() + width / 2.f); | 575 p1.SetX(p1.X() + width / 2.f); |
| 535 p2.SetX(p2.X() - width / 2.f); | 576 p2.SetX(p2.X() - width / 2.f); |
| 536 } | 577 } |
| 537 } | 578 } |
| 538 | 579 |
| 539 AdjustLineToPixelBoundaries(p1, p2, width, pen_style); | 580 AdjustLineToPixelBoundaries(p1, p2, width, pen_style); |
| 540 canvas_->drawLine(p1.X(), p1.Y(), p2.X(), p2.Y(), flags); | 581 canvas_->drawLine(p1.X(), p1.Y(), p2.X(), p2.Y(), |
| 582 ApplyHighContrastFilter(&flags)); | |
| 541 } | 583 } |
| 542 | 584 |
| 543 void GraphicsContext::DrawLineForText(const FloatPoint& pt, float width) { | 585 void GraphicsContext::DrawLineForText(const FloatPoint& pt, float width) { |
| 544 if (ContextDisabled()) | 586 if (ContextDisabled()) |
| 545 return; | 587 return; |
| 546 | 588 |
| 547 if (width <= 0) | 589 if (width <= 0) |
| 548 return; | 590 return; |
| 549 | 591 |
| 550 PaintFlags flags; | 592 PaintFlags flags; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 607 } | 649 } |
| 608 | 650 |
| 609 template <typename TextPaintInfo> | 651 template <typename TextPaintInfo> |
| 610 void GraphicsContext::DrawTextInternal(const Font& font, | 652 void GraphicsContext::DrawTextInternal(const Font& font, |
| 611 const TextPaintInfo& text_info, | 653 const TextPaintInfo& text_info, |
| 612 const FloatPoint& point, | 654 const FloatPoint& point, |
| 613 const PaintFlags& flags) { | 655 const PaintFlags& flags) { |
| 614 if (ContextDisabled()) | 656 if (ContextDisabled()) |
| 615 return; | 657 return; |
| 616 | 658 |
| 617 if (font.DrawText(canvas_, text_info, point, device_scale_factor_, flags)) | 659 if (font.DrawText(canvas_, text_info, point, device_scale_factor_, |
| 660 ApplyHighContrastFilter(&flags))) { | |
| 618 paint_controller_.SetTextPainted(); | 661 paint_controller_.SetTextPainted(); |
| 662 } | |
| 619 } | 663 } |
| 620 | 664 |
| 621 void GraphicsContext::DrawText(const Font& font, | 665 void GraphicsContext::DrawText(const Font& font, |
| 622 const TextRunPaintInfo& text_info, | 666 const TextRunPaintInfo& text_info, |
| 623 const FloatPoint& point, | 667 const FloatPoint& point, |
| 624 const PaintFlags& flags) { | 668 const PaintFlags& flags) { |
| 625 DrawTextInternal(font, text_info, point, flags); | 669 DrawTextInternal(font, text_info, point, flags); |
| 626 } | 670 } |
| 627 | 671 |
| 628 void GraphicsContext::DrawText(const Font& font, | 672 void GraphicsContext::DrawText(const Font& font, |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 652 } | 696 } |
| 653 | 697 |
| 654 template <typename TextPaintInfo> | 698 template <typename TextPaintInfo> |
| 655 void GraphicsContext::DrawTextInternal(const Font& font, | 699 void GraphicsContext::DrawTextInternal(const Font& font, |
| 656 const TextPaintInfo& text_info, | 700 const TextPaintInfo& text_info, |
| 657 const FloatPoint& point) { | 701 const FloatPoint& point) { |
| 658 if (ContextDisabled()) | 702 if (ContextDisabled()) |
| 659 return; | 703 return; |
| 660 | 704 |
| 661 DrawTextPasses([&font, &text_info, &point, this](const PaintFlags& flags) { | 705 DrawTextPasses([&font, &text_info, &point, this](const PaintFlags& flags) { |
| 662 if (font.DrawText(canvas_, text_info, point, device_scale_factor_, flags)) | 706 if (font.DrawText(canvas_, text_info, point, device_scale_factor_, |
| 707 ApplyHighContrastFilter(&flags))) | |
| 663 paint_controller_.SetTextPainted(); | 708 paint_controller_.SetTextPainted(); |
| 664 }); | 709 }); |
| 665 } | 710 } |
| 666 | 711 |
| 667 void GraphicsContext::DrawText(const Font& font, | 712 void GraphicsContext::DrawText(const Font& font, |
| 668 const TextRunPaintInfo& text_info, | 713 const TextRunPaintInfo& text_info, |
| 669 const FloatPoint& point) { | 714 const FloatPoint& point) { |
| 670 DrawTextInternal(font, text_info, point); | 715 DrawTextInternal(font, text_info, point); |
| 671 } | 716 } |
| 672 | 717 |
| 673 void GraphicsContext::DrawText(const Font& font, | 718 void GraphicsContext::DrawText(const Font& font, |
| 674 const TextFragmentPaintInfo& text_info, | 719 const TextFragmentPaintInfo& text_info, |
| 675 const FloatPoint& point) { | 720 const FloatPoint& point) { |
| 676 DrawTextInternal(font, text_info, point); | 721 DrawTextInternal(font, text_info, point); |
| 677 } | 722 } |
| 678 | 723 |
| 679 template <typename TextPaintInfo> | 724 template <typename TextPaintInfo> |
| 680 void GraphicsContext::DrawEmphasisMarksInternal(const Font& font, | 725 void GraphicsContext::DrawEmphasisMarksInternal(const Font& font, |
| 681 const TextPaintInfo& text_info, | 726 const TextPaintInfo& text_info, |
| 682 const AtomicString& mark, | 727 const AtomicString& mark, |
| 683 const FloatPoint& point) { | 728 const FloatPoint& point) { |
| 684 if (ContextDisabled()) | 729 if (ContextDisabled()) |
| 685 return; | 730 return; |
| 686 | 731 |
| 687 DrawTextPasses( | 732 DrawTextPasses( |
| 688 [&font, &text_info, &mark, &point, this](const PaintFlags& flags) { | 733 [&font, &text_info, &mark, &point, this](const PaintFlags& flags) { |
| 689 font.DrawEmphasisMarks(canvas_, text_info, mark, point, | 734 font.DrawEmphasisMarks(canvas_, text_info, mark, point, |
| 690 device_scale_factor_, flags); | 735 device_scale_factor_, |
| 736 ApplyHighContrastFilter(&flags)); | |
| 691 }); | 737 }); |
| 692 } | 738 } |
| 693 | 739 |
| 694 void GraphicsContext::DrawEmphasisMarks(const Font& font, | 740 void GraphicsContext::DrawEmphasisMarks(const Font& font, |
| 695 const TextRunPaintInfo& text_info, | 741 const TextRunPaintInfo& text_info, |
| 696 const AtomicString& mark, | 742 const AtomicString& mark, |
| 697 const FloatPoint& point) { | 743 const FloatPoint& point) { |
| 698 DrawEmphasisMarksInternal(font, text_info, mark, point); | 744 DrawEmphasisMarksInternal(font, text_info, mark, point); |
| 699 } | 745 } |
| 700 | 746 |
| 701 void GraphicsContext::DrawEmphasisMarks(const Font& font, | 747 void GraphicsContext::DrawEmphasisMarks(const Font& font, |
| 702 const TextFragmentPaintInfo& text_info, | 748 const TextFragmentPaintInfo& text_info, |
| 703 const AtomicString& mark, | 749 const AtomicString& mark, |
| 704 const FloatPoint& point) { | 750 const FloatPoint& point) { |
| 705 DrawEmphasisMarksInternal(font, text_info, mark, point); | 751 DrawEmphasisMarksInternal(font, text_info, mark, point); |
| 706 } | 752 } |
| 707 | 753 |
| 708 void GraphicsContext::DrawBidiText( | 754 void GraphicsContext::DrawBidiText( |
| 709 const Font& font, | 755 const Font& font, |
| 710 const TextRunPaintInfo& run_info, | 756 const TextRunPaintInfo& run_info, |
| 711 const FloatPoint& point, | 757 const FloatPoint& point, |
| 712 Font::CustomFontNotReadyAction custom_font_not_ready_action) { | 758 Font::CustomFontNotReadyAction custom_font_not_ready_action) { |
| 713 if (ContextDisabled()) | 759 if (ContextDisabled()) |
| 714 return; | 760 return; |
| 715 | 761 |
| 716 DrawTextPasses([&font, &run_info, &point, custom_font_not_ready_action, | 762 DrawTextPasses([&font, &run_info, &point, custom_font_not_ready_action, |
| 717 this](const PaintFlags& flags) { | 763 this](const PaintFlags& flags) { |
| 718 if (font.DrawBidiText(canvas_, run_info, point, | 764 if (font.DrawBidiText(canvas_, run_info, point, |
| 719 custom_font_not_ready_action, device_scale_factor_, | 765 custom_font_not_ready_action, device_scale_factor_, |
| 720 flags)) | 766 ApplyHighContrastFilter(&flags))) |
| 721 paint_controller_.SetTextPainted(); | 767 paint_controller_.SetTextPainted(); |
| 722 }); | 768 }); |
| 723 } | 769 } |
| 724 | 770 |
| 725 void GraphicsContext::DrawHighlightForText(const Font& font, | 771 void GraphicsContext::DrawHighlightForText(const Font& font, |
| 726 const TextRun& run, | 772 const TextRun& run, |
| 727 const FloatPoint& point, | 773 const FloatPoint& point, |
| 728 int h, | 774 int h, |
| 729 const Color& background_color, | 775 const Color& background_color, |
| 730 int from, | 776 int from, |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 864 image->DrawTiledBorder(*this, dest, src_rect, tile_scale_factor, h_rule, | 910 image->DrawTiledBorder(*this, dest, src_rect, tile_scale_factor, h_rule, |
| 865 v_rule, op); | 911 v_rule, op); |
| 866 paint_controller_.SetImagePainted(); | 912 paint_controller_.SetImagePainted(); |
| 867 } | 913 } |
| 868 | 914 |
| 869 void GraphicsContext::DrawOval(const SkRect& oval, const PaintFlags& flags) { | 915 void GraphicsContext::DrawOval(const SkRect& oval, const PaintFlags& flags) { |
| 870 if (ContextDisabled()) | 916 if (ContextDisabled()) |
| 871 return; | 917 return; |
| 872 DCHECK(canvas_); | 918 DCHECK(canvas_); |
| 873 | 919 |
| 874 canvas_->drawOval(oval, flags); | 920 canvas_->drawOval(oval, ApplyHighContrastFilter(&flags)); |
| 875 } | 921 } |
| 876 | 922 |
| 877 void GraphicsContext::DrawPath(const SkPath& path, const PaintFlags& flags) { | 923 void GraphicsContext::DrawPath(const SkPath& path, const PaintFlags& flags) { |
| 878 if (ContextDisabled()) | 924 if (ContextDisabled()) |
| 879 return; | 925 return; |
| 880 DCHECK(canvas_); | 926 DCHECK(canvas_); |
| 881 | 927 |
| 882 canvas_->drawPath(path, flags); | 928 canvas_->drawPath(path, ApplyHighContrastFilter(&flags)); |
| 883 } | 929 } |
| 884 | 930 |
| 885 void GraphicsContext::DrawRect(const SkRect& rect, const PaintFlags& flags) { | 931 void GraphicsContext::DrawRect(const SkRect& rect, const PaintFlags& flags) { |
| 886 if (ContextDisabled()) | 932 if (ContextDisabled()) |
| 887 return; | 933 return; |
| 888 DCHECK(canvas_); | 934 DCHECK(canvas_); |
| 889 | 935 |
| 890 canvas_->drawRect(rect, flags); | 936 canvas_->drawRect(rect, ApplyHighContrastFilter(&flags)); |
| 891 } | 937 } |
| 892 | 938 |
| 893 void GraphicsContext::DrawRRect(const SkRRect& rrect, const PaintFlags& flags) { | 939 void GraphicsContext::DrawRRect(const SkRRect& rrect, const PaintFlags& flags) { |
| 894 if (ContextDisabled()) | 940 if (ContextDisabled()) |
| 895 return; | 941 return; |
| 896 DCHECK(canvas_); | 942 DCHECK(canvas_); |
| 897 | 943 |
| 898 canvas_->drawRRect(rrect, flags); | 944 canvas_->drawRRect(rrect, ApplyHighContrastFilter(&flags)); |
| 899 } | 945 } |
| 900 | 946 |
| 901 void GraphicsContext::FillPath(const Path& path_to_fill) { | 947 void GraphicsContext::FillPath(const Path& path_to_fill) { |
| 902 if (ContextDisabled() || path_to_fill.IsEmpty()) | 948 if (ContextDisabled() || path_to_fill.IsEmpty()) |
| 903 return; | 949 return; |
| 904 | 950 |
| 905 DrawPath(path_to_fill.GetSkPath(), ImmutableState()->FillFlags()); | 951 DrawPath(path_to_fill.GetSkPath(), ImmutableState()->FillFlags()); |
| 906 } | 952 } |
| 907 | 953 |
| 908 void GraphicsContext::FillRect(const FloatRect& rect) { | 954 void GraphicsContext::FillRect(const FloatRect& rect) { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1008 const Color& color) { | 1054 const Color& color) { |
| 1009 if (ContextDisabled()) | 1055 if (ContextDisabled()) |
| 1010 return; | 1056 return; |
| 1011 DCHECK(canvas_); | 1057 DCHECK(canvas_); |
| 1012 | 1058 |
| 1013 if (!IsSimpleDRRect(outer, inner)) { | 1059 if (!IsSimpleDRRect(outer, inner)) { |
| 1014 if (color == FillColor()) { | 1060 if (color == FillColor()) { |
| 1015 canvas_->drawDRRect(outer, inner, ImmutableState()->FillFlags()); | 1061 canvas_->drawDRRect(outer, inner, ImmutableState()->FillFlags()); |
| 1016 } else { | 1062 } else { |
| 1017 PaintFlags flags(ImmutableState()->FillFlags()); | 1063 PaintFlags flags(ImmutableState()->FillFlags()); |
| 1018 flags.setColor(color.Rgb()); | 1064 flags.setColor(ApplyHighContrastFilter(color).Rgb()); |
| 1019 canvas_->drawDRRect(outer, inner, flags); | 1065 canvas_->drawDRRect(outer, inner, flags); |
| 1020 } | 1066 } |
| 1021 | 1067 |
| 1022 return; | 1068 return; |
| 1023 } | 1069 } |
| 1024 | 1070 |
| 1025 // We can draw this as a stroked rrect. | 1071 // We can draw this as a stroked rrect. |
| 1026 float stroke_width = inner.Rect().X() - outer.Rect().X(); | 1072 float stroke_width = inner.Rect().X() - outer.Rect().X(); |
| 1027 SkRRect stroke_r_rect = outer; | 1073 SkRRect stroke_r_rect = outer; |
| 1028 stroke_r_rect.inset(stroke_width / 2, stroke_width / 2); | 1074 stroke_r_rect.inset(stroke_width / 2, stroke_width / 2); |
| 1029 | 1075 |
| 1030 PaintFlags stroke_flags(ImmutableState()->FillFlags()); | 1076 PaintFlags stroke_flags(ImmutableState()->FillFlags()); |
| 1031 stroke_flags.setColor(color.Rgb()); | 1077 stroke_flags.setColor(ApplyHighContrastFilter(color).Rgb()); |
| 1032 stroke_flags.setStyle(PaintFlags::kStroke_Style); | 1078 stroke_flags.setStyle(PaintFlags::kStroke_Style); |
| 1033 stroke_flags.setStrokeWidth(stroke_width); | 1079 stroke_flags.setStrokeWidth(stroke_width); |
| 1034 | 1080 |
| 1035 canvas_->drawRRect(stroke_r_rect, stroke_flags); | 1081 canvas_->drawRRect(stroke_r_rect, stroke_flags); |
| 1036 } | 1082 } |
| 1037 | 1083 |
| 1038 void GraphicsContext::FillEllipse(const FloatRect& ellipse) { | 1084 void GraphicsContext::FillEllipse(const FloatRect& ellipse) { |
| 1039 if (ContextDisabled()) | 1085 if (ContextDisabled()) |
| 1040 return; | 1086 return; |
| 1041 | 1087 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1213 } | 1259 } |
| 1214 | 1260 |
| 1215 void GraphicsContext::FillRectWithRoundedHole( | 1261 void GraphicsContext::FillRectWithRoundedHole( |
| 1216 const FloatRect& rect, | 1262 const FloatRect& rect, |
| 1217 const FloatRoundedRect& rounded_hole_rect, | 1263 const FloatRoundedRect& rounded_hole_rect, |
| 1218 const Color& color) { | 1264 const Color& color) { |
| 1219 if (ContextDisabled()) | 1265 if (ContextDisabled()) |
| 1220 return; | 1266 return; |
| 1221 | 1267 |
| 1222 PaintFlags flags(ImmutableState()->FillFlags()); | 1268 PaintFlags flags(ImmutableState()->FillFlags()); |
| 1223 flags.setColor(color.Rgb()); | 1269 flags.setColor(ApplyHighContrastFilter(color).Rgb()); |
| 1224 canvas_->drawDRRect(SkRRect::MakeRect(rect), rounded_hole_rect, flags); | 1270 canvas_->drawDRRect(SkRRect::MakeRect(rect), rounded_hole_rect, flags); |
| 1225 } | 1271 } |
| 1226 | 1272 |
| 1227 void GraphicsContext::AdjustLineToPixelBoundaries(FloatPoint& p1, | 1273 void GraphicsContext::AdjustLineToPixelBoundaries(FloatPoint& p1, |
| 1228 FloatPoint& p2, | 1274 FloatPoint& p2, |
| 1229 float stroke_width, | 1275 float stroke_width, |
| 1230 StrokeStyle pen_style) { | 1276 StrokeStyle pen_style) { |
| 1231 // For odd widths, we add in 0.5 to the appropriate x/y so that the float | 1277 // For odd widths, we add in 0.5 to the appropriate x/y so that the float |
| 1232 // arithmetic works out. For example, with a border width of 3, WebKit will | 1278 // arithmetic works out. For example, with a border width of 3, WebKit will |
| 1233 // pass us (y1+y2)/2, e.g., (50+53)/2 = 103/2 = 51 when we want 51.5. It is | 1279 // pass us (y1+y2)/2, e.g., (50+53)/2 = 103/2 = 51 when we want 51.5. It is |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1270 case kColorFilterNone: | 1316 case kColorFilterNone: |
| 1271 break; | 1317 break; |
| 1272 default: | 1318 default: |
| 1273 NOTREACHED(); | 1319 NOTREACHED(); |
| 1274 break; | 1320 break; |
| 1275 } | 1321 } |
| 1276 | 1322 |
| 1277 return nullptr; | 1323 return nullptr; |
| 1278 } | 1324 } |
| 1279 | 1325 |
| 1326 Color GraphicsContext::ApplyHighContrastFilter(const Color& input) const { | |
| 1327 if (!high_contrast_filter_) | |
| 1328 return input; | |
| 1329 | |
| 1330 SkColor sk_input = | |
| 1331 SkColorSetARGB(input.Alpha(), input.Red(), input.Green(), input.Blue()); | |
| 1332 SkColor sk_output = high_contrast_filter_->filterColor(sk_input); | |
| 1333 return Color(MakeRGBA(SkColorGetR(sk_output), SkColorGetG(sk_output), | |
| 1334 SkColorGetB(sk_output), SkColorGetA(sk_output))); | |
| 1335 } | |
| 1336 | |
| 1337 PaintFlags GraphicsContext::ApplyHighContrastFilter( | |
| 1338 const PaintFlags* input) const { | |
| 1339 if (input && !high_contrast_filter_) | |
| 1340 return *input; | |
| 1341 | |
| 1342 PaintFlags output; | |
| 1343 if (input) | |
| 1344 output = *input; | |
| 1345 if (output.getShader()) { | |
| 1346 output.setColorFilter(high_contrast_filter_); | |
| 1347 } else { | |
| 1348 output.setColor(high_contrast_filter_->filterColor(output.getColor())); | |
| 1349 } | |
| 1350 return output; | |
| 1351 } | |
| 1352 | |
| 1280 } // namespace blink | 1353 } // namespace blink |
| OLD | NEW |