SkPDFTypes.h revision f7f9aa8bd957766ebf6a296360a2d5857abed265
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2010 The Android Open Source Project
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SkPDFTypes_DEFINED
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#define SkPDFTypes_DEFINED
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkRefCnt.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkScalar.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkString.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkTDArray.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "SkTypes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkPDFCatalog;
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass SkWStream;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** \class SkPDFObject
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    A PDF Object is the base class for primitive elements in a PDF file.  A
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    common subtype is used to ease the use of indirect object references,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    which are common in the PDF format.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkPDFObject : public SkRefCnt {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Create a PDF object.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPDFObject();
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual ~SkPDFObject();
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Return the size (number of bytes) of this object in the final output
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  file. Compound objects or objects that are computationally intensive
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     *  to output should override this method.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param catalog  The object catalog to use.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param indirect If true, output an object identifier with the object.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    /** For non-primitive objects (i.e. objects defined outside this file),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  this method will add to resourceList any objects that this method
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  depends on.  This operates recursively so if this object depends on
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     *  another object and that object depends on two more, all three objects
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     *  will be added.
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     *  @param resourceList  The list to append dependant resources to.
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual void getResources(SkTDArray<SkPDFObject*>* resourceList);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Emit this object unless the catalog has a substitute object, in which
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  case emit that.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @see emitObject
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void emit(SkWStream* stream, SkPDFCatalog* catalog, bool indirect);
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    /** Helper function to output an indirect object.
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     *  @param catalog The object catalog to use.
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     *  @param stream  The writable output stream to send the output to.
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     */
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void emitIndirectObject(SkWStream* stream, SkPDFCatalog* catalog);
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    /** Helper function to find the size of an indirect object.
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     *  @param catalog The object catalog to use.
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     */
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t getIndirectOutputSize(SkPDFCatalog* catalog);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Static helper function to add a resource to a list.  The list takes
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  a reference.
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * @param resource  The resource to add.
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * @param list      The list to add the resource to.
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    static void AddResourceHelper(SkPDFObject* resource,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  SkTDArray<SkPDFObject*>* list);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Static helper function to copy and reference the resources (and all
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *   their subresources) into a new list.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param resources The resource list.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param result    The list to add to.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static void GetResourcesHelper(SkTDArray<SkPDFObject*>* resources,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   SkTDArray<SkPDFObject*>* result);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Subclasses must implement this method to print the object to the
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  PDF file.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param catalog  The object catalog to use.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param indirect If true, output an object identifier with the object.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param stream   The writable output stream to send the output to.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool indirect) = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** \class SkPDFObjRef
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    An indirect reference to a PDF object.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkPDFObjRef : public SkPDFObject {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Create a reference to an existing SkPDFObject.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param obj The object to reference.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit SkPDFObjRef(SkPDFObject* obj);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~SkPDFObjRef();
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The SkPDFObject interface.
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            bool indirect);
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)private:
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SkRefPtr<SkPDFObject> fObj;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/** \class SkPDFInt
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    An integer object in a PDF.
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)*/
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkPDFInt : public SkPDFObject {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    /** Create a PDF integer (usually for indirect reference purposes).
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value An integer value between 2^31 - 1 and -2^31.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit SkPDFInt(int32_t value);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~SkPDFInt();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The SkPDFObject interface.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            bool indirect);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int32_t fValue;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** \class SkPDFBool
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    An boolean value in a PDF.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkPDFBool : public SkPDFObject {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Create a PDF boolean.
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value true or false.
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    explicit SkPDFBool(bool value);
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual ~SkPDFBool();
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The SkPDFObject interface.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            bool indirect);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool fValue;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** \class SkPDFScalar
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    A real number object in a PDF.
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)*/
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SkPDFScalar : public SkPDFObject {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Create a PDF real number.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value A real value.
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit SkPDFScalar(SkScalar value);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~SkPDFScalar();
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static void Append(SkScalar value, SkWStream* stream);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The SkPDFObject interface.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            bool indirect);
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkScalar fValue;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** \class SkPDFString
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    A string object in a PDF.
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)*/
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SkPDFString : public SkPDFObject {
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Create a PDF string. Maximum length (in bytes) is 65,535.
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value A string value.
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit SkPDFString(const char value[]);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit SkPDFString(const SkString& value);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Create a PDF string. Maximum length (in bytes) is 65,535.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value     A string value.
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param len       The length of value.
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param wideChars Indicates if the top byte in value is significant and
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *                   should be encoded (true) or not (false).
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SkPDFString(const uint16_t* value, size_t len, bool wideChars);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~SkPDFString();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The SkPDFObject interface.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            bool indirect);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static SkString FormatString(const char* input, size_t len);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static SkString FormatString(const uint16_t* input, size_t len,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 bool wideChars);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    static const size_t kMaxLen = 65535;
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const SkString fValue;
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    static SkString DoFormatString(const void* input, size_t len,
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 bool wideInput, bool wideOutput);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/** \class SkPDFName
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    A name object in a PDF.
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)*/
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SkPDFName : public SkPDFObject {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Create a PDF name object. Maximum length is 127 bytes.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param value The name.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit SkPDFName(const char name[]);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit SkPDFName(const SkString& name);
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~SkPDFName();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool operator==(const SkPDFName& b) const;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The SkPDFObject interface.
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            bool indirect);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const size_t kMaxLen = 127;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SkString fValue;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static SkString FormatName(const SkString& input);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** \class SkPDFArray
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    An array object in a PDF.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkPDFArray : public SkPDFObject {
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Create a PDF array. Maximum length is 8191.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkPDFArray();
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~SkPDFArray();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The SkPDFObject interface.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool indirect);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** The size of the array.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int size() { return fValue.count(); }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Preallocate space for the given number of entries.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param length The number of array slots to preallocate.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void reserve(int length);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Returns the object at the given offset in the array.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param index The index into the array to retrieve.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPDFObject* getAt(int index) { return fValue[index]; }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Set the object at the given offset in the array. Ref's value.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param index The index into the array to set.
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value The value to add to the array.
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @return The value argument is returned.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkPDFObject* setAt(int index, SkPDFObject* value);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Append the object to the end of the array and increments its ref count.
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value The value to add to the array.
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @return The value argument is returned.
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkPDFObject* append(SkPDFObject* value);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Creates a SkPDFInt object and appends it to the array.
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value The value to add to the array.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void appendInt(int32_t value);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Creates a SkPDFScalar object and appends it to the array.
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value The value to add to the array.
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void appendScalar(SkScalar value);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Creates a SkPDFName object and appends it to the array.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param value The value to add to the array.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void appendName(const char name[]);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const int kMaxLen = 8191;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkTDArray<SkPDFObject*> fValue;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** \class SkPDFDict
3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    A dictionary object in a PDF.
3123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)*/
3133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class SkPDFDict : public SkPDFObject {
3143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)public:
3153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /** Create a PDF dictionary. Maximum number of entries is 4095.
3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     */
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPDFDict();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Create a PDF dictionary with a Type entry.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param type   The value of the Type entry.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit SkPDFDict(const char type[]);
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~SkPDFDict();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The SkPDFObject interface.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool indirect);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** The size of the dictionary.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int size() { return fValue.count(); }
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Add the value to the dictionary with the given key.  Refs value.
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param key   The key for this dictionary entry.
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  @param value The value for this dictionary entry.
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     *  @return The value argument is returned.
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     */
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPDFObject* insert(SkPDFName* key, SkPDFObject* value);
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Add the value to the dictionary with the given key.  Refs value.  The
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     *  method will create the SkPDFName object.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param key   The text of the key for this dictionary entry.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param value The value for this dictionary entry.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @return The value argument is returned.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkPDFObject* insert(const char key[], SkPDFObject* value);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Add the int to the dictionary with the given key.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param key   The text of the key for this dictionary entry.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param value The int value for this dictionary entry.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void insertInt(const char key[], int32_t value);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Add the scalar to the dictionary with the given key.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param key   The text of the key for this dictionary entry.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param value The scalar value for this dictionary entry.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void insertScalar(const char key[], SkScalar value);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /** Add the name to the dictionary with the given key.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param key   The text of the key for this dictionary entry.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param name  The name for this dictionary entry.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void insertName(const char key[], const char name[]);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /** Add the name to the dictionary with the given key.
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     *  @param key   The text of the key for this dictionary entry.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *  @param name  The name for this dictionary entry.
371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     */
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    void insertName(const char key[], const SkString& name) {
373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        this->insertName(key, name.c_str());
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    /** Remove all entries from the dictionary.
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     */
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    void clear();
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)private:
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    struct Rec {
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SkPDFName* key;
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SkPDFObject* value;
384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    };
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class Iter {
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public:
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        explicit Iter(const SkPDFDict& dict);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SkPDFName* next(SkPDFObject** value);
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private:
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Rec* fIter;
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Rec* fStop;
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static const int kMaxLen = 4095;
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkTDArray<struct Rec> fValue;
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)