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