/* 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 "gfxImageSurface.h" #include "gfxPattern.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::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); nsCOMPtr 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); nsRefPtr surf = new gfxImageSurface(reinterpret_cast(data.BeginWriting()), gfxIntSize(renderSize.width, renderSize.height), 4 * renderSize.width, gfxImageFormat::ARGB32); nsRefPtr ctx = new gfxContext(surf); ctx->SetMatrix(mozilla::gfx::ThebesMatrix(transform)); nsCOMPtr shell = presContext->PresShell(); shell->RenderDocument(documentRect, renderFlags, bgColor, ctx); return true; }