Bug 1278441 - Add a CoreGraphics subclass of PrintTarget. r=mstange

--HG--
extra : rebase_source : 3629f0a9152dad18b9a2e44d16b4d28359f414cf
This commit is contained in:
Jonathan Watt 2016-06-09 22:35:14 +01:00
Родитель 5085e17052
Коммит 09e31afca4
4 изменённых файлов: 118 добавлений и 13 удалений

Просмотреть файл

@ -0,0 +1,71 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* 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 "PrintTargetCG.h"
#include "cairo.h"
#include "cairo-quartz.h"
#include "mozilla/gfx/HelpersCairo.h"
namespace mozilla {
namespace gfx {
PrintTargetCG::PrintTargetCG(cairo_surface_t* aCairoSurface,
const IntSize& aSize)
: PrintTarget(aCairoSurface, aSize)
{
// TODO: Add memory reporting like gfxQuartzSurface.
//RecordMemoryUsed(mSize.height * 4 + sizeof(gfxQuartzSurface));
}
/* static */ already_AddRefed<PrintTargetCG>
PrintTargetCG::CreateOrNull(const IntSize& aSize, gfxImageFormat aFormat)
{
if (!Factory::CheckSurfaceSize(aSize)) {
return nullptr;
}
unsigned int width = static_cast<unsigned int>(aSize.width);
unsigned int height = static_cast<unsigned int>(aSize.height);
cairo_format_t cformat = GfxFormatToCairoFormat(aFormat);
cairo_surface_t* surface =
cairo_quartz_surface_create(cformat, width, height);
if (cairo_surface_status(surface)) {
return nullptr;
}
// The new object takes ownership of our surface reference.
RefPtr<PrintTargetCG> target = new PrintTargetCG(surface, aSize);
return target.forget();
}
/* static */ already_AddRefed<PrintTargetCG>
PrintTargetCG::CreateOrNull(CGContextRef aContext, const IntSize& aSize)
{
if (!Factory::CheckSurfaceSize(aSize)) {
return nullptr;
}
unsigned int width = static_cast<unsigned int>(aSize.width);
unsigned int height = static_cast<unsigned int>(aSize.height);
cairo_surface_t* surface =
cairo_quartz_surface_create_for_cg_context(aContext, width, height);
if (cairo_surface_status(surface)) {
return nullptr;
}
// The new object takes ownership of our surface reference.
RefPtr<PrintTargetCG> target = new PrintTargetCG(surface, aSize);
return target.forget();
}
} // namespace gfx
} // namespace mozilla

Просмотреть файл

@ -0,0 +1,39 @@
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* 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_GFX_PRINTTARGETCG_H
#define MOZILLA_GFX_PRINTTARGETCG_H
#include <Carbon/Carbon.h>
#include "PrintTarget.h"
namespace mozilla {
namespace gfx {
/**
* CoreGraphics printing target.
*
* Note that a CGContextRef obtained from PMSessionGetCGGraphicsContext is
* valid only for the current page. As a consequence instances of this class
* should only be used to print a single page.
*/
class PrintTargetCG final : public PrintTarget
{
public:
static already_AddRefed<PrintTargetCG>
CreateOrNull(const IntSize& aSize, gfxImageFormat aFormat);
static already_AddRefed<PrintTargetCG>
CreateOrNull(CGContextRef aContext, const IntSize& aSize);
private:
PrintTargetCG(cairo_surface_t* aCairoSurface,
const IntSize& aSize);
};
} // namespace gfx
} // namespace mozilla
#endif /* MOZILLA_GFX_PRINTTARGETCG_H */

Просмотреть файл

@ -97,12 +97,16 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
'gfxQuartzNativeDrawing.h',
'gfxQuartzSurface.h',
]
EXPORTS.mozilla.gfx += [
'PrintTargetCG.h',
]
SOURCES += [
'gfxCoreTextShaper.cpp',
'gfxMacFont.cpp',
'gfxPlatformMac.cpp',
'gfxQuartzNativeDrawing.cpp',
'gfxQuartzSurface.cpp',
'PrintTargetCG.cpp',
]
elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
EXPORTS += [

Просмотреть файл

@ -5,7 +5,7 @@
#include "nsDeviceContextSpecX.h"
#include "mozilla/gfx/PrintTargetThebes.h"
#include "mozilla/gfx/PrintTargetCG.h"
#include "mozilla/RefPtr.h"
#include "nsCRT.h"
#include <unistd.h>
@ -15,8 +15,6 @@
#include "nsIPrintOptions.h"
#include "nsPrintSettingsX.h"
#include "gfxQuartzSurface.h"
// This must be the last include:
#include "nsObjCExceptions.h"
@ -153,23 +151,16 @@ already_AddRefed<PrintTarget> nsDeviceContextSpecX::MakePrintTarget()
CGContextRef context;
::PMSessionGetCGGraphicsContext(mPrintSession, &context);
RefPtr<gfxASurface> newSurface;
if (context) {
// Initially, origin is at bottom-left corner of the paper.
// Here, we translate it to top-left corner of the paper.
CGContextTranslateCTM(context, 0, height);
CGContextScaleCTM(context, 1.0, -1.0);
newSurface = new gfxQuartzSurface(context, size);
} else {
newSurface = new gfxQuartzSurface(size, SurfaceFormat::A8R8G8B8_UINT32);
return PrintTargetCG::CreateOrNull(context, size);
}
if (!newSurface) {
return nullptr;
}
return PrintTargetThebes::CreateOrNull(newSurface);
// Apparently we do need this branch - bug 368933.
return PrintTargetCG::CreateOrNull(size, SurfaceFormat::A8R8G8B8_UINT32);
NS_OBJC_END_TRY_ABORT_BLOCK_NSNULL;
}