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

Commit c5b5f055 authored by Chris Craik's avatar Chris Craik
Browse files

Account for colorfilter transparency in determining paint opacity

bug:17765601
Change-Id: I90d76ee199bb357c71fc8f537c1abfa20d848416
parent ec89863a
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -212,10 +212,13 @@ protected:

        // check state/paint for transparency
        if (mPaint) {
            if (mPaint->getAlpha() != 0xFF) {
                return false;
            }
            if (mPaint->getShader() && !mPaint->getShader()->isOpaque()) {
                return false;
            }
            if (mPaint->getAlpha() != 0xFF) {
            if (Renderer::isBlendedColorFilter(mPaint->getColorFilter())) {
                return false;
            }
        }
+0 −7
Original line number Diff line number Diff line
@@ -1714,13 +1714,6 @@ void OpenGLRenderer::accountForClear(SkXfermode::Mode mode) {
    }
}

static bool isBlendedColorFilter(const SkColorFilter* filter) {
    if (filter == NULL) {
        return false;
    }
    return (filter->getFlags() & SkColorFilter::kAlphaUnchanged_Flag) == 0;
}

void OpenGLRenderer::setupDrawBlending(const Layer* layer, bool swapSrcDst) {
    SkXfermode::Mode mode = layer->getMode();
    // When the blending mode is kClear_Mode, we need to use a modulate color
+10 −1
Original line number Diff line number Diff line
@@ -17,12 +17,13 @@
#ifndef ANDROID_HWUI_RENDERER_H
#define ANDROID_HWUI_RENDERER_H

#include <SkColorFilter.h>
#include <SkPaint.h>
#include <SkRegion.h>

#include <utils/String8.h>

#include "AssetAtlas.h"
#include "SkPaint.h"

namespace android {

@@ -81,6 +82,14 @@ public:
                && !paint.getColorFilter()
                && getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode;
    }

    static bool isBlendedColorFilter(const SkColorFilter* filter) {
        if (filter == NULL) {
            return false;
        }
        return (filter->getFlags() & SkColorFilter::kAlphaUnchanged_Flag) == 0;
    }

// ----------------------------------------------------------------------------
// Frame state operations
// ----------------------------------------------------------------------------