TextLayoutCache code refactoring
- use vector (instead of array) for advances and glyphs - reverse glyphs directly in computeRunValuesWithHarfbuzz() (instead of reversing them after) Change-Id: I716a8f914fd043818d7cb80cca76ee5fb0effb96
This commit is contained in:
@@ -271,14 +271,6 @@ void TextLayout::getTextRunAdvances(SkPaint* paint, const jchar* chars, jint sta
|
||||
}
|
||||
}
|
||||
|
||||
void TextLayout::getTextRunAdvancesHB(SkPaint* paint, const jchar* chars, jint start,
|
||||
jint count, jint contextCount, jint dirFlags,
|
||||
jfloat* resultAdvances, jfloat& resultTotalAdvance) {
|
||||
// Compute advances and return them
|
||||
TextLayoutCacheValue::computeValuesWithHarfbuzz(paint, chars, start, count, contextCount,
|
||||
dirFlags, resultAdvances, &resultTotalAdvance, NULL, NULL);
|
||||
}
|
||||
|
||||
void TextLayout::getTextRunAdvancesICU(SkPaint* paint, const jchar* chars, jint start,
|
||||
jint count, jint contextCount, jint dirFlags,
|
||||
jfloat* resultAdvances, jfloat& resultTotalAdvance) {
|
||||
|
||||
@@ -77,10 +77,6 @@ public:
|
||||
jint count, jint contextCount, jint dirFlags,
|
||||
jfloat* resultAdvances, jfloat& resultTotalAdvance);
|
||||
|
||||
static void getTextRunAdvancesHB(SkPaint* paint, const jchar* chars, jint start,
|
||||
jint count, jint contextCount, jint dirFlags,
|
||||
jfloat* resultAdvances, jfloat& resultTotalAdvance);
|
||||
|
||||
static void drawText(SkPaint* paint, const jchar* text, jsize len,
|
||||
jint bidiFlags, jfloat x, jfloat y, SkCanvas* canvas);
|
||||
|
||||
|
||||
@@ -290,13 +290,7 @@ size_t TextLayoutCacheKey::getSize() {
|
||||
* TextLayoutCacheValue
|
||||
*/
|
||||
TextLayoutCacheValue::TextLayoutCacheValue() :
|
||||
mAdvances(NULL), mTotalAdvance(0), mAdvancesCount(0),
|
||||
mGlyphs(NULL), mGlyphsCount(0), mElapsedTime(0) {
|
||||
}
|
||||
|
||||
TextLayoutCacheValue::~TextLayoutCacheValue() {
|
||||
delete[] mAdvances;
|
||||
delete[] mGlyphs;
|
||||
mTotalAdvance(0), mElapsedTime(0) {
|
||||
}
|
||||
|
||||
void TextLayoutCacheValue::setElapsedTime(uint32_t time) {
|
||||
@@ -309,11 +303,11 @@ uint32_t TextLayoutCacheValue::getElapsedTime() {
|
||||
|
||||
void TextLayoutCacheValue::computeValues(SkPaint* paint, const UChar* chars, size_t start,
|
||||
size_t count, size_t contextCount, int dirFlags) {
|
||||
mAdvancesCount = count;
|
||||
mAdvances = new float[count];
|
||||
|
||||
// Give a hint for advances and glyphs vectors size
|
||||
mAdvances.setCapacity(count);
|
||||
mGlyphs.setCapacity(count);
|
||||
computeValuesWithHarfbuzz(paint, chars, start, count, contextCount, dirFlags,
|
||||
mAdvances, &mTotalAdvance, &mGlyphs, &mGlyphsCount);
|
||||
&mAdvances, &mTotalAdvance, &mGlyphs);
|
||||
#if DEBUG_ADVANCES
|
||||
LOGD("Advances - count=%d - countextCount=%d - totalAdvance=%f - "
|
||||
"adv[0]=%f adv[1]=%f adv[2]=%f adv[3]=%f", count, contextCount, mTotalAdvance,
|
||||
@@ -322,8 +316,8 @@ void TextLayoutCacheValue::computeValues(SkPaint* paint, const UChar* chars, siz
|
||||
}
|
||||
|
||||
size_t TextLayoutCacheValue::getSize() {
|
||||
return sizeof(TextLayoutCacheValue) + sizeof(jfloat) * mAdvancesCount +
|
||||
sizeof(jchar) * mGlyphsCount;
|
||||
return sizeof(TextLayoutCacheValue) + sizeof(jfloat) * mAdvances.capacity() +
|
||||
sizeof(jchar) * mGlyphs.capacity();
|
||||
}
|
||||
|
||||
void TextLayoutCacheValue::setupShaperItem(HB_ShaperItem* shaperItem, HB_FontRec* font,
|
||||
@@ -394,27 +388,10 @@ void TextLayoutCacheValue::shapeWithHarfbuzz(HB_ShaperItem* shaperItem, HB_FontR
|
||||
}
|
||||
}
|
||||
|
||||
struct GlyphRun {
|
||||
inline GlyphRun() {}
|
||||
inline GlyphRun(jchar* glyphs, size_t glyphsCount, bool isRTL) :
|
||||
glyphs(glyphs), glyphsCount(glyphsCount), isRTL(isRTL) { }
|
||||
jchar* glyphs;
|
||||
size_t glyphsCount;
|
||||
int isRTL;
|
||||
};
|
||||
|
||||
void static reverseGlyphArray(jchar* glyphs, size_t count) {
|
||||
for (size_t i = 0; i < count / 2; i++) {
|
||||
jchar temp = glyphs[i];
|
||||
glyphs[i] = glyphs[count - 1 - i];
|
||||
glyphs[count - 1 - i] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar* chars,
|
||||
size_t start, size_t count, size_t contextCount, int dirFlags,
|
||||
jfloat* outAdvances, jfloat* outTotalAdvance,
|
||||
jchar** outGlyphs, size_t* outGlyphsCount) {
|
||||
Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance,
|
||||
Vector<jchar>* const outGlyphs) {
|
||||
|
||||
UBiDiLevel bidiReq = 0;
|
||||
bool forceLTR = false;
|
||||
@@ -435,11 +412,7 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar
|
||||
forceLTR, forceRTL);
|
||||
#endif
|
||||
computeRunValuesWithHarfbuzz(paint, chars, start, count, contextCount, forceRTL,
|
||||
outAdvances, outTotalAdvance, outGlyphs, outGlyphsCount);
|
||||
|
||||
if (forceRTL && *outGlyphsCount > 1) {
|
||||
reverseGlyphArray(*outGlyphs, *outGlyphsCount);
|
||||
}
|
||||
outAdvances, outTotalAdvance, outGlyphs);
|
||||
} else {
|
||||
UBiDi* bidi = ubidi_open();
|
||||
if (bidi) {
|
||||
@@ -461,15 +434,8 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar
|
||||
"-- run-start=%d run-len=%d isRTL=%d", start, count, isRTL);
|
||||
#endif
|
||||
computeRunValuesWithHarfbuzz(paint, chars, start, count, contextCount,
|
||||
isRTL, outAdvances, outTotalAdvance, outGlyphs, outGlyphsCount);
|
||||
|
||||
if (isRTL && *outGlyphsCount > 1) {
|
||||
reverseGlyphArray(*outGlyphs, *outGlyphsCount);
|
||||
}
|
||||
isRTL, outAdvances, outTotalAdvance, outGlyphs);
|
||||
} else {
|
||||
Vector<GlyphRun> glyphRuns;
|
||||
jchar* runGlyphs;
|
||||
size_t runGlyphsCount = 0;
|
||||
int32_t end = start + count;
|
||||
for (size_t i = 0; i < rc; ++i) {
|
||||
int32_t startRun;
|
||||
@@ -503,34 +469,9 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar
|
||||
computeRunValuesWithHarfbuzz(paint, chars, startRun,
|
||||
lengthRun, contextCount, isRTL,
|
||||
outAdvances, &runTotalAdvance,
|
||||
&runGlyphs, &runGlyphsCount);
|
||||
outGlyphs);
|
||||
|
||||
outAdvances += lengthRun;
|
||||
*outTotalAdvance += runTotalAdvance;
|
||||
*outGlyphsCount += runGlyphsCount;
|
||||
#if DEBUG_GLYPHS
|
||||
LOGD("computeValuesWithHarfbuzz -- run=%d run-glyphs-count=%d",
|
||||
i, runGlyphsCount);
|
||||
for (size_t j = 0; j < runGlyphsCount; j++) {
|
||||
LOGD(" -- glyphs[%d]=%d", j, runGlyphs[j]);
|
||||
}
|
||||
#endif
|
||||
glyphRuns.push(GlyphRun(runGlyphs, runGlyphsCount, isRTL));
|
||||
}
|
||||
*outGlyphs = new jchar[*outGlyphsCount];
|
||||
|
||||
jchar* glyphs = *outGlyphs;
|
||||
for (size_t i = 0; i < glyphRuns.size(); i++) {
|
||||
const GlyphRun& glyphRun = glyphRuns.itemAt(i);
|
||||
if (glyphRun.isRTL) {
|
||||
for (size_t n = 0; n < glyphRun.glyphsCount; n++) {
|
||||
glyphs[glyphRun.glyphsCount - n - 1] = glyphRun.glyphs[n];
|
||||
}
|
||||
} else {
|
||||
memcpy(glyphs, glyphRun.glyphs, glyphRun.glyphsCount * sizeof(jchar));
|
||||
}
|
||||
glyphs += glyphRun.glyphsCount;
|
||||
delete[] glyphRun.glyphs;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -543,22 +484,18 @@ void TextLayoutCacheValue::computeValuesWithHarfbuzz(SkPaint* paint, const UChar
|
||||
"-- run-start=%d run-len=%d isRTL=%d", start, count, isRTL);
|
||||
#endif
|
||||
computeRunValuesWithHarfbuzz(paint, chars, start, count, contextCount, isRTL,
|
||||
outAdvances, outTotalAdvance, outGlyphs, outGlyphsCount);
|
||||
|
||||
if (isRTL && *outGlyphsCount > 1) {
|
||||
reverseGlyphArray(*outGlyphs, *outGlyphsCount);
|
||||
}
|
||||
outAdvances, outTotalAdvance, outGlyphs);
|
||||
}
|
||||
}
|
||||
#if DEBUG_GLYPHS
|
||||
LOGD("computeValuesWithHarfbuzz -- total-glyphs-count=%d", *outGlyphsCount);
|
||||
LOGD("computeValuesWithHarfbuzz -- total-glyphs-count=%d", outGlyphs->size());
|
||||
#endif
|
||||
}
|
||||
|
||||
static void logGlyphs(HB_ShaperItem shaperItem) {
|
||||
LOGD("Got glyphs - count=%d", shaperItem.num_glyphs);
|
||||
for (size_t i = 0; i < shaperItem.num_glyphs; i++) {
|
||||
LOGD(" glyphs[%d]=%d - offset.x=%f offset.y=%f", i, shaperItem.glyphs[i],
|
||||
LOGD(" glyph[%d]=%d - offset.x=%f offset.y=%f", i, shaperItem.glyphs[i],
|
||||
HBFixedToFloat(shaperItem.offsets[i].x),
|
||||
HBFixedToFloat(shaperItem.offsets[i].y));
|
||||
}
|
||||
@@ -566,12 +503,13 @@ static void logGlyphs(HB_ShaperItem shaperItem) {
|
||||
|
||||
void TextLayoutCacheValue::computeRunValuesWithHarfbuzz(SkPaint* paint, const UChar* chars,
|
||||
size_t start, size_t count, size_t contextCount, bool isRTL,
|
||||
jfloat* outAdvances, jfloat* outTotalAdvance,
|
||||
jchar** outGlyphs, size_t* outGlyphsCount) {
|
||||
Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance,
|
||||
Vector<jchar>* const outGlyphs) {
|
||||
|
||||
HB_ShaperItem shaperItem;
|
||||
HB_FontRec font;
|
||||
FontData fontData;
|
||||
|
||||
shapeWithHarfbuzz(&shaperItem, &font, &fontData, paint, chars, start, count,
|
||||
contextCount, isRTL);
|
||||
|
||||
@@ -588,30 +526,28 @@ void TextLayoutCacheValue::computeRunValuesWithHarfbuzz(SkPaint* paint, const UC
|
||||
#if DEBUG_GLYPHS
|
||||
LOGD("HARFBUZZ -- advances array is empty or num_glypth = 0");
|
||||
#endif
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
outAdvances[i] = 0;
|
||||
}
|
||||
outAdvances->insertAt(0, outAdvances->size(), count);
|
||||
*outTotalAdvance = 0;
|
||||
|
||||
if (outGlyphs) {
|
||||
*outGlyphsCount = 0;
|
||||
*outGlyphs = new jchar[0];
|
||||
}
|
||||
|
||||
// Cleaning
|
||||
deleteGlyphArrays(&shaperItem);
|
||||
HB_FreeFace(shaperItem.face);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get Advances and their total
|
||||
jfloat totalAdvance = outAdvances[0] = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[0]]);
|
||||
jfloat currentAdvance = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[0]]);
|
||||
jfloat totalAdvance = currentAdvance;
|
||||
outAdvances->add(currentAdvance);
|
||||
for (size_t i = 1; i < count; i++) {
|
||||
size_t clusterPrevious = shaperItem.log_clusters[i - 1];
|
||||
size_t cluster = shaperItem.log_clusters[i];
|
||||
if (cluster == clusterPrevious) {
|
||||
outAdvances[i] = 0;
|
||||
outAdvances->add(0);
|
||||
} else {
|
||||
totalAdvance += outAdvances[i] = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[i]]);
|
||||
currentAdvance = HBFixedToFloat(shaperItem.advances[shaperItem.log_clusters[i]]);
|
||||
totalAdvance += currentAdvance;
|
||||
outAdvances->add(currentAdvance);
|
||||
}
|
||||
}
|
||||
*outTotalAdvance = totalAdvance;
|
||||
@@ -623,12 +559,15 @@ void TextLayoutCacheValue::computeRunValuesWithHarfbuzz(SkPaint* paint, const UC
|
||||
}
|
||||
#endif
|
||||
|
||||
// Get Glyphs
|
||||
// Get Glyphs and reverse them in place if RTL
|
||||
if (outGlyphs) {
|
||||
*outGlyphsCount = shaperItem.num_glyphs;
|
||||
*outGlyphs = new jchar[shaperItem.num_glyphs];
|
||||
for (size_t i = 0; i < shaperItem.num_glyphs; i++) {
|
||||
(*outGlyphs)[i] = (jchar) shaperItem.glyphs[i];
|
||||
size_t count = shaperItem.num_glyphs;
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
jchar glyph = (jchar) shaperItem.glyphs[(!isRTL) ? i : count - 1 - i];
|
||||
#if DEBUG_GLYPHS
|
||||
LOGD("HARFBUZZ -- glyph[%d]=%d", i, glyph);
|
||||
#endif
|
||||
outGlyphs->add(glyph);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -110,9 +110,6 @@ private:
|
||||
* TextLayoutCacheValue is the Cache value
|
||||
*/
|
||||
class TextLayoutCacheValue : public RefBase {
|
||||
protected:
|
||||
~TextLayoutCacheValue();
|
||||
|
||||
public:
|
||||
TextLayoutCacheValue();
|
||||
|
||||
@@ -122,11 +119,11 @@ public:
|
||||
void computeValues(SkPaint* paint, const UChar* chars, size_t start, size_t count,
|
||||
size_t contextCount, int dirFlags);
|
||||
|
||||
inline const jfloat* getAdvances() const { return mAdvances; }
|
||||
inline size_t getAdvancesCount() const { return mAdvancesCount; }
|
||||
inline const jfloat* getAdvances() const { return mAdvances.array(); }
|
||||
inline size_t getAdvancesCount() const { return mAdvances.size(); }
|
||||
inline jfloat getTotalAdvance() const { return mTotalAdvance; }
|
||||
inline const jchar* getGlyphs() const { return mGlyphs; }
|
||||
inline size_t getGlyphsCount() const { return mGlyphsCount; }
|
||||
inline const jchar* getGlyphs() const { return mGlyphs.array(); }
|
||||
inline size_t getGlyphsCount() const { return mGlyphs.size(); }
|
||||
|
||||
/**
|
||||
* Get the size of the Cache entry
|
||||
@@ -143,8 +140,8 @@ public:
|
||||
|
||||
static void computeValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, size_t start,
|
||||
size_t count, size_t contextCount, int dirFlags,
|
||||
jfloat* outAdvances, jfloat* outTotalAdvance,
|
||||
jchar** outGlyphs, size_t* outGlyphsCount);
|
||||
Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance,
|
||||
Vector<jchar>* const outGlyphs);
|
||||
|
||||
static void computeAdvancesWithICU(SkPaint* paint, const UChar* chars, size_t start,
|
||||
size_t count, size_t contextCount, int dirFlags,
|
||||
@@ -152,9 +149,9 @@ public:
|
||||
|
||||
private:
|
||||
/**
|
||||
* Advances array
|
||||
* Advances vector
|
||||
*/
|
||||
jfloat* mAdvances;
|
||||
Vector<jfloat> mAdvances;
|
||||
|
||||
/**
|
||||
* Total number of advances
|
||||
@@ -162,19 +159,9 @@ private:
|
||||
jfloat mTotalAdvance;
|
||||
|
||||
/**
|
||||
* Allocated size for advances array
|
||||
* Glyphs vector
|
||||
*/
|
||||
size_t mAdvancesCount;
|
||||
|
||||
/**
|
||||
* Glyphs array
|
||||
*/
|
||||
jchar* mGlyphs;
|
||||
|
||||
/**
|
||||
* Total number of glyphs
|
||||
*/
|
||||
size_t mGlyphsCount;
|
||||
Vector<jchar> mGlyphs;
|
||||
|
||||
/**
|
||||
* Time for computing the values (in milliseconds)
|
||||
@@ -187,8 +174,8 @@ private:
|
||||
|
||||
static void computeRunValuesWithHarfbuzz(SkPaint* paint, const UChar* chars, size_t start,
|
||||
size_t count, size_t contextCount, bool isRTL,
|
||||
jfloat* outAdvances, jfloat* outTotalAdvance,
|
||||
jchar** outGlyphs, size_t* outGlyphsCount);
|
||||
Vector<jfloat>* const outAdvances, jfloat* outTotalAdvance,
|
||||
Vector<jchar>* const outGlyphs);
|
||||
}; // TextLayoutCacheValue
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user