119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/* 319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * Copyright 2010 The Android Open Source Project 419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * 519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * Use of this source code is governed by a BSD-style license that can be 619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * found in the LICENSE file. 719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 1019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#ifndef SkPDFTypes_DEFINED 1119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#define SkPDFTypes_DEFINED 1219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 1319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#include "SkRefCnt.h" 1419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#include "SkScalar.h" 1519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#include "SkString.h" 1619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#include "SkTDArray.h" 1709b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com#include "SkTSet.h" 1819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#include "SkTypes.h" 1919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 2019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFCatalog; 2119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkWStream; 2219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 2319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFObject 2419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 2519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org A PDF Object is the base class for primitive elements in a PDF file. A 2619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org common subtype is used to ease the use of indirect object references, 2719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org which are common in the PDF format. 2819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 2919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFObject : public SkRefCnt { 3019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 315402c06820a293e8293e052266d9fbdb8ab42033robertphillips@google.com SK_DECLARE_INST_COUNT(SkPDFObject) 325402c06820a293e8293e052266d9fbdb8ab42033robertphillips@google.com 3319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Return the size (number of bytes) of this object in the final output 3419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * file. Compound objects or objects that are computationally intensive 3519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * to output should override this method. 3619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param catalog The object catalog to use. 3719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param indirect If true, output an object identifier with the object. 3819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 3919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); 4019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 4119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** For non-primitive objects (i.e. objects defined outside this file), 4209b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * this method will add to newResourceObjects any objects that this method 4309b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * depends on, but not already in knownResourceObjects. This operates 4409b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * recursively so if this object depends on another object and that object 4509b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * depends on two more, all three objects will be added. 4609b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * 4709b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * @param knownResourceObjects The set of resources to be ignored. 4809b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * @param newResourceObjects The set to append dependant resources to. 4919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 5009b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com virtual void getResources(const SkTSet<SkPDFObject*>& knownResourceObjects, 5109b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com SkTSet<SkPDFObject*>* newResourceObjects); 5219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 5319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Emit this object unless the catalog has a substitute object, in which 5419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * case emit that. 5519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @see emitObject 5619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 5719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void emit(SkWStream* stream, SkPDFCatalog* catalog, bool indirect); 5819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 5919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Helper function to output an indirect object. 6019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param catalog The object catalog to use. 6119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param stream The writable output stream to send the output to. 6219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 6319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void emitIndirectObject(SkWStream* stream, SkPDFCatalog* catalog); 6419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 6519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Helper function to find the size of an indirect object. 6619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param catalog The object catalog to use. 6719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 6819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org size_t getIndirectOutputSize(SkPDFCatalog* catalog); 6919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 7019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Static helper function to add a resource to a list. The list takes 7119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * a reference. 7219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param resource The resource to add. 7319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param list The list to add the resource to. 7419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 7519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static void AddResourceHelper(SkPDFObject* resource, 7619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkTDArray<SkPDFObject*>* list); 7719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 7819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Static helper function to copy and reference the resources (and all 7919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * their subresources) into a new list. 8019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param resources The resource list. 8109b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * @param newResourceObjects All the resource objects (recursively) used on 8209b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * the page are added to this array. This gives 8309b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * the caller a chance to deduplicate resources 8409b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * across pages. 8509b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com * @param knownResourceObjects The set of resources to be ignored. 8619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 8709b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com static void GetResourcesHelper( 8809b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com const SkTDArray<SkPDFObject*>* resources, 8909b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com const SkTSet<SkPDFObject*>& knownResourceObjects, 9009b4813b6bd356d371952c4346f1f9fbe02fdfceedisonn@google.com SkTSet<SkPDFObject*>* newResourceObjects); 9119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 9219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprotected: 9319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Subclasses must implement this method to print the object to the 9419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * PDF file. 9519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param catalog The object catalog to use. 9619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param indirect If true, output an object identifier with the object. 9719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param stream The writable output stream to send the output to. 9819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 9919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 10019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect) = 0; 1015402c06820a293e8293e052266d9fbdb8ab42033robertphillips@google.com 1025402c06820a293e8293e052266d9fbdb8ab42033robertphillips@google.com typedef SkRefCnt INHERITED; 10319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 10419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 10519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFObjRef 10619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 10719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org An indirect reference to a PDF object. 10819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 10919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFObjRef : public SkPDFObject { 11019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 111f06b135419dd7144906299be7063c616c37027f6reed@google.com SK_DECLARE_INST_COUNT(SkPDFObjRef) 112f06b135419dd7144906299be7063c616c37027f6reed@google.com 11319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a reference to an existing SkPDFObject. 11419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param obj The object to reference. 11519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 11619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFObjRef(SkPDFObject* obj); 11719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual ~SkPDFObjRef(); 11819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 11919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // The SkPDFObject interface. 12019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 12119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect); 12219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); 12319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 12419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 1255b20098a0c3b7d3fe65d8e636bc898fb661f6fa8vandebo@chromium.org SkAutoTUnref<SkPDFObject> fObj; 126dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 127f06b135419dd7144906299be7063c616c37027f6reed@google.com typedef SkPDFObject INHERITED; 12819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 12919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 13019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFInt 13119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 13219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org An integer object in a PDF. 13319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 13419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFInt : public SkPDFObject { 13519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 136f06b135419dd7144906299be7063c616c37027f6reed@google.com SK_DECLARE_INST_COUNT(SkPDFInt) 137f06b135419dd7144906299be7063c616c37027f6reed@google.com 13819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a PDF integer (usually for indirect reference purposes). 13919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value An integer value between 2^31 - 1 and -2^31. 14019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 14119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFInt(int32_t value); 14219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual ~SkPDFInt(); 14319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 14419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // The SkPDFObject interface. 14519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 14619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect); 14719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 14819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 14919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org int32_t fValue; 150dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 151f06b135419dd7144906299be7063c616c37027f6reed@google.com typedef SkPDFObject INHERITED; 15219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 15319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 15419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFBool 15519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 15619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org An boolean value in a PDF. 15719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 15819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFBool : public SkPDFObject { 15919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 160f06b135419dd7144906299be7063c616c37027f6reed@google.com SK_DECLARE_INST_COUNT(SkPDFBool) 161f06b135419dd7144906299be7063c616c37027f6reed@google.com 16219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a PDF boolean. 16319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value true or false. 16419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 16519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFBool(bool value); 16619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual ~SkPDFBool(); 16719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 16819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // The SkPDFObject interface. 16919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 17019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect); 17119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); 17219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 17319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 17419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool fValue; 175dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 176f06b135419dd7144906299be7063c616c37027f6reed@google.com typedef SkPDFObject INHERITED; 17719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 17819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 17919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFScalar 18019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 18119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org A real number object in a PDF. 18219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 18319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFScalar : public SkPDFObject { 18419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 185f06b135419dd7144906299be7063c616c37027f6reed@google.com SK_DECLARE_INST_COUNT(SkPDFScalar) 186f06b135419dd7144906299be7063c616c37027f6reed@google.com 18719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a PDF real number. 18819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value A real value. 18919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 19019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFScalar(SkScalar value); 19119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual ~SkPDFScalar(); 19219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 19319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static void Append(SkScalar value, SkWStream* stream); 19419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 19519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // The SkPDFObject interface. 19619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 19719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect); 19819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 19919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 20019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkScalar fValue; 201dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 202f06b135419dd7144906299be7063c616c37027f6reed@google.com typedef SkPDFObject INHERITED; 20319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 20419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 20519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFString 20619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 20719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org A string object in a PDF. 20819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 20919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFString : public SkPDFObject { 21019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 211f06b135419dd7144906299be7063c616c37027f6reed@google.com SK_DECLARE_INST_COUNT(SkPDFString) 212f06b135419dd7144906299be7063c616c37027f6reed@google.com 21319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a PDF string. Maximum length (in bytes) is 65,535. 21419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value A string value. 21519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 21619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFString(const char value[]); 21719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFString(const SkString& value); 21819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 21919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a PDF string. Maximum length (in bytes) is 65,535. 22019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value A string value. 22119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param len The length of value. 22219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param wideChars Indicates if the top byte in value is significant and 22319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * should be encoded (true) or not (false). 22419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 22519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFString(const uint16_t* value, size_t len, bool wideChars); 22619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual ~SkPDFString(); 22719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 22819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // The SkPDFObject interface. 22919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 23019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect); 23119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); 23219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 23319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkString FormatString(const char* input, size_t len); 23419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkString FormatString(const uint16_t* input, size_t len, 23519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool wideChars); 23619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 23719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static const size_t kMaxLen = 65535; 23819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 23919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org const SkString fValue; 24019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 24119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkString DoFormatString(const void* input, size_t len, 24219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool wideInput, bool wideOutput); 243f06b135419dd7144906299be7063c616c37027f6reed@google.com 244f06b135419dd7144906299be7063c616c37027f6reed@google.com typedef SkPDFObject INHERITED; 24519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 24619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 24719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFName 24819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 24919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org A name object in a PDF. 25019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 25119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFName : public SkPDFObject { 25219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 253f06b135419dd7144906299be7063c616c37027f6reed@google.com SK_DECLARE_INST_COUNT(SkPDFName) 254f06b135419dd7144906299be7063c616c37027f6reed@google.com 25519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a PDF name object. Maximum length is 127 bytes. 25619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The name. 25719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 25819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFName(const char name[]); 25919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFName(const SkString& name); 26019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual ~SkPDFName(); 26119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 26219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool operator==(const SkPDFName& b) const; 26319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 26419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // The SkPDFObject interface. 26519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 26619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect); 26719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); 26819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 26919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 27019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static const size_t kMaxLen = 127; 27119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 27219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org const SkString fValue; 27319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 27419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static SkString FormatName(const SkString& input); 275dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 276f06b135419dd7144906299be7063c616c37027f6reed@google.com typedef SkPDFObject INHERITED; 27719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 27819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 27919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFArray 28019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 28119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org An array object in a PDF. 28219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 28319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFArray : public SkPDFObject { 28419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 285f06b135419dd7144906299be7063c616c37027f6reed@google.com SK_DECLARE_INST_COUNT(SkPDFArray) 286f06b135419dd7144906299be7063c616c37027f6reed@google.com 28719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a PDF array. Maximum length is 8191. 28819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 28919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFArray(); 29019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual ~SkPDFArray(); 29119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 29219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // The SkPDFObject interface. 29319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 29419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect); 29519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); 29619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 29719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** The size of the array. 29819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 29919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org int size() { return fValue.count(); } 30019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 30119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Preallocate space for the given number of entries. 30219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param length The number of array slots to preallocate. 30319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 30419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void reserve(int length); 30519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 30619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Returns the object at the given offset in the array. 30719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param index The index into the array to retrieve. 30819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 30919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFObject* getAt(int index) { return fValue[index]; } 31019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 31119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Set the object at the given offset in the array. Ref's value. 31219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param index The index into the array to set. 31319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The value to add to the array. 31419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @return The value argument is returned. 31519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 31619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFObject* setAt(int index, SkPDFObject* value); 31719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 31819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Append the object to the end of the array and increments its ref count. 31919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The value to add to the array. 32019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @return The value argument is returned. 32119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 32219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFObject* append(SkPDFObject* value); 32319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 32419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Creates a SkPDFInt object and appends it to the array. 32519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The value to add to the array. 32619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 32719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void appendInt(int32_t value); 32819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 32919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Creates a SkPDFScalar object and appends it to the array. 33019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The value to add to the array. 33119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 33219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void appendScalar(SkScalar value); 33319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 33419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Creates a SkPDFName object and appends it to the array. 33519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The value to add to the array. 33619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 33719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void appendName(const char name[]); 33819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 33919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 34019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static const int kMaxLen = 8191; 34119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkTDArray<SkPDFObject*> fValue; 342dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 343f06b135419dd7144906299be7063c616c37027f6reed@google.com typedef SkPDFObject INHERITED; 34419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 34519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 34619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org/** \class SkPDFDict 34719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 34819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org A dictionary object in a PDF. 34919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org*/ 35019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgclass SkPDFDict : public SkPDFObject { 35119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 352f06b135419dd7144906299be7063c616c37027f6reed@google.com SK_DECLARE_INST_COUNT(SkPDFDict) 353f06b135419dd7144906299be7063c616c37027f6reed@google.com 35419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a PDF dictionary. Maximum number of entries is 4095. 35519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 35619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFDict(); 35719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 35819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Create a PDF dictionary with a Type entry. 35919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param type The value of the Type entry. 36019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 36119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit SkPDFDict(const char type[]); 36219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 36319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual ~SkPDFDict(); 36419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 36519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org // The SkPDFObject interface. 36619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, 36719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org bool indirect); 36819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); 36919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 37019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** The size of the dictionary. 37119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 37219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org int size() { return fValue.count(); } 37319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 37419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Add the value to the dictionary with the given key. Refs value. 37519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param key The key for this dictionary entry. 37619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The value for this dictionary entry. 37719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @return The value argument is returned. 37819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 37919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFObject* insert(SkPDFName* key, SkPDFObject* value); 38019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 38119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Add the value to the dictionary with the given key. Refs value. The 38219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * method will create the SkPDFName object. 38319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param key The text of the key for this dictionary entry. 38419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The value for this dictionary entry. 38519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @return The value argument is returned. 38619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 38719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFObject* insert(const char key[], SkPDFObject* value); 38819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 38919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Add the int to the dictionary with the given key. 39019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param key The text of the key for this dictionary entry. 39119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The int value for this dictionary entry. 39219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 39319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void insertInt(const char key[], int32_t value); 39419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 39519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Add the scalar to the dictionary with the given key. 39619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param key The text of the key for this dictionary entry. 39719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param value The scalar value for this dictionary entry. 39819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 39919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void insertScalar(const char key[], SkScalar value); 40019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 40119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Add the name to the dictionary with the given key. 40219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param key The text of the key for this dictionary entry. 40319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param name The name for this dictionary entry. 40419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 40519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void insertName(const char key[], const char name[]); 40619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 40719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Add the name to the dictionary with the given key. 40819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param key The text of the key for this dictionary entry. 40919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org * @param name The name for this dictionary entry. 41019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 41119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void insertName(const char key[], const SkString& name) { 41219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org this->insertName(key, name.c_str()); 41319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org } 41419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 41519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org /** Remove all entries from the dictionary. 41619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org */ 41719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org void clear(); 41819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 41919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 42019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org struct Rec { 42119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFName* key; 42219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFObject* value; 42319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org }; 42419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 42519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgpublic: 42619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org class Iter { 42719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org public: 42819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org explicit Iter(const SkPDFDict& dict); 42919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkPDFName* next(SkPDFObject** value); 43019be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 43119be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org private: 432871c3b10650a8bae00106ddd2a73113be6256824commit-bot@chromium.org const Rec* fIter; 433871c3b10650a8bae00106ddd2a73113be6256824commit-bot@chromium.org const Rec* fStop; 43419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org }; 43519be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 43619be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.orgprivate: 43719be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org static const int kMaxLen = 4095; 43819be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 43919be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org SkTDArray<struct Rec> fValue; 440dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com 441f06b135419dd7144906299be7063c616c37027f6reed@google.com typedef SkPDFObject INHERITED; 44219be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org}; 44319be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org 44419be8d34138d93df3a792263eb185d77f153c0c6vandebo@chromium.org#endif 445