/*
 * 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 SkPdfConfig_DEFINED
#define SkPdfConfig_DEFINED

#include "stddef.h"
class SkPdfNativeObject;

// shows what objects have not been used in rendering. can be used to track what features we might
// have not implemented, or where we implemented only the default behaivour
//#define PDF_TRACK_OBJECT_USAGE

// tracks the position in the stream, it can be used to show where exactly the errors happened
//#define PDF_TRACK_STREAM_OFFSETS

// reports issues, warning, NYI, errors, ...
// enable PDF_TRACK_STREAM_OFFSETS to also have the offset in the stream where the error happened
//#define PDF_REPORT

// At various points in code we show the value of important variables with this flag
//#define PDF_TRACE

// displays the result of each read token, individual result
//#define PDF_TRACE_READ_TOKEN

// Every drawtext draws before a rectangle, in this way we see the one that might have failed
//#define PDF_TRACE_DRAWTEXT

// For each render operations, it will dump the canvas in a png
//#define PDF_TRACE_DIFF_IN_PNG

// Does not clip at all, can be used in debugging issues
//#define PDF_DEBUG_NO_CLIPING

// Does not click the page, use is with 3x
//#define PDF_DEBUG_NO_PAGE_CLIPING

// render the page 3X bigger (with content in center) - used to make sure we don't mess up
// positioning
// like a tick tac toe board, only the center one has content, all the rest of them have to be clean
//#define PDF_DEBUG_3X


// TODO(edisonn): pass a flag to say how it was used? e.g. asked the type? Obtained value?
// Implement it when it will be needed the first time to fix some bug.
#ifdef PDF_TRACK_OBJECT_USAGE
#define SkPdfMarkObjectUsed() fUsed = true
#else
#define SkPdfMarkObjectUsed()
#endif   // PDF_TRACK_OBJECT_USAGE

#ifdef PDF_TRACK_OBJECT_USAGE
#define SkPdfMarkObjectUnused() fUsed = false
#else
#define SkPdfMarkObjectUnused()
#endif   // PDF_TRACK_OBJECT_USAGE

#ifdef PDF_TRACK_STREAM_OFFSETS
#define TRACK_OBJECT_SRC(a)
#define STORE_TRACK_PARAMETERS(obj) (obj)->fStreamId = streamId;\
                                    (obj)->fOffsetStart = offsetStart;\
                                    (obj)->fOffsetEnd = offsetEnd;
#define STORE_TRACK_PARAMETER_OFFSET_END(obj,offsetEnd) (obj)->fOffsetEnd = (offsetEnd)-streamStart;
#else
#define TRACK_OBJECT_SRC(a)
#define STORE_TRACK_PARAMETERS(obj)
#define STORE_TRACK_PARAMETER_OFFSET_END(obj,offsetEnd)
#endif   //PDF_TRACK_STREAM_OFFSETS

// TODO(edisonn): move it somewhere else?
struct SkPdfInputStream {
#ifdef PDF_TRACK_STREAM_OFFSETS
    // no parent object -> original file to be rendered
    // no parent file -> stream object
    // both -> external stream object
    int fParentFileID;
    const SkPdfNativeObject* fParentObject;

    size_t fDelta;  // delta in parent stream
    const unsigned char* fStart;
#endif  //  PDF_TRACK_STREAM_OFFSETS

    const unsigned char* fEnd;
};

struct SkPdfInputStreamLocation {
    SkPdfInputStream fInputStream;
    const unsigned char* fNow;
};

#ifdef PDF_TRACK_STREAM_OFFSETS
struct SkPdfInputStreamRange {
    SkPdfInputStream fInputStream;
    const unsigned char* fRangeStart;
    const unsigned char* fRangeEnd;
};
#endif  //  PDF_TRACK_STREAM_OFFSETS


#endif  // SkPdfConfig_DEFINED