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