mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-25 03:05:34 +00:00
d639d2c5ac
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
101 lines
2.7 KiB
C++
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
|