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

Commit 8f9a9f61 authored by Romain Guy's avatar Romain Guy
Browse files

Clip text correctly

Bug #5706056

A newly introduced optimization relied on the display list renderer
to properly measure text to perform fast clipping. The paint used
to measure text needs to have AA and glyph id encoding set to return
the correct results. Unfortunately these properties were set by
the GL renderer and not by the display list renderer. This change
simply sets the properties in the display list renderer instead.

This change also improves the error message printed out when the
application attempts to use a bitmap larger than the max texture
size.

Change-Id: I4d84e1c7d194aed9ad476f69434eaa2c8f3836a8
parent cac5fd3e
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1204,6 +1204,16 @@ void DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
    addText(text, bytesCount);
    addInt(count);
    addPoint(x, y);
    // TODO: We should probably make a copy of the paint instead of modifying
    //       it; modifying the paint will change its generationID the first
    //       time, which might impact caches. More investigation needed to
    //       see if it matters.
    //       If we make a copy, then drawTextDecorations() should *not* make
    //       its own copy as it does right now.
    paint->setAntiAlias(true);
#if RENDER_TEXT_AS_GLYPHS
    paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
#endif
    addPaint(paint);
    addFloat(length < 0.0f ? paint->measureText(text, bytesCount) : length);
}
+1 −1
Original line number Diff line number Diff line
@@ -290,7 +290,7 @@ public:
    virtual void drawLines(float* points, int count, SkPaint* paint);
    virtual void drawPoints(float* points, int count, SkPaint* paint);
    virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
            SkPaint* paint, float length);
            SkPaint* paint, float length = 1.0f);

    virtual void resetShader();
    virtual void setupShader(SkiaShader* shader);
+2 −10
Original line number Diff line number Diff line
@@ -2069,16 +2069,7 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count,
    }
    if (mSnapshot->isIgnored()) return;

    // TODO: We should probably make a copy of the paint instead of modifying
    //       it; modifying the paint will change its generationID the first
    //       time, which might impact caches. More investigation needed to
    //       see if it matters.
    //       If we make a copy, then drawTextDecorations() should *not* make
    //       its own copy as it does right now.
    paint->setAntiAlias(true);
#if RENDER_TEXT_AS_GLYPHS
    paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
#endif
    // NOTE: AA and glyph id encoding are set in DisplayListRenderer.cpp

    switch (paint->getTextAlign()) {
        case SkPaint::kCenter_Align:
@@ -2095,6 +2086,7 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count,

    SkPaint::FontMetrics metrics;
    paint->getFontMetrics(&metrics, 0.0f);
    // If no length was specified, just perform the hit test on the Y axis
    if (quickReject(x, y + metrics.fTop,
            x + (length >= 0.0f ? length : INT_MAX / 2), y + metrics.fBottom)) {
        return;
+2 −1
Original line number Diff line number Diff line
@@ -503,7 +503,8 @@ PathTexture* ShapeCache<Entry>::addTexture(const Entry& entry, const SkPath *pat
    const uint32_t height = uint32_t(pathHeight + offset * 2.0 + 0.5);

    if (width > mMaxTextureSize || height > mMaxTextureSize) {
        LOGW("Shape %s too large to be rendered into a texture", mName);
        LOGW("Shape %s too large to be rendered into a texture (%dx%d, max=%dx%d)",
                mName, width, height, mMaxTextureSize, mMaxTextureSize);
        return NULL;
    }

+2 −1
Original line number Diff line number Diff line
@@ -125,7 +125,8 @@ Texture* TextureCache::get(SkBitmap* bitmap) {

    if (!texture) {
        if (bitmap->width() > mMaxTextureSize || bitmap->height() > mMaxTextureSize) {
            LOGW("Bitmap too large to be uploaded into a texture");
            LOGW("Bitmap too large to be uploaded into a texture (%dx%d, max=%dx%d)",
                    bitmap->width(), bitmap->height(), mMaxTextureSize, mMaxTextureSize);
            return NULL;
        }