1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef MOZILLA_GFX_PRINTTARGET_H
7 #define MOZILLA_GFX_PRINTTARGET_H
11 #include "mozilla/RefPtr.h"
12 #include "mozilla/gfx/2D.h"
13 #include "nsISupportsImpl.h"
14 #include "nsStringFwd.h"
19 class DrawEventRecorder
;
22 * A class that is used to draw output that is to be sent to a printer or print
25 * This class wraps a cairo_surface_t* and provides access to it via a
26 * DrawTarget. The various checkpointing methods manage the state of the
27 * platform specific cairo_surface_t*.
31 NS_INLINE_DECL_REFCOUNTING(PrintTarget
);
33 /// Must be matched 1:1 by an EndPrinting/AbortPrinting call.
34 virtual nsresult
BeginPrinting(const nsAString
& aTitle
,
35 const nsAString
& aPrintToFileName
,
36 int32_t aStartPage
, int32_t aEndPage
) {
39 virtual nsresult
EndPrinting() { return NS_OK
; }
40 virtual nsresult
AbortPrinting() {
42 mHasActivePage
= false;
47 * Note: not all print devices implement mixed page sizing. Most PrintTarget
48 * subclasses will ignore `aSizeInPoints`.
50 virtual nsresult
BeginPage(const IntSize
& aSizeInPoints
) {
52 MOZ_ASSERT(!mHasActivePage
, "Missing EndPage() call");
53 mHasActivePage
= true;
57 virtual nsresult
EndPage() {
59 mHasActivePage
= false;
65 * Releases the resources used by this PrintTarget. Typically this should be
66 * called after calling EndPrinting(). Calling this more than once is
67 * allowed, but subsequent calls are a no-op.
69 * Note that any DrawTarget obtained from this PrintTarget will no longer be
70 * useful after this method has been called.
72 virtual void Finish();
74 const IntSize
& GetSize() const { return mSize
; }
77 * Makes a DrawTarget to draw the printer output to, or returns null on
80 * If aRecorder is passed a recording DrawTarget will be created instead of
81 * the type of DrawTarget that would normally be returned for a particular
82 * subclass of this class. This argument is only intended to be used in
83 * the e10s content process if printing output can't otherwise be transfered
84 * over to the parent process using the normal DrawTarget type.
86 * NOTE: this should only be called between BeginPage()/EndPage() calls, and
87 * the returned DrawTarget should not be drawn to after EndPage() has been
90 * XXX For consistency with the old code this takes a size parameter even
91 * though we already have the size passed to our subclass's CreateOrNull
92 * factory methods. The size passed to the factory method comes from
93 * nsIDeviceContextSpec::MakePrintTarget overrides, whereas the size
94 * passed to us comes from nsDeviceContext::CreateRenderingContext. In at
95 * least one case (nsDeviceContextSpecAndroid::MakePrintTarget) these are
96 * different. At some point we should align the two sources and get rid of
97 * this method's size parameter.
99 * XXX For consistency with the old code this returns a new DrawTarget for
100 * each call. Perhaps we can create and cache a DrawTarget in our subclass's
101 * CreateOrNull factory methods and return that on each call? Currently that
102 * seems to cause Mochitest failures on Windows though, which coincidentally
103 * is the only platform where we get passed an aRecorder. Probably the
104 * issue is that we get called more than once with a different aRecorder, so
105 * storing one recording DrawTarget for our lifetime doesn't currently work.
107 * XXX Could we pass aRecorder to our subclass's CreateOrNull factory methods?
108 * We'd need to check that our consumers always pass the same aRecorder for
109 * our entire lifetime.
111 * XXX Once PrintTargetThebes is removed this can become non-virtual.
113 * XXX In the long run, this class and its sub-classes should be converted to
114 * use STL classes and mozilla::RefCounted<> so the can be moved to Moz2D.
116 * TODO: Consider adding a SetDPI method that calls
117 * cairo_surface_set_fallback_resolution.
119 virtual already_AddRefed
<DrawTarget
> MakeDrawTarget(
120 const IntSize
& aSize
, DrawEventRecorder
* aRecorder
= nullptr);
123 * Returns a reference DrawTarget. Unlike MakeDrawTarget, this method is not
124 * restricted to being called between BeginPage()/EndPage() calls, and the
125 * returned DrawTarget is still valid to use after EndPage() has been called.
127 virtual already_AddRefed
<DrawTarget
> GetReferenceDrawTarget();
129 static void AdjustPrintJobNameForIPP(const nsAString
& aJobName
,
130 nsCString
& aAdjustedJobName
);
131 static void AdjustPrintJobNameForIPP(const nsAString
& aJobName
,
132 nsString
& aAdjustedJobName
);
135 // Only created via subclass's constructors
136 explicit PrintTarget(cairo_surface_t
* aCairoSurface
, const IntSize
& aSize
);
138 // Protected because we're refcounted
139 virtual ~PrintTarget();
141 static already_AddRefed
<DrawTarget
> CreateRecordingDrawTarget(
142 DrawEventRecorder
* aRecorder
, DrawTarget
* aDrawTarget
);
144 cairo_surface_t
* mCairoSurface
;
145 RefPtr
<DrawTarget
> mRefDT
; // reference DT
155 } // namespace mozilla
157 #endif /* MOZILLA_GFX_PRINTTARGET_H */