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 31class PdfFileViewer : public SampleView { 32private: 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 50public: 51 PdfFileViewer(const char name[] = nullptr) : fFilename(name) { 52 fPicture = nullptr; 53 } 54 55 virtual ~PdfFileViewer() { 56 SkSafeUnref(fPicture); 57 } 58 59protected: 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 88private: 89 typedef SampleView INHERITED; 90}; 91 92SampleView* CreateSamplePdfFileViewer(const char filename[]); 93SampleView* CreateSamplePdfFileViewer(const char filename[]) { 94 return new PdfFileViewer(filename); 95} 96 97////////////////////////////////////////////////////////////////////////////// 98 99#if 0 100static SkView* MyFactory() { return new PdfFileViewer; } 101static SkViewRegister reg(MyFactory); 102#endif 103 104#endif // SAMPLE_PDF_FILE_VIEWER 105