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 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: 51 PdfFileViewer(const char name[] = nullptr) : fFilename(name) { 52 fPicture = nullptr; 53 } 54 55 virtual ~PdfFileViewer() { 56 SkSafeUnref(fPicture); 57 } 58 59 protected: 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 88 private: 89 typedef SampleView INHERITED; 90 }; 91 92 SampleView* 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