OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. |
6 * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. | 6 * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 { | 101 { |
102 if (codePath(runInfo) == ComplexPath) { | 102 if (codePath(runInfo) == ComplexPath) { |
103 HarfBuzzShaper shaper(this, runInfo.run, (forTextEmphasis == ForTextEmph
asis) | 103 HarfBuzzShaper shaper(this, runInfo.run, (forTextEmphasis == ForTextEmph
asis) |
104 ? HarfBuzzShaper::ForTextEmphasis : HarfBuzzShaper::NotForTextEmphas
is); | 104 ? HarfBuzzShaper::ForTextEmphasis : HarfBuzzShaper::NotForTextEmphas
is); |
105 shaper.setDrawRange(runInfo.from, runInfo.to); | 105 shaper.setDrawRange(runInfo.from, runInfo.to); |
106 shaper.shape(&glyphBuffer); | 106 shaper.shape(&glyphBuffer); |
107 return shaper.totalWidth(); | 107 return shaper.totalWidth(); |
108 } | 108 } |
109 | 109 |
110 SimpleShaper shaper(this, runInfo.run, nullptr /* fallbackFonts */, | 110 SimpleShaper shaper(this, runInfo.run, nullptr /* fallbackFonts */, |
111 nullptr /* GlyphBounds */, forTextEmphasis); | 111 nullptr, forTextEmphasis); |
112 shaper.advance(runInfo.from); | 112 shaper.advance(runInfo.from); |
113 shaper.advance(runInfo.to, &glyphBuffer); | 113 shaper.advance(runInfo.to, &glyphBuffer); |
114 float width = shaper.runWidthSoFar(); | 114 float width = shaper.runWidthSoFar(); |
115 | 115 |
116 if (runInfo.run.rtl()) { | 116 if (runInfo.run.rtl()) { |
117 // Glyphs are shaped & stored in RTL advance order - reverse them for LT
R drawing. | 117 // Glyphs are shaped & stored in RTL advance order - reverse them for LT
R drawing. |
118 shaper.advance(runInfo.run.length()); | 118 shaper.advance(runInfo.run.length()); |
119 glyphBuffer.reverseForSimpleRTL(width, shaper.runWidthSoFar()); | 119 glyphBuffer.reverseForSimpleRTL(width, shaper.runWidthSoFar()); |
120 } | 120 } |
121 | 121 |
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 if ((textMode & TextModeStroke) && gc->hasStroke()) { | 779 if ((textMode & TextModeStroke) && gc->hasStroke()) { |
780 SkPaint paint = gc->strokePaint(); | 780 SkPaint paint = gc->strokePaint(); |
781 if (textMode & TextModeFill) | 781 if (textMode & TextModeFill) |
782 paint.setLooper(0); | 782 paint.setLooper(0); |
783 gc->drawTextBlob(blob, origin, paint); | 783 gc->drawTextBlob(blob, origin, paint); |
784 } | 784 } |
785 } | 785 } |
786 | 786 |
787 float Font::floatWidthForComplexText(const TextRun& run, HashSet<const SimpleFon
tData*>* fallbackFonts, IntRectOutsets* glyphBounds) const | 787 float Font::floatWidthForComplexText(const TextRun& run, HashSet<const SimpleFon
tData*>* fallbackFonts, IntRectOutsets* glyphBounds) const |
788 { | 788 { |
789 HarfBuzzShaper shaper(this, run, HarfBuzzShaper::NotForTextEmphasis, fallbac
kFonts); | 789 FloatRect bounds; |
| 790 HarfBuzzShaper shaper(this, run, HarfBuzzShaper::NotForTextEmphasis, fallbac
kFonts, glyphBounds ? &bounds : 0); |
790 if (!shaper.shape()) | 791 if (!shaper.shape()) |
791 return 0; | 792 return 0; |
792 | 793 |
793 glyphBounds->setTop(ceilf(-shaper.glyphBoundingBox().y())); | 794 glyphBounds->setTop(ceilf(-bounds.y())); |
794 glyphBounds->setBottom(ceilf(shaper.glyphBoundingBox().maxY())); | 795 glyphBounds->setBottom(ceilf(bounds.maxY())); |
795 glyphBounds->setLeft(std::max<int>(0, ceilf(-shaper.glyphBoundingBox().x()))
); | 796 glyphBounds->setLeft(std::max<int>(0, ceilf(-bounds.x()))); |
796 glyphBounds->setRight(std::max<int>(0, ceilf(shaper.glyphBoundingBox().maxX(
) - shaper.totalWidth()))); | 797 glyphBounds->setRight(std::max<int>(0, ceilf(bounds.maxX() - shaper.totalWid
th()))); |
797 | 798 |
798 return shaper.totalWidth(); | 799 return shaper.totalWidth(); |
799 } | 800 } |
800 | 801 |
801 // Return the code point index for the given |x| offset into the text run. | 802 // Return the code point index for the given |x| offset into the text run. |
802 int Font::offsetForPositionForComplexText(const TextRun& run, float xFloat, | 803 int Font::offsetForPositionForComplexText(const TextRun& run, float xFloat, |
803 bool includePartialGlyphs) const | 804 bool includePartialGlyphs) const |
804 { | 805 { |
805 HarfBuzzShaper shaper(this, run); | 806 HarfBuzzShaper shaper(this, run); |
806 if (!shaper.shape()) | 807 if (!shaper.shape()) |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 markBuffer.add(markGlyphData.glyph, markFontData, FloatPoint(- offse
tToMiddleOfGlyph(markFontData, markGlyphData.glyph), | 886 markBuffer.add(markGlyphData.glyph, markFontData, FloatPoint(- offse
tToMiddleOfGlyph(markFontData, markGlyphData.glyph), |
886 glyphBuffer.xOffsetAt(i) - offsetToMiddleOfGlyph(markFontData, m
arkGlyphData.glyph, Vertical))); | 887 glyphBuffer.xOffsetAt(i) - offsetToMiddleOfGlyph(markFontData, m
arkGlyphData.glyph, Vertical))); |
887 } | 888 } |
888 } | 889 } |
889 | 890 |
890 drawGlyphBuffer(context, runInfo, markBuffer, point); | 891 drawGlyphBuffer(context, runInfo, markBuffer, point); |
891 } | 892 } |
892 | 893 |
893 float Font::floatWidthForSimpleText(const TextRun& run, HashSet<const SimpleFont
Data*>* fallbackFonts, IntRectOutsets* glyphBounds) const | 894 float Font::floatWidthForSimpleText(const TextRun& run, HashSet<const SimpleFont
Data*>* fallbackFonts, IntRectOutsets* glyphBounds) const |
894 { | 895 { |
895 SimpleShaper::GlyphBounds bounds; | 896 FloatRect bounds; |
896 SimpleShaper shaper(this, run, fallbackFonts, glyphBounds ? &bounds : 0); | 897 SimpleShaper shaper(this, run, fallbackFonts, glyphBounds ? &bounds : 0); |
897 shaper.advance(run.length()); | 898 shaper.advance(run.length()); |
| 899 float runWidth = shaper.runWidthSoFar(); |
898 | 900 |
899 if (glyphBounds) { | 901 if (glyphBounds) { |
900 glyphBounds->setTop(ceilf(-bounds.minGlyphBoundingBoxY)); | 902 glyphBounds->setTop(ceilf(-bounds.y())); |
901 glyphBounds->setBottom(ceilf(bounds.maxGlyphBoundingBoxY)); | 903 glyphBounds->setBottom(ceilf(bounds.maxY())); |
902 glyphBounds->setLeft(ceilf(bounds.firstGlyphOverflow)); | 904 glyphBounds->setLeft(std::max<int>(0, ceilf(-bounds.x()))); |
903 glyphBounds->setRight(ceilf(bounds.lastGlyphOverflow)); | 905 glyphBounds->setRight(std::max<int>(0, ceilf(bounds.maxX() - runWidth)))
; |
904 } | 906 } |
905 | 907 return runWidth; |
906 return shaper.runWidthSoFar(); | |
907 } | 908 } |
908 | 909 |
909 FloatRect Font::selectionRectForSimpleText(const TextRun& run, const FloatPoint&
point, int h, int from, int to, bool accountForGlyphBounds) const | 910 FloatRect Font::selectionRectForSimpleText(const TextRun& run, const FloatPoint&
point, int h, int from, int to, bool accountForGlyphBounds) const |
910 { | 911 { |
911 SimpleShaper::GlyphBounds bounds; | 912 FloatRect bounds; |
912 SimpleShaper shaper(this, run, 0, accountForGlyphBounds ? &bounds : 0); | 913 SimpleShaper shaper(this, run, 0, accountForGlyphBounds ? &bounds : 0); |
913 shaper.advance(from); | 914 shaper.advance(from); |
914 float fromX = shaper.runWidthSoFar(); | 915 float fromX = shaper.runWidthSoFar(); |
915 shaper.advance(to); | 916 shaper.advance(to); |
916 float toX = shaper.runWidthSoFar(); | 917 float toX = shaper.runWidthSoFar(); |
917 | 918 |
918 if (run.rtl()) { | 919 if (run.rtl()) { |
919 shaper.advance(run.length()); | 920 shaper.advance(run.length()); |
920 float totalWidth = shaper.runWidthSoFar(); | 921 float totalWidth = shaper.runWidthSoFar(); |
921 float beforeWidth = fromX; | 922 float beforeWidth = fromX; |
922 float afterWidth = toX; | 923 float afterWidth = toX; |
923 fromX = totalWidth - afterWidth; | 924 fromX = totalWidth - afterWidth; |
924 toX = totalWidth - beforeWidth; | 925 toX = totalWidth - beforeWidth; |
925 } | 926 } |
926 | 927 |
927 return FloatRect(point.x() + fromX, | 928 return FloatRect(point.x() + fromX, |
928 accountForGlyphBounds ? bounds.minGlyphBoundingBoxY : point.y(), | 929 accountForGlyphBounds ? bounds.y(): point.y(), |
929 toX - fromX, | 930 toX - fromX, |
930 accountForGlyphBounds ? bounds.maxGlyphBoundingBoxY - bounds.minGlyphBou
ndingBoxY : h); | 931 accountForGlyphBounds ? bounds.maxY()- bounds.y(): h); |
931 } | 932 } |
932 | 933 |
933 int Font::offsetForPositionForSimpleText(const TextRun& run, float x, bool inclu
dePartialGlyphs) const | 934 int Font::offsetForPositionForSimpleText(const TextRun& run, float x, bool inclu
dePartialGlyphs) const |
934 { | 935 { |
935 float delta = x; | 936 float delta = x; |
936 | 937 |
937 SimpleShaper shaper(this, run); | 938 SimpleShaper shaper(this, run); |
938 unsigned offset; | 939 unsigned offset; |
939 if (run.rtl()) { | 940 if (run.rtl()) { |
940 delta -= floatWidthForSimpleText(run); | 941 delta -= floatWidthForSimpleText(run); |
(...skipping 25 matching lines...) Expand all Loading... |
966 if (delta <= 0) | 967 if (delta <= 0) |
967 break; | 968 break; |
968 } | 969 } |
969 } | 970 } |
970 } | 971 } |
971 | 972 |
972 return offset; | 973 return offset; |
973 } | 974 } |
974 | 975 |
975 } // namespace blink | 976 } // namespace blink |
OLD | NEW |