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