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)