mozilla-skia-bmo1136958.patch
author Wolfgang Rosenauer <wr@rosenauer.org>
Sun, 22 Mar 2015 13:59:40 +0100
changeset 842 b199b6c7d84a
parent 841 d8a3e976dfba
permissions -rw-r--r--
37.0b5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
842
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
     1
From a8ab3ec3542469c1d4e0741121eb1be17cc0acb0 Mon Sep 17 00:00:00 2001
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
     2
From: Mike Hommey <mh@glandium.org>
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
     3
Date: Mon, 9 Mar 2015 08:42:19 +0900
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
     4
Subject: [PATCH] Bug 1136958 - Reintroduce pixman code path removed in bug
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
     5
 1097776 for --disable-skia builds
838
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     6
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     7
---
842
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
     8
 gfx/layers/basic/BasicCompositor.cpp   | 94 +++++++++++++++++++++++++++++++---
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
     9
 gfx/layers/basic/BasicLayerManager.cpp | 88 +++++++++++++++++++++++++++++--
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    10
 2 files changed, 171 insertions(+), 11 deletions(-)
838
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    11
842
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    12
diff --git a/gfx/layers/basic/BasicCompositor.cpp b/gfx/layers/basic/BasicCompositor.cpp
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    13
index 0bef076..000b591 100644
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    14
--- a/gfx/layers/basic/BasicCompositor.cpp
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    15
+++ b/gfx/layers/basic/BasicCompositor.cpp
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    16
@@ -17,8 +17,13 @@
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    17
 #include <algorithm>
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    18
 #include "ImageContainer.h"
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    19
 #include "gfxPrefs.h"
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    20
+#ifdef MOZ_ENABLE_SKIA
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    21
 #include "skia/SkCanvas.h"              // for SkCanvas
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    22
 #include "skia/SkBitmapDevice.h"        // for SkBitmapDevice
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    23
+#else
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    24
+#define PIXMAN_DONT_DEFINE_STDINT
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    25
+#include "pixman.h"                     // for pixman_f_transform, etc
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    26
+#endif
838
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    27
 
842
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    28
 namespace mozilla {
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    29
 using namespace mozilla::gfx;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    30
@@ -168,6 +173,7 @@ DrawSurfaceWithTextureCoords(DrawTarget *aDest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    31
                    mode, aMask, aMaskTransform, &matrix);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    32
 }
838
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    33
 
842
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    34
+#ifdef MOZ_ENABLE_SKIA
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    35
 static SkMatrix
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    36
 Matrix3DToSkia(const gfx3DMatrix& aMatrix)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    37
 {
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    38
@@ -186,10 +192,10 @@ Matrix3DToSkia(const gfx3DMatrix& aMatrix)
838
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    39
 }
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    40
 
842
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    41
 static void
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    42
-SkiaTransform(DataSourceSurface* aDest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    43
-              DataSourceSurface* aSource,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    44
-              const gfx3DMatrix& aTransform,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    45
-              const Point& aDestOffset)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    46
+Transform(DataSourceSurface* aDest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    47
+          DataSourceSurface* aSource,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    48
+          const gfx3DMatrix& aTransform,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    49
+          const Point& aDestOffset)
838
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    50
 {
842
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    51
   if (aTransform.IsSingular()) {
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    52
     return;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    53
@@ -225,6 +231,78 @@ SkiaTransform(DataSourceSurface* aDest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    54
   SkRect destRect = SkRect::MakeXYWH(0, 0, srcSize.width, srcSize.height);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    55
   destCanvas.drawBitmapRectToRect(src, nullptr, destRect, &paint);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    56
 }
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    57
+#else
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    58
+static pixman_transform
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    59
+Matrix3DToPixman(const gfx3DMatrix& aMatrix)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    60
+{
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    61
+  pixman_f_transform transform;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    62
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    63
+  transform.m[0][0] = aMatrix._11;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    64
+  transform.m[0][1] = aMatrix._21;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    65
+  transform.m[0][2] = aMatrix._41;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    66
+  transform.m[1][0] = aMatrix._12;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    67
+  transform.m[1][1] = aMatrix._22;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    68
+  transform.m[1][2] = aMatrix._42;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    69
+  transform.m[2][0] = aMatrix._14;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    70
+  transform.m[2][1] = aMatrix._24;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    71
+  transform.m[2][2] = aMatrix._44;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    72
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    73
+  pixman_transform result;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    74
+  pixman_transform_from_pixman_f_transform(&result, &transform);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    75
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    76
+  return result;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    77
+}
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    78
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    79
+static void
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    80
+Transform(DataSourceSurface* aDest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    81
+          DataSourceSurface* aSource,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    82
+          const gfx3DMatrix& aTransform,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    83
+          const Point& aDestOffset)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    84
+{
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    85
+  IntSize destSize = aDest->GetSize();
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    86
+  pixman_image_t* dest = pixman_image_create_bits(PIXMAN_a8r8g8b8,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    87
+                                                  destSize.width,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    88
+                                                  destSize.height,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    89
+                                                  (uint32_t*)aDest->GetData(),
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    90
+                                                  aDest->Stride());
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    91
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    92
+  IntSize srcSize = aSource->GetSize();
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    93
+  pixman_image_t* src = pixman_image_create_bits(PIXMAN_a8r8g8b8,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    94
+                                                 srcSize.width,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    95
+                                                 srcSize.height,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    96
+                                                 (uint32_t*)aSource->GetData(),
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    97
+                                                 aSource->Stride());
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    98
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
    99
+  NS_ABORT_IF_FALSE(src && dest, "Failed to create pixman images?");
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   100
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   101
+  pixman_transform pixTransform = Matrix3DToPixman(aTransform);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   102
+  pixman_transform pixTransformInverted;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   103
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   104
+  // If the transform is singular then nothing would be drawn anyway, return here
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   105
+  if (!pixman_transform_invert(&pixTransformInverted, &pixTransform)) {
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   106
+    pixman_image_unref(dest);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   107
+    pixman_image_unref(src);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   108
+    return;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   109
+  }
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   110
+  pixman_image_set_transform(src, &pixTransformInverted);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   111
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   112
+  pixman_image_composite32(PIXMAN_OP_SRC,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   113
+                           src,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   114
+                           nullptr,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   115
+                           dest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   116
+                           aDestOffset.x,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   117
+                           aDestOffset.y,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   118
+                           0,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   119
+                           0,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   120
+                           0,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   121
+                           0,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   122
+                           destSize.width,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   123
+                           destSize.height);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   124
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   125
+  pixman_image_unref(dest);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   126
+  pixman_image_unref(src);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   127
+}
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   128
+#endif
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   129
 
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   130
 static inline IntRect
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   131
 RoundOut(Rect r)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   132
@@ -364,12 +442,16 @@ BasicCompositor::DrawQuad(const gfx::Rect& aRect,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   133
     RefPtr<SourceSurface> snapshot = dest->Snapshot();
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   134
     RefPtr<DataSourceSurface> source = snapshot->GetDataSurface();
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   135
     RefPtr<DataSourceSurface> temp =
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   136
-      Factory::CreateDataSourceSurface(RoundOut(transformBounds).Size(), SurfaceFormat::B8G8R8A8, true);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   137
+      Factory::CreateDataSourceSurface(RoundOut(transformBounds).Size(), SurfaceFormat::B8G8R8A8
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   138
+#ifdef MOZ_ENABLE_SKIA
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   139
+        , true
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   140
+#endif
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   141
+        );
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   142
     if (NS_WARN_IF(!temp)) {
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   143
       return;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   144
     }
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   145
 
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   146
-    SkiaTransform(temp, source, new3DTransform, transformBounds.TopLeft());
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   147
+    Transform(temp, source, new3DTransform, transformBounds.TopLeft());
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   148
 
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   149
     transformBounds.MoveTo(0, 0);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   150
     buffer->DrawSurface(temp, transformBounds, transformBounds);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   151
diff --git a/gfx/layers/basic/BasicLayerManager.cpp b/gfx/layers/basic/BasicLayerManager.cpp
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   152
index f4ec9e4..c849c27 100644
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   153
--- a/gfx/layers/basic/BasicLayerManager.cpp
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   154
+++ b/gfx/layers/basic/BasicLayerManager.cpp
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   155
@@ -46,8 +46,13 @@
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   156
 #include "nsRect.h"                     // for nsIntRect
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   157
 #include "nsRegion.h"                   // for nsIntRegion, etc
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   158
 #include "nsTArray.h"                   // for nsAutoTArray
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   159
+#ifdef MOZ_ENABLE_SKIA
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   160
 #include "skia/SkCanvas.h"              // for SkCanvas
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   161
 #include "skia/SkBitmapDevice.h"        // for SkBitmapDevice
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   162
+#else
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   163
+#define PIXMAN_DONT_DEFINE_STDINT
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   164
+#include "pixman.h"                     // for pixman_f_transform, etc
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   165
+#endif
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   166
 class nsIWidget;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   167
 
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   168
 namespace mozilla {
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   169
@@ -601,6 +606,7 @@ BasicLayerManager::SetRoot(Layer* aLayer)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   170
   mRoot = aLayer;
838
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   171
 }
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   172
 
842
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   173
+#ifdef MOZ_ENABLE_SKIA
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   174
 static SkMatrix
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   175
 BasicLayerManager_Matrix3DToSkia(const gfx3DMatrix& aMatrix)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   176
 {
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   177
@@ -619,10 +625,10 @@ BasicLayerManager_Matrix3DToSkia(const gfx3DMatrix& aMatrix)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   178
 }
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   179
 
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   180
 static void
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   181
-SkiaTransform(const gfxImageSurface* aDest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   182
-              RefPtr<DataSourceSurface> aSrc,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   183
-              const gfx3DMatrix& aTransform,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   184
-              gfxPoint aDestOffset)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   185
+Transform(const gfxImageSurface* aDest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   186
+          RefPtr<DataSourceSurface> aSrc,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   187
+          const gfx3DMatrix& aTransform,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   188
+          gfxPoint aDestOffset)
838
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   189
 {
842
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   190
   if (aTransform.IsSingular()) {
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   191
     return;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   192
@@ -658,6 +664,78 @@ SkiaTransform(const gfxImageSurface* aDest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   193
   SkRect destRect = SkRect::MakeXYWH(0, 0, srcSize.width, srcSize.height);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   194
   destCanvas.drawBitmapRectToRect(src, nullptr, destRect, &paint);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   195
 }
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   196
+#else
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   197
+static pixman_transform
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   198
+BasicLayerManager_Matrix3DToPixman(const gfx3DMatrix& aMatrix)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   199
+{
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   200
+  pixman_f_transform transform;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   201
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   202
+  transform.m[0][0] = aMatrix._11;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   203
+  transform.m[0][1] = aMatrix._21;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   204
+  transform.m[0][2] = aMatrix._41;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   205
+  transform.m[1][0] = aMatrix._12;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   206
+  transform.m[1][1] = aMatrix._22;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   207
+  transform.m[1][2] = aMatrix._42;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   208
+  transform.m[2][0] = aMatrix._14;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   209
+  transform.m[2][1] = aMatrix._24;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   210
+  transform.m[2][2] = aMatrix._44;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   211
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   212
+  pixman_transform result;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   213
+  pixman_transform_from_pixman_f_transform(&result, &transform);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   214
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   215
+  return result;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   216
+}
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   217
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   218
+static void
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   219
+Transform(const gfxImageSurface* aDest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   220
+          RefPtr<DataSourceSurface> aSrc,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   221
+          const gfx3DMatrix& aTransform,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   222
+          gfxPoint aDestOffset)
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   223
+{
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   224
+  IntSize destSize = ToIntSize(aDest->GetSize());
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   225
+  pixman_image_t* dest = pixman_image_create_bits(aDest->Format() == gfxImageFormat::ARGB32 ? PIXMAN_a8r8g8b8 : PIXMAN_x8r8g8b8,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   226
+                                                  destSize.width,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   227
+                                                  destSize.height,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   228
+                                                  (uint32_t*)aDest->Data(),
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   229
+                                                  aDest->Stride());
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   230
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   231
+  IntSize srcSize = aSrc->GetSize();
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   232
+  pixman_image_t* src = pixman_image_create_bits(aSrc->GetFormat() == SurfaceFormat::B8G8R8A8 ? PIXMAN_a8r8g8b8 : PIXMAN_x8r8g8b8,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   233
+                                                 srcSize.width,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   234
+                                                 srcSize.height,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   235
+                                                 (uint32_t*)aSrc->GetData(),
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   236
+                                                 aSrc->Stride());
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   237
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   238
+  NS_ABORT_IF_FALSE(src && dest, "Failed to create pixman images?");
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   239
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   240
+  pixman_transform pixTransform = BasicLayerManager_Matrix3DToPixman(aTransform);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   241
+  pixman_transform pixTransformInverted;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   242
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   243
+  // If the transform is singular then nothing would be drawn anyway, return here
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   244
+  if (!pixman_transform_invert(&pixTransformInverted, &pixTransform)) {
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   245
+    pixman_image_unref(dest);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   246
+    pixman_image_unref(src);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   247
+    return;
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   248
+  }
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   249
+  pixman_image_set_transform(src, &pixTransformInverted);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   250
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   251
+  pixman_image_composite32(PIXMAN_OP_SRC,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   252
+                           src,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   253
+                           nullptr,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   254
+                           dest,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   255
+                           aDestOffset.x,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   256
+                           aDestOffset.y,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   257
+                           0,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   258
+                           0,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   259
+                           0,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   260
+                           0,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   261
+                           destSize.width,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   262
+                           destSize.height);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   263
+
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   264
+  pixman_image_unref(dest);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   265
+  pixman_image_unref(src);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   266
+}
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   267
+#endif
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   268
 
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   269
 /**
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   270
  * Transform a surface using a gfx3DMatrix and blit to the destination if
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   271
@@ -699,7 +777,7 @@ Transform3D(RefPtr<SourceSurface> aSource,
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   272
   gfx3DMatrix translation = gfx3DMatrix::Translation(aBounds.x, aBounds.y, 0);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   273
 
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   274
   // Transform the content and offset it such that the content begins at the origin.
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   275
-  SkiaTransform(destImage, aSource->GetDataSurface(), translation * aTransform, offset);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   276
+  Transform(destImage, aSource->GetDataSurface(), translation * aTransform, offset);
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   277
 
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   278
   // If we haven't actually drawn to aDest then return our temporary image so
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   279
   // that the caller can do this.
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   280
-- 
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   281
2.3.0.4.g34b1174
Wolfgang Rosenauer <wr@rosenauer.org>
parents: 841
diff changeset
   282