1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
28459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 The Android Open Source Project
48459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
78459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org */
88459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
108459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org#ifndef SkPDFTypes_DEFINED
118459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org#define SkPDFTypes_DEFINED
128459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
138459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org#include "SkRefCnt.h"
148459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org#include "SkScalar.h"
158459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org#include "SkString.h"
168459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org#include "SkTDArray.h"
176addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com#include "SkTSet.h"
1828be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org#include "SkTypes.h"
198459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
208459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkPDFCatalog;
218459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkWStream;
228459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
238459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org/** \class SkPDFObject
248459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
258459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    A PDF Object is the base class for primitive elements in a PDF file.  A
268459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    common subtype is used to ease the use of indirect object references,
278459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    which are common in the PDF format.
288459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org*/
298459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkPDFObject : public SkRefCnt {
308459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgpublic:
314d73ac22a1b99402fc8cff78a4eb4b27aa8fe019robertphillips@google.com    SK_DECLARE_INST_COUNT(SkPDFObject)
324d73ac22a1b99402fc8cff78a4eb4b27aa8fe019robertphillips@google.com
338459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Return the size (number of bytes) of this object in the final output
348459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  file. Compound objects or objects that are computationally intensive
358459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  to output should override this method.
368459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param catalog  The object catalog to use.
378459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param indirect If true, output an object identifier with the object.
388459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
398459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
408459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
41188838c20818307fda770ffc395a76ea63c1c8ccvandebo@chromium.org    /** For non-primitive objects (i.e. objects defined outside this file),
426addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *  this method will add to newResourceObjects any objects that this method
436addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *  depends on, but not already in knownResourceObjects. This operates
446addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *  recursively so if this object depends on another object and that object
456addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *  depends on two more, all three objects will be added.
466addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *
476addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *  @param knownResourceObjects  The set of resources to be ignored.
486addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *  @param newResourceObjects  The set to append dependant resources to.
49a518086928494319b8968abc09808eff492c194fvandebo@chromium.org     */
506addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com    virtual void getResources(const SkTSet<SkPDFObject*>& knownResourceObjects,
516addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com                              SkTSet<SkPDFObject*>* newResourceObjects);
52a518086928494319b8968abc09808eff492c194fvandebo@chromium.org
532ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org    /** Emit this object unless the catalog has a substitute object, in which
542ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org     *  case emit that.
552ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org     *  @see emitObject
562ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org     */
572ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org    void emit(SkWStream* stream, SkPDFCatalog* catalog, bool indirect);
582ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org
598459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Helper function to output an indirect object.
608459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param catalog The object catalog to use.
618459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param stream  The writable output stream to send the output to.
628459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
638459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    void emitIndirectObject(SkWStream* stream, SkPDFCatalog* catalog);
648459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
658459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Helper function to find the size of an indirect object.
668459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param catalog The object catalog to use.
678459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
688459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    size_t getIndirectOutputSize(SkPDFCatalog* catalog);
692ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org
70421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    /** Static helper function to add a resource to a list.  The list takes
71421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org     *  a reference.
72421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org     * @param resource  The resource to add.
73421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org     * @param list      The list to add the resource to.
74421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org     */
75421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    static void AddResourceHelper(SkPDFObject* resource,
76421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org                                  SkTDArray<SkPDFObject*>* list);
77421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org
78421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    /** Static helper function to copy and reference the resources (and all
79421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org     *   their subresources) into a new list.
80421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org     * @param resources The resource list.
816addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     * @param newResourceObjects All the resource objects (recursively) used on
826addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *                         the page are added to this array.  This gives
836addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *                         the caller a chance to deduplicate resources
846addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     *                         across pages.
856addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com     * @param knownResourceObjects  The set of resources to be ignored.
86421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org     */
876addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com    static void GetResourcesHelper(
886addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com            const SkTDArray<SkPDFObject*>* resources,
896addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com            const SkTSet<SkPDFObject*>& knownResourceObjects,
906addb1930013ebb2f984045141650fd7afcfa90fedisonn@google.com            SkTSet<SkPDFObject*>* newResourceObjects);
91421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org
922ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.orgprotected:
932ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org    /** Subclasses must implement this method to print the object to the
942ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org     *  PDF file.
952ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org     *  @param catalog  The object catalog to use.
962ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org     *  @param indirect If true, output an object identifier with the object.
972ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org     *  @param stream   The writable output stream to send the output to.
982ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org     */
992ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
1002ef12d4bb54312091d644f0ada3639c51c9f6e5avandebo@chromium.org                            bool indirect) = 0;
1014d73ac22a1b99402fc8cff78a4eb4b27aa8fe019robertphillips@google.com
1024d73ac22a1b99402fc8cff78a4eb4b27aa8fe019robertphillips@google.com        typedef SkRefCnt INHERITED;
1038459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org};
1048459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1058459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org/** \class SkPDFObjRef
1068459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1078459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    An indirect reference to a PDF object.
1088459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org*/
1098459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkPDFObjRef : public SkPDFObject {
1108459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgpublic:
1113b429984664e88e0530eb6a1461a828898d8d96breed@google.com    SK_DECLARE_INST_COUNT(SkPDFObjRef)
1123b429984664e88e0530eb6a1461a828898d8d96breed@google.com
1138459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Create a reference to an existing SkPDFObject.
1148459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param obj The object to reference.
1158459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
116f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    explicit SkPDFObjRef(SkPDFObject* obj);
117f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    virtual ~SkPDFObjRef();
1188459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1198459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    // The SkPDFObject interface.
1208459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
1218459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org                            bool indirect);
1228459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
1238459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1248459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgprivate:
125d96d17b9c113ac694138224249ff2ce643e961ddvandebo@chromium.org    SkAutoTUnref<SkPDFObject> fObj;
126d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1273b429984664e88e0530eb6a1461a828898d8d96breed@google.com    typedef SkPDFObject INHERITED;
1288459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org};
1298459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1308459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org/** \class SkPDFInt
1318459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1328459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    An integer object in a PDF.
1338459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org*/
1348459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkPDFInt : public SkPDFObject {
1358459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgpublic:
1363b429984664e88e0530eb6a1461a828898d8d96breed@google.com    SK_DECLARE_INST_COUNT(SkPDFInt)
1373b429984664e88e0530eb6a1461a828898d8d96breed@google.com
1388459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Create a PDF integer (usually for indirect reference purposes).
1398459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param value An integer value between 2^31 - 1 and -2^31.
1408459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
141f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    explicit SkPDFInt(int32_t value);
142f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    virtual ~SkPDFInt();
1438459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1448459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    // The SkPDFObject interface.
1458459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
1468459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org                            bool indirect);
1478459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1488459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgprivate:
1498459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    int32_t fValue;
150d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1513b429984664e88e0530eb6a1461a828898d8d96breed@google.com    typedef SkPDFObject INHERITED;
1528459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org};
1538459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1549b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org/** \class SkPDFBool
1559b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
1569b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    An boolean value in a PDF.
1579b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org*/
1589b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgclass SkPDFBool : public SkPDFObject {
1599b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgpublic:
1603b429984664e88e0530eb6a1461a828898d8d96breed@google.com    SK_DECLARE_INST_COUNT(SkPDFBool)
1613b429984664e88e0530eb6a1461a828898d8d96breed@google.com
1629b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    /** Create a PDF boolean.
1639b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org     *  @param value true or false.
1649b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org     */
1659b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    explicit SkPDFBool(bool value);
1669b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    virtual ~SkPDFBool();
1679b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
1689b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    // The SkPDFObject interface.
1699b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
1709b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org                            bool indirect);
1719b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
1729b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
1739b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.orgprivate:
1749b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org    bool fValue;
175d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1763b429984664e88e0530eb6a1461a828898d8d96breed@google.com    typedef SkPDFObject INHERITED;
1779b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org};
1789b49dc0db8254e3dcdc2de4a1e0add4f8a7ac5a8vandebo@chromium.org
1798459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org/** \class SkPDFScalar
1808459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1818459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    A real number object in a PDF.
1828459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org*/
1838459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkPDFScalar : public SkPDFObject {
1848459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgpublic:
1853b429984664e88e0530eb6a1461a828898d8d96breed@google.com    SK_DECLARE_INST_COUNT(SkPDFScalar)
1863b429984664e88e0530eb6a1461a828898d8d96breed@google.com
1878459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Create a PDF real number.
1888459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param value A real value.
1898459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
190f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    explicit SkPDFScalar(SkScalar value);
191f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    virtual ~SkPDFScalar();
1928459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
193cae5fba82e687d674b076b10cdc8aba46e1ac3b3vandebo@chromium.org    static void Append(SkScalar value, SkWStream* stream);
194094316bd284372c2a3d8ef02eec589901e503c59vandebo@chromium.org
1958459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    // The SkPDFObject interface.
1968459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
1978459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org                            bool indirect);
1988459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
1998459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgprivate:
2008459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    SkScalar fValue;
201d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2023b429984664e88e0530eb6a1461a828898d8d96breed@google.com    typedef SkPDFObject INHERITED;
2038459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org};
2048459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2058459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org/** \class SkPDFString
2068459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2078459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    A string object in a PDF.
2088459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org*/
2098459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkPDFString : public SkPDFObject {
2108459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgpublic:
2113b429984664e88e0530eb6a1461a828898d8d96breed@google.com    SK_DECLARE_INST_COUNT(SkPDFString)
2123b429984664e88e0530eb6a1461a828898d8d96breed@google.com
2138459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Create a PDF string. Maximum length (in bytes) is 65,535.
2148459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param value A string value.
2158459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
216f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    explicit SkPDFString(const char value[]);
217f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    explicit SkPDFString(const SkString& value);
21828be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org
21928be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    /** Create a PDF string. Maximum length (in bytes) is 65,535.
22028be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org     *  @param value     A string value.
22128be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org     *  @param len       The length of value.
22228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org     *  @param wideChars Indicates if the top byte in value is significant and
22328be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org     *                   should be encoded (true) or not (false).
22428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org     */
22528be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    SkPDFString(const uint16_t* value, size_t len, bool wideChars);
226f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    virtual ~SkPDFString();
2278459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2288459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    // The SkPDFObject interface.
2298459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
2308459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org                            bool indirect);
2318459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
2328459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
233f6c3ebdeb135dcdb9af225bd7af77f1fe1f92787reed@google.com    static SkString FormatString(const char* input, size_t len);
234f6c3ebdeb135dcdb9af225bd7af77f1fe1f92787reed@google.com    static SkString FormatString(const uint16_t* input, size_t len,
23528be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org                                 bool wideChars);
2368459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgprivate:
237d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org    static const size_t kMaxLen = 65535;
2388459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2398459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    const SkString fValue;
2408459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
241f6c3ebdeb135dcdb9af225bd7af77f1fe1f92787reed@google.com    static SkString DoFormatString(const void* input, size_t len,
24228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org                                 bool wideInput, bool wideOutput);
2433b429984664e88e0530eb6a1461a828898d8d96breed@google.com
2443b429984664e88e0530eb6a1461a828898d8d96breed@google.com    typedef SkPDFObject INHERITED;
2458459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org};
2468459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2478459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org/** \class SkPDFName
2488459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2498459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    A name object in a PDF.
2508459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org*/
2518459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkPDFName : public SkPDFObject {
2528459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgpublic:
2533b429984664e88e0530eb6a1461a828898d8d96breed@google.com    SK_DECLARE_INST_COUNT(SkPDFName)
2543b429984664e88e0530eb6a1461a828898d8d96breed@google.com
2558459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Create a PDF name object. Maximum length is 127 bytes.
2568459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param value The name.
2578459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
258f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    explicit SkPDFName(const char name[]);
259f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    explicit SkPDFName(const SkString& name);
260f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    virtual ~SkPDFName();
2618459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
262421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    bool operator==(const SkPDFName& b) const;
263421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org
2648459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    // The SkPDFObject interface.
2658459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
2668459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org                            bool indirect);
2678459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
2688459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2698459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgprivate:
270d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org    static const size_t kMaxLen = 127;
2718459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2728459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    const SkString fValue;
2738459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
274f6c3ebdeb135dcdb9af225bd7af77f1fe1f92787reed@google.com    static SkString FormatName(const SkString& input);
275d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2763b429984664e88e0530eb6a1461a828898d8d96breed@google.com    typedef SkPDFObject INHERITED;
2778459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org};
2788459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2798459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org/** \class SkPDFArray
2808459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2818459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    An array object in a PDF.
2828459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org*/
2838459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkPDFArray : public SkPDFObject {
2848459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgpublic:
2853b429984664e88e0530eb6a1461a828898d8d96breed@google.com    SK_DECLARE_INST_COUNT(SkPDFArray)
2863b429984664e88e0530eb6a1461a828898d8d96breed@google.com
2878459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Create a PDF array. Maximum length is 8191.
2888459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
289f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    SkPDFArray();
2908459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual ~SkPDFArray();
2918459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2928459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    // The SkPDFObject interface.
2938459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
2948459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org                            bool indirect);
2958459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
2968459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
2978459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** The size of the array.
2988459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
2998459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    int size() { return fValue.count(); }
3008459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
3018459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Preallocate space for the given number of entries.
3028459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param length The number of array slots to preallocate.
3038459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
3048459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    void reserve(int length);
3058459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
3068459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Returns the object at the given offset in the array.
3078459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param index The index into the array to retrieve.
3088459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
3098459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    SkPDFObject* getAt(int index) { return fValue[index]; }
3108459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
311f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    /** Set the object at the given offset in the array. Ref's value.
3128459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param index The index into the array to set.
3138459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param value The value to add to the array.
314f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org     *  @return The value argument is returned.
3158459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
316f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    SkPDFObject* setAt(int index, SkPDFObject* value);
3178459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
318f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    /** Append the object to the end of the array and increments its ref count.
3198459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param value The value to add to the array.
320f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org     *  @return The value argument is returned.
3218459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
322f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    SkPDFObject* append(SkPDFObject* value);
323a5c7234e81748f76cbeede40e619351146e5286actguil@chromium.org
324c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    /** Creates a SkPDFInt object and appends it to the array.
325c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param value The value to add to the array.
326c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     */
327c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    void appendInt(int32_t value);
328a5c7234e81748f76cbeede40e619351146e5286actguil@chromium.org
329c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    /** Creates a SkPDFScalar object and appends it to the array.
330c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param value The value to add to the array.
331c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     */
332c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    void appendScalar(SkScalar value);
333a5c7234e81748f76cbeede40e619351146e5286actguil@chromium.org
334c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    /** Creates a SkPDFName object and appends it to the array.
335c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param value The value to add to the array.
336c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     */
337c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    void appendName(const char name[]);
338a5c7234e81748f76cbeede40e619351146e5286actguil@chromium.org
3398459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgprivate:
3408459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    static const int kMaxLen = 8191;
3418459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    SkTDArray<SkPDFObject*> fValue;
342d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3433b429984664e88e0530eb6a1461a828898d8d96breed@google.com    typedef SkPDFObject INHERITED;
3448459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org};
3458459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
3468459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org/** \class SkPDFDict
3478459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
3488459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    A dictionary object in a PDF.
3498459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org*/
3508459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgclass SkPDFDict : public SkPDFObject {
3518459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgpublic:
3523b429984664e88e0530eb6a1461a828898d8d96breed@google.com    SK_DECLARE_INST_COUNT(SkPDFDict)
3533b429984664e88e0530eb6a1461a828898d8d96breed@google.com
3548459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** Create a PDF dictionary. Maximum number of entries is 4095.
3558459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
356f66025d59ab4c8c4439fabf6ad89ddf35a19d1fdvandebo@chromium.org    SkPDFDict();
357d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org
358d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org    /** Create a PDF dictionary with a Type entry.
359d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org     *  @param type   The value of the Type entry.
360d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org     */
361d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org    explicit SkPDFDict(const char type[]);
362d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org
3638459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual ~SkPDFDict();
3648459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
3658459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    // The SkPDFObject interface.
3668459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
3678459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org                            bool indirect);
3688459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
3698459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
3708459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    /** The size of the dictionary.
3718459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
3728459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    int size() { return fValue.count(); }
3738459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
374f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    /** Add the value to the dictionary with the given key.  Refs value.
3758459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param key   The key for this dictionary entry.
3768459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     *  @param value The value for this dictionary entry.
377f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org     *  @return The value argument is returned.
3788459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org     */
379f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    SkPDFObject* insert(SkPDFName* key, SkPDFObject* value);
3808459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
381f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    /** Add the value to the dictionary with the given key.  Refs value.  The
382f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org     *  method will create the SkPDFName object.
383d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org     *  @param key   The text of the key for this dictionary entry.
384d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org     *  @param value The value for this dictionary entry.
385f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org     *  @return The value argument is returned.
386d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org     */
387f7c157610ff85f7323f5e213b62478dcc66edbecvandebo@chromium.org    SkPDFObject* insert(const char key[], SkPDFObject* value);
388a5c7234e81748f76cbeede40e619351146e5286actguil@chromium.org
389c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    /** Add the int to the dictionary with the given key.
390c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param key   The text of the key for this dictionary entry.
391c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param value The int value for this dictionary entry.
392c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     */
393c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    void insertInt(const char key[], int32_t value);
394a5c7234e81748f76cbeede40e619351146e5286actguil@chromium.org
395aec406650cbfa4ef65d83db5ff4f82572e8e098freed@google.com    /**
396aec406650cbfa4ef65d83db5ff4f82572e8e098freed@google.com     *  Calls insertInt() but asserts in debug builds that the value can be represented
397aec406650cbfa4ef65d83db5ff4f82572e8e098freed@google.com     *  by an int32_t.
398aec406650cbfa4ef65d83db5ff4f82572e8e098freed@google.com     */
399aec406650cbfa4ef65d83db5ff4f82572e8e098freed@google.com    void insertInt(const char key[], size_t value) {
400aec406650cbfa4ef65d83db5ff4f82572e8e098freed@google.com        this->insertInt(key, SkToS32(value));
401aec406650cbfa4ef65d83db5ff4f82572e8e098freed@google.com    }
402aec406650cbfa4ef65d83db5ff4f82572e8e098freed@google.com
403c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    /** Add the scalar to the dictionary with the given key.
404c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param key   The text of the key for this dictionary entry.
405c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param value The scalar value for this dictionary entry.
406c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     */
407c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    void insertScalar(const char key[], SkScalar value);
408a5c7234e81748f76cbeede40e619351146e5286actguil@chromium.org
409c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    /** Add the name to the dictionary with the given key.
410c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param key   The text of the key for this dictionary entry.
411c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param name  The name for this dictionary entry.
412c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     */
413c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    void insertName(const char key[], const char name[]);
414d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org
415c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    /** Add the name to the dictionary with the given key.
416c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param key   The text of the key for this dictionary entry.
417c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     *  @param name  The name for this dictionary entry.
418c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com     */
419c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    void insertName(const char key[], const SkString& name) {
420c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com        this->insertName(key, name.c_str());
421c789cf1c6f3947283aeb34acb5a22e6204f8f6f5reed@google.com    }
422a5c7234e81748f76cbeede40e619351146e5286actguil@chromium.org
423d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org    /** Remove all entries from the dictionary.
424d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org     */
425d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org    void clear();
426d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org
4278459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.orgprivate:
4288459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    struct Rec {
4298459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org      SkPDFName* key;
4308459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org      SkPDFObject* value;
4318459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    };
4328459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
433421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.orgpublic:
434421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    class Iter {
435421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    public:
436421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org        explicit Iter(const SkPDFDict& dict);
437421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org        SkPDFName* next(SkPDFObject** value);
438421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org
439421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    private:
440aa537d4bdb2384cdcd0644a02a2ab7fb0ecdd3b3commit-bot@chromium.org        const Rec* fIter;
441aa537d4bdb2384cdcd0644a02a2ab7fb0ecdd3b3commit-bot@chromium.org        const Rec* fStop;
442421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    };
443421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org
444421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.orgprivate:
445421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org    static const int kMaxLen = 4095;
446421d6443fbd3a913dfa32b6492c4a2969bc6314bvandebo@chromium.org
4478459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org    SkTDArray<struct Rec> fValue;
448d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
4493b429984664e88e0530eb6a1461a828898d8d96breed@google.com    typedef SkPDFObject INHERITED;
4508459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org};
4518459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org
4528459d4e5e32608ec6da3f2b81731aaeb7b038843vandebo@chromium.org#endif
453