OLD | NEW |
1 /** | 1 /** |
2 * Copyright (C) 2003, 2006, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2006, 2010 Apple Inc. All rights reserved. |
3 * Copyright (C) 2008 Holger Hans Peter Freyther | 3 * Copyright (C) 2008 Holger Hans Peter Freyther |
4 * Copyright (C) 2009 Torch Mobile, Inc. | 4 * Copyright (C) 2009 Torch Mobile, Inc. |
5 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
(...skipping 10 matching lines...) Expand all Loading... |
21 */ | 21 */ |
22 | 22 |
23 #include "config.h" | 23 #include "config.h" |
24 #include "core/platform/graphics/Font.h" | 24 #include "core/platform/graphics/Font.h" |
25 | 25 |
26 #include "core/platform/graphics/FontCache.h" | 26 #include "core/platform/graphics/FontCache.h" |
27 #include "core/platform/graphics/FontFallbackList.h" | 27 #include "core/platform/graphics/FontFallbackList.h" |
28 #include "core/platform/graphics/GlyphPageTreeNode.h" | 28 #include "core/platform/graphics/GlyphPageTreeNode.h" |
29 #include "core/platform/graphics/SimpleFontData.h" | 29 #include "core/platform/graphics/SimpleFontData.h" |
30 #include "core/platform/graphics/WidthIterator.h" | 30 #include "core/platform/graphics/WidthIterator.h" |
| 31 #include "platform/LayoutUnit.h" |
31 #include "platform/fonts/GlyphBuffer.h" | 32 #include "platform/fonts/GlyphBuffer.h" |
32 #include "platform/geometry/FloatRect.h" | 33 #include "platform/geometry/FloatRect.h" |
33 #include "platform/graphics/TextRun.h" | 34 #include "platform/graphics/TextRun.h" |
34 #include "wtf/MainThread.h" | 35 #include "wtf/MainThread.h" |
35 #include "wtf/MathExtras.h" | 36 #include "wtf/MathExtras.h" |
36 #include "wtf/unicode/CharacterNames.h" | 37 #include "wtf/unicode/CharacterNames.h" |
37 #include "wtf/unicode/Unicode.h" | 38 #include "wtf/unicode/Unicode.h" |
38 | 39 |
39 using namespace WTF; | 40 using namespace WTF; |
40 using namespace Unicode; | 41 using namespace Unicode; |
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 | 550 |
550 FloatRect Font::selectionRectForSimpleText(const TextRun& run, const FloatPoint&
point, int h, int from, int to) const | 551 FloatRect Font::selectionRectForSimpleText(const TextRun& run, const FloatPoint&
point, int h, int from, int to) const |
551 { | 552 { |
552 GlyphBuffer glyphBuffer; | 553 GlyphBuffer glyphBuffer; |
553 WidthIterator it(this, run); | 554 WidthIterator it(this, run); |
554 it.advance(from, &glyphBuffer); | 555 it.advance(from, &glyphBuffer); |
555 float beforeWidth = it.m_runWidthSoFar; | 556 float beforeWidth = it.m_runWidthSoFar; |
556 it.advance(to, &glyphBuffer); | 557 it.advance(to, &glyphBuffer); |
557 float afterWidth = it.m_runWidthSoFar; | 558 float afterWidth = it.m_runWidthSoFar; |
558 | 559 |
559 // Using roundf() rather than ceilf() for the right edge as a compromise to
ensure correct caret positioning. | 560 // Using roundf() rather than ceilf() for the right edge as a compromise to |
| 561 // ensure correct caret positioning. |
| 562 // Use LayoutUnit::epsilon() to ensure that values that cannot be stored as |
| 563 // an integer are floored to n and not n-1 due to floating point imprecision
. |
560 if (run.rtl()) { | 564 if (run.rtl()) { |
561 it.advance(run.length(), &glyphBuffer); | 565 it.advance(run.length(), &glyphBuffer); |
562 float totalWidth = it.m_runWidthSoFar; | 566 float totalWidth = it.m_runWidthSoFar; |
563 return FloatRect(floorf(point.x() + totalWidth - afterWidth), point.y(),
roundf(point.x() + totalWidth - beforeWidth) - floorf(point.x() + totalWidth -
afterWidth), h); | 567 float pixelAlignedX = floorf(point.x() + totalWidth - afterWidth + Layou
tUnit::epsilon()); |
| 568 return FloatRect(pixelAlignedX, point.y(), |
| 569 roundf(point.x() + totalWidth - beforeWidth) - pixelAlignedX, h); |
564 } | 570 } |
565 | 571 |
566 return FloatRect(floorf(point.x() + beforeWidth), point.y(), roundf(point.x(
) + afterWidth) - floorf(point.x() + beforeWidth), h); | 572 float pixelAlignedX = floorf(point.x() + beforeWidth + LayoutUnit::epsilon()
); |
| 573 return FloatRect(pixelAlignedX, point.y(), |
| 574 roundf(point.x() + afterWidth) - pixelAlignedX, h); |
567 } | 575 } |
568 | 576 |
569 int Font::offsetForPositionForSimpleText(const TextRun& run, float x, bool inclu
dePartialGlyphs) const | 577 int Font::offsetForPositionForSimpleText(const TextRun& run, float x, bool inclu
dePartialGlyphs) const |
570 { | 578 { |
571 float delta = x; | 579 float delta = x; |
572 | 580 |
573 WidthIterator it(this, run); | 581 WidthIterator it(this, run); |
574 GlyphBuffer localGlyphBuffer; | 582 GlyphBuffer localGlyphBuffer; |
575 unsigned offset; | 583 unsigned offset; |
576 if (run.rtl()) { | 584 if (run.rtl()) { |
(...skipping 26 matching lines...) Expand all Loading... |
603 if (delta <= 0) | 611 if (delta <= 0) |
604 break; | 612 break; |
605 } | 613 } |
606 } | 614 } |
607 } | 615 } |
608 | 616 |
609 return offset; | 617 return offset; |
610 } | 618 } |
611 | 619 |
612 } | 620 } |
OLD | NEW |