Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/thebes/PrintTargetSkPDF.cpp
Line
Count
Source (jump to first uncovered line)
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 "PrintTargetSkPDF.h"
7
8
#include "mozilla/gfx/2D.h"
9
#include "nsString.h"
10
#include <vector>
11
12
namespace mozilla {
13
namespace gfx {
14
15
PrintTargetSkPDF::PrintTargetSkPDF(const IntSize& aSize,
16
                                   UniquePtr<SkWStream> aStream)
17
  : PrintTarget(/* not using cairo_surface_t */ nullptr, aSize)
18
  , mOStream(std::move(aStream))
19
  , mPageCanvas(nullptr)
20
  , mRefCanvas(nullptr)
21
0
{
22
0
}
23
24
PrintTargetSkPDF::~PrintTargetSkPDF()
25
0
{
26
0
  Finish(); // ensure stream is flushed
27
0
28
0
  // Make sure mPDFDoc and mRefPDFDoc are destroyed before our member streams
29
0
  // (which they wrap) are destroyed:
30
0
  mPDFDoc = nullptr;
31
0
  mRefPDFDoc = nullptr;
32
0
}
33
34
/* static */ already_AddRefed<PrintTargetSkPDF>
35
PrintTargetSkPDF::CreateOrNull(UniquePtr<SkWStream> aStream,
36
                               const IntSize& aSizeInPoints)
37
0
{
38
0
  return do_AddRef(new PrintTargetSkPDF(aSizeInPoints, std::move(aStream)));
39
0
}
40
41
nsresult
42
PrintTargetSkPDF::BeginPrinting(const nsAString& aTitle,
43
                                const nsAString& aPrintToFileName,
44
                                int32_t aStartPage,
45
                                int32_t aEndPage)
46
0
{
47
0
  // We need to create the SkPDFDocument here rather than in CreateOrNull
48
0
  // because it's only now that we are given aTitle which we want for the
49
0
  // PDF metadata.
50
0
51
0
  SkDocument::PDFMetadata metadata;
52
0
  metadata.fTitle = NS_ConvertUTF16toUTF8(aTitle).get();
53
0
  metadata.fCreator = "Firefox";
54
0
  SkTime::DateTime now;
55
0
  SkTime::GetDateTime(&now);
56
0
  metadata.fCreation.fEnabled = true;
57
0
  metadata.fCreation.fDateTime = now;
58
0
  metadata.fModified.fEnabled = true;
59
0
  metadata.fModified.fDateTime = now;
60
0
61
0
  // SkDocument stores a non-owning raw pointer to aStream
62
0
  mPDFDoc = SkDocument::MakePDF(mOStream.get(), metadata);
63
0
64
0
  return mPDFDoc ? NS_OK : NS_ERROR_FAILURE;
65
0
}
66
67
nsresult
68
PrintTargetSkPDF::BeginPage()
69
0
{
70
0
  mPageCanvas = mPDFDoc->beginPage(mSize.width, mSize.height);
71
0
72
0
  return !mPageCanvas ? NS_ERROR_FAILURE : PrintTarget::BeginPage();
73
0
}
74
75
nsresult
76
PrintTargetSkPDF::EndPage()
77
0
{
78
0
  mPageCanvas = nullptr;
79
0
  mPageDT = nullptr;
80
0
  return PrintTarget::EndPage();
81
0
}
82
83
nsresult
84
PrintTargetSkPDF::EndPrinting()
85
0
{
86
0
  mPDFDoc->close();
87
0
  if (mRefPDFDoc) {
88
0
    mRefPDFDoc->close();
89
0
  }
90
0
  mPageCanvas = nullptr;
91
0
  mPageDT = nullptr;
92
0
  return NS_OK;
93
0
}
94
95
void
96
PrintTargetSkPDF::Finish()
97
0
{
98
0
  if (mIsFinished) {
99
0
    return;
100
0
  }
101
0
  mOStream->flush();
102
0
  PrintTarget::Finish();
103
0
}
104
105
already_AddRefed<DrawTarget>
106
PrintTargetSkPDF::MakeDrawTarget(const IntSize& aSize,
107
                                 DrawEventRecorder* aRecorder)
108
0
{
109
0
  if (aRecorder) {
110
0
    return PrintTarget::MakeDrawTarget(aSize, aRecorder);
111
0
  }
112
0
  //MOZ_ASSERT(aSize == mSize, "Should mPageCanvas size match?");
113
0
  if (!mPageCanvas) {
114
0
    return nullptr;
115
0
  }
116
0
  mPageDT = Factory::CreateDrawTargetWithSkCanvas(mPageCanvas);
117
0
  if (!mPageDT) {
118
0
    mPageCanvas = nullptr;
119
0
    return nullptr;
120
0
  }
121
0
  return do_AddRef(mPageDT);
122
0
}
123
124
already_AddRefed<DrawTarget>
125
PrintTargetSkPDF::GetReferenceDrawTarget()
126
0
{
127
0
  if (!mRefDT) {
128
0
    SkDocument::PDFMetadata metadata;
129
0
    // SkDocument stores a non-owning raw pointer to aStream
130
0
    mRefPDFDoc = SkDocument::MakePDF(&mRefOStream, metadata);
131
0
    if (!mRefPDFDoc) {
132
0
      return nullptr;
133
0
    }
134
0
    mRefCanvas = mRefPDFDoc->beginPage(mSize.width, mSize.height);
135
0
    if (!mRefCanvas) {
136
0
      return nullptr;
137
0
    }
138
0
    RefPtr<DrawTarget> dt =
139
0
      Factory::CreateDrawTargetWithSkCanvas(mRefCanvas);
140
0
    if (!dt) {
141
0
      return nullptr;
142
0
    }
143
0
    mRefDT = dt.forget();
144
0
  }
145
0
146
0
  return do_AddRef(mRefDT);
147
0
}
148
149
} // namespace gfx
150
} // namespace mozilla