Loading libs/hwui/DeferredLayerUpdater.cpp +10 −11 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ // TODO: Use public SurfaceTexture APIs once available and include public NDK header file instead. #include <surfacetexture/surface_texture_platform.h> #include "AutoBackendTextureRelease.h" #include "Matrix.h" #include "Properties.h" #include "renderstate/RenderState.h" #include "renderthread/EglManager.h" Loading Loading @@ -144,17 +145,16 @@ void DeferredLayerUpdater::apply() { } if (mUpdateTexImage) { mUpdateTexImage = false; float transformMatrix[16]; android_dataspace dataspace; int slot; bool newContent = false; ARect rect; uint32_t textureTransform; // Note: ASurfaceTexture_dequeueBuffer discards all but the last frame. This // is necessary if the SurfaceTexture queue is in synchronous mode, and we // cannot tell which mode it is in. AHardwareBuffer* hardwareBuffer = ASurfaceTexture_dequeueBuffer( mSurfaceTexture.get(), &slot, &dataspace, &newContent, createReleaseFence, fenceWait, this, &rect, &textureTransform); mSurfaceTexture.get(), &slot, &dataspace, transformMatrix, &newContent, createReleaseFence, fenceWait, this); if (hardwareBuffer) { mCurrentSlot = slot; Loading @@ -165,12 +165,12 @@ void DeferredLayerUpdater::apply() { // (invoked by createIfNeeded) will add a ref to the AHardwareBuffer. AHardwareBuffer_release(hardwareBuffer); if (layerImage.get()) { SkMatrix textureTransform; mat4(transformMatrix).copyTo(textureTransform); // force filtration if buffer size != layer size bool forceFilter = mWidth != layerImage->width() || mHeight != layerImage->height(); SkRect cropRect = SkRect::MakeLTRB(rect.left, rect.top, rect.right, rect.bottom); updateLayer(forceFilter, textureTransform, cropRect, layerImage); updateLayer(forceFilter, textureTransform, layerImage); } } } Loading @@ -182,13 +182,12 @@ void DeferredLayerUpdater::apply() { } } void DeferredLayerUpdater::updateLayer(bool forceFilter, const uint32_t textureTransform, const SkRect cropRect, const sk_sp<SkImage>& layerImage) { void DeferredLayerUpdater::updateLayer(bool forceFilter, const SkMatrix& textureTransform, const sk_sp<SkImage>& layerImage) { mLayer->setBlend(mBlend); mLayer->setForceFilter(forceFilter); mLayer->setSize(mWidth, mHeight); mLayer->setTextureTransform(textureTransform); mLayer->setCropRect(cropRect); mLayer->getTexTransform() = textureTransform; mLayer->setImage(layerImage); } Loading libs/hwui/DeferredLayerUpdater.h +1 −1 Original line number Diff line number Diff line Loading @@ -90,7 +90,7 @@ public: void detachSurfaceTexture(); void updateLayer(bool forceFilter, const uint32_t textureTransform, const SkRect cropRect, void updateLayer(bool forceFilter, const SkMatrix& textureTransform, const sk_sp<SkImage>& layerImage); void destroyLayer(); Loading libs/hwui/Layer.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ Layer::Layer(RenderState& renderState, sk_sp<SkColorFilter> colorFilter, int alp // preserves the old inc/dec ref locations. This should be changed... incStrong(nullptr); renderState.registerLayer(this); texTransform.setIdentity(); transform.setIdentity(); } Loading Loading @@ -100,6 +101,7 @@ void Layer::draw(SkCanvas* canvas) { const int layerHeight = getHeight(); if (layerImage) { SkMatrix textureMatrixInv; textureMatrixInv = getTexTransform(); // 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; Loading libs/hwui/Layer.h +6 −19 Original line number Diff line number Diff line Loading @@ -74,17 +74,9 @@ public: void setColorFilter(sk_sp<SkColorFilter> filter) { mColorFilter = filter; }; inline SkMatrix& getTransform() { return transform; } inline SkRect getCropRect() { return mCropRect; } inline SkMatrix& getTexTransform() { return texTransform; } inline void setCropRect(const SkRect cropRect) { mCropRect = cropRect; } inline void setTextureTransform(uint32_t textureTransform) { mTextureTransform = textureTransform; } inline uint32_t getTextureTransform() { return mTextureTransform; } inline SkMatrix& getTransform() { return transform; } /** * Posts a decStrong call to the appropriate thread. Loading Loading @@ -124,19 +116,14 @@ private: SkBlendMode mode; /** * Optional transform. * Optional texture coordinates transform. */ SkMatrix transform; /** * Optional crop */ SkRect mCropRect; SkMatrix texTransform; /** * Optional transform * Optional transform. */ uint32_t mTextureTransform; SkMatrix transform; /** * An image backing the layer. Loading libs/hwui/Readback.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -251,6 +251,8 @@ CopyResult Readback::copyHWBitmapInto(Bitmap* hwBitmap, SkBitmap* bitmap) { Rect srcRect; Matrix4 transform; transform.loadScale(1, -1, 1); transform.translate(0, -1); return copyImageInto(hwBitmap->makeImage(), transform, srcRect, bitmap); } Loading Loading @@ -278,6 +280,8 @@ CopyResult Readback::copyLayerInto(DeferredLayerUpdater* deferredLayer, SkBitmap CopyResult Readback::copyImageInto(const sk_sp<SkImage>& image, SkBitmap* bitmap) { Rect srcRect; Matrix4 transform; transform.loadScale(1, -1, 1); transform.translate(0, -1); return copyImageInto(image, transform, srcRect, bitmap); } Loading Loading @@ -316,6 +320,7 @@ CopyResult Readback::copyImageInto(const sk_sp<SkImage>& image, Matrix4& texTran Layer layer(mRenderThread.renderState(), nullptr, 255, SkBlendMode::kSrc); layer.setSize(displayedWidth, displayedHeight); texTransform.copyTo(layer.getTexTransform()); layer.setImage(image); // Scaling filter is not explicitly set here, because it is done inside copyLayerInfo // after checking the necessity based on the src/dest rect size and the transformation. Loading Loading
libs/hwui/DeferredLayerUpdater.cpp +10 −11 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ // TODO: Use public SurfaceTexture APIs once available and include public NDK header file instead. #include <surfacetexture/surface_texture_platform.h> #include "AutoBackendTextureRelease.h" #include "Matrix.h" #include "Properties.h" #include "renderstate/RenderState.h" #include "renderthread/EglManager.h" Loading Loading @@ -144,17 +145,16 @@ void DeferredLayerUpdater::apply() { } if (mUpdateTexImage) { mUpdateTexImage = false; float transformMatrix[16]; android_dataspace dataspace; int slot; bool newContent = false; ARect rect; uint32_t textureTransform; // Note: ASurfaceTexture_dequeueBuffer discards all but the last frame. This // is necessary if the SurfaceTexture queue is in synchronous mode, and we // cannot tell which mode it is in. AHardwareBuffer* hardwareBuffer = ASurfaceTexture_dequeueBuffer( mSurfaceTexture.get(), &slot, &dataspace, &newContent, createReleaseFence, fenceWait, this, &rect, &textureTransform); mSurfaceTexture.get(), &slot, &dataspace, transformMatrix, &newContent, createReleaseFence, fenceWait, this); if (hardwareBuffer) { mCurrentSlot = slot; Loading @@ -165,12 +165,12 @@ void DeferredLayerUpdater::apply() { // (invoked by createIfNeeded) will add a ref to the AHardwareBuffer. AHardwareBuffer_release(hardwareBuffer); if (layerImage.get()) { SkMatrix textureTransform; mat4(transformMatrix).copyTo(textureTransform); // force filtration if buffer size != layer size bool forceFilter = mWidth != layerImage->width() || mHeight != layerImage->height(); SkRect cropRect = SkRect::MakeLTRB(rect.left, rect.top, rect.right, rect.bottom); updateLayer(forceFilter, textureTransform, cropRect, layerImage); updateLayer(forceFilter, textureTransform, layerImage); } } } Loading @@ -182,13 +182,12 @@ void DeferredLayerUpdater::apply() { } } void DeferredLayerUpdater::updateLayer(bool forceFilter, const uint32_t textureTransform, const SkRect cropRect, const sk_sp<SkImage>& layerImage) { void DeferredLayerUpdater::updateLayer(bool forceFilter, const SkMatrix& textureTransform, const sk_sp<SkImage>& layerImage) { mLayer->setBlend(mBlend); mLayer->setForceFilter(forceFilter); mLayer->setSize(mWidth, mHeight); mLayer->setTextureTransform(textureTransform); mLayer->setCropRect(cropRect); mLayer->getTexTransform() = textureTransform; mLayer->setImage(layerImage); } Loading
libs/hwui/DeferredLayerUpdater.h +1 −1 Original line number Diff line number Diff line Loading @@ -90,7 +90,7 @@ public: void detachSurfaceTexture(); void updateLayer(bool forceFilter, const uint32_t textureTransform, const SkRect cropRect, void updateLayer(bool forceFilter, const SkMatrix& textureTransform, const sk_sp<SkImage>& layerImage); void destroyLayer(); Loading
libs/hwui/Layer.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ Layer::Layer(RenderState& renderState, sk_sp<SkColorFilter> colorFilter, int alp // preserves the old inc/dec ref locations. This should be changed... incStrong(nullptr); renderState.registerLayer(this); texTransform.setIdentity(); transform.setIdentity(); } Loading Loading @@ -100,6 +101,7 @@ void Layer::draw(SkCanvas* canvas) { const int layerHeight = getHeight(); if (layerImage) { SkMatrix textureMatrixInv; textureMatrixInv = getTexTransform(); // 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; Loading
libs/hwui/Layer.h +6 −19 Original line number Diff line number Diff line Loading @@ -74,17 +74,9 @@ public: void setColorFilter(sk_sp<SkColorFilter> filter) { mColorFilter = filter; }; inline SkMatrix& getTransform() { return transform; } inline SkRect getCropRect() { return mCropRect; } inline SkMatrix& getTexTransform() { return texTransform; } inline void setCropRect(const SkRect cropRect) { mCropRect = cropRect; } inline void setTextureTransform(uint32_t textureTransform) { mTextureTransform = textureTransform; } inline uint32_t getTextureTransform() { return mTextureTransform; } inline SkMatrix& getTransform() { return transform; } /** * Posts a decStrong call to the appropriate thread. Loading Loading @@ -124,19 +116,14 @@ private: SkBlendMode mode; /** * Optional transform. * Optional texture coordinates transform. */ SkMatrix transform; /** * Optional crop */ SkRect mCropRect; SkMatrix texTransform; /** * Optional transform * Optional transform. */ uint32_t mTextureTransform; SkMatrix transform; /** * An image backing the layer. Loading
libs/hwui/Readback.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -251,6 +251,8 @@ CopyResult Readback::copyHWBitmapInto(Bitmap* hwBitmap, SkBitmap* bitmap) { Rect srcRect; Matrix4 transform; transform.loadScale(1, -1, 1); transform.translate(0, -1); return copyImageInto(hwBitmap->makeImage(), transform, srcRect, bitmap); } Loading Loading @@ -278,6 +280,8 @@ CopyResult Readback::copyLayerInto(DeferredLayerUpdater* deferredLayer, SkBitmap CopyResult Readback::copyImageInto(const sk_sp<SkImage>& image, SkBitmap* bitmap) { Rect srcRect; Matrix4 transform; transform.loadScale(1, -1, 1); transform.translate(0, -1); return copyImageInto(image, transform, srcRect, bitmap); } Loading Loading @@ -316,6 +320,7 @@ CopyResult Readback::copyImageInto(const sk_sp<SkImage>& image, Matrix4& texTran Layer layer(mRenderThread.renderState(), nullptr, 255, SkBlendMode::kSrc); layer.setSize(displayedWidth, displayedHeight); texTransform.copyTo(layer.getTexTransform()); layer.setImage(image); // Scaling filter is not explicitly set here, because it is done inside copyLayerInfo // after checking the necessity based on the src/dest rect size and the transformation. Loading