summaryrefslogtreecommitdiff
path: root/dom/canvas
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@gmail.com>2018-03-14 12:38:55 +0100
committerwolfbeast <mcwerewolf@gmail.com>2018-03-14 12:38:55 +0100
commit302f17e514772770f5555ce939b21b194514ebc3 (patch)
treeaca62ce6a23c2a9b08cfa27987586463aafef760 /dom/canvas
parent959f6d2881edaf7389b439ca69bcf881622d06a2 (diff)
downloaduxp-302f17e514772770f5555ce939b21b194514ebc3.tar.gz
Revert "Bug 1438425 - Delete DocumentRenderer. r=jesup, a=RyanVM"
This reverts commit 5b69e05939c7fd3f917e2dd0f399774b3b15c886.
Diffstat (limited to 'dom/canvas')
-rw-r--r--dom/canvas/CanvasRenderingContext2D.cpp3
-rw-r--r--dom/canvas/CanvasRenderingContextHelper.cpp1
-rw-r--r--dom/canvas/DocumentRendererChild.cpp94
-rw-r--r--dom/canvas/DocumentRendererChild.h37
-rw-r--r--dom/canvas/DocumentRendererParent.cpp63
-rw-r--r--dom/canvas/DocumentRendererParent.h44
-rw-r--r--dom/canvas/WebGLContextState.cpp1
-rw-r--r--dom/canvas/moz.build7
8 files changed, 247 insertions, 3 deletions
diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp
index 4e058b4dbb..35ea2cd1a1 100644
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -92,7 +92,8 @@
#include "mozilla/gfx/PathHelpers.h"
#include "mozilla/gfx/DataSurfaceHelpers.h"
#include "mozilla/gfx/PatternHelpers.h"
-#include "mozilla/gfx/Swizzle.h"
+#include "mozilla/ipc/DocumentRendererParent.h"
+#include "mozilla/ipc/PDocumentRendererParent.h"
#include "mozilla/layers/PersistentBufferProvider.h"
#include "mozilla/MathAlgorithms.h"
#include "mozilla/Preferences.h"
diff --git a/dom/canvas/CanvasRenderingContextHelper.cpp b/dom/canvas/CanvasRenderingContextHelper.cpp
index 639c11fca3..3000e59bdf 100644
--- a/dom/canvas/CanvasRenderingContextHelper.cpp
+++ b/dom/canvas/CanvasRenderingContextHelper.cpp
@@ -9,7 +9,6 @@
#include "mozilla/dom/CanvasRenderingContext2D.h"
#include "mozilla/Telemetry.h"
#include "mozilla/UniquePtr.h"
-#include "MozFramebuffer.h"
#include "nsContentUtils.h"
#include "nsDOMJSUtils.h"
#include "nsIScriptContext.h"
diff --git a/dom/canvas/DocumentRendererChild.cpp b/dom/canvas/DocumentRendererChild.cpp
new file mode 100644
index 0000000000..15dd5fc521
--- /dev/null
+++ b/dom/canvas/DocumentRendererChild.cpp
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ipc/DocumentRendererChild.h"
+
+#include "base/basictypes.h"
+
+#include "gfx2DGlue.h"
+#include "gfxPattern.h"
+#include "mozilla/gfx/2D.h"
+#include "mozilla/RefPtr.h"
+#include "nsPIDOMWindow.h"
+#include "nsIDOMWindow.h"
+#include "nsIDocShell.h"
+#include "nsIInterfaceRequestorUtils.h"
+#include "nsComponentManagerUtils.h"
+#include "nsCSSParser.h"
+#include "nsPresContext.h"
+#include "nsCOMPtr.h"
+#include "nsColor.h"
+#include "gfxContext.h"
+#include "nsLayoutUtils.h"
+#include "nsContentUtils.h"
+#include "nsCSSValue.h"
+#include "nsRuleNode.h"
+#include "mozilla/gfx/Matrix.h"
+
+using namespace mozilla;
+using namespace mozilla::gfx;
+using namespace mozilla::ipc;
+
+DocumentRendererChild::DocumentRendererChild()
+{}
+
+DocumentRendererChild::~DocumentRendererChild()
+{}
+
+bool
+DocumentRendererChild::RenderDocument(nsPIDOMWindowOuter* window,
+ const nsRect& documentRect,
+ const mozilla::gfx::Matrix& transform,
+ const nsString& aBGColor,
+ uint32_t renderFlags,
+ bool flushLayout,
+ const nsIntSize& renderSize,
+ nsCString& data)
+{
+ if (flushLayout)
+ nsContentUtils::FlushLayoutForTree(window);
+
+ RefPtr<nsPresContext> presContext;
+ if (window) {
+ nsIDocShell* docshell = window->GetDocShell();
+ if (docshell) {
+ docshell->GetPresContext(getter_AddRefs(presContext));
+ }
+ }
+ if (!presContext)
+ return false;
+
+ nsCSSParser parser;
+ nsCSSValue bgColorValue;
+ if (!parser.ParseColorString(aBGColor, nullptr, 0, bgColorValue)) {
+ return false;
+ }
+
+ nscolor bgColor;
+ if (!nsRuleNode::ComputeColor(bgColorValue, presContext, nullptr, bgColor)) {
+ return false;
+ }
+
+ // Draw directly into the output array.
+ data.SetLength(renderSize.width * renderSize.height * 4);
+
+ RefPtr<DrawTarget> dt =
+ Factory::CreateDrawTargetForData(BackendType::CAIRO,
+ reinterpret_cast<uint8_t*>(data.BeginWriting()),
+ IntSize(renderSize.width, renderSize.height),
+ 4 * renderSize.width,
+ SurfaceFormat::B8G8R8A8);
+ if (!dt || !dt->IsValid()) {
+ gfxWarning() << "DocumentRendererChild::RenderDocument failed to Factory::CreateDrawTargetForData";
+ return false;
+ }
+ RefPtr<gfxContext> ctx = gfxContext::CreateOrNull(dt);
+ MOZ_ASSERT(ctx); // already checked the draw target above
+ ctx->SetMatrix(mozilla::gfx::ThebesMatrix(transform));
+
+ nsCOMPtr<nsIPresShell> shell = presContext->PresShell();
+ shell->RenderDocument(documentRect, renderFlags, bgColor, ctx);
+
+ return true;
+}
diff --git a/dom/canvas/DocumentRendererChild.h b/dom/canvas/DocumentRendererChild.h
new file mode 100644
index 0000000000..463ba27076
--- /dev/null
+++ b/dom/canvas/DocumentRendererChild.h
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_DocumentRendererChild
+#define mozilla_dom_DocumentRendererChild
+
+#include "mozilla/ipc/PDocumentRendererChild.h"
+#include "nsString.h"
+#include "gfxContext.h"
+
+class nsIDOMWindow;
+
+namespace mozilla {
+namespace ipc {
+
+class DocumentRendererChild : public PDocumentRendererChild
+{
+public:
+ DocumentRendererChild();
+ virtual ~DocumentRendererChild();
+
+ bool RenderDocument(nsPIDOMWindowOuter* window,
+ const nsRect& documentRect, const gfx::Matrix& transform,
+ const nsString& bgcolor,
+ uint32_t renderFlags, bool flushLayout,
+ const nsIntSize& renderSize, nsCString& data);
+
+private:
+
+ DISALLOW_EVIL_CONSTRUCTORS(DocumentRendererChild);
+};
+
+} // namespace ipc
+} // namespace mozilla
+
+#endif
diff --git a/dom/canvas/DocumentRendererParent.cpp b/dom/canvas/DocumentRendererParent.cpp
new file mode 100644
index 0000000000..d9578ac4ee
--- /dev/null
+++ b/dom/canvas/DocumentRendererParent.cpp
@@ -0,0 +1,63 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/ipc/DocumentRendererParent.h"
+
+#include "gfx2DGlue.h"
+#include "mozilla/gfx/2D.h"
+#include "mozilla/gfx/PathHelpers.h"
+#include "mozilla/RefPtr.h"
+#include "nsICanvasRenderingContextInternal.h"
+
+using namespace mozilla;
+using namespace mozilla::gfx;
+using namespace mozilla::ipc;
+
+DocumentRendererParent::DocumentRendererParent()
+{}
+
+DocumentRendererParent::~DocumentRendererParent()
+{}
+
+void DocumentRendererParent::SetCanvasContext(nsICanvasRenderingContextInternal* aCanvas,
+ gfxContext* ctx)
+{
+ mCanvas = aCanvas;
+ mCanvasContext = ctx;
+}
+
+void DocumentRendererParent::DrawToCanvas(const nsIntSize& aSize,
+ const nsCString& aData)
+{
+ if (!mCanvas || !mCanvasContext)
+ return;
+
+ DrawTarget* drawTarget = mCanvasContext->GetDrawTarget();
+ Rect rect(0, 0, aSize.width, aSize.height);
+ MaybeSnapToDevicePixels(rect, *drawTarget, true);
+ RefPtr<DataSourceSurface> dataSurface =
+ Factory::CreateWrappingDataSourceSurface(reinterpret_cast<uint8_t*>(const_cast<nsCString&>(aData).BeginWriting()),
+ aSize.width * 4,
+ IntSize(aSize.width, aSize.height),
+ SurfaceFormat::B8G8R8A8);
+ SurfacePattern pattern(dataSurface, ExtendMode::CLAMP);
+ drawTarget->FillRect(rect, pattern);
+
+ gfxRect damageRect = mCanvasContext->UserToDevice(ThebesRect(rect));
+ mCanvas->Redraw(damageRect);
+}
+
+void
+DocumentRendererParent::ActorDestroy(ActorDestroyReason aWhy)
+{
+ // Implement me! Bug 1005139
+}
+
+bool
+DocumentRendererParent::Recv__delete__(const nsIntSize& renderedSize,
+ const nsCString& data)
+{
+ DrawToCanvas(renderedSize, data);
+ return true;
+}
diff --git a/dom/canvas/DocumentRendererParent.h b/dom/canvas/DocumentRendererParent.h
new file mode 100644
index 0000000000..432aa82643
--- /dev/null
+++ b/dom/canvas/DocumentRendererParent.h
@@ -0,0 +1,44 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_dom_DocumentRendererParent
+#define mozilla_dom_DocumentRendererParent
+
+#include "mozilla/ipc/PDocumentRendererParent.h"
+#include "nsCOMPtr.h"
+#include "nsString.h"
+#include "gfxContext.h"
+
+class nsICanvasRenderingContextInternal;
+
+namespace mozilla {
+namespace ipc {
+
+class DocumentRendererParent : public PDocumentRendererParent
+{
+public:
+ DocumentRendererParent();
+ virtual ~DocumentRendererParent();
+
+ void SetCanvasContext(nsICanvasRenderingContextInternal* aCanvas,
+ gfxContext* ctx);
+ void DrawToCanvas(const nsIntSize& renderedSize,
+ const nsCString& aData);
+
+ virtual void ActorDestroy(ActorDestroyReason aWhy) override;
+
+ virtual bool Recv__delete__(const nsIntSize& renderedSize,
+ const nsCString& data) override;
+
+private:
+ nsCOMPtr<nsICanvasRenderingContextInternal> mCanvas;
+ RefPtr<gfxContext> mCanvasContext;
+
+ DISALLOW_EVIL_CONSTRUCTORS(DocumentRendererParent);
+};
+
+} // namespace ipc
+} // namespace mozilla
+
+#endif
diff --git a/dom/canvas/WebGLContextState.cpp b/dom/canvas/WebGLContextState.cpp
index f12c7d92a5..e0234f5c61 100644
--- a/dom/canvas/WebGLContextState.cpp
+++ b/dom/canvas/WebGLContextState.cpp
@@ -9,7 +9,6 @@
#include "GLScreenBuffer.h"
#include "mozilla/dom/ToJSValue.h"
#include "mozilla/Preferences.h"
-#include "MozFramebuffer.h"
#include "nsString.h"
#include "WebGLBuffer.h"
#include "WebGLContextUtils.h"
diff --git a/dom/canvas/moz.build b/dom/canvas/moz.build
index f7555b33db..55153c70b8 100644
--- a/dom/canvas/moz.build
+++ b/dom/canvas/moz.build
@@ -25,6 +25,11 @@ EXPORTS += [
'nsICanvasRenderingContextInternal.h',
]
+EXPORTS.mozilla.ipc += [
+ 'DocumentRendererChild.h',
+ 'DocumentRendererParent.h',
+]
+
EXPORTS.mozilla.dom += [
'CanvasGradient.h',
'CanvasPath.h',
@@ -47,6 +52,8 @@ UNIFIED_SOURCES += [
'CanvasRenderingContext2D.cpp',
'CanvasRenderingContextHelper.cpp',
'CanvasUtils.cpp',
+ 'DocumentRendererChild.cpp',
+ 'DocumentRendererParent.cpp',
'ImageBitmap.cpp',
'ImageBitmapColorUtils.cpp',
'ImageBitmapRenderingContext.cpp',