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

Unified Diff: Source/platform/fonts/shaping/HarfBuzzShaper.cpp

Issue 1248453004: Change Font::offsetForPositionForComplexText to use CachingWordShapeIterator (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: TestExpectations and rebase Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: Source/platform/fonts/shaping/HarfBuzzShaper.cpp
diff --git a/Source/platform/fonts/shaping/HarfBuzzShaper.cpp b/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
index 22e181f679e9dc53fcc06f0451fa188630533f70..cf38fc428c40509d0026a5b7fe517f2878897fb8 100644
--- a/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
+++ b/Source/platform/fonts/shaping/HarfBuzzShaper.cpp
@@ -39,6 +39,7 @@
#include "platform/fonts/Font.h"
#include "platform/fonts/GlyphBuffer.h"
#include "platform/fonts/UTF16TextIterator.h"
+#include "platform/fonts/shaping/CachingWordShapeIterator.h"
#include "platform/fonts/shaping/HarfBuzzFace.h"
#include "platform/text/TextBreakIterator.h"
#include "wtf/Compiler.h"
@@ -441,6 +442,39 @@ FloatRect ShapeResult::selectionRect(Vector<RefPtr<ShapeResult>>& results,
return FloatRect(point.x() + toX, point.y(), fromX - toX, height);
}
+int ShapeResult::offsetForPosition(CachingWordShapeIterator& iterator,
+ const TextRun& run, float targetX)
+{
+ RefPtr<ShapeResult> wordResult;
+ unsigned totalOffset;
+ if (run.rtl()) {
+ totalOffset = run.length();
+ while (iterator.next(&wordResult)) {
+ if (!wordResult)
+ continue;
+ totalOffset -= wordResult->numCharacters();
+ if (targetX >= 0 && targetX <= wordResult->width()) {
+ int offsetForWord = wordResult->offsetForPosition(targetX);
+ return totalOffset + offsetForWord;
+ }
+ targetX -= wordResult->width();
+ }
+ } else {
+ totalOffset = 0;
+ while (iterator.next(&wordResult)) {
+ if (!wordResult)
+ continue;
+ int offsetForWord = wordResult->offsetForPosition(targetX);
+ ASSERT(offsetForWord >= 0);
+ totalOffset += offsetForWord;
+ if (targetX >= 0 && targetX <= wordResult->width())
+ return totalOffset;
+ targetX -= wordResult->width();
+ }
+ }
+ return totalOffset;
+}
+
int ShapeResult::offsetForPosition(float targetX)
{
int charactersSoFar = 0;

Powered by Google App Engine
This is Rietveld 408576698