|
1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- |
|
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/. */ |
|
5 |
|
6 #include "gfxPDFSurface.h" |
|
7 |
|
8 #include "cairo.h" |
|
9 #include "cairo-pdf.h" |
|
10 |
|
11 static cairo_status_t |
|
12 write_func(void *closure, const unsigned char *data, unsigned int length) |
|
13 { |
|
14 nsCOMPtr<nsIOutputStream> out = reinterpret_cast<nsIOutputStream*>(closure); |
|
15 do { |
|
16 uint32_t wrote = 0; |
|
17 if (NS_FAILED(out->Write((const char*)data, length, &wrote))) |
|
18 break; |
|
19 data += wrote; length -= wrote; |
|
20 } while (length > 0); |
|
21 NS_ASSERTION(length == 0, "not everything was written to the file"); |
|
22 return CAIRO_STATUS_SUCCESS; |
|
23 } |
|
24 |
|
25 gfxPDFSurface::gfxPDFSurface(nsIOutputStream *aStream, const gfxSize& aSizeInPoints) |
|
26 : mStream(aStream), mXDPI(-1), mYDPI(-1), mSize(aSizeInPoints) |
|
27 { |
|
28 Init(cairo_pdf_surface_create_for_stream(write_func, (void*)mStream, mSize.width, mSize.height)); |
|
29 } |
|
30 |
|
31 gfxPDFSurface::~gfxPDFSurface() |
|
32 { |
|
33 } |
|
34 |
|
35 nsresult |
|
36 gfxPDFSurface::BeginPrinting(const nsAString& aTitle, const nsAString& aPrintToFileName) |
|
37 { |
|
38 return NS_OK; |
|
39 } |
|
40 |
|
41 nsresult |
|
42 gfxPDFSurface::EndPrinting() |
|
43 { |
|
44 return NS_OK; |
|
45 } |
|
46 |
|
47 nsresult |
|
48 gfxPDFSurface::AbortPrinting() |
|
49 { |
|
50 return NS_OK; |
|
51 } |
|
52 |
|
53 nsresult |
|
54 gfxPDFSurface::BeginPage() |
|
55 { |
|
56 return NS_OK; |
|
57 } |
|
58 |
|
59 nsresult |
|
60 gfxPDFSurface::EndPage() |
|
61 { |
|
62 cairo_surface_show_page(CairoSurface()); |
|
63 return NS_OK; |
|
64 } |
|
65 |
|
66 void |
|
67 gfxPDFSurface::Finish() |
|
68 { |
|
69 gfxASurface::Finish(); |
|
70 mStream->Close(); |
|
71 } |
|
72 |
|
73 void |
|
74 gfxPDFSurface::SetDPI(double xDPI, double yDPI) |
|
75 { |
|
76 mXDPI = xDPI; |
|
77 mYDPI = yDPI; |
|
78 cairo_surface_set_fallback_resolution(CairoSurface(), xDPI, yDPI); |
|
79 } |
|
80 |
|
81 void |
|
82 gfxPDFSurface::GetDPI(double *xDPI, double *yDPI) |
|
83 { |
|
84 *xDPI = mXDPI; |
|
85 *yDPI = mYDPI; |
|
86 } |