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