1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2018 Google LLC. 2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. 3*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkPDFUnion_DEFINED 4*c8dee2aaSAndroid Build Coastguard Worker #define SkPDFUnion_DEFINED 5*c8dee2aaSAndroid Build Coastguard Worker 6*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 7*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 11*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 12*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker class SkPDFObject; 15*c8dee2aaSAndroid Build Coastguard Worker class SkWStream; 16*c8dee2aaSAndroid Build Coastguard Worker struct SkPDFIndirectReference; 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker /** 19*c8dee2aaSAndroid Build Coastguard Worker A SkPDFUnion is a non-virtualized implementation of the 20*c8dee2aaSAndroid Build Coastguard Worker non-compound, non-specialized PDF Object types: Name, String, 21*c8dee2aaSAndroid Build Coastguard Worker Number, Boolean. 22*c8dee2aaSAndroid Build Coastguard Worker */ 23*c8dee2aaSAndroid Build Coastguard Worker class SkPDFUnion { 24*c8dee2aaSAndroid Build Coastguard Worker public: 25*c8dee2aaSAndroid Build Coastguard Worker // Move constructor and assignment operator destroy the argument 26*c8dee2aaSAndroid Build Coastguard Worker // and steal their references (if needed). 27*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion(SkPDFUnion&&); 28*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion& operator=(SkPDFUnion&&); 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker ~SkPDFUnion(); 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker /** The following nine functions are the standard way of creating 33*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion objects. */ 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion Int(int32_t); 36*c8dee2aaSAndroid Build Coastguard Worker Int(size_t v)37*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion Int(size_t v) { return SkPDFUnion::Int(SkToS32(v)); } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion Bool(bool); 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion Scalar(SkScalar); 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion ColorComponent(uint8_t); 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion ColorComponentF(float); 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker /** These two functions do NOT take ownership of char*, and do NOT 48*c8dee2aaSAndroid Build Coastguard Worker copy the string. Suitable for passing in static const 49*c8dee2aaSAndroid Build Coastguard Worker strings. For example: 50*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion n = SkPDFUnion::Name("Length"); 51*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion u = SkPDFUnion::String("Identity"); */ 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker /** SkPDFUnion::Name(const char*) assumes that the passed string 54*c8dee2aaSAndroid Build Coastguard Worker is already a valid name (that is: it has no control or 55*c8dee2aaSAndroid Build Coastguard Worker whitespace characters). This will not copy the name. */ 56*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion Name(const char*); 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker /** SkPDFUnion::String will encode the passed string. This will not copy. */ 59*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion ByteString(const char*); 60*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion TextString(const char*); 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker /** SkPDFUnion::Name(SkString) does not assume that the 63*c8dee2aaSAndroid Build Coastguard Worker passed string is already a valid name and it will escape the 64*c8dee2aaSAndroid Build Coastguard Worker string. */ 65*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion Name(SkString); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker /** SkPDFUnion::String will encode the passed string. */ 68*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion ByteString(SkString); 69*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion TextString(SkString); 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion Object(std::unique_ptr<SkPDFObject>); 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker static SkPDFUnion Ref(SkPDFIndirectReference); 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker /** These two non-virtual methods mirror SkPDFObject's 76*c8dee2aaSAndroid Build Coastguard Worker corresponding virtuals. */ 77*c8dee2aaSAndroid Build Coastguard Worker void emitObject(SkWStream*) const; 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker bool isName() const; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker private: 82*c8dee2aaSAndroid Build Coastguard Worker using PDFObject = std::unique_ptr<SkPDFObject>; 83*c8dee2aaSAndroid Build Coastguard Worker union { 84*c8dee2aaSAndroid Build Coastguard Worker int32_t fIntValue; 85*c8dee2aaSAndroid Build Coastguard Worker bool fBoolValue; 86*c8dee2aaSAndroid Build Coastguard Worker SkScalar fScalarValue; 87*c8dee2aaSAndroid Build Coastguard Worker const char* fStaticString; 88*c8dee2aaSAndroid Build Coastguard Worker SkString fSkString; 89*c8dee2aaSAndroid Build Coastguard Worker PDFObject fObject; 90*c8dee2aaSAndroid Build Coastguard Worker }; 91*c8dee2aaSAndroid Build Coastguard Worker enum class Type : char { 92*c8dee2aaSAndroid Build Coastguard Worker /** It is an error to call emitObject() or addResources() on an kDestroyed object. */ 93*c8dee2aaSAndroid Build Coastguard Worker kDestroyed = 0, 94*c8dee2aaSAndroid Build Coastguard Worker kInt, 95*c8dee2aaSAndroid Build Coastguard Worker kColorComponent, 96*c8dee2aaSAndroid Build Coastguard Worker kColorComponentF, 97*c8dee2aaSAndroid Build Coastguard Worker kBool, 98*c8dee2aaSAndroid Build Coastguard Worker kScalar, 99*c8dee2aaSAndroid Build Coastguard Worker kName, 100*c8dee2aaSAndroid Build Coastguard Worker kByteString, 101*c8dee2aaSAndroid Build Coastguard Worker kTextString, 102*c8dee2aaSAndroid Build Coastguard Worker kNameSkS, 103*c8dee2aaSAndroid Build Coastguard Worker kByteStringSkS, 104*c8dee2aaSAndroid Build Coastguard Worker kTextStringSkS, 105*c8dee2aaSAndroid Build Coastguard Worker kObject, 106*c8dee2aaSAndroid Build Coastguard Worker kRef, 107*c8dee2aaSAndroid Build Coastguard Worker }; 108*c8dee2aaSAndroid Build Coastguard Worker Type fType; 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion(Type, int32_t); 111*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion(Type, bool); 112*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion(Type, SkScalar); 113*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion(Type, const char*); 114*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion(Type, SkString); 115*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion(Type, PDFObject); 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion& operator=(const SkPDFUnion&) = delete; 118*c8dee2aaSAndroid Build Coastguard Worker SkPDFUnion(const SkPDFUnion&) = delete; 119*c8dee2aaSAndroid Build Coastguard Worker }; 120*c8dee2aaSAndroid Build Coastguard Worker static_assert(sizeof(SkString) == sizeof(void*), "SkString_size"); 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker #endif // SkPDFUnion_DEFINED 123