change private alloc methods to also take fonts
Bug: skia:2664 Change-Id: I772534179ce0c948984640f9fffc22e0372fce97 Reviewed-on: https://skia-review.googlesource.com/c/174848 Reviewed-by: Ben Wagner <bungeman@google.com> Commit-Queue: Mike Reed <reed@google.com>
This commit is contained in:
parent
db2aa248c6
commit
6d59568196
@ -285,17 +285,17 @@ public:
|
||||
const SkRect* bounds = nullptr);
|
||||
|
||||
private:
|
||||
const RunBuffer& allocRunText(const SkPaint& font,
|
||||
const RunBuffer& allocRunText(const SkFont& font,
|
||||
int count,
|
||||
SkScalar x,
|
||||
SkScalar y,
|
||||
int textByteCount,
|
||||
SkString lang,
|
||||
const SkRect* bounds = nullptr);
|
||||
const RunBuffer& allocRunTextPosH(const SkPaint& font, int count, SkScalar y,
|
||||
const RunBuffer& allocRunTextPosH(const SkFont& font, int count, SkScalar y,
|
||||
int textByteCount, SkString lang,
|
||||
const SkRect* bounds = nullptr);
|
||||
const RunBuffer& allocRunTextPos(const SkPaint& font, int count,
|
||||
const RunBuffer& allocRunTextPos(const SkFont& font, int count,
|
||||
int textByteCount, SkString lang,
|
||||
const SkRect* bounds = nullptr);
|
||||
void reserve(size_t size);
|
||||
|
@ -396,16 +396,16 @@ struct ShapedGlyph {
|
||||
bool fHasVisual;
|
||||
};
|
||||
struct ShapedRun {
|
||||
ShapedRun(const char* utf8Start, const char* utf8End, int numGlyphs, const SkFont& paint,
|
||||
ShapedRun(const char* utf8Start, const char* utf8End, int numGlyphs, const SkFont& font,
|
||||
UBiDiLevel level, std::unique_ptr<ShapedGlyph[]> glyphs)
|
||||
: fUtf8Start(utf8Start), fUtf8End(utf8End), fNumGlyphs(numGlyphs), fPaint(paint)
|
||||
: fUtf8Start(utf8Start), fUtf8End(utf8End), fNumGlyphs(numGlyphs), fFont(font)
|
||||
, fLevel(level), fGlyphs(std::move(glyphs))
|
||||
{}
|
||||
|
||||
const char* fUtf8Start;
|
||||
const char* fUtf8End;
|
||||
int fNumGlyphs;
|
||||
SkFont fPaint;
|
||||
SkFont fFont;
|
||||
UBiDiLevel fLevel;
|
||||
std::unique_ptr<ShapedGlyph[]> fGlyphs;
|
||||
};
|
||||
@ -416,9 +416,7 @@ static constexpr bool is_LTR(UBiDiLevel level) {
|
||||
|
||||
static void append(SkTextBlobBuilder* b, const ShapedRun& run, int start, int end, SkPoint* p) {
|
||||
unsigned len = end - start;
|
||||
SkPaint tmpPaint;
|
||||
run.fPaint.LEGACY_applyToPaint(&tmpPaint);
|
||||
auto runBuffer = SkTextBlobBuilderPriv::AllocRunTextPos(b, tmpPaint, len,
|
||||
auto runBuffer = SkTextBlobBuilderPriv::AllocRunTextPos(b, run.fFont, len,
|
||||
run.fUtf8End - run.fUtf8Start, SkString());
|
||||
memcpy(runBuffer.utf8text, run.fUtf8Start, run.fUtf8End - run.fUtf8Start);
|
||||
|
||||
@ -641,8 +639,8 @@ SkPoint SkShaper::shape(SkTextBlobBuilder* builder,
|
||||
std::unique_ptr<ShapedGlyph[]>(new ShapedGlyph[len]));
|
||||
int scaleX, scaleY;
|
||||
hb_font_get_scale(font->currentHBFont(), &scaleX, &scaleY);
|
||||
double textSizeY = run.fPaint.getSize() / scaleY;
|
||||
double textSizeX = run.fPaint.getSize() / scaleX * run.fPaint.getScaleX();
|
||||
double textSizeY = run.fFont.getSize() / scaleY;
|
||||
double textSizeX = run.fFont.getSize() / scaleX * run.fFont.getScaleX();
|
||||
for (unsigned i = 0; i < len; i++) {
|
||||
ShapedGlyph& glyph = run.fGlyphs[i];
|
||||
glyph.fID = info[i].codepoint;
|
||||
@ -732,7 +730,7 @@ SkPoint SkShaper::shape(SkTextBlobBuilder* builder,
|
||||
|
||||
if (previousRunIndex != runIndex) {
|
||||
SkFontMetrics metrics;
|
||||
runs[runIndex].fPaint.getMetrics(&metrics);
|
||||
runs[runIndex].fFont.getMetrics(&metrics);
|
||||
maxAscent = SkTMin(maxAscent, metrics.fAscent);
|
||||
maxDescent = SkTMax(maxDescent, metrics.fDescent);
|
||||
maxLeading = SkTMax(maxLeading, metrics.fLeading);
|
||||
|
@ -33,7 +33,7 @@ unsigned utf8_lead_byte_to_count(const char* ptr) {
|
||||
}
|
||||
|
||||
SkPoint SkShaper::shape(SkTextBlobBuilder* builder,
|
||||
const SkFont& srcPaint,
|
||||
const SkFont& srcFont,
|
||||
const char* utf8text,
|
||||
size_t textBytes,
|
||||
bool leftToRight,
|
||||
@ -41,21 +41,19 @@ SkPoint SkShaper::shape(SkTextBlobBuilder* builder,
|
||||
SkScalar width) const {
|
||||
sk_ignore_unused_variable(leftToRight);
|
||||
|
||||
SkFont paint(srcPaint);
|
||||
paint.setTypeface(fImpl->fTypeface);
|
||||
int glyphCount = paint.countText(utf8text, textBytes, SkTextEncoding::kUTF8);
|
||||
SkFont font(srcFont);
|
||||
font.setTypeface(fImpl->fTypeface);
|
||||
int glyphCount = font.countText(utf8text, textBytes, SkTextEncoding::kUTF8);
|
||||
if (glyphCount <= 0) {
|
||||
return point;
|
||||
}
|
||||
SkRect bounds;
|
||||
SkFontMetrics metrics;
|
||||
paint.getMetrics(&metrics);
|
||||
font.getMetrics(&metrics);
|
||||
point.fY -= metrics.fAscent;
|
||||
(void)paint.measureText(utf8text, textBytes, SkTextEncoding::kUTF8, &bounds);
|
||||
SkPaint tmpPaint;
|
||||
paint.LEGACY_applyToPaint(&tmpPaint);
|
||||
(void)font.measureText(utf8text, textBytes, SkTextEncoding::kUTF8, &bounds);
|
||||
const SkTextBlobBuilder::RunBuffer& runBuffer =
|
||||
builder->allocRunTextPosH(tmpPaint, glyphCount, point.y(), textBytes, SkString(), &bounds);
|
||||
builder->allocRunTextPosH(font, glyphCount, point.y(), textBytes, SkString(), &bounds);
|
||||
memcpy(runBuffer.utf8text, utf8text, textBytes);
|
||||
const char* txtPtr = utf8text;
|
||||
for (int i = 0; i < glyphCount; ++i) {
|
||||
@ -64,10 +62,10 @@ SkPoint SkShaper::shape(SkTextBlobBuilder* builder,
|
||||
txtPtr += utf8_lead_byte_to_count(txtPtr);
|
||||
SkASSERT(txtPtr <= utf8text + textBytes);
|
||||
}
|
||||
(void)paint.textToGlyphs(utf8text, textBytes, SkTextEncoding::kUTF8,
|
||||
runBuffer.glyphs, glyphCount);
|
||||
(void)font.textToGlyphs(utf8text, textBytes, SkTextEncoding::kUTF8,
|
||||
runBuffer.glyphs, glyphCount);
|
||||
// replace with getPos()?
|
||||
(void)paint.getWidths(runBuffer.glyphs, glyphCount, runBuffer.pos);
|
||||
(void)font.getWidths(runBuffer.glyphs, glyphCount, runBuffer.pos);
|
||||
SkScalar x = point.x();
|
||||
for (int i = 0; i < glyphCount; ++i) {
|
||||
SkScalar w = runBuffer.pos[i];
|
||||
|
@ -523,37 +523,30 @@ const SkTextBlobBuilder::RunBuffer& SkTextBlobBuilder::allocRunPos(const SkFont&
|
||||
return fCurrentRunBuffer;
|
||||
}
|
||||
|
||||
// SkPaint versions
|
||||
|
||||
const SkTextBlobBuilder::RunBuffer& SkTextBlobBuilder::allocRunText(const SkPaint& paint, int count,
|
||||
const SkTextBlobBuilder::RunBuffer& SkTextBlobBuilder::allocRunText(const SkFont& font, int count,
|
||||
SkScalar x, SkScalar y,
|
||||
int textByteCount,
|
||||
SkString lang,
|
||||
const SkRect* bounds) {
|
||||
SkFont font = SkFont::LEGACY_ExtractFromPaint(paint);
|
||||
this->allocInternal(font, SkTextBlob::kDefault_Positioning, count, textByteCount, SkPoint::Make(x, y), bounds);
|
||||
return fCurrentRunBuffer;
|
||||
}
|
||||
|
||||
const SkTextBlobBuilder::RunBuffer& SkTextBlobBuilder::allocRunTextPosH(const SkPaint& paint, int count,
|
||||
const SkTextBlobBuilder::RunBuffer& SkTextBlobBuilder::allocRunTextPosH(const SkFont& font, int count,
|
||||
SkScalar y,
|
||||
int textByteCount,
|
||||
SkString lang,
|
||||
const SkRect* bounds) {
|
||||
SkFont font = SkFont::LEGACY_ExtractFromPaint(paint);
|
||||
this->allocInternal(font, SkTextBlob::kHorizontal_Positioning, count, textByteCount, SkPoint::Make(0, y),
|
||||
bounds);
|
||||
|
||||
return fCurrentRunBuffer;
|
||||
}
|
||||
|
||||
const SkTextBlobBuilder::RunBuffer& SkTextBlobBuilder::allocRunTextPos(const SkPaint& paint, int count,
|
||||
const SkTextBlobBuilder::RunBuffer& SkTextBlobBuilder::allocRunTextPos(const SkFont& font, int count,
|
||||
int textByteCount,
|
||||
SkString lang,
|
||||
const SkRect *bounds) {
|
||||
SkFont font = SkFont::LEGACY_ExtractFromPaint(paint);
|
||||
this->allocInternal(font, SkTextBlob::kFull_Positioning, count, textByteCount, SkPoint::Make(0, 0), bounds);
|
||||
|
||||
return fCurrentRunBuffer;
|
||||
}
|
||||
|
||||
@ -671,8 +664,9 @@ sk_sp<SkTextBlob> SkTextBlobPriv::MakeFromBuffer(SkReadBuffer& reader) {
|
||||
|
||||
SkPoint offset;
|
||||
reader.readPoint(&offset);
|
||||
SkPaint font;
|
||||
reader.readPaint(&font);
|
||||
SkPaint paint;
|
||||
reader.readPaint(&paint);
|
||||
SkFont font = SkFont::LEGACY_ExtractFromPaint(paint);
|
||||
|
||||
// Compute the expected size of the buffer and ensure we have enough to deserialize
|
||||
// a run before allocating it.
|
||||
|
@ -43,17 +43,17 @@ public:
|
||||
class SkTextBlobBuilderPriv {
|
||||
public:
|
||||
static const SkTextBlobBuilder::RunBuffer& AllocRunText(SkTextBlobBuilder* builder,
|
||||
const SkPaint& font, int count, SkScalar x, SkScalar y, int textByteCount,
|
||||
const SkFont& font, int count, SkScalar x, SkScalar y, int textByteCount,
|
||||
SkString lang, const SkRect* bounds = nullptr) {
|
||||
return builder->allocRunText(font, count, x, y, textByteCount, lang, bounds);
|
||||
}
|
||||
static const SkTextBlobBuilder::RunBuffer& AllocRunTextPosH(SkTextBlobBuilder* builder,
|
||||
const SkPaint& font, int count, SkScalar y, int textByteCount, SkString lang,
|
||||
const SkFont& font, int count, SkScalar y, int textByteCount, SkString lang,
|
||||
const SkRect* bounds = nullptr) {
|
||||
return builder->allocRunTextPosH(font, count, y, textByteCount, lang, bounds);
|
||||
}
|
||||
static const SkTextBlobBuilder::RunBuffer& AllocRunTextPos(SkTextBlobBuilder* builder,
|
||||
const SkPaint& font, int count, int textByteCount, SkString lang,
|
||||
const SkFont& font, int count, int textByteCount, SkString lang,
|
||||
const SkRect* bounds = nullptr) {
|
||||
return builder->allocRunTextPos(font, count, textByteCount, lang, bounds);
|
||||
}
|
||||
@ -237,6 +237,10 @@ public:
|
||||
SkASSERT(!this->done());
|
||||
return fCurrentRun->offset();
|
||||
}
|
||||
const SkFont& font() const {
|
||||
SkASSERT(!this->done());
|
||||
return fCurrentRun->font();
|
||||
}
|
||||
const SkRunFont& runFont() const {
|
||||
SkASSERT(!this->done());
|
||||
return fCurrentRun->font();
|
||||
|
@ -320,17 +320,16 @@ DEF_TEST(TextBlob_paint, reporter) {
|
||||
|
||||
DEF_TEST(TextBlob_extended, reporter) {
|
||||
SkTextBlobBuilder textBlobBuilder;
|
||||
SkPaint paint;
|
||||
SkFont font;
|
||||
const char text1[] = "Foo";
|
||||
const char text2[] = "Bar";
|
||||
|
||||
int glyphCount = paint.textToGlyphs(text1, strlen(text1), nullptr);
|
||||
int glyphCount = font.countText(text1, strlen(text1), kUTF8_SkTextEncoding);
|
||||
SkAutoTMalloc<uint16_t> glyphs(glyphCount);
|
||||
(void)paint.textToGlyphs(text1, strlen(text1), glyphs.get());
|
||||
paint.setTextEncoding(kGlyphID_SkTextEncoding);
|
||||
(void)font.textToGlyphs(text1, strlen(text1), kUTF8_SkTextEncoding, glyphs.get(), glyphCount);
|
||||
|
||||
auto run = SkTextBlobBuilderPriv::AllocRunText(&textBlobBuilder,
|
||||
paint, glyphCount, 0, 0, SkToInt(strlen(text2)), SkString(), nullptr);
|
||||
font, glyphCount, 0, 0, SkToInt(strlen(text2)), SkString(), nullptr);
|
||||
memcpy(run.glyphs, glyphs.get(), sizeof(uint16_t) * glyphCount);
|
||||
memcpy(run.utf8text, text2, strlen(text2));
|
||||
for (int i = 0; i < glyphCount; ++i) {
|
||||
|
@ -992,15 +992,17 @@ public:
|
||||
continue;
|
||||
}
|
||||
|
||||
SkFont font = SkFont::LEGACY_ExtractFromPaint(*filteredPaint);
|
||||
|
||||
const SkTextBlobBuilder::RunBuffer& runBuffer
|
||||
= it.positioning() == SkTextBlobRunIterator::kDefault_Positioning
|
||||
? SkTextBlobBuilderPriv::AllocRunText(&builder, *filteredPaint,
|
||||
? SkTextBlobBuilderPriv::AllocRunText(&builder, font,
|
||||
it.offset().x(),it.offset().y(), it.glyphCount(), it.textSize(), SkString())
|
||||
: it.positioning() == SkTextBlobRunIterator::kHorizontal_Positioning
|
||||
? SkTextBlobBuilderPriv::AllocRunTextPosH(&builder, *filteredPaint,
|
||||
? SkTextBlobBuilderPriv::AllocRunTextPosH(&builder, font,
|
||||
it.offset().y(), it.glyphCount(), it.textSize(), SkString())
|
||||
: it.positioning() == SkTextBlobRunIterator::kFull_Positioning
|
||||
? SkTextBlobBuilderPriv::AllocRunTextPos(&builder, *filteredPaint,
|
||||
? SkTextBlobBuilderPriv::AllocRunTextPos(&builder, font,
|
||||
it.glyphCount(), it.textSize(), SkString())
|
||||
: (SkASSERT_RELEASE(false), SkTextBlobBuilder::RunBuffer());
|
||||
uint32_t glyphCount = it.glyphCount();
|
||||
|
Loading…
Reference in New Issue
Block a user