Implemented the range-to-rect function on OS X.
This commit is contained in:
parent
b18cc88dce
commit
0ae25c62ed
|
@ -330,6 +330,46 @@ void uiDrawTextLayoutHitTest(uiDrawTextLayout *tl, double x, double y, uiDrawTex
|
||||||
result->Pos = tl->u16tou8[pos];
|
result->Pos = tl->u16tou8[pos];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO document this is appropriate for a caret
|
||||||
|
// TODO what happens if we select across a wrapped line?
|
||||||
void uiDrawTextLayoutByteRangeToRectangle(uiDrawTextLayout *tl, size_t start, size_t end, uiDrawTextLayoutByteRangeRectangle *r)
|
void uiDrawTextLayoutByteRangeToRectangle(uiDrawTextLayout *tl, size_t start, size_t end, uiDrawTextLayoutByteRangeRectangle *r)
|
||||||
{
|
{
|
||||||
|
CFIndex i;
|
||||||
|
CTLineRef line;
|
||||||
|
CFRange range;
|
||||||
|
CGFloat x, x2; // TODO rename x to x1
|
||||||
|
|
||||||
|
if (start > tl->nUTF8)
|
||||||
|
start = tl->nUTF8;
|
||||||
|
if (end > tl->nUTF8)
|
||||||
|
end = tl->nUTF8;
|
||||||
|
start = tl->u8tou16[start];
|
||||||
|
end = tl->u8tou16[end];
|
||||||
|
|
||||||
|
for (i = 0; i < tl->nLines; i++) {
|
||||||
|
line = (CTLineRef) CFArrayGetValueAtIndex(tl->lines, i);
|
||||||
|
range = CTLineGetStringRange(line);
|
||||||
|
if (start >= range.location)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == tl->nLines)
|
||||||
|
i--;
|
||||||
|
r->Line = i;
|
||||||
|
if (end > (range.location + range.length))
|
||||||
|
end = range.location + range.length;
|
||||||
|
|
||||||
|
x = CTLineGetOffsetForStringIndex(line, start, NULL);
|
||||||
|
x2 = CTLineGetOffsetForStringIndex(line, end, NULL);
|
||||||
|
|
||||||
|
r->X = tl->lineMetrics[i].X + x;
|
||||||
|
r->Y = tl->lineMetrics[i].Y;
|
||||||
|
r->Width = (tl->lineMetrics[i].X + x2) - r->X;
|
||||||
|
r->Height = tl->lineMetrics[i].Height;
|
||||||
|
|
||||||
|
// and use x and x2 to get the actual start and end positions
|
||||||
|
// TODO error check?
|
||||||
|
r->RealStart = CTLineGetStringIndexForPosition(line, CGPointMake(x, 0));
|
||||||
|
r->RealEnd = CTLineGetStringIndexForPosition(line, CGPointMake(x2, 0));
|
||||||
|
r->RealStart = tl->u16tou8[r->RealStart];
|
||||||
|
r->RealEnd = tl->u16tou8[r->RealEnd];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue