diff options
author | Mike Reed <reed@google.com> | 2018-10-22 14:24:07 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-10-22 18:48:19 +0000 |
commit | fe4fc148546b656a5fa139e565f3b92deff0c764 (patch) | |
tree | 45103e5099b3127352461523cd5aa33dcb11fb16 /src | |
parent | b7f0b9cd5c624544c8e622117a688123cafb7d31 (diff) | |
download | skqp-fe4fc148546b656a5fa139e565f3b92deff0c764.tar.gz |
Change SkFont to match needs of textblob
Tentative roadmap:
- land this
- extend TextBlobBuilder to take SkFont for its runs (eventually removing paint option)
- change SkTextBlob to store SkFont instead of SkRunFont (not critical, but makes sense)
After the above, (or during) also work towards:
- removing callers of SkPaint set... (textsize, textscalex, typeface, etc.)
- eventually physically remove those setters/getters/fields
- rev as desired the SkFont API to clean up flags, hinting, etc.
Bug: skia:2664
Change-Id: I0e323c58aef055e26d697911b078797453cb3626
Reviewed-on: https://skia-review.googlesource.com/c/163783
Commit-Queue: Mike Reed <reed@google.com>
Auto-Submit: Mike Reed <reed@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkFont.cpp | 73 |
1 files changed, 33 insertions, 40 deletions
diff --git a/src/core/SkFont.cpp b/src/core/SkFont.cpp index f9423a27e0..821c020c58 100644 --- a/src/core/SkFont.cpp +++ b/src/core/SkFont.cpp @@ -11,14 +11,13 @@ #include "SkTypeface.h" #include "SkUTF.h" -SkFont::SkFont(sk_sp<SkTypeface> face, SkScalar size, SkScalar scaleX, SkScalar skewX, MaskType mt, +SkFont::SkFont(sk_sp<SkTypeface> face, SkScalar size, SkScalar scaleX, SkScalar skewX, uint32_t flags) : fTypeface(face ? std::move(face) : SkTypeface::MakeDefault()) , fSize(size) , fScaleX(scaleX) , fSkewX(skewX) , fFlags(flags) - , fMaskType(SkToU8(mt)) { SkASSERT(size > 0); SkASSERT(scaleX > 0); @@ -26,33 +25,15 @@ SkFont::SkFont(sk_sp<SkTypeface> face, SkScalar size, SkScalar scaleX, SkScalar SkASSERT(0 == (flags & ~kAllFlags)); } -sk_sp<SkFont> SkFont::Make(sk_sp<SkTypeface> face, SkScalar size, SkScalar scaleX, SkScalar skewX, - MaskType mt, uint32_t flags) { - if (size <= 0 || !SkScalarIsFinite(size)) { - return nullptr; - } - if (scaleX <= 0 || !SkScalarIsFinite(scaleX)) { - return nullptr; - } - if (!SkScalarIsFinite(skewX)) { - return nullptr; - } - flags &= kAllFlags; - return sk_sp<SkFont>(new SkFont(std::move(face), size, scaleX, skewX, mt, flags)); -} +SkFont::SkFont(sk_sp<SkTypeface> face, SkScalar size, uint32_t flags) + : SkFont(std::move(face), size, 1, 0, flags) {} -sk_sp<SkFont> SkFont::Make(sk_sp<SkTypeface> face, SkScalar size, MaskType mt, uint32_t flags) { - return SkFont::Make(std::move(face), size, 1, 0, mt, flags); +SkFont SkFont::makeWithSize(SkScalar newSize) const { + return {this->refTypeface(), newSize, this->getScaleX(), this->getSkewX(), this->getFlags()}; } -sk_sp<SkFont> SkFont::makeWithSize(SkScalar newSize) const { - return SkFont::Make(sk_ref_sp(this->getTypeface()), newSize, this->getScaleX(), - this->getSkewX(), this->getMaskType(), this->getFlags()); -} - -sk_sp<SkFont> SkFont::makeWithFlags(uint32_t newFlags) const { - return SkFont::Make(sk_ref_sp(this->getTypeface()), this->getSize(), this->getScaleX(), - this->getSkewX(), this->getMaskType(), newFlags); +SkFont SkFont::makeWithFlags(uint32_t newFlags) const { + return {this->refTypeface(), this->getSize(), this->getScaleX(), this->getSkewX(), newFlags}; } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -116,7 +97,20 @@ SkScalar SkFont::measureText(const void* text, size_t byteLength, SkTextEncoding #include "SkPaint.h" -sk_sp<SkFont> SkFont::Testing_CreateFromPaint(const SkPaint& paint) { +void SkFont::LEGACY_applyToPaint(SkPaint* paint) const { + paint->setEmbeddedBitmapText(SkToBool(fFlags & kEmbeddedBitmaps_Flag)); + paint->setFakeBoldText(SkToBool(fFlags & kEmbolden_Flag)); + paint->setAutohinted(SkToBool(fFlags & kForceAutoHinting_Flag)); + paint->setSubpixelText(SkToBool(fFlags & kSubpixel_Flag)); + paint->setLinearText(SkToBool(fFlags & kLinearMetrics_Flag)); + + unsigned hinting = (fFlags >> kHinting_FlagShift) & kHinting_FlagMask; + paint->setHinting((SkPaint::Hinting)hinting); + + paint->setAntiAlias(SkToBool(fFlags & kDEPRECATED_Antialias_Flag)); +} + +SkFont SkFont::LEGACY_ExtractFromPaint(const SkPaint& paint) { uint32_t flags = 0; if (paint.isVerticalText()) { flags |= kVertical_Flag; @@ -127,24 +121,23 @@ sk_sp<SkFont> SkFont::Testing_CreateFromPaint(const SkPaint& paint) { if (paint.isFakeBoldText()) { flags |= kEmbolden_Flag; } - - if (SkPaint::kFull_Hinting == paint.getHinting()) { - flags |= kEnableByteCodeHints_Flag; - } if (paint.isAutohinted()) { - flags |= kEnableAutoHints_Flag; + flags |= kForceAutoHinting_Flag; + } + if (paint.isSubpixelText()) { + flags |= kSubpixel_Flag; } - if (paint.isSubpixelText() || paint.isLinearText()) { - // this is our default - } else { - flags |= kUseNonlinearMetrics_Flag; + if (paint.isLinearText()) { + flags |= kLinearMetrics_Flag; } - MaskType maskType = SkFont::kBW_MaskType; if (paint.isAntiAlias()) { - maskType = paint.isLCDRenderText() ? kLCD_MaskType : kA8_MaskType; + flags |= kDEPRECATED_Antialias_Flag; } - return Make(sk_ref_sp(paint.getTypeface()), paint.getTextSize(), paint.getTextScaleX(), - paint.getTextSkewX(), maskType, flags); + unsigned hinting = (unsigned)paint.getHinting(); + flags |= (hinting << kHinting_FlagShift); + + return SkFont(sk_ref_sp(paint.getTypeface()), paint.getTextSize(), paint.getTextScaleX(), + paint.getTextSkewX(), flags); } |