| /* | |
| * Copyright 2013 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "SkTypes.h" | |
| #ifdef SAMPLE_PDF_FILE_VIEWER | |
| #include "SampleCode.h" | |
| #include "SkDumpCanvas.h" | |
| #include "SkView.h" | |
| #include "SkCanvas.h" | |
| #include "SkGradientShader.h" | |
| #include "SkGraphics.h" | |
| #include "SkOSFile.h" | |
| #include "SkPath.h" | |
| #include "SkPicture.h" | |
| #include "SkRandom.h" | |
| #include "SkRegion.h" | |
| #include "SkShader.h" | |
| #include "SkUtils.h" | |
| #include "SkColorPriv.h" | |
| #include "SkColorFilter.h" | |
| #include "SkTime.h" | |
| #include "SkTypeface.h" | |
| #include "SkXfermode.h" | |
| #include "SkPdfRenderer.h" | |
| class PdfFileViewer : public SampleView { | |
| private: | |
| SkString fFilename; | |
| SkPicture* fPicture; // TODO(edisonn): multiple pages, one page / picture, make it an array | |
| static SkPicture* LoadPdf(const char path[]) { | |
| SkAutoTDelete<SkPdfRenderer> renderer(SkPdfRenderer::CreateFromFile(path)); | |
| if (nullptr == renderer.get()) { | |
| return nullptr; | |
| } | |
| SkPicture* pic = new SkPicture; | |
| SkCanvas* canvas = pic->beginRecording((int) renderer->MediaBox(0).width(), | |
| (int) renderer->MediaBox(0).height()); | |
| renderer->renderPage(0, canvas, renderer->MediaBox(0)); | |
| pic->endRecording(); | |
| return pic; | |
| } | |
| public: | |
| PdfFileViewer(const char name[] = nullptr) : fFilename(name) { | |
| fPicture = nullptr; | |
| } | |
| virtual ~PdfFileViewer() { | |
| SkSafeUnref(fPicture); | |
| } | |
| protected: | |
| // overrides from SkEventSink | |
| virtual bool onQuery(SkEvent* evt) { | |
| if (SampleCode::TitleQ(*evt)) { | |
| SkString name("P:"); | |
| const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR); | |
| name.append(basename ? basename+1: fFilename.c_str()); | |
| SampleCode::TitleR(evt, name.c_str()); | |
| return true; | |
| } | |
| return this->INHERITED::onQuery(evt); | |
| } | |
| virtual bool onEvent(const SkEvent& evt) { | |
| // TODO(edisonn): add here event handlers to disable clipping, or to show helpful info | |
| // like pdf object from click, ... | |
| // TODO(edisonn): first, next, prev, last page navigation + slideshow | |
| return this->INHERITED::onEvent(evt); | |
| } | |
| virtual void onDrawContent(SkCanvas* canvas) { | |
| if (!fPicture) { | |
| fPicture = LoadPdf(fFilename.c_str()); | |
| } | |
| if (fPicture) { | |
| canvas->drawPicture(*fPicture); | |
| } | |
| } | |
| private: | |
| typedef SampleView INHERITED; | |
| }; | |
| SampleView* CreateSamplePdfFileViewer(const char filename[]); | |
| SampleView* CreateSamplePdfFileViewer(const char filename[]) { | |
| return new PdfFileViewer(filename); | |
| } | |
| ////////////////////////////////////////////////////////////////////////////// | |
| #if 0 | |
| static SkView* MyFactory() { return new PdfFileViewer; } | |
| static SkViewRegister reg(MyFactory); | |
| #endif | |
| #endif // SAMPLE_PDF_FILE_VIEWER |