/*
 * Copyright 2013 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#ifndef SkPdfRenderer_DEFINED
#define SkPdfRenderer_DEFINED

#include "SkTypes.h"

class SkBitmap;
class SkCanvas;
class SkPdfNativeDoc;
struct SkRect;
class SkStream;

// What kind of content to render.
// FIXME: Currently unused.
enum SkPdfContent {
    kNoForms_SkPdfContent,
    kAll_SkPdfContent,
};

/** \class SkPdfRenderer
 *
 *  The SkPdfRenderer class is used to render a PDF into canvas.
 *
 */
class SkPdfRenderer : public SkNoncopyable {
public:
    // Create a new renderer from a stream.
    // TODO(edisonn): replace it with a SkSmartStream which would know to to efficiently
    // deal with a HTTP stream.
    // FIXME: Untested.
    static SkPdfRenderer* CreateFromStream(SkStream*);
    // Create a new renderer from a file.
    static SkPdfRenderer* CreateFromFile(const char* filename);

    ~SkPdfRenderer();

    // Render a specific page into the canvas, in a specific rectangle.
    bool renderPage(int page, SkCanvas* canvas, const SkRect& dst) const;

    // Returns the number of pages in the loaded pdf.
    int pages() const;

    // Returns the MediaBox of a page. Can be used by client to crate a canvas.
    SkRect MediaBox(int page) const;

    // TODO(edisonn): for testing only, probably it should be removed, unless some client wants to
    // let users know how much memory the PDF needs.
    size_t bytesUsed() const;

private:
    // Takes ownership of SkPdfNativeDoc.
    SkPdfRenderer(SkPdfNativeDoc*);
    SkPdfNativeDoc* fPdfDoc;
};

// For testing only, reports stats about rendering, like how many operations failed, or are NYI, ...
void reportPdfRenderStats();

// Renders a page of a pdf in a bitmap.
bool SkPDFNativeRenderToBitmap(SkStream* stream,
                               SkBitmap* output,
                               int page = 0,
                               SkPdfContent content = kAll_SkPdfContent,
                               double dpi = 72.0);

// TODO(edisonn): add options to render forms, checkboxes, ...
// TODO(edisonn): Add API for Forms viewing and editing
// e.g. SkBitmap getPage(int page);
//      int formsCount();
//      SkForm getForm(int formID); // SkForm(SkRect, .. other data)
// TODO (edisonn): Add intend when loading pdf, for example: for viewing, for parsing content, ...

#endif  // SkPdfRenderer_DEFINED
