diff options
author | corvid <corvid@lavabit.com> | 2009-09-03 03:03:06 +0000 |
---|---|---|
committer | corvid <corvid@lavabit.com> | 2009-09-03 03:03:06 +0000 |
commit | 5231f9206c6c31ae0d53a5c52d6bb75d3d3b3a9e (patch) | |
tree | d53f0f6200a0fb538c4c80ceef3632248577dccc /dw | |
parent | baa36e7fcb271838f2696232b513bf54df4b6d0a (diff) |
TextblockIterator::getAllocation: use start & end args rather than entire Word.
This matters for the case of plain text, where an entire line is currently
passed to dw as one very long Word.
Diffstat (limited to 'dw')
-rw-r--r-- | dw/textblock.cc | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/dw/textblock.cc b/dw/textblock.cc index 0ba6439f..25ff750c 100644 --- a/dw/textblock.cc +++ b/dw/textblock.cc @@ -2159,14 +2159,32 @@ void Textblock::TextblockIterator::getAllocation (int start, int end, allocation->x = textblock->allocation.x + textblock->lineXOffsetWidget (line); + for (int i = line->firstWord; i < index; i++) { Word *w = textblock->words->getRef(i); allocation->x += w->size.width + w->effSpace; } + if (start > 0 && word->content.type == core::Content::TEXT) { + allocation->x += textblock->layout->textWidth (word->style->font, + word->content.text, + start); + } allocation->y = textblock->allocation.y + textblock->lineYOffsetWidget (line) + line->ascent - word->size.ascent; + allocation->width = word->size.width; + if (word->content.type == core::Content::TEXT) { + int wordEnd = strlen(word->content.text); + + if (start > 0 || end < wordEnd) { + end = misc::min(end, wordEnd); /* end could be INT_MAX */ + allocation->width = + textblock->layout->textWidth (word->style->font, + word->content.text + start, + end - start); + } + } allocation->ascent = word->size.ascent; allocation->descent = word->size.descent; } |