gecko-dev/gfx/thebes/PrintTargetThebes.cpp
Andrew Osmond d639d2c5ac Bug 1435586 - Use static gfxPlatform methods directly instead of requiring initialization. r=kats
gfxPlatform::GetSourceSurfaceForSurface and CreateDrawTargetForSurface
are both static methods that we sometimes use via the pattern
gfxPlatform::GetPlatform()->... This is problematic because this forces
gfxPlatform to be initialized in the process, and in the GPU process, we
don't support this. It should be safe to call these methods without
initializing gfxPlatform, so this patch removes the GetPlatform() call.

GetSourceSurfaceForSurface may end up initializing gfxPlatform anyways,
depending on whether or not a DrawTarget was given. This should not be a
concern for the crashes observed in bug 1435586.

Differential Revision: https://phabricator.services.mozilla.com/D33785
2019-06-05 12:40:26 -04:00

101 lines
2.7 KiB
C++

/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* 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 "PrintTargetThebes.h"
#include "gfxASurface.h"
#include "gfxPlatform.h"
#include "mozilla/gfx/Logging.h"
namespace mozilla {
namespace gfx {
/* static */
already_AddRefed<PrintTargetThebes> PrintTargetThebes::CreateOrNull(
gfxASurface* aSurface) {
MOZ_ASSERT(aSurface);
if (!aSurface || aSurface->CairoStatus()) {
return nullptr;
}
RefPtr<PrintTargetThebes> target = new PrintTargetThebes(aSurface);
return target.forget();
}
PrintTargetThebes::PrintTargetThebes(gfxASurface* aSurface)
: PrintTarget(nullptr, aSurface->GetSize()), mGfxSurface(aSurface) {}
already_AddRefed<DrawTarget> PrintTargetThebes::MakeDrawTarget(
const IntSize& aSize, DrawEventRecorder* aRecorder) {
// This should not be called outside of BeginPage()/EndPage() calls since
// some backends can only provide a valid DrawTarget at that time.
MOZ_ASSERT(mHasActivePage, "We can't guarantee a valid DrawTarget");
RefPtr<gfx::DrawTarget> dt =
gfxPlatform::CreateDrawTargetForSurface(mGfxSurface, aSize);
if (!dt || !dt->IsValid()) {
return nullptr;
}
if (aRecorder) {
dt = CreateWrapAndRecordDrawTarget(aRecorder, dt);
if (!dt || !dt->IsValid()) {
return nullptr;
}
}
return dt.forget();
}
already_AddRefed<DrawTarget> PrintTargetThebes::GetReferenceDrawTarget() {
if (!mRefDT) {
RefPtr<gfx::DrawTarget> dt =
gfxPlatform::CreateDrawTargetForSurface(mGfxSurface, mSize);
if (!dt || !dt->IsValid()) {
return nullptr;
}
mRefDT = dt->CreateSimilarDrawTarget(IntSize(1, 1), dt->GetFormat());
}
return do_AddRef(mRefDT);
}
nsresult PrintTargetThebes::BeginPrinting(const nsAString& aTitle,
const nsAString& aPrintToFileName,
int32_t aStartPage,
int32_t aEndPage) {
return mGfxSurface->BeginPrinting(aTitle, aPrintToFileName);
}
nsresult PrintTargetThebes::EndPrinting() { return mGfxSurface->EndPrinting(); }
nsresult PrintTargetThebes::AbortPrinting() {
#ifdef DEBUG
mHasActivePage = false;
#endif
return mGfxSurface->AbortPrinting();
}
nsresult PrintTargetThebes::BeginPage() {
#ifdef DEBUG
mHasActivePage = true;
#endif
return mGfxSurface->BeginPage();
}
nsresult PrintTargetThebes::EndPage() {
#ifdef DEBUG
mHasActivePage = false;
#endif
return mGfxSurface->EndPage();
}
void PrintTargetThebes::Finish() { return mGfxSurface->Finish(); }
} // namespace gfx
} // namespace mozilla