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

Side by Side Diff: third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp

Issue 2889653002: Remove cullRect() from PaintOpBuffer. (Closed)
Patch Set: movecullrect2 rebase-once-and-for-all 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/paint/InlineTextBoxPainter.h" 5 #include "core/paint/InlineTextBoxPainter.h"
6 6
7 #include "core/editing/CompositionUnderline.h" 7 #include "core/editing/CompositionUnderline.h"
8 #include "core/editing/Editor.h" 8 #include "core/editing/Editor.h"
9 #include "core/editing/markers/DocumentMarkerController.h" 9 #include "core/editing/markers/DocumentMarkerController.h"
10 #include "core/frame/LocalFrame.h" 10 #include "core/frame/LocalFrame.h"
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 default: 699 default:
700 NOTREACHED(); 700 NOTREACHED();
701 } 701 }
702 } 702 }
703 } 703 }
704 704
705 namespace { 705 namespace {
706 706
707 #if !OS(MACOSX) 707 #if !OS(MACOSX)
708 708
709 static const float kMarkerWidth = 4;
710 static const float kMarkerHeight = 2;
711
709 sk_sp<PaintRecord> RecordMarker(DocumentMarker::MarkerType marker_type) { 712 sk_sp<PaintRecord> RecordMarker(DocumentMarker::MarkerType marker_type) {
710 SkColor color = (marker_type == DocumentMarker::kGrammar) 713 SkColor color = (marker_type == DocumentMarker::kGrammar)
711 ? SkColorSetRGB(0xC0, 0xC0, 0xC0) 714 ? SkColorSetRGB(0xC0, 0xC0, 0xC0)
712 : SK_ColorRED; 715 : SK_ColorRED;
713 716
714 // Record the path equivalent to this legacy pattern: 717 // Record the path equivalent to this legacy pattern:
715 // X o o X o o X 718 // X o o X o o X
716 // o X o o X o 719 // o X o o X o
717 720
718 static const float kW = 4;
719 static const float kH = 2;
720
721 // Adjust the phase such that f' == 0 is "pixel"-centered 721 // Adjust the phase such that f' == 0 is "pixel"-centered
722 // (for optimal rasterization at native rez). 722 // (for optimal rasterization at native rez).
723 SkPath path; 723 SkPath path;
724 path.moveTo(kW * -3 / 8, kH * 3 / 4); 724 path.moveTo(kMarkerWidth * -3 / 8, kMarkerHeight * 3 / 4);
725 path.cubicTo(kW * -1 / 8, kH * 3 / 4, 725 path.cubicTo(kMarkerWidth * -1 / 8, kMarkerHeight * 3 / 4,
726 kW * -1 / 8, kH * 1 / 4, 726 kMarkerWidth * -1 / 8, kMarkerHeight * 1 / 4,
727 kW * 1 / 8, kH * 1 / 4); 727 kMarkerWidth * 1 / 8, kMarkerHeight * 1 / 4);
728 path.cubicTo(kW * 3 / 8, kH * 1 / 4, 728 path.cubicTo(kMarkerWidth * 3 / 8, kMarkerHeight * 1 / 4,
729 kW * 3 / 8, kH * 3 / 4, 729 kMarkerWidth * 3 / 8, kMarkerHeight * 3 / 4,
730 kW * 5 / 8, kH * 3 / 4); 730 kMarkerWidth * 5 / 8, kMarkerHeight * 3 / 4);
731 path.cubicTo(kW * 7 / 8, kH * 3 / 4, 731 path.cubicTo(kMarkerWidth * 7 / 8, kMarkerHeight * 3 / 4,
732 kW * 7 / 8, kH * 1 / 4, 732 kMarkerWidth * 7 / 8, kMarkerHeight * 1 / 4,
733 kW * 9 / 8, kH * 1 / 4); 733 kMarkerWidth * 9 / 8, kMarkerHeight * 1 / 4);
734 734
735 PaintFlags flags; 735 PaintFlags flags;
736 flags.setAntiAlias(true); 736 flags.setAntiAlias(true);
737 flags.setColor(color); 737 flags.setColor(color);
738 flags.setStyle(PaintFlags::kStroke_Style); 738 flags.setStyle(PaintFlags::kStroke_Style);
739 flags.setStrokeWidth(kH * 1 / 2); 739 flags.setStrokeWidth(kMarkerHeight * 1 / 2);
740 740
741 PaintRecorder recorder; 741 PaintRecorder recorder;
742 recorder.beginRecording(kW, kH); 742 recorder.beginRecording(kMarkerWidth, kMarkerHeight);
743 recorder.getRecordingCanvas()->drawPath(path, flags); 743 recorder.getRecordingCanvas()->drawPath(path, flags);
744 744
745 return recorder.finishRecordingAsPicture(); 745 return recorder.finishRecordingAsPicture();
746 } 746 }
747 747
748 #else // OS(MACOSX) 748 #else // OS(MACOSX)
749 749
750 static const float kMarkerWidth = 4;
751 static const float kMarkerHeight = 3;
752
750 sk_sp<PaintRecord> RecordMarker(DocumentMarker::MarkerType marker_type) { 753 sk_sp<PaintRecord> RecordMarker(DocumentMarker::MarkerType marker_type) {
751 SkColor color = (marker_type == DocumentMarker::kGrammar) 754 SkColor color = (marker_type == DocumentMarker::kGrammar)
752 ? SkColorSetRGB(0x6B, 0x6B, 0x6B) 755 ? SkColorSetRGB(0x6B, 0x6B, 0x6B)
753 : SkColorSetRGB(0xFB, 0x2D, 0x1D); 756 : SkColorSetRGB(0xFB, 0x2D, 0x1D);
754 757
755 // Match the artwork used by the Mac. 758 // Match the artwork used by the Mac.
756 static const float kW = 4;
757 static const float kH = 3;
758 static const float kR = 1.5f; 759 static const float kR = 1.5f;
759 760
760 // top->bottom translucent gradient. 761 // top->bottom translucent gradient.
761 const SkColor colors[2] = { 762 const SkColor colors[2] = {
762 SkColorSetARGB(0x48, 763 SkColorSetARGB(0x48,
763 SkColorGetR(color), 764 SkColorGetR(color),
764 SkColorGetG(color), 765 SkColorGetG(color),
765 SkColorGetB(color)), 766 SkColorGetB(color)),
766 color 767 color
767 }; 768 };
768 const SkPoint pts[2] = { 769 const SkPoint pts[2] = {
769 SkPoint::Make(0, 0), 770 SkPoint::Make(0, 0),
770 SkPoint::Make(0, 2 * kR) 771 SkPoint::Make(0, 2 * kR)
771 }; 772 };
772 773
773 PaintFlags flags; 774 PaintFlags flags;
774 flags.setAntiAlias(true); 775 flags.setAntiAlias(true);
775 flags.setColor(color); 776 flags.setColor(color);
776 flags.setShader(SkGradientShader::MakeLinear( 777 flags.setShader(SkGradientShader::MakeLinear(
777 pts, colors, nullptr, ARRAY_SIZE(colors), SkShader::kClamp_TileMode)); 778 pts, colors, nullptr, ARRAY_SIZE(colors), SkShader::kClamp_TileMode));
778 PaintRecorder recorder; 779 PaintRecorder recorder;
779 recorder.beginRecording(kW, kH); 780 recorder.beginRecording(kMarkerWidth, kMarkerHeight);
780 recorder.getRecordingCanvas()->drawCircle(kR, kR, kR, flags); 781 recorder.getRecordingCanvas()->drawCircle(kR, kR, kR, flags);
781 782
782 return recorder.finishRecordingAsPicture(); 783 return recorder.finishRecordingAsPicture();
783 } 784 }
784 785
785 #endif // OS(MACOSX) 786 #endif // OS(MACOSX)
786 787
787 void DrawDocumentMarker(GraphicsContext& context, 788 void DrawDocumentMarker(GraphicsContext& context,
788 const FloatPoint& pt, 789 const FloatPoint& pt,
789 float width, 790 float width,
790 DocumentMarker::MarkerType marker_type, 791 DocumentMarker::MarkerType marker_type,
791 float zoom) { 792 float zoom) {
792 DCHECK(marker_type == DocumentMarker::kSpelling || 793 DCHECK(marker_type == DocumentMarker::kSpelling ||
793 marker_type == DocumentMarker::kGrammar); 794 marker_type == DocumentMarker::kGrammar);
794 795
795 DEFINE_STATIC_LOCAL(PaintRecord*, spelling_marker, 796 DEFINE_STATIC_LOCAL(PaintRecord*, spelling_marker,
796 (RecordMarker(DocumentMarker::kSpelling).release())); 797 (RecordMarker(DocumentMarker::kSpelling).release()));
797 DEFINE_STATIC_LOCAL(PaintRecord*, grammar_marker, 798 DEFINE_STATIC_LOCAL(PaintRecord*, grammar_marker,
798 (RecordMarker(DocumentMarker::kGrammar).release())); 799 (RecordMarker(DocumentMarker::kGrammar).release()));
799 const auto& marker = marker_type == DocumentMarker::kSpelling 800 const auto& marker = marker_type == DocumentMarker::kSpelling
800 ? spelling_marker 801 ? spelling_marker
801 : grammar_marker; 802 : grammar_marker;
802 803
803 // Position already includes zoom and device scale factor. 804 // Position already includes zoom and device scale factor.
804 SkScalar origin_x = WebCoreFloatToSkScalar(pt.X()); 805 SkScalar origin_x = WebCoreFloatToSkScalar(pt.X());
805 SkScalar origin_y = WebCoreFloatToSkScalar(pt.Y()); 806 SkScalar origin_y = WebCoreFloatToSkScalar(pt.Y());
806 807
807 #if OS(MACOSX) 808 #if OS(MACOSX)
808 // Make sure to draw only complete dots, and finish inside the marked text. 809 // Make sure to draw only complete dots, and finish inside the marked text.
809 width -= fmodf(width, marker->cullRect().width() * zoom); 810 width -= fmodf(width, kMarkerWidth * zoom);
810 #else 811 #else
811 // Offset it vertically by 1 so that there's some space under the text. 812 // Offset it vertically by 1 so that there's some space under the text.
812 origin_y += 1; 813 origin_y += 1;
813 #endif 814 #endif
814 815
815 const auto rect = SkRect::MakeWH(width, marker->cullRect().height() * zoom); 816 const auto rect = SkRect::MakeWH(width, kMarkerHeight * zoom);
816 const auto local_matrix = SkMatrix::MakeScale(zoom, zoom); 817 const auto local_matrix = SkMatrix::MakeScale(zoom, zoom);
817 818
818 PaintFlags flags; 819 PaintFlags flags;
819 flags.setAntiAlias(true); 820 flags.setAntiAlias(true);
820 flags.setShader(WrapSkShader(MakePaintShaderRecord( 821 flags.setShader(WrapSkShader(MakePaintShaderRecord(
821 sk_ref_sp(marker), SkShader::kRepeat_TileMode, SkShader::kClamp_TileMode, 822 sk_ref_sp(marker), FloatRect(0, 0, kMarkerWidth, kMarkerHeight),
822 &local_matrix, nullptr))); 823 SkShader::kRepeat_TileMode, SkShader::kClamp_TileMode, &local_matrix)));
823 824
824 // Apply the origin translation as a global transform. This ensures that the 825 // Apply the origin translation as a global transform. This ensures that the
825 // shader local matrix depends solely on zoom => Skia can reuse the same 826 // shader local matrix depends solely on zoom => Skia can reuse the same
826 // cached tile for all markers at a given zoom level. 827 // cached tile for all markers at a given zoom level.
827 GraphicsContextStateSaver saver(context); 828 GraphicsContextStateSaver saver(context);
828 context.Translate(origin_x, origin_y); 829 context.Translate(origin_x, origin_y);
829 context.DrawRect(rect, flags); 830 context.DrawRect(rect, flags);
830 } 831 }
831 832
832 } // anonymous ns 833 } // anonymous ns
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 1181
1181 LayoutRect box_rect(box_origin, LayoutSize(inline_text_box_.LogicalWidth(), 1182 LayoutRect box_rect(box_origin, LayoutSize(inline_text_box_.LogicalWidth(),
1182 inline_text_box_.LogicalHeight())); 1183 inline_text_box_.LogicalHeight()));
1183 context.Clip(FloatRect(box_rect)); 1184 context.Clip(FloatRect(box_rect));
1184 context.DrawHighlightForText(font, run, FloatPoint(box_origin), 1185 context.DrawHighlightForText(font, run, FloatPoint(box_origin),
1185 box_rect.Height().ToInt(), color, 1186 box_rect.Height().ToInt(), color,
1186 paint_offsets.first, paint_offsets.second); 1187 paint_offsets.first, paint_offsets.second);
1187 } 1188 }
1188 1189
1189 } // namespace blink 1190 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698