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