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

Commit 944dbf25 authored by Stan Iliev's avatar Stan Iliev
Browse files

Apply texture matrix to the layer canvas

Fix camera preview shown inverted. Apply texture matrix when
drawing opengl layer.

Test: Ran camera preview in message app and smart lock with face.
Ran CtsUiRenderingTestCases and CtsGraphicsTestCases tests.
Bug: 65534412
Change-Id: I3ed52a6c62921fcdfe30104dd176802ed1533fad
parent de893f3f
Loading
Loading
Loading
Loading
+25 −15
Original line number Diff line number Diff line
@@ -36,22 +36,18 @@ void LayerDrawable::onDraw(SkCanvas* canvas) {

bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer) {
    // transform the matrix based on the layer
    int saveCount = -1;
    if (!layer->getTransform().isIdentity()) {
        saveCount = canvas->save();
        SkMatrix transform;
        layer->getTransform().copyTo(transform);
        canvas->concat(transform);
    }

    SkMatrix layerTransform;
    layer->getTransform().copyTo(layerTransform);
    sk_sp<SkImage> layerImage;
    int layerWidth = layer->getWidth();
    int layerHeight = layer->getHeight();
    if (layer->getApi() == Layer::Api::OpenGL) {
        GlLayer* glLayer = static_cast<GlLayer*>(layer);
        GrGLTextureInfo externalTexture;
        externalTexture.fTarget = glLayer->getRenderTarget();
        externalTexture.fID = glLayer->getTextureId();
        GrBackendTexture backendTexture(glLayer->getWidth(), glLayer->getHeight(),
                kRGBA_8888_GrPixelConfig, externalTexture);
        GrBackendTexture backendTexture(layerWidth, layerHeight, kRGBA_8888_GrPixelConfig,
                externalTexture);
        layerImage = SkImage::MakeFromTexture(context, backendTexture, kTopLeft_GrSurfaceOrigin,
                kPremul_SkAlphaType, nullptr);
    } else {
@@ -62,15 +58,29 @@ bool LayerDrawable::DrawLayer(GrContext* context, SkCanvas* canvas, Layer* layer
    }

    if (layerImage) {
        SkMatrix textureMatrix;
        layer->getTexTransform().copyTo(textureMatrix);
        //TODO: after skia bug https://bugs.chromium.org/p/skia/issues/detail?id=7075 is fixed
        // use bottom left origin and remove flipV and invert transformations.
        SkMatrix flipV;
        flipV.setAll(1, 0, 0, 0, -1, 1, 0, 0, 1);
        textureMatrix.preConcat(flipV);
        textureMatrix.preScale(1.0f/layerWidth, 1.0f/layerHeight);
        textureMatrix.postScale(layerWidth, layerHeight);
        SkMatrix textureMatrixInv;
        if (!textureMatrix.invert(&textureMatrixInv)) {
            textureMatrixInv = textureMatrix;
        }

        SkMatrix matrix = SkMatrix::Concat(textureMatrixInv, layerTransform);

        SkPaint paint;
        paint.setAlpha(layer->getAlpha());
        paint.setBlendMode(layer->getMode());
        paint.setColorFilter(sk_ref_sp(layer->getColorFilter()));
        canvas->drawImage(layerImage, 0, 0, &paint);
    }
    // restore the original matrix
    if (saveCount >= 0) {
        canvas->restoreToCount(saveCount);
        // draw image with a shader to avoid save/restore of the matrix
        paint.setShader(layerImage->makeShader(&matrix));
        canvas->drawRect(SkRect::MakeWH(layerWidth, layerHeight), paint);
    }

    return layerImage;