1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2013 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypes.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifdef SAMPLE_PDF_FILE_VIEWER
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDumpCanvas.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkView.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGraphics.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkOSFile.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPicture.h"
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h"
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRegion.h"
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h"
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkUtils.h"
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h"
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorFilter.h"
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTime.h"
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypeface.h"
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPdfRenderer.h"
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PdfFileViewer : public SampleView {
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString    fFilename;
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPicture*  fPicture;  // TODO(edisonn): multiple pages, one page / picture, make it an array
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static SkPicture* LoadPdf(const char path[]) {
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        std::unique_ptr<SkPdfRenderer> renderer(SkPdfRenderer::CreateFromFile(path));
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (nullptr == renderer.get()) {
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return nullptr;
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPicture* pic = new SkPicture;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkCanvas* canvas = pic->beginRecording((int) renderer->MediaBox(0).width(),
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                               (int) renderer->MediaBox(0).height());
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        renderer->renderPage(0, canvas, renderer->MediaBox(0));
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        pic->endRecording();
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return pic;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    PdfFileViewer(const char name[] = nullptr) : fFilename(name) {
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPicture = nullptr;
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual ~PdfFileViewer() {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkSafeUnref(fPicture);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // overrides from SkEventSink
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual bool onQuery(SkEvent* evt) {
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (SampleCode::TitleQ(*evt)) {
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkString name("P:");
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            name.append(basename ? basename+1: fFilename.c_str());
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SampleCode::TitleR(evt, name.c_str());
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return true;
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->INHERITED::onQuery(evt);
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual bool onEvent(const SkEvent& evt) {
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // TODO(edisonn): add here event handlers to disable clipping, or to show helpful info
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // like pdf object from click, ...
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // TODO(edisonn): first, next, prev, last page navigation + slideshow
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->INHERITED::onEvent(evt);
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void onDrawContent(SkCanvas* canvas) {
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!fPicture) {
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fPicture = LoadPdf(fFilename.c_str());
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fPicture) {
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPicture(*fPicture);
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SampleView INHERITED;
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSampleView* CreateSamplePdfFileViewer(const char filename[]);
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSampleView* CreateSamplePdfFileViewer(const char filename[]) {
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return new PdfFileViewer(filename);
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if 0
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkView* MyFactory() { return new PdfFileViewer; }
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkViewRegister reg(MyFactory);
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif  // SAMPLE_PDF_FILE_VIEWER
105