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/SkGradientShader.h" | |
51 #include "third_party/skia/include/effects/SkLumaColorFilter.h" | 50 #include "third_party/skia/include/effects/SkLumaColorFilter.h" |
52 #include "third_party/skia/include/effects/SkPictureImageFilter.h" | 51 #include "third_party/skia/include/effects/SkPictureImageFilter.h" |
53 #include "third_party/skia/include/pathops/SkPathOps.h" | 52 #include "third_party/skia/include/pathops/SkPathOps.h" |
54 #include "third_party/skia/include/utils/SkNullCanvas.h" | 53 #include "third_party/skia/include/utils/SkNullCanvas.h" |
55 | 54 |
56 namespace blink { | 55 namespace blink { |
57 | 56 |
58 GraphicsContext::GraphicsContext(PaintController& paint_controller, | 57 GraphicsContext::GraphicsContext(PaintController& paint_controller, |
59 DisabledMode disable_context_or_painting, | 58 DisabledMode disable_context_or_painting, |
60 SkMetaData* meta_data) | 59 SkMetaData* meta_data) |
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 } else { | 533 } else { |
535 p1.SetX(p1.X() + width / 2.f); | 534 p1.SetX(p1.X() + width / 2.f); |
536 p2.SetX(p2.X() - width / 2.f); | 535 p2.SetX(p2.X() - width / 2.f); |
537 } | 536 } |
538 } | 537 } |
539 | 538 |
540 AdjustLineToPixelBoundaries(p1, p2, width, pen_style); | 539 AdjustLineToPixelBoundaries(p1, p2, width, pen_style); |
541 canvas_->drawLine(p1.X(), p1.Y(), p2.X(), p2.Y(), flags); | 540 canvas_->drawLine(p1.X(), p1.Y(), p2.X(), p2.Y(), flags); |
542 } | 541 } |
543 | 542 |
544 namespace { | |
545 | |
546 #if !OS(MACOSX) | |
547 | |
548 sk_sp<PaintRecord> RecordMarker( | |
549 GraphicsContext::DocumentMarkerLineStyle style) { | |
550 SkColor color = (style == GraphicsContext::kDocumentMarkerGrammarLineStyle) | |
551 ? SkColorSetRGB(0xC0, 0xC0, 0xC0) | |
552 : SK_ColorRED; | |
553 | |
554 // Record the path equivalent to this legacy pattern: | |
555 // X o o X o o X | |
556 // o X o o X o | |
557 | |
558 static const float kW = 4; | |
559 static const float kH = 2; | |
560 | |
561 // Adjust the phase such that f' == 0 is "pixel"-centered | |
562 // (for optimal rasterization at native rez). | |
563 SkPath path; | |
564 path.moveTo(kW * -3 / 8, kH * 3 / 4); | |
565 path.cubicTo(kW * -1 / 8, kH * 3 / 4, | |
566 kW * -1 / 8, kH * 1 / 4, | |
567 kW * 1 / 8, kH * 1 / 4); | |
568 path.cubicTo(kW * 3 / 8, kH * 1 / 4, | |
569 kW * 3 / 8, kH * 3 / 4, | |
570 kW * 5 / 8, kH * 3 / 4); | |
571 path.cubicTo(kW * 7 / 8, kH * 3 / 4, | |
572 kW * 7 / 8, kH * 1 / 4, | |
573 kW * 9 / 8, kH * 1 / 4); | |
574 | |
575 PaintFlags flags; | |
576 flags.setAntiAlias(true); | |
577 flags.setColor(color); | |
578 flags.setStyle(PaintFlags::kStroke_Style); | |
579 flags.setStrokeWidth(kH * 1 / 2); | |
580 | |
581 PaintRecorder recorder; | |
582 recorder.beginRecording(kW, kH); | |
583 recorder.getRecordingCanvas()->drawPath(path, flags); | |
584 | |
585 return recorder.finishRecordingAsPicture(); | |
586 } | |
587 | |
588 #else // OS(MACOSX) | |
589 | |
590 sk_sp<PaintRecord> RecordMarker( | |
591 GraphicsContext::DocumentMarkerLineStyle style) { | |
592 SkColor color = (style == GraphicsContext::kDocumentMarkerGrammarLineStyle) | |
593 ? SkColorSetRGB(0x6B, 0x6B, 0x6B) | |
594 : SkColorSetRGB(0xFB, 0x2D, 0x1D); | |
595 | |
596 // Match the artwork used by the Mac. | |
597 static const float kW = 4; | |
598 static const float kH = 3; | |
599 static const float kR = 1.5f; | |
600 | |
601 // top->bottom translucent gradient. | |
602 const SkColor colors[2] = { | |
603 SkColorSetARGB(0x48, | |
604 SkColorGetR(color), | |
605 SkColorGetG(color), | |
606 SkColorGetB(color)), | |
607 color | |
608 }; | |
609 const SkPoint pts[2] = { | |
610 SkPoint::Make(0, 0), | |
611 SkPoint::Make(0, 2 * kR) | |
612 }; | |
613 | |
614 PaintFlags flags; | |
615 flags.setAntiAlias(true); | |
616 flags.setColor(color); | |
617 flags.setShader(SkGradientShader::MakeLinear( | |
618 pts, colors, nullptr, ARRAY_SIZE(colors), SkShader::kClamp_TileMode)); | |
619 PaintRecorder recorder; | |
620 recorder.beginRecording(kW, kH); | |
621 recorder.getRecordingCanvas()->drawCircle(kR, kR, kR, flags); | |
622 | |
623 return recorder.finishRecordingAsPicture(); | |
624 } | |
625 | |
626 #endif // OS(MACOSX) | |
627 | |
628 } // anonymous ns | |
629 | |
630 void GraphicsContext::DrawLineForDocumentMarker(const FloatPoint& pt, | |
631 float width, | |
632 DocumentMarkerLineStyle style, | |
633 float zoom) { | |
634 if (ContextDisabled()) | |
635 return; | |
636 | |
637 DEFINE_STATIC_LOCAL( | |
638 PaintRecord*, spelling_marker, | |
639 (RecordMarker(kDocumentMarkerSpellingLineStyle).release())); | |
640 DEFINE_STATIC_LOCAL( | |
641 PaintRecord*, grammar_marker, | |
642 (RecordMarker(kDocumentMarkerGrammarLineStyle).release())); | |
643 const auto& marker = style == kDocumentMarkerSpellingLineStyle | |
644 ? spelling_marker | |
645 : grammar_marker; | |
646 | |
647 // Position already includes zoom and device scale factor. | |
648 SkScalar origin_x = WebCoreFloatToSkScalar(pt.X()); | |
649 SkScalar origin_y = WebCoreFloatToSkScalar(pt.Y()); | |
650 | |
651 #if OS(MACOSX) | |
652 // Make sure to draw only complete dots, and finish inside the marked text. | |
653 width -= fmodf(width, marker->cullRect().width() * zoom); | |
654 #else | |
655 // Offset it vertically by 1 so that there's some space under the text. | |
656 origin_y += 1; | |
657 #endif | |
658 | |
659 const auto rect = SkRect::MakeWH(width, marker->cullRect().height() * zoom); | |
660 const auto local_matrix = SkMatrix::MakeScale(zoom, zoom); | |
661 | |
662 PaintFlags flags; | |
663 flags.setAntiAlias(true); | |
664 flags.setShader(WrapSkShader(MakePaintShaderRecord( | |
665 sk_ref_sp(marker), SkShader::kRepeat_TileMode, SkShader::kClamp_TileMode, | |
666 &local_matrix, nullptr))); | |
667 | |
668 // Apply the origin translation as a global transform. This ensures that the | |
669 // shader local matrix depends solely on zoom => Skia can reuse the same | |
670 // cached tile for all markers at a given zoom level. | |
671 PaintCanvasAutoRestore acr(canvas_, true); | |
672 canvas_->translate(origin_x, origin_y); | |
673 canvas_->drawRect(rect, flags); | |
674 } | |
675 | |
676 void GraphicsContext::DrawLineForText(const FloatPoint& pt, float width) { | 543 void GraphicsContext::DrawLineForText(const FloatPoint& pt, float width) { |
677 if (ContextDisabled()) | 544 if (ContextDisabled()) |
678 return; | 545 return; |
679 | 546 |
680 if (width <= 0) | 547 if (width <= 0) |
681 return; | 548 return; |
682 | 549 |
683 PaintFlags flags; | 550 PaintFlags flags; |
684 switch (GetStrokeStyle()) { | 551 switch (GetStrokeStyle()) { |
685 case kNoStroke: | 552 case kNoStroke: |
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1361 break; | 1228 break; |
1362 default: | 1229 default: |
1363 NOTREACHED(); | 1230 NOTREACHED(); |
1364 break; | 1231 break; |
1365 } | 1232 } |
1366 | 1233 |
1367 return nullptr; | 1234 return nullptr; |
1368 } | 1235 } |
1369 | 1236 |
1370 } // namespace blink | 1237 } // namespace blink |
OLD | NEW |