blob: a36b29f42f0e93165f0cd37cd31eb687ded253e5 [file] [log] [blame]
edisonn@google.comf8b6b012013-07-11 14:28:04 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
halcanary385fe4d2015-08-26 13:07:48 -07008#include "SkTypes.h"
9
edisonn@google.comf8b6b012013-07-11 14:28:04 +000010#ifdef SAMPLE_PDF_FILE_VIEWER
11
12#include "SampleCode.h"
13#include "SkDumpCanvas.h"
14#include "SkView.h"
15#include "SkCanvas.h"
edisonn@google.comf8b6b012013-07-11 14:28:04 +000016#include "SkGradientShader.h"
17#include "SkGraphics.h"
edisonn@google.comf8b6b012013-07-11 14:28:04 +000018#include "SkOSFile.h"
19#include "SkPath.h"
20#include "SkPicture.h"
21#include "SkRandom.h"
22#include "SkRegion.h"
23#include "SkShader.h"
24#include "SkUtils.h"
25#include "SkColorPriv.h"
26#include "SkColorFilter.h"
27#include "SkTime.h"
28#include "SkTypeface.h"
29#include "SkXfermode.h"
30
edisonn@google.comd1a874a2013-07-11 14:45:20 +000031#include "SkPdfRenderer.h"
edisonn@google.comf8b6b012013-07-11 14:28:04 +000032
33class PdfFileViewer : public SampleView {
34private:
35 SkString fFilename;
36 SkPicture* fPicture; // TODO(edisonn): multiple pages, one page / picture, make it an array
37
38 static SkPicture* LoadPdf(const char path[]) {
scroggo@google.com90922892013-11-14 19:09:27 +000039 SkAutoTDelete<SkPdfRenderer> renderer(SkPdfRenderer::CreateFromFile(path));
halcanary96fcdcc2015-08-27 07:41:13 -070040 if (nullptr == renderer.get()) {
41 return nullptr;
edisonn@google.comf8b6b012013-07-11 14:28:04 +000042 }
scroggo@google.com90922892013-11-14 19:09:27 +000043
halcanary385fe4d2015-08-26 13:07:48 -070044 SkPicture* pic = new SkPicture;
scroggo@google.com90922892013-11-14 19:09:27 +000045 SkCanvas* canvas = pic->beginRecording((int) renderer->MediaBox(0).width(),
46 (int) renderer->MediaBox(0).height());
47 renderer->renderPage(0, canvas, renderer->MediaBox(0));
48 pic->endRecording();
edisonn@google.comf8b6b012013-07-11 14:28:04 +000049 return pic;
50 }
51
52public:
halcanary96fcdcc2015-08-27 07:41:13 -070053 PdfFileViewer(const char name[] = nullptr) : fFilename(name) {
54 fPicture = nullptr;
edisonn@google.comf8b6b012013-07-11 14:28:04 +000055 }
56
57 virtual ~PdfFileViewer() {
58 SkSafeUnref(fPicture);
59 }
60
61protected:
62 // overrides from SkEventSink
63 virtual bool onQuery(SkEvent* evt) {
64 if (SampleCode::TitleQ(*evt)) {
65 SkString name("P:");
66 const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
67 name.append(basename ? basename+1: fFilename.c_str());
68 SampleCode::TitleR(evt, name.c_str());
69 return true;
70 }
71 return this->INHERITED::onQuery(evt);
72 }
73
74 virtual bool onEvent(const SkEvent& evt) {
75 // TODO(edisonn): add here event handlers to disable clipping, or to show helpful info
76 // like pdf object from click, ...
77 // TODO(edisonn): first, next, prev, last page navigation + slideshow
78 return this->INHERITED::onEvent(evt);
79 }
80
81 virtual void onDrawContent(SkCanvas* canvas) {
82 if (!fPicture) {
83 fPicture = LoadPdf(fFilename.c_str());
84 }
85 if (fPicture) {
86 canvas->drawPicture(*fPicture);
87 }
88 }
89
90private:
91 typedef SampleView INHERITED;
92};
93
94SampleView* CreateSamplePdfFileViewer(const char filename[]);
95SampleView* CreateSamplePdfFileViewer(const char filename[]) {
96 return new PdfFileViewer(filename);
97}
98
99//////////////////////////////////////////////////////////////////////////////
100
101#if 0
102static SkView* MyFactory() { return new PdfFileViewer; }
103static SkViewRegister reg(MyFactory);
104#endif
105
106#endif // SAMPLE_PDF_FILE_VIEWER