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
8f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#ifdef SAMPLE_PDF_FILE_VIEWER
9f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
10f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SampleCode.h"
11f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkDumpCanvas.h"
12f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkView.h"
13f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkCanvas.h"
14f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkGradientShader.h"
15f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkGraphics.h"
16f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkImageDecoder.h"
17f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkOSFile.h"
18f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkPath.h"
19f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkPicture.h"
20f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkRandom.h"
21f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkRegion.h"
22f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkShader.h"
23f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkUtils.h"
24f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkColorPriv.h"
25f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkColorFilter.h"
26f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkTime.h"
27f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkTypeface.h"
28f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#include "SkXfermode.h"
29f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
30d1a874aaa820e32590c5046fe13267b3a132263bedisonn@google.com#include "SkPdfRenderer.h"
31f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
32f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comclass PdfFileViewer : public SampleView {
33f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comprivate:
34f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    SkString    fFilename;
35f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    SkPicture*  fPicture;  // TODO(edisonn): multiple pages, one page / picture, make it an array
36f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
37f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    static SkPicture* LoadPdf(const char path[]) {
38909228992c1671ea7451d1c6bc588a8ec991841escroggo@google.com        SkAutoTDelete<SkPdfRenderer> renderer(SkPdfRenderer::CreateFromFile(path));
39909228992c1671ea7451d1c6bc588a8ec991841escroggo@google.com        if (NULL == renderer.get()) {
40909228992c1671ea7451d1c6bc588a8ec991841escroggo@google.com            return NULL;
41f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        }
42909228992c1671ea7451d1c6bc588a8ec991841escroggo@google.com
43909228992c1671ea7451d1c6bc588a8ec991841escroggo@google.com        SkPicture* pic = SkNEW(SkPicture);
44909228992c1671ea7451d1c6bc588a8ec991841escroggo@google.com        SkCanvas* canvas = pic->beginRecording((int) renderer->MediaBox(0).width(),
45909228992c1671ea7451d1c6bc588a8ec991841escroggo@google.com                                               (int) renderer->MediaBox(0).height());
46909228992c1671ea7451d1c6bc588a8ec991841escroggo@google.com        renderer->renderPage(0, canvas, renderer->MediaBox(0));
47909228992c1671ea7451d1c6bc588a8ec991841escroggo@google.com        pic->endRecording();
48f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        return pic;
49f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    }
50f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
51f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.compublic:
52f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    PdfFileViewer(const char name[] = NULL) : fFilename(name) {
53f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        fPicture = NULL;
54f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    }
55f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
56f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    virtual ~PdfFileViewer() {
57f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        SkSafeUnref(fPicture);
58f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    }
59f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
60f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comprotected:
61f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    // overrides from SkEventSink
62f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    virtual bool onQuery(SkEvent* evt) {
63f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        if (SampleCode::TitleQ(*evt)) {
64f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com            SkString name("P:");
65f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com            const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
66f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com            name.append(basename ? basename+1: fFilename.c_str());
67f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com            SampleCode::TitleR(evt, name.c_str());
68f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com            return true;
69f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        }
70f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        return this->INHERITED::onQuery(evt);
71f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    }
72f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
73f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    virtual bool onEvent(const SkEvent& evt) {
74f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        // TODO(edisonn): add here event handlers to disable clipping, or to show helpful info
75f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        // like pdf object from click, ...
76f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        // TODO(edisonn): first, next, prev, last page navigation + slideshow
77f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        return this->INHERITED::onEvent(evt);
78f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    }
79f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
80f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    virtual void onDrawContent(SkCanvas* canvas) {
81f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        if (!fPicture) {
82f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com            fPicture = LoadPdf(fFilename.c_str());
83f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        }
84f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        if (fPicture) {
85f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com            canvas->drawPicture(*fPicture);
86f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com        }
87f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    }
88f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
89f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comprivate:
90f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    typedef SampleView INHERITED;
91f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com};
92f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
93f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comSampleView* CreateSamplePdfFileViewer(const char filename[]);
94f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comSampleView* CreateSamplePdfFileViewer(const char filename[]) {
95f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com    return new PdfFileViewer(filename);
96f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com}
97f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
98f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com//////////////////////////////////////////////////////////////////////////////
99f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
100f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#if 0
101f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comstatic SkView* MyFactory() { return new PdfFileViewer; }
102f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.comstatic SkViewRegister reg(MyFactory);
103f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#endif
104f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com
105f8b6b01d51d08e39499d1c88063af2964fe72a0fedisonn@google.com#endif  // SAMPLE_PDF_FILE_VIEWER
106