/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SkPDFFont_DEFINED #define SkPDFFont_DEFINED #include "SkPDFTypes.h" #include "SkTDArray.h" #include "SkThread.h" class SkPaint; /** \class SkPDFFont A PDF Object class representing a font. The font may have resources attached to it in order to embed the font. SkPDFFonts are canonicalized so that resource deduplication will only include one copy of a font. This class uses the same pattern as SkPDFGraphicState, a static weak reference to each instantiated class. */ class SkPDFFont : public SkPDFDict { public: virtual ~SkPDFFont(); virtual void getResources(SkTDArray* resourceList); /* Returns the font ID represented by this class. */ uint32_t fontID(); /** Returns true if this font supports glyph IDs above 255. */ bool multiByteGlyphs(); /** Covert the specified text to glyph IDs, taking into consideration * PDF encodings and return the number of glyphs IDs written. */ int textToPDFGlyphs(const void* text, size_t byteLength, const SkPaint& paint, uint16_t* glyphs, size_t glyphsLength) const; /** Get the font resource for the passed font ID. The reference count of * the object is incremented and it is the caller's responsibility to * unreference it when done. This is needed to accommodate the weak * reference pattern used when the returned object is new and has no * other references. * @param paint The SkPaint to emulate. */ static SkPDFFont* getFontResouceByID(uint32_t fontID); private: uint32_t fFontID; bool fMultiByteGlyphs; SkTDArray fResources; class FontRec { public: SkPDFFont* fFont; uint32_t fFontID; bool operator==(const FontRec& b) const; FontRec(SkPDFFont* font, uint32_t fontID); }; // This should be made a hash table if performance is a problem. static SkTDArray& canonicalFonts(); static SkMutex& canonicalFontsMutex(); SkPDFFont(uint32_t fontID, bool multiByteGlyphs); void populateBuiltinFont(const char fontName[]); void populateFont(const char subType[], const char fontName[], int firstChar, int lastChar, int widths[], SkPDFObject* fontDescriptor); static int find(uint32_t fontID); }; #endif