☠☠ backed out by 60c65a7eb0e8 ☠ ☠ | |
author | Markus Stange <mstange@themasta.com> |
Tue, 18 Nov 2014 11:36:17 -0500 (2014-11-18) | |
changeset 216311 | 0092a5e1467dc33582890f06f5a46a95d966ff49 |
parent 216310 | 9509628adfe45b496b7b25cce7ce954b7881013f |
child 216312 | 24a68796eb6e9b308c2365aea7df8ff47ae8ed44 |
push id | 27845 |
push user | kwierso@gmail.com |
push date | Wed, 19 Nov 2014 02:08:01 +0000 (2014-11-19) |
treeherder | mozilla-central@64e7a6391916 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jrmuizel |
bugs | 1097776 |
milestone | 36.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/layers/basic/BasicCompositor.cpp +++ b/gfx/layers/basic/BasicCompositor.cpp @@ -12,18 +12,18 @@ #include "gfx2DGlue.h" #include "mozilla/gfx/2D.h" #include "mozilla/gfx/Helpers.h" #include "gfxUtils.h" #include "YCbCrUtils.h" #include <algorithm> #include "ImageContainer.h" #include "gfxPrefs.h" -#define PIXMAN_DONT_DEFINE_STDINT -#include "pixman.h" // for pixman_f_transform, etc +#include "skia/SkCanvas.h" // for SkCanvas +#include "skia/SkBitmapDevice.h" // for SkBitmapDevice namespace mozilla { using namespace mozilla::gfx; namespace layers { class DataTextureSourceBasic : public DataTextureSource , public TextureSourceBasic @@ -163,85 +163,72 @@ DrawSurfaceWithTextureCoords(DrawTarget // Only use REPEAT if aTextureCoords is outside (0, 0, 1, 1). gfx::Rect unitRect(0, 0, 1, 1); ExtendMode mode = unitRect.Contains(aTextureCoords) ? ExtendMode::CLAMP : ExtendMode::REPEAT; FillRectWithMask(aDest, aDestRect, aSource, aFilter, DrawOptions(aOpacity), mode, aMask, aMaskTransform, &matrix); } -static pixman_transform -Matrix3DToPixman(const gfx3DMatrix& aMatrix) +static SkMatrix +Matrix3DToSkia(const gfx3DMatrix& aMatrix) { - pixman_f_transform transform; + SkMatrix transform; + transform.setAll(aMatrix._11, + aMatrix._21, + aMatrix._41, + aMatrix._12, + aMatrix._22, + aMatrix._42, + aMatrix._14, + aMatrix._24, + aMatrix._44); - transform.m[0][0] = aMatrix._11; - transform.m[0][1] = aMatrix._21; - transform.m[0][2] = aMatrix._41; - transform.m[1][0] = aMatrix._12; - transform.m[1][1] = aMatrix._22; - transform.m[1][2] = aMatrix._42; - transform.m[2][0] = aMatrix._14; - transform.m[2][1] = aMatrix._24; - transform.m[2][2] = aMatrix._44; - - pixman_transform result; - pixman_transform_from_pixman_f_transform(&result, &transform); - - return result; + return transform; } static void -PixmanTransform(DataSourceSurface* aDest, - DataSourceSurface* aSource, - const gfx3DMatrix& aTransform, - const Point& aDestOffset) +SkiaTransform(DataSourceSurface* aDest, + DataSourceSurface* aSource, + const gfx3DMatrix& aTransform, + const Point& aDestOffset) { + if (aTransform.IsSingular()) { + return; + } + IntSize destSize = aDest->GetSize(); - pixman_image_t* dest = pixman_image_create_bits(PIXMAN_a8r8g8b8, - destSize.width, - destSize.height, - (uint32_t*)aDest->GetData(), - aDest->Stride()); + SkImageInfo destInfo = SkImageInfo::Make(destSize.width, + destSize.height, + kBGRA_8888_SkColorType, + kPremul_SkAlphaType); + SkBitmap destBitmap; + destBitmap.setInfo(destInfo, aDest->Stride()); + destBitmap.setPixels((uint32_t*)aDest->GetData()); + SkCanvas destCanvas(new SkBitmapDevice(destBitmap)); IntSize srcSize = aSource->GetSize(); - pixman_image_t* src = pixman_image_create_bits(PIXMAN_a8r8g8b8, - srcSize.width, - srcSize.height, - (uint32_t*)aSource->GetData(), - aSource->Stride()); - - NS_ABORT_IF_FALSE(src && dest, "Failed to create pixman images?"); - - pixman_transform pixTransform = Matrix3DToPixman(aTransform); - pixman_transform pixTransformInverted; + SkImageInfo srcInfo = SkImageInfo::Make(srcSize.width, + srcSize.height, + kBGRA_8888_SkColorType, + kPremul_SkAlphaType); + SkBitmap src; + src.setInfo(srcInfo, aSource->Stride()); + src.setPixels((uint32_t*)aSource->GetData()); - // If the transform is singular then nothing would be drawn anyway, return here - if (!pixman_transform_invert(&pixTransformInverted, &pixTransform)) { - pixman_image_unref(dest); - pixman_image_unref(src); - return; - } - pixman_image_set_transform(src, &pixTransformInverted); + gfx3DMatrix transform = aTransform; + transform.TranslatePost(Point3D(-aDestOffset.x, -aDestOffset.y, 0)); + destCanvas.setMatrix(Matrix3DToSkia(transform)); - pixman_image_composite32(PIXMAN_OP_SRC, - src, - nullptr, - dest, - aDestOffset.x, - aDestOffset.y, - 0, - 0, - 0, - 0, - destSize.width, - destSize.height); - - pixman_image_unref(dest); - pixman_image_unref(src); + SkPaint paint; + paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setAntiAlias(true); + paint.setFilterLevel(SkPaint::kLow_FilterLevel); + SkRect destRect = SkRect::MakeXYWH(0, 0, srcSize.width, srcSize.height); + destCanvas.drawBitmapRectToRect(src, nullptr, destRect, &paint); } static inline IntRect RoundOut(Rect r) { r.RoundOut(); return IntRect(r.x, r.y, r.width, r.height); } @@ -377,17 +364,17 @@ BasicCompositor::DrawQuad(const gfx::Rec RefPtr<SourceSurface> snapshot = dest->Snapshot(); RefPtr<DataSourceSurface> source = snapshot->GetDataSurface(); RefPtr<DataSourceSurface> temp = Factory::CreateDataSourceSurface(RoundOut(transformBounds).Size(), SurfaceFormat::B8G8R8A8); if (NS_WARN_IF(!temp)) { return; } - PixmanTransform(temp, source, new3DTransform, transformBounds.TopLeft()); + SkiaTransform(temp, source, new3DTransform, transformBounds.TopLeft()); transformBounds.MoveTo(0, 0); buffer->DrawSurface(temp, transformBounds, transformBounds); } buffer->PopClip(); }
--- a/gfx/layers/basic/BasicLayerManager.cpp +++ b/gfx/layers/basic/BasicLayerManager.cpp @@ -41,19 +41,18 @@ #include "nsAutoPtr.h" // for nsRefPtr #include "nsCOMPtr.h" // for already_AddRefed #include "nsDebug.h" // for NS_ASSERTION, etc #include "nsISupportsImpl.h" // for gfxContext::Release, etc #include "nsPoint.h" // for nsIntPoint #include "nsRect.h" // for nsIntRect #include "nsRegion.h" // for nsIntRegion, etc #include "nsTArray.h" // for nsAutoTArray -#define PIXMAN_DONT_DEFINE_STDINT -#include "pixman.h" // for pixman_f_transform, etc - +#include "skia/SkCanvas.h" // for SkCanvas +#include "skia/SkBitmapDevice.h" // for SkBitmapDevice class nsIWidget; namespace mozilla { namespace layers { using namespace mozilla::gfx; /** @@ -600,85 +599,72 @@ void BasicLayerManager::SetRoot(Layer* aLayer) { NS_ASSERTION(aLayer, "Root can't be null"); NS_ASSERTION(aLayer->Manager() == this, "Wrong manager"); NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); mRoot = aLayer; } -static pixman_transform -BasicLayerManager_Matrix3DToPixman(const gfx3DMatrix& aMatrix) +static SkMatrix +BasicLayerManager_Matrix3DToSkia(const gfx3DMatrix& aMatrix) { - pixman_f_transform transform; + SkMatrix transform; + transform.setAll(aMatrix._11, + aMatrix._21, + aMatrix._41, + aMatrix._12, + aMatrix._22, + aMatrix._42, + aMatrix._14, + aMatrix._24, + aMatrix._44); - transform.m[0][0] = aMatrix._11; - transform.m[0][1] = aMatrix._21; - transform.m[0][2] = aMatrix._41; - transform.m[1][0] = aMatrix._12; - transform.m[1][1] = aMatrix._22; - transform.m[1][2] = aMatrix._42; - transform.m[2][0] = aMatrix._14; - transform.m[2][1] = aMatrix._24; - transform.m[2][2] = aMatrix._44; - - pixman_transform result; - pixman_transform_from_pixman_f_transform(&result, &transform); - - return result; + return transform; } static void -PixmanTransform(const gfxImageSurface* aDest, - RefPtr<DataSourceSurface> aSrc, - const gfx3DMatrix& aTransform, - gfxPoint aDestOffset) +SkiaTransform(const gfxImageSurface* aDest, + RefPtr<DataSourceSurface> aSrc, + const gfx3DMatrix& aTransform, + gfxPoint aDestOffset) { + if (aTransform.IsSingular()) { + return; + } + IntSize destSize = ToIntSize(aDest->GetSize()); - pixman_image_t* dest = pixman_image_create_bits(aDest->Format() == gfxImageFormat::ARGB32 ? PIXMAN_a8r8g8b8 : PIXMAN_x8r8g8b8, - destSize.width, - destSize.height, - (uint32_t*)aDest->Data(), - aDest->Stride()); + SkImageInfo destInfo = SkImageInfo::Make(destSize.width, + destSize.height, + kBGRA_8888_SkColorType, + kPremul_SkAlphaType); + SkBitmap destBitmap; + destBitmap.setInfo(destInfo, aDest->Stride()); + destBitmap.setPixels((uint32_t*)aDest->Data()); + SkCanvas destCanvas(new SkBitmapDevice(destBitmap)); IntSize srcSize = aSrc->GetSize(); - pixman_image_t* src = pixman_image_create_bits(aSrc->GetFormat() == SurfaceFormat::B8G8R8A8 ? PIXMAN_a8r8g8b8 : PIXMAN_x8r8g8b8, - srcSize.width, - srcSize.height, - (uint32_t*)aSrc->GetData(), - aSrc->Stride()); - - NS_ABORT_IF_FALSE(src && dest, "Failed to create pixman images?"); - - pixman_transform pixTransform = BasicLayerManager_Matrix3DToPixman(aTransform); - pixman_transform pixTransformInverted; + SkImageInfo srcInfo = SkImageInfo::Make(srcSize.width, + srcSize.height, + kBGRA_8888_SkColorType, + kPremul_SkAlphaType); + SkBitmap src; + src.setInfo(srcInfo, aSrc->Stride()); + src.setPixels((uint32_t*)aSrc->GetData()); - // If the transform is singular then nothing would be drawn anyway, return here - if (!pixman_transform_invert(&pixTransformInverted, &pixTransform)) { - pixman_image_unref(dest); - pixman_image_unref(src); - return; - } - pixman_image_set_transform(src, &pixTransformInverted); + gfx3DMatrix transform = aTransform; + transform.TranslatePost(Point3D(-aDestOffset.x, -aDestOffset.y, 0)); + destCanvas.setMatrix(BasicLayerManager_Matrix3DToSkia(transform)); - pixman_image_composite32(PIXMAN_OP_SRC, - src, - nullptr, - dest, - aDestOffset.x, - aDestOffset.y, - 0, - 0, - 0, - 0, - destSize.width, - destSize.height); - - pixman_image_unref(dest); - pixman_image_unref(src); + SkPaint paint; + paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setAntiAlias(true); + paint.setFilterLevel(SkPaint::kLow_FilterLevel); + SkRect destRect = SkRect::MakeXYWH(0, 0, srcSize.width, srcSize.height); + destCanvas.drawBitmapRectToRect(src, nullptr, destRect, &paint); } /** * Transform a surface using a gfx3DMatrix and blit to the destination if * it is efficient to do so. * * @param aSource Source surface. * @param aDest Desintation context. @@ -711,17 +697,17 @@ Transform3D(RefPtr<SourceSurface> aSourc aDestRect.height), gfxImageFormat::ARGB32); gfxPoint offset = aDestRect.TopLeft(); // Include a translation to the correct origin. gfx3DMatrix translation = gfx3DMatrix::Translation(aBounds.x, aBounds.y, 0); // Transform the content and offset it such that the content begins at the origin. - PixmanTransform(destImage, aSource->GetDataSurface(), translation * aTransform, offset); + SkiaTransform(destImage, aSource->GetDataSurface(), translation * aTransform, offset); // If we haven't actually drawn to aDest then return our temporary image so // that the caller can do this. return destImage.forget(); } void BasicLayerManager::PaintSelfOrChildren(PaintLayerContext& aPaintContext,
--- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -1838,10 +1838,10 @@ test-pref(layout.css.grid.enabled,true) == 1059498-2.html 1059498-1-ref.html == 1059498-3.html 1059498-1-ref.html fails-if(Android) == 1062792-1.html 1062792-1-ref.html == 1062963-floatmanager-reflow.html 1062963-floatmanager-reflow-ref.html test-pref(dom.webcomponents.enabled,true) == 1066554-1.html 1066554-1-ref.html == 1069716-1.html 1069716-1-ref.html == 1078262-1.html about:blank test-pref(layout.testing.overlay-scrollbars.always-visible,false) == 1081072-1.html 1081072-1-ref.html -== 1081185-1.html 1081185-1-ref.html +fuzzy-if(winWidget&&!layersGPUAccelerated,1,31) == 1081185-1.html 1081185-1-ref.html == 1097437-1.html 1097437-1-ref.html \ No newline at end of file
--- a/layout/reftests/transform-3d/reftest.list +++ b/layout/reftests/transform-3d/reftest.list @@ -30,28 +30,28 @@ fuzzy-if(winWidget,102,580) fuzzy-if(d2d == translate3d-1a.html translate3d-1-ref.html == matrix3d-1a.html matrix3d-1-ref.html == matrix3d-2a.html matrix3d-2-ref.html == rotate3d-1a.html rotatex-1-ref.html == rotate3d-2a.html rotatey-1-ref.html != backface-visibility-1a.html about:blank == backface-visibility-1b.html about:blank == backface-visibility-1c.html about:blank -== backface-visibility-2.html backface-visibility-2-ref.html +fuzzy-if(winWidget&&!layersGPUAccelerated,1,251) == backface-visibility-2.html backface-visibility-2-ref.html == backface-visibility-3.html backface-visibility-3-ref.html != perspective-origin-1a.html rotatex-perspective-1a.html random-if(Android&&AndroidVersion==17) == perspective-origin-1b.html perspective-origin-1a.html random-if(Android&&!browserIsRemote) == perspective-origin-2a.html perspective-origin-2-ref.html # bug 732568 == perspective-origin-3a.html perspective-origin-3-ref.html == perspective-origin-4a.html perspective-origin-4-ref.html != sorting-1a.html sorting-1-ref.html # Parallel planes, different z depth == sorting-2a.html sorting-2-ref.html # Parallel planes, same z depth (shouldn't be sorted!) == sorting-2b.html sorting-2-ref.html == sorting-3a.html green-rect.html # Different, but equivalent (for the given transform) transform origins == rotatex-transformorigin-1a.html rotatex-transformorigin-1-ref.html -== overflow-hidden-1a.html overflow-hidden-1-ref.html +fuzzy-if(gtk2Widget&&layersOMTC,1,86) == overflow-hidden-1a.html overflow-hidden-1-ref.html == transform-style-flat-1a.html transform-style-flat-1-ref.html pref(layout.css.will-change.enabled,true) == willchange-containing-block.html?willchange willchange-containing-block.html?ref pref(layout.css.will-change.enabled,true) != willchange-containing-block.html?willchange willchange-containing-block.html?noblock == scroll-perspective-1.html scroll-perspective-1-ref.html