1/*
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
8#include "SkTypes.h"
9
10#ifdef SAMPLE_PDF_FILE_VIEWER
11
12#include "SampleCode.h"
13#include "SkDumpCanvas.h"
14#include "SkView.h"
15#include "SkCanvas.h"
16#include "SkGradientShader.h"
17#include "SkGraphics.h"
18#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 "SkPdfRenderer.h"
30
31class PdfFileViewer : public SampleView {
32private:
33    SkString    fFilename;
34    SkPicture*  fPicture;  // TODO(edisonn): multiple pages, one page / picture, make it an array
35
36    static SkPicture* LoadPdf(const char path[]) {
37        std::unique_ptr<SkPdfRenderer> renderer(SkPdfRenderer::CreateFromFile(path));
38        if (nullptr == renderer.get()) {
39            return nullptr;
40        }
41
42        SkPicture* pic = new SkPicture;
43        SkCanvas* canvas = pic->beginRecording((int) renderer->MediaBox(0).width(),
44                                               (int) renderer->MediaBox(0).height());
45        renderer->renderPage(0, canvas, renderer->MediaBox(0));
46        pic->endRecording();
47        return pic;
48    }
49
50public:
51    PdfFileViewer(const char name[] = nullptr) : fFilename(name) {
52        fPicture = nullptr;
53    }
54
55    virtual ~PdfFileViewer() {
56        SkSafeUnref(fPicture);
57    }
58
59protected:
60    // overrides from SkEventSink
61    virtual bool onQuery(SkEvent* evt) {
62        if (SampleCode::TitleQ(*evt)) {
63            SkString name("P:");
64            const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
65            name.append(basename ? basename+1: fFilename.c_str());
66            SampleCode::TitleR(evt, name.c_str());
67            return true;
68        }
69        return this->INHERITED::onQuery(evt);
70    }
71
72    virtual bool onEvent(const SkEvent& evt) {
73        // TODO(edisonn): add here event handlers to disable clipping, or to show helpful info
74        // like pdf object from click, ...
75        // TODO(edisonn): first, next, prev, last page navigation + slideshow
76        return this->INHERITED::onEvent(evt);
77    }
78
79    virtual void onDrawContent(SkCanvas* canvas) {
80        if (!fPicture) {
81            fPicture = LoadPdf(fFilename.c_str());
82        }
83        if (fPicture) {
84            canvas->drawPicture(*fPicture);
85        }
86    }
87
88private:
89    typedef SampleView INHERITED;
90};
91
92SampleView* CreateSamplePdfFileViewer(const char filename[]);
93SampleView* CreateSamplePdfFileViewer(const char filename[]) {
94    return new PdfFileViewer(filename);
95}
96
97//////////////////////////////////////////////////////////////////////////////
98
99#if 0
100static SkView* MyFactory() { return new PdfFileViewer; }
101static SkViewRegister reg(MyFactory);
102#endif
103
104#endif  // SAMPLE_PDF_FILE_VIEWER
105