• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
31 class PdfFileViewer : public SampleView {
32 private:
33     SkString    fFilename;
34     SkPicture*  fPicture;  // TODO(edisonn): multiple pages, one page / picture, make it an array
35 
LoadPdf(const char path[])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 
50 public:
PdfFileViewer(const char name[]=nullptr)51     PdfFileViewer(const char name[] = nullptr) : fFilename(name) {
52         fPicture = nullptr;
53     }
54 
~PdfFileViewer()55     virtual ~PdfFileViewer() {
56         SkSafeUnref(fPicture);
57     }
58 
59 protected:
60     // overrides from SkEventSink
onQuery(SkEvent * evt)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 
onEvent(const SkEvent & evt)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 
onDrawContent(SkCanvas * canvas)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 
88 private:
89     typedef SampleView INHERITED;
90 };
91 
92 SampleView* CreateSamplePdfFileViewer(const char filename[]);
CreateSamplePdfFileViewer(const char filename[])93 SampleView* CreateSamplePdfFileViewer(const char filename[]) {
94     return new PdfFileViewer(filename);
95 }
96 
97 //////////////////////////////////////////////////////////////////////////////
98 
99 #if 0
100 static SkView* MyFactory() { return new PdfFileViewer; }
101 static SkViewRegister reg(MyFactory);
102 #endif
103 
104 #endif  // SAMPLE_PDF_FILE_VIEWER
105