Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c25e5a1 authored by Raph Levien's avatar Raph Levien Committed by Android Git Automerger
Browse files

am 79fbad97: Merge "Support for scaleX and skewX in Minikin" into lmp-preview-dev

* commit '79fbad97705d191f80d7af7e494ca4a5fed3a783':
  Support for scaleX and skewX in Minikin
parents ef7dfc08 30d3c97f
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -46,8 +46,10 @@ bool MinikinFontSkia::GetGlyph(uint32_t codepoint, uint32_t *glyph) const {
static void MinikinFontSkia_SetSkiaPaint(SkTypeface* typeface, SkPaint* skPaint, const MinikinPaint& paint) {
    skPaint->setTypeface(typeface);
    skPaint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
    // TODO: set more paint parameters from Minikin
    skPaint->setTextSize(paint.size);
    skPaint->setTextScaleX(paint.scaleX);
    skPaint->setTextSkewX(paint.skewX);
    MinikinFontSkia::unpackPaintFlags(skPaint, paint.paintFlags);
}

float MinikinFontSkia::GetHorizontalAdvance(uint32_t glyph_id,
@@ -96,4 +98,21 @@ int32_t MinikinFontSkia::GetUniqueId() const {
    return mTypeface->uniqueID();
}

uint32_t MinikinFontSkia::packPaintFlags(const SkPaint* paint) {
    uint32_t flags = paint->getFlags();
    SkPaint::Hinting hinting = paint->getHinting();
    // select only flags that might affect text layout
    flags &= (SkPaint::kAntiAlias_Flag | SkPaint::kFakeBoldText_Flag | SkPaint::kLinearText_Flag |
            SkPaint::kSubpixelText_Flag | SkPaint::kDevKernText_Flag |
            SkPaint::kEmbeddedBitmapText_Flag | SkPaint::kAutoHinting_Flag |
            SkPaint::kVerticalText_Flag);
    flags |= (hinting << 16);
    return flags;
}

void MinikinFontSkia::unpackPaintFlags(SkPaint* paint, uint32_t paintFlags) {
    paint->setFlags(paintFlags & SkPaint::kAllFlags);
    paint->setHinting(static_cast<SkPaint::Hinting>(paintFlags >> 16));
}

}
+2 −0
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ public:

    SkTypeface *GetSkTypeface();

    static uint32_t packPaintFlags(const SkPaint* paint);
    static void unpackPaintFlags(SkPaint* paint, uint32_t paintFlags);
private:
    SkTypeface *mTypeface;
};
+21 −4
Original line number Diff line number Diff line
@@ -14,6 +14,9 @@
 * limitations under the License.
 */

#define LOG_TAG "Minikin"
#include <cutils/log.h>

#include "SkPaint.h"
#include "minikin/Layout.h"
#include "TypefaceImpl.h"
@@ -23,23 +26,37 @@

namespace android {

// Do an sprintf starting at offset n, abort on overflow
static int snprintfcat(char* buf, int off, int size, const char* format, ...) {
    va_list args;
    va_start(args, format);
    int n = vsnprintf(buf + off, size - off, format, args);
    LOG_ALWAYS_FATAL_IF(n >= size - off, "String overflow in setting layout properties");
    va_end(args);
    return off + n;
}

void MinikinUtils::SetLayoutProperties(Layout* layout, const SkPaint* paint, int flags,
    TypefaceImpl* typeface) {
    TypefaceImpl* resolvedFace = TypefaceImpl_resolveDefault(typeface);
    layout->setFontCollection(resolvedFace->fFontCollection);
    FontStyle style = resolvedFace->fStyle;
    char css[256];
    int off = snprintf(css, sizeof(css),
        "font-size: %d; font-weight: %d; font-style: %s; -minikin-bidi: %d;",
    int off = snprintfcat(css, 0, sizeof(css),
        "font-size: %d; font-scale-x: %f; font-skew-x: %f; -paint-flags: %d;"
        " font-weight: %d; font-style: %s; -minikin-bidi: %d;",
        (int)paint->getTextSize(),
        paint->getTextScaleX(),
        paint->getTextSkewX(),
        MinikinFontSkia::packPaintFlags(paint),
        style.getWeight() * 100,
        style.getItalic() ? "italic" : "normal",
        flags);
    SkString langString = paint->getPaintOptionsAndroid().getLanguage().getTag();
    off += snprintf(css + off, sizeof(css) - off, " lang: %s;", langString.c_str());
    off = snprintfcat(css, off, sizeof(css), " lang: %s;", langString.c_str());
    SkPaintOptionsAndroid::FontVariant var = paint->getPaintOptionsAndroid().getFontVariant();
    const char* varstr = var == SkPaintOptionsAndroid::kElegant_Variant ? "elegant" : "compact";
    off += snprintf(css + off, sizeof(css) - off, " -minikin-variant: %s;", varstr);
    off = snprintfcat(css, off, sizeof(css), " -minikin-variant: %s;", varstr);
    layout->setProperties(css);
}

+4 −0
Original line number Diff line number Diff line
@@ -26,10 +26,14 @@

namespace android {

class Layout;
class TypefaceImpl;

class MinikinUtils {
public:
    static void SetLayoutProperties(Layout* layout, const SkPaint* paint, int flags,
        TypefaceImpl* face);

    static float xOffsetForTextAlign(SkPaint* paint, const Layout& layout);

    // f is a functor of type void f(SkTypeface *, size_t start, size_t end);
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <minikin/FontCollection.h>
#include <minikin/FontFamily.h>
#include <minikin/Layout.h>
#include "SkPaint.h"
#include "MinikinSkia.h"
#endif