From e97d9097da30e412eaea5a55e6bece21cefc7c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sat, 18 Jan 2014 10:28:48 +0100 Subject: [PATCH] ParagraphLayout: Added more utility methods * FirtOffsetOnLine(), LastOffsetOnLine(), and GetLineBounds() --- .../haiku-depot/textview/ParagraphLayout.cpp | 67 +++++++++++++++++++ .../haiku-depot/textview/ParagraphLayout.h | 6 ++ 2 files changed, 73 insertions(+) diff --git a/src/apps/haiku-depot/textview/ParagraphLayout.cpp b/src/apps/haiku-depot/textview/ParagraphLayout.cpp index 33eccf31fa..fe9ccc68b2 100644 --- a/src/apps/haiku-depot/textview/ParagraphLayout.cpp +++ b/src/apps/haiku-depot/textview/ParagraphLayout.cpp @@ -307,6 +307,73 @@ ParagraphLayout::LineIndexForOffset(int32 textOffset) } +int32 +ParagraphLayout::FirstOffsetOnLine(int32 lineIndex) +{ + _ValidateLayout(); + + if (lineIndex < 0) + lineIndex = 0; + if (lineIndex > fLineInfos.CountItems()) + lineIndex = fLineInfos.CountItems() - 1; + + return fLineInfos.ItemAt(lineIndex).textOffset; +} + + +int32 +ParagraphLayout::LastOffsetOnLine(int32 lineIndex) +{ + _ValidateLayout(); + + if (lineIndex < 0) + lineIndex = 0; + if (lineIndex >= fLineInfos.CountItems() - 1) + return CountGlyphs(); + + return fLineInfos.ItemAt(lineIndex + 1).textOffset - 1; +} + + +void +ParagraphLayout::GetLineBounds(int32 lineIndex, float& x1, float& y1, + float& x2, float& y2) +{ + _ValidateLayout(); + + if (fGlyphInfos.CountItems() == 0) { + x1 = 0.0f; + y1 = 0.0f; + x2 = 0.0f; + y2 = 0.0f; + + return; + } + + if (lineIndex < 0) + lineIndex = 0; + if (lineIndex > fLineInfos.CountItems()) + lineIndex = fLineInfos.CountItems() - 1; + + const LineInfo& lineInfo = fLineInfos.ItemAt(lineIndex); + int32 firstGlyphIndex = lineInfo.textOffset; + + int32 lastGlyphIndex; + if (lineIndex < fLineInfos.CountItems() - 1) + lastGlyphIndex = fLineInfos.ItemAt(lineIndex + 1).textOffset - 1; + else + lastGlyphIndex = fGlyphInfos.CountItems() - 1; + + const GlyphInfo& firstInfo = fGlyphInfos.ItemAtFast(firstGlyphIndex); + const GlyphInfo& lastInfo = fGlyphInfos.ItemAtFast(lastGlyphIndex); + + x1 = firstInfo.x; + y1 = lineInfo.y; + x2 = lastInfo.x + lastInfo.width; + y1 = lineInfo.y + lineInfo.height; +} + + void ParagraphLayout::GetTextBounds(int32 textOffset, float& x1, float& y1, float& x2, float& y2) diff --git a/src/apps/haiku-depot/textview/ParagraphLayout.h b/src/apps/haiku-depot/textview/ParagraphLayout.h index 8e622ce314..99bf5b76c6 100644 --- a/src/apps/haiku-depot/textview/ParagraphLayout.h +++ b/src/apps/haiku-depot/textview/ParagraphLayout.h @@ -193,6 +193,12 @@ public: int32 CountLines(); int32 LineIndexForOffset(int32 textOffset); + int32 FirstOffsetOnLine(int32 lineIndex); + int32 LastOffsetOnLine(int32 lineIndex); + + void GetLineBounds(int32 lineIndex, + float& x1, float& y1, + float& x2, float& y2); void GetTextBounds(int32 textOffset, float& x1, float& y1,