Boilerplate needed for implementing range-to-rect.

This commit is contained in:
Pietro Gagliardi 2017-02-05 20:42:52 -05:00
parent c336063b65
commit b18cc88dce
3 changed files with 22 additions and 4 deletions

View File

@ -315,11 +315,24 @@ size_t attrstrUTF16Len(uiAttributedString *s)
return s->u16len; return s->u16len;
} }
// TODO is this still needed given the below?
size_t attrstrUTF8ToUTF16(uiAttributedString *s, size_t n) size_t attrstrUTF8ToUTF16(uiAttributedString *s, size_t n)
{ {
return s->u8tou16[n]; return s->u8tou16[n];
} }
size_t *attrstrCopyUTF8ToUTF16(uiAttributedString *s, size_t *n)
{
size_t *out;
size_t nbytes;
nbytes = (s->len + 1) * sizeof (size_t);
*n = s->len;
out = (size_t *) uiAlloc(nbytes, "size_t[] (uiAttributedString)");
memmove(out, s->u8tou16, nbytes);
return out;
}
size_t *attrstrCopyUTF16ToUTF8(uiAttributedString *s, size_t *n) size_t *attrstrCopyUTF16ToUTF8(uiAttributedString *s, size_t *n)
{ {
size_t *out; size_t *out;

View File

@ -73,6 +73,7 @@ extern struct graphemes *graphemes(void *s, size_t len);
extern const uint16_t *attrstrUTF16(uiAttributedString *s); extern const uint16_t *attrstrUTF16(uiAttributedString *s);
extern size_t attrstrUTF16Len(uiAttributedString *s); extern size_t attrstrUTF16Len(uiAttributedString *s);
extern size_t attrstrUTF8ToUTF16(uiAttributedString *s, size_t n); extern size_t attrstrUTF8ToUTF16(uiAttributedString *s, size_t n);
extern size_t *attrstrCopyUTF8ToUTF16(uiAttributedString *s, size_t *n);
extern size_t *attrstrCopyUTF16ToUTF8(uiAttributedString *s, size_t *n); extern size_t *attrstrCopyUTF16ToUTF8(uiAttributedString *s, size_t *n);
// attrlist.c // attrlist.c

View File

@ -28,9 +28,11 @@ struct uiDrawTextLayout {
// we compute this once when first creating the layout // we compute this once when first creating the layout
uiDrawTextLayoutLineMetrics *lineMetrics; uiDrawTextLayoutLineMetrics *lineMetrics;
// for converting CFAttributedString indices to byte offsets // for converting CFAttributedString indices from/to byte offsets
size_t *u8tou16;
size_t nUTF8;
size_t *u16tou8; size_t *u16tou8;
size_t nu16tou8; // TODO I don't like the casing of this name size_t nUTF16;
}; };
static CTFontRef fontdescToCTFont(uiDrawFontDescriptor *fd) static CTFontRef fontdescToCTFont(uiDrawFontDescriptor *fd)
@ -201,8 +203,9 @@ uiDrawTextLayout *uiDrawNewTextLayout(uiAttributedString *s, uiDrawFontDescripto
tl->nLines = CFArrayGetCount(tl->lines); tl->nLines = CFArrayGetCount(tl->lines);
tl->lineMetrics = computeLineMetrics(tl->frame, tl->size); tl->lineMetrics = computeLineMetrics(tl->frame, tl->size);
// and finally copy the UTF-16 to UTF-8 index conversion table // and finally copy the UTF-8/UTF-16 conversion tables
tl->u16tou8 = attrstrCopyUTF16ToUTF8(s, &(tl->nu16tou8)); tl->u8tou16 = attrstrCopyUTF8ToUTF16(s, &(tl->nUTF8));
tl->u16tou8 = attrstrCopyUTF16ToUTF8(s, &(tl->nUTF16));
return tl; return tl;
} }
@ -210,6 +213,7 @@ uiDrawTextLayout *uiDrawNewTextLayout(uiAttributedString *s, uiDrawFontDescripto
void uiDrawFreeTextLayout(uiDrawTextLayout *tl) void uiDrawFreeTextLayout(uiDrawTextLayout *tl)
{ {
uiFree(tl->u16tou8); uiFree(tl->u16tou8);
uiFree(tl->u8tou16);
uiFree(tl->lineMetrics); uiFree(tl->lineMetrics);
// TODO release tl->lines? // TODO release tl->lines?
CFRelease(tl->frame); CFRelease(tl->frame);