diff -r 000000000000 -r 6474c204b198 content/canvas/src/DocumentRendererChild.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/canvas/src/DocumentRendererChild.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,90 @@ +/* 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(nsIDOMWindow *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); + + nsRefPtr presContext; + nsCOMPtr win = do_QueryInterface(window); + if (win) { + nsIDocShell* docshell = win->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 dt = + Factory::CreateDrawTargetForData(BackendType::CAIRO, + reinterpret_cast(data.BeginWriting()), + IntSize(renderSize.width, renderSize.height), + 4 * renderSize.width, + SurfaceFormat::B8G8R8A8); + nsRefPtr ctx = new gfxContext(dt); + ctx->SetMatrix(mozilla::gfx::ThebesMatrix(transform)); + + nsCOMPtr shell = presContext->PresShell(); + shell->RenderDocument(documentRect, renderFlags, bgColor, ctx); + + return true; +}