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

Commit d01b5916 authored by Derek Sollenberger's avatar Derek Sollenberger
Browse files

Set the color space to sRGB on the Surface and remove colorFilter.

Also for a canvas wrapping a bitmap the colorspace of the bitmap
will be used to correctly blend content.

Test: CtsUiRenderingTestCases
Bug: 111436479
Change-Id: I63ad7a30605a7f725cc0ef4716d42ea978fb03e3
parent fe878c45
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -64,11 +64,10 @@ static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, j
        jint tileModeX, jint tileModeY) {
    const SkMatrix* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
    sk_sp<SkImage> image;
    sk_sp<SkColorFilter> colorFilter;
    if (jbitmap) {
        // Only pass a valid SkBitmap object to the constructor if the Bitmap exists. Otherwise,
        // we'll pass an empty SkBitmap to avoid crashing/excepting for compatibility.
        image = android::bitmap::toBitmap(env, jbitmap).makeImage(&colorFilter);
        image = android::bitmap::toBitmap(env, jbitmap).makeImage();
    }

    if (!image.get()) {
@@ -81,9 +80,6 @@ static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, j
    if (matrix) {
        shader = shader->makeWithLocalMatrix(*matrix);
    }
    if(colorFilter) {
        shader = shader->makeWithColorFilter(colorFilter);
    }

    ThrowIAE_IfNull(env, shader.get());
    return reinterpret_cast<jlong>(shader.release());
+3 −5
Original line number Diff line number Diff line
@@ -85,19 +85,18 @@ void DeferredLayerUpdater::apply() {
            mUpdateTexImage = false;
            sk_sp<SkImage> layerImage;
            SkMatrix textureTransform;
            android_dataspace dataSpace;
            bool queueEmpty = true;
            // If the SurfaceTexture queue is in synchronous mode, need to discard all
            // but latest frame. Since we can't tell which mode it is in,
            // do this unconditionally.
            do {
                layerImage = mSurfaceTexture->dequeueImage(textureTransform, dataSpace, &queueEmpty,
                layerImage = mSurfaceTexture->dequeueImage(textureTransform, &queueEmpty,
                        mRenderState);
            } while (layerImage.get() && (!queueEmpty));
            if (layerImage.get()) {
                // force filtration if buffer size != layer size
                bool forceFilter = mWidth != layerImage->width() || mHeight != layerImage->height();
                updateLayer(forceFilter, textureTransform, dataSpace, layerImage);
                updateLayer(forceFilter, textureTransform, layerImage);
            }
        }

@@ -109,12 +108,11 @@ void DeferredLayerUpdater::apply() {
}

void DeferredLayerUpdater::updateLayer(bool forceFilter, const SkMatrix& textureTransform,
        android_dataspace dataspace, const sk_sp<SkImage>& layerImage) {
        const sk_sp<SkImage>& layerImage) {
    mLayer->setBlend(mBlend);
    mLayer->setForceFilter(forceFilter);
    mLayer->setSize(mWidth, mHeight);
    mLayer->getTexTransform() = textureTransform;
    mLayer->setDataSpace(dataspace);
    mLayer->setImage(layerImage);
}

+1 −1
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ public:
    void detachSurfaceTexture();

    void updateLayer(bool forceFilter, const SkMatrix& textureTransform,
            android_dataspace dataspace, const sk_sp<SkImage>& layerImage);
                     const sk_sp<SkImage>& layerImage);

    void destroyLayer();

+0 −31
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ Layer::Layer(RenderState& renderState, sk_sp<SkColorFilter> colorFilter, int alp
    // TODO: This is a violation of Android's typical ref counting, but it
    // preserves the old inc/dec ref locations. This should be changed...
    incStrong(nullptr);
    buildColorSpaceWithFilter();
    renderState.registerLayer(this);
    texTransform.setIdentity();
    transform.setIdentity();
@@ -43,36 +42,6 @@ Layer::~Layer() {
    mRenderState.unregisterLayer(this);
}

void Layer::setColorFilter(sk_sp<SkColorFilter> filter) {
    if (filter != mColorFilter) {
        mColorFilter = filter;
        buildColorSpaceWithFilter();
    }
}

void Layer::setDataSpace(android_dataspace dataspace) {
    if (dataspace != mCurrentDataspace) {
        mCurrentDataspace = dataspace;
        buildColorSpaceWithFilter();
    }
}

void Layer::buildColorSpaceWithFilter() {
    sk_sp<SkColorFilter> colorSpaceFilter;
    sk_sp<SkColorSpace> colorSpace = DataSpaceToColorSpace(mCurrentDataspace);
    if (colorSpace && !colorSpace->isSRGB()) {
        colorSpaceFilter = SkToSRGBColorFilter::Make(colorSpace);
    }

    if (mColorFilter && colorSpaceFilter) {
        mColorSpaceWithFilter = mColorFilter->makeComposed(colorSpaceFilter);
    } else if (colorSpaceFilter) {
        mColorSpaceWithFilter = colorSpaceFilter;
    } else {
        mColorSpaceWithFilter = mColorFilter;
    }
}

void Layer::postDecStrong() {
    mRenderState.postDecStrong(this);
}
+2 −20
Original line number Diff line number Diff line
@@ -69,15 +69,9 @@ public:

    SkBlendMode getMode() const;

    inline SkColorFilter* getColorFilter() const { return mColorFilter.get(); }
    inline sk_sp<SkColorFilter> getColorFilter() const { return mColorFilter; }

    void setColorFilter(sk_sp<SkColorFilter> filter);

    void setDataSpace(android_dataspace dataspace);

    void setColorSpace(sk_sp<SkColorSpace> colorSpace);

    inline sk_sp<SkColorFilter> getColorSpaceWithFilter() const { return mColorSpaceWithFilter; }
    void setColorFilter(sk_sp<SkColorFilter> filter) { mColorFilter = filter; };

    inline SkMatrix& getTexTransform() { return texTransform; }

@@ -98,23 +92,11 @@ protected:
    RenderState& mRenderState;

private:
    void buildColorSpaceWithFilter();

    /**
     * Color filter used to draw this layer. Optional.
     */
    sk_sp<SkColorFilter> mColorFilter;

    /**
     * Colorspace of the contents of the layer. Optional.
     */
    android_dataspace mCurrentDataspace = HAL_DATASPACE_UNKNOWN;

    /**
     * A color filter that is the combination of the mColorFilter and mColorSpace. Optional.
     */
    sk_sp<SkColorFilter> mColorSpaceWithFilter;

    /**
     * Indicates raster data backing the layer is scaled, requiring filtration.
     */
Loading