Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members
SkPDFDocument Class Reference

#include <SkPDFDocumentPriv.h>

Inheritance diagram for SkPDFDocument:
SkDocument SkRefCnt SkRefCntBase

Public Member Functions

 SkPDFDocument (SkWStream *, SkPDF::Metadata)
 
 ~SkPDFDocument () override
 
SkCanvasonBeginPage (SkScalar, SkScalar) override
 
void onEndPage () override
 
void onClose (SkWStream *) override
 
void onAbort () override
 
SkPDFIndirectReference emit (const SkPDFObject &, SkPDFIndirectReference)
 
SkPDFIndirectReference emit (const SkPDFObject &o)
 
template<typename T >
void emitStream (const SkPDFDict &dict, T writeStream, SkPDFIndirectReference ref)
 
const SkPDF::Metadatametadata () const
 
SkPDFIndirectReference getPage (size_t pageIndex) const
 
bool hasCurrentPage () const
 
SkPDFIndirectReference currentPage () const
 
SkPDFTagTree::Mark createMarkIdForNodeId (int nodeId, SkPoint)
 
int createStructParentKeyForNodeId (int nodeId)
 
void addNodeTitle (int nodeId, SkSpan< const char >)
 
std::unique_ptr< SkPDFArraygetAnnotations ()
 
SkPDFIndirectReference reserveRef ()
 
SkString nextFontSubsetTag ()
 
SkExecutorexecutor () const
 
void incrementJobCount ()
 
void signalJobComplete ()
 
size_t currentPageIndex ()
 
size_t pageCount ()
 
const SkMatrixcurrentPageTransform () const
 
- Public Member Functions inherited from SkDocument
SkCanvasbeginPage (SkScalar width, SkScalar height, const SkRect *content=nullptr)
 
void endPage ()
 
void close ()
 
void abort ()
 
- Public Member Functions inherited from SkRefCntBase
 SkRefCntBase ()
 
virtual ~SkRefCntBase ()
 
bool unique () const
 
void ref () const
 
void unref () const
 

Public Attributes

skia_private::THashMap< SkPDFImageShaderKey, SkPDFIndirectReference, SkPDFImageShaderKey::HashfImageShaderMap
 
skia_private::THashMap< SkPDFGradientShader::Key, SkPDFIndirectReference, SkPDFGradientShader::KeyHashfGradientPatternMap
 
skia_private::THashMap< SkBitmapKey, SkPDFIndirectReferencefPDFBitmapMap
 
skia_private::THashMap< SkPDFIccProfileKey, SkPDFIndirectReference, SkPDFIccProfileKey::HashfICCProfileMap
 
skia_private::THashMap< uint32_t, std::unique_ptr< SkAdvancedTypefaceMetrics > > fTypefaceMetrics
 
skia_private::THashMap< uint32_t, std::vector< SkString > > fType1GlyphNames
 
skia_private::THashMap< uint32_t, std::vector< SkUnichar > > fToUnicodeMap
 
skia_private::THashMap< uint32_t, SkPDFIndirectReferencefFontDescriptors
 
skia_private::THashMap< uint32_t, SkPDFIndirectReferencefType3FontDescriptors
 
skia_private::THashMap< uint64_t, SkPDFFontfFontMap
 
skia_private::THashMap< SkPDFStrokeGraphicState, SkPDFIndirectReference, SkPDFStrokeGraphicState::HashfStrokeGSMap
 
skia_private::THashMap< SkPDFFillGraphicState, SkPDFIndirectReference, SkPDFFillGraphicState::HashfFillGSMap
 
SkPDFIndirectReference fInvertFunction
 
SkPDFIndirectReference fNoSmaskGraphicState
 
std::vector< std::unique_ptr< SkPDFLink > > fCurrentPageLinks
 
std::vector< SkPDFNamedDestinationfNamedDestinations
 

Additional Inherited Members

- Protected Types inherited from SkDocument
enum  State { kBetweenPages_State , kInPage_State , kClosed_State }
 
- Protected Member Functions inherited from SkDocument
 SkDocument (SkWStream *)
 
 ~SkDocument () override
 
SkWStreamgetStream ()
 
State getState () const
 

Detailed Description

Concrete implementation of SkDocument that creates PDF files. This class does not produced linearized or optimized PDFs; instead it it attempts to use a minimum amount of RAM.

Definition at line 81 of file SkPDFDocumentPriv.h.

Constructor & Destructor Documentation

◆ SkPDFDocument()

SkPDFDocument::SkPDFDocument ( SkWStream stream,
SkPDF::Metadata  metadata 
)

Definition at line 210 of file SkPDFDocument.cpp.

212 : SkDocument(stream)
213 , fMetadata(std::move(metadata)) {
214 constexpr float kDpiForRasterScaleOne = 72.0f;
215 if (fMetadata.fRasterDPI != kDpiForRasterScaleOne) {
216 fInverseRasterScale = kDpiForRasterScaleOne / fMetadata.fRasterDPI;
217 fRasterScale = fMetadata.fRasterDPI / kDpiForRasterScaleOne;
218 }
219 if (fMetadata.fStructureElementTreeRoot) {
220 fTagTree.init(fMetadata.fStructureElementTreeRoot, fMetadata.fOutline);
221 }
222 fExecutor = fMetadata.fExecutor;
223}
const SkPDF::Metadata & metadata() const
void init(SkPDF::StructureElementNode *, SkPDF::Metadata::Outline)
Definition SkPDFTag.cpp:193
SkExecutor * fExecutor
enum SkPDF::Metadata::Outline fOutline
StructureElementNode * fStructureElementTreeRoot

◆ ~SkPDFDocument()

SkPDFDocument::~SkPDFDocument ( )
override

Definition at line 225 of file SkPDFDocument.cpp.

225 {
226 // subclasses of SkDocument must call close() in their destructors.
227 this->close();
228}
void close()

Member Function Documentation

◆ addNodeTitle()

void SkPDFDocument::addNodeTitle ( int  nodeId,
SkSpan< const char >  title 
)

Definition at line 544 of file SkPDFDocument.cpp.

544 {
545 fTagTree.addNodeTitle(nodeId, std::move(title));
546}
void addNodeTitle(int nodeId, SkSpan< const char >)
Definition SkPDFTag.cpp:335

◆ createMarkIdForNodeId()

SkPDFTagTree::Mark SkPDFDocument::createMarkIdForNodeId ( int  nodeId,
SkPoint  p 
)

Definition at line 535 of file SkPDFDocument.cpp.

535 {
536 // If the mark isn't on a page (like when emitting a Type3 glyph)
537 // return a temporary mark not attached to the tag tree, node id, or page.
538 if (!this->hasCurrentPage()) {
539 return SkPDFTagTree::Mark();
540 }
541 return fTagTree.createMarkIdForNodeId(nodeId, SkToUInt(this->currentPageIndex()), p);
542}
constexpr unsigned SkToUInt(S x)
Definition SkTo.h:30
size_t currentPageIndex()
bool hasCurrentPage() const
Mark createMarkIdForNodeId(int nodeId, unsigned pageIndex, SkPoint)
Definition SkPDFTag.cpp:209

◆ createStructParentKeyForNodeId()

int SkPDFDocument::createStructParentKeyForNodeId ( int  nodeId)

Definition at line 548 of file SkPDFDocument.cpp.

548 {
549 // Structure elements are tied to pages, so don't emit one if not on a page.
550 if (!this->hasCurrentPage()) {
551 return -1;
552 }
553 return fTagTree.createStructParentKeyForNodeId(nodeId, SkToUInt(this->currentPageIndex()));
554}
int createStructParentKeyForNodeId(int nodeId, unsigned pageIndex)
Definition SkPDFTag.cpp:229

◆ currentPage()

SkPDFIndirectReference SkPDFDocument::currentPage ( ) const
inline

Definition at line 117 of file SkPDFDocumentPriv.h.

117 {
118 return SkASSERT(this->hasCurrentPage() && !fPageRefs.empty()), fPageRefs.back();
119 }
#define SkASSERT(cond)
Definition SkAssert.h:116

◆ currentPageIndex()

size_t SkPDFDocument::currentPageIndex ( )
inline

Definition at line 141 of file SkPDFDocumentPriv.h.

141{ return fPages.size(); }

◆ currentPageTransform()

const SkMatrix & SkPDFDocument::currentPageTransform ( ) const

Definition at line 526 of file SkPDFDocument.cpp.

526 {
527 static constexpr const SkMatrix gIdentity;
528 // If not on a page (like when emitting a Type3 glyph) return identity.
529 if (!this->hasCurrentPage()) {
530 return gIdentity;
531 }
532 return fPageDevice->initialTransform();
533}
const SkMatrix & initialTransform() const

◆ emit() [1/2]

SkPDFIndirectReference SkPDFDocument::emit ( const SkPDFObject object,
SkPDFIndirectReference  ref 
)

Serialize the object, as well as any other objects it indirectly refers to. If any any other objects have been added to the SkPDFObjNumMap without serializing them, they will be serialized as well.

It might go without saying that objects should not be changed after calling serialize, since those changes will be too late.

Definition at line 230 of file SkPDFDocument.cpp.

230 {
231 SkAutoMutexExclusive lock(fMutex);
232 object.emitObject(this->beginObject(ref));
233 this->endObject();
234 return ref;
235}
void ref() const
Definition SkRefCnt.h:62

◆ emit() [2/2]

SkPDFIndirectReference SkPDFDocument::emit ( const SkPDFObject o)
inline

Definition at line 100 of file SkPDFDocumentPriv.h.

100{ return this->emit(o, this->reserveRef()); }
SkPDFIndirectReference emit(const SkPDFObject &, SkPDFIndirectReference)
SkPDFIndirectReference reserveRef()

◆ emitStream()

template<typename T >
void SkPDFDocument::emitStream ( const SkPDFDict dict,
T  writeStream,
SkPDFIndirectReference  ref 
)
inline

Definition at line 103 of file SkPDFDocumentPriv.h.

103 {
104 SkAutoMutexExclusive lock(fMutex);
105 SkWStream* stream = this->beginObject(ref);
106 dict.emitObject(stream);
107 stream->writeText(" stream\n");
108 writeStream(stream);
109 stream->writeText("\nendstream");
110 this->endObject();
111 }
void emitObject(SkWStream *stream) const override

◆ executor()

SkExecutor * SkPDFDocument::executor ( ) const
inline

Definition at line 138 of file SkPDFDocumentPriv.h.

138{ return fExecutor; }

◆ getAnnotations()

std::unique_ptr< SkPDFArray > SkPDFDocument::getAnnotations ( )

Definition at line 315 of file SkPDFDocument.cpp.

315 {
316 std::unique_ptr<SkPDFArray> array;
317 size_t count = fCurrentPageLinks.size();
318 if (0 == count) {
319 return array; // is nullptr
320 }
321 array = SkPDFMakeArray();
322 array->reserve(count);
323 for (const auto& link : fCurrentPageLinks) {
324 SkPDFDict annotation("Annot");
325 populate_link_annotation(&annotation, link->fRect);
326 if (link->fType == SkPDFLink::Type::kUrl) {
327 std::unique_ptr<SkPDFDict> action = SkPDFMakeDict("Action");
328 action->insertName("S", "URI");
329 // This is documented to be a 7 bit ASCII (byte) string.
330 action->insertByteString("URI", ToValidUtf8String(*link->fData));
331 annotation.insertObject("A", std::move(action));
332 } else if (link->fType == SkPDFLink::Type::kNamedDestination) {
333 annotation.insertName("Dest", ToValidUtf8String(*link->fData));
334 } else {
335 SkDEBUGFAIL("Unknown link type.");
336 }
337
338 if (link->fNodeId) {
339 int structParentKey = createStructParentKeyForNodeId(link->fNodeId);
340 if (structParentKey != -1) {
341 annotation.insertInt("StructParent", structParentKey);
342 }
343 }
344
345 SkPDFIndirectReference annotationRef = emit(annotation);
346 array->appendRef(annotationRef);
347 if (link->fNodeId) {
348 fTagTree.addNodeAnnotation(link->fNodeId, annotationRef, SkToUInt(this->currentPageIndex()));
349 }
350 }
351 return array;
352}
int count
#define SkDEBUGFAIL(message)
Definition SkAssert.h:118
static void populate_link_annotation(SkPDFDict *annotation, const SkRect &r)
static SkString ToValidUtf8String(const SkData &d)
static std::unique_ptr< SkPDFDict > SkPDFMakeDict(const char *type=nullptr)
Definition SkPDFTypes.h:195
static std::unique_ptr< SkPDFArray > SkPDFMakeArray(Args... args)
Definition SkPDFTypes.h:135
std::vector< std::unique_ptr< SkPDFLink > > fCurrentPageLinks
int createStructParentKeyForNodeId(int nodeId)
void addNodeAnnotation(int nodeId, SkPDFIndirectReference annotationRef, unsigned pageIndex)
Definition SkPDFTag.cpp:320
link(from_root, to_root)
Definition dart_pkg.py:44

◆ getPage()

SkPDFIndirectReference SkPDFDocument::getPage ( size_t  pageIndex) const

Definition at line 521 of file SkPDFDocument.cpp.

521 {
522 SkASSERT(pageIndex < fPageRefs.size());
523 return fPageRefs[pageIndex];
524}

◆ hasCurrentPage()

bool SkPDFDocument::hasCurrentPage ( ) const
inline

Definition at line 116 of file SkPDFDocumentPriv.h.

116{ return bool(fPageDevice); }

◆ incrementJobCount()

void SkPDFDocument::incrementJobCount ( )

Definition at line 649 of file SkPDFDocument.cpp.

649{ fJobCount++; }

◆ metadata()

const SkPDF::Metadata & SkPDFDocument::metadata ( ) const
inline

Definition at line 113 of file SkPDFDocumentPriv.h.

113{ return fMetadata; }

◆ nextFontSubsetTag()

SkString SkPDFDocument::nextFontSubsetTag ( )

Definition at line 569 of file SkPDFDocument.cpp.

569 {
570 // PDF 32000-1:2008 Section 9.6.4 FontSubsets "The tag shall consist of six uppercase letters"
571 // "followed by a plus sign" "different subsets in the same PDF file shall have different tags."
572 // There are 26^6 or 308,915,776 possible values. So start in range then increment and mod.
573 uint32_t thisFontSubsetTag = fNextFontSubsetTag;
574 fNextFontSubsetTag = (fNextFontSubsetTag + 1u) % 308915776u;
575
576 SkString subsetTag(7);
577 char* subsetTagData = subsetTag.data();
578 for (size_t i = 0; i < 6; ++i) {
579 subsetTagData[i] = 'A' + (thisFontSubsetTag % 26);
580 thisFontSubsetTag /= 26;
581 }
582 subsetTagData[6] = '+';
583 return subsetTag;
584}

◆ onAbort()

void SkPDFDocument::onAbort ( )
overridevirtual

Implements SkDocument.

Definition at line 382 of file SkPDFDocument.cpp.

382 {
383 this->waitForJobs();
384}

◆ onBeginPage()

SkCanvas * SkPDFDocument::onBeginPage ( SkScalar  width,
SkScalar  height 
)
overridevirtual

Implements SkDocument.

Definition at line 249 of file SkPDFDocument.cpp.

249 {
250 SkASSERT(fCanvas.imageInfo().dimensions().isZero());
251 if (fPages.empty()) {
252 // if this is the first page if the document.
253 {
254 SkAutoMutexExclusive autoMutexAcquire(fMutex);
255 serializeHeader(&fOffsetMap, this->getStream());
256
257 }
258
259 fInfoDict = this->emit(*SkPDFMetadata::MakeDocumentInformationDict(fMetadata));
260 if (fMetadata.fPDFA) {
261 fUUID = SkPDFMetadata::CreateUUID(fMetadata);
262 // We use the same UUID for Document ID and Instance ID since this
263 // is the first revision of this document (and Skia does not
264 // support revising existing PDF documents).
265 // If we are not in PDF/A mode, don't use a UUID since testing
266 // works best with reproducible outputs.
267 fXMP = SkPDFMetadata::MakeXMPObject(fMetadata, fUUID, fUUID, this);
268 }
269 }
270 // By scaling the page at the device level, we will create bitmap layer
271 // devices at the rasterized scale, not the 72dpi scale. Bitmap layer
272 // devices are created when saveLayer is called with an ImageFilter; see
273 // SkPDFDevice::onCreateDevice().
274 SkISize pageSize = (SkSize{width, height} * fRasterScale).toRound();
275 SkMatrix initialTransform;
276 // Skia uses the top left as the origin but PDF natively has the origin at the
277 // bottom left. This matrix corrects for that, as well as the raster scale.
278 initialTransform.setScaleTranslate(fInverseRasterScale, -fInverseRasterScale,
279 0, fInverseRasterScale * pageSize.height());
280 fPageDevice = sk_make_sp<SkPDFDevice>(pageSize, this, initialTransform);
281 reset_object(&fCanvas, fPageDevice);
282 fCanvas.scale(fRasterScale, fRasterScale);
283 fPageRefs.push_back(this->reserveRef());
284 return &fCanvas;
285}
static void serializeHeader(SkPDFOffsetMap *offsetMap, SkWStream *wStream)
static void reset_object(T *dst, Args &&... args)
void scale(SkScalar sx, SkScalar sy)
SkImageInfo imageInfo() const
SkWStream * getStream()
Definition SkDocument.h:77
void setScaleTranslate(SkScalar sx, SkScalar sy, SkScalar tx, SkScalar ty)
Definition SkMatrix.h:1803
std::unique_ptr< SkPDFObject > MakeDocumentInformationDict(const SkPDF::Metadata &)
SkPDFIndirectReference MakeXMPObject(const SkPDF::Metadata &metadata, const SkUUID &doc, const SkUUID &instance, SkPDFDocument *)
SkUUID CreateUUID(const SkPDF::Metadata &)
int32_t height
int32_t width
constexpr int32_t height() const
Definition SkSize.h:37
bool isZero() const
Definition SkSize.h:28
SkISize dimensions() const

◆ onClose()

void SkPDFDocument::onClose ( SkWStream stream)
overridevirtual

Implements SkDocument.

Definition at line 586 of file SkPDFDocument.cpp.

586 {
587 SkASSERT(fCanvas.imageInfo().dimensions().isZero());
588 if (fPages.empty()) {
589 this->waitForJobs();
590 return;
591 }
592 auto docCatalog = SkPDFMakeDict("Catalog");
593 if (fMetadata.fPDFA) {
595 docCatalog->insertRef("Metadata", fXMP);
596 // Don't specify OutputIntents if we are not in PDF/A mode since
597 // no one has ever asked for this feature.
598 docCatalog->insertObject("OutputIntents", make_srgb_output_intents(this));
599 }
600
601 docCatalog->insertRef("Pages", generate_page_tree(this, std::move(fPages), fPageRefs));
602
603 if (!fNamedDestinations.empty()) {
604 docCatalog->insertRef("Dests", append_destinations(this, fNamedDestinations));
605 fNamedDestinations.clear();
606 }
607
608 // Handle tagged PDFs.
609 if (SkPDFIndirectReference root = fTagTree.makeStructTreeRoot(this)) {
610 // In the document catalog, indicate that this PDF is tagged.
611 auto markInfo = SkPDFMakeDict("MarkInfo");
612 markInfo->insertBool("Marked", true);
613 docCatalog->insertObject("MarkInfo", std::move(markInfo));
614 docCatalog->insertRef("StructTreeRoot", root);
615
616 if (SkPDFIndirectReference outline = fTagTree.makeOutline(this)) {
617 docCatalog->insertRef("Outlines", outline);
618 }
619 }
620
621 // If ViewerPreferences DisplayDocTitle isn't set to true, accessibility checks will fail.
622 if (!fMetadata.fTitle.isEmpty()) {
623 auto viewerPrefs = SkPDFMakeDict("ViewerPreferences");
624 viewerPrefs->insertBool("DisplayDocTitle", true);
625 docCatalog->insertObject("ViewerPreferences", std::move(viewerPrefs));
626 }
627
628 SkString lang = fMetadata.fLang;
629 if (lang.isEmpty()) {
630 lang = fTagTree.getRootLanguage();
631 }
632 if (!lang.isEmpty()) {
633 docCatalog->insertTextString("Lang", lang);
634 }
635
636 auto docCatalogRef = this->emit(*docCatalog);
637
638 for (const SkPDFFont* f : get_fonts(*this)) {
639 f->emitSubset(this);
640 }
641
642 this->waitForJobs();
643 {
644 SkAutoMutexExclusive autoMutexAcquire(fMutex);
645 serialize_footer(fOffsetMap, this->getStream(), fInfoDict, docCatalogRef, fUUID);
646 }
647}
static SkPDFIndirectReference generate_page_tree(SkPDFDocument *doc, std::vector< std::unique_ptr< SkPDFDict > > pages, const std::vector< SkPDFIndirectReference > &pageRefs)
static SkPDFIndirectReference append_destinations(SkPDFDocument *doc, const std::vector< SkPDFNamedDestination > &namedDestinations)
static std::unique_ptr< SkPDFArray > make_srgb_output_intents(SkPDFDocument *doc)
static void serialize_footer(const SkPDFOffsetMap &offsetMap, SkWStream *wStream, SkPDFIndirectReference infoDict, SkPDFIndirectReference docCatalog, SkUUID uuid)
static std::vector< const SkPDFFont * > get_fonts(const SkPDFDocument &canon)
std::vector< SkPDFNamedDestination > fNamedDestinations
SkPDFIndirectReference makeStructTreeRoot(SkPDFDocument *doc)
Definition SkPDFTag.cpp:355
SkPDFIndirectReference makeOutline(SkPDFDocument *doc)
Definition SkPDFTag.cpp:550
SkString getRootLanguage()
Definition SkPDFTag.cpp:574
bool isEmpty() const
Definition SkString.h:130

◆ onEndPage()

void SkPDFDocument::onEndPage ( )
overridevirtual

Implements SkDocument.

Definition at line 354 of file SkPDFDocument.cpp.

354 {
355 SkASSERT(!fCanvas.imageInfo().dimensions().isZero());
356 reset_object(&fCanvas);
357 SkASSERT(fPageDevice);
358
359 auto page = SkPDFMakeDict("Page");
360
361 SkSize mediaSize = fPageDevice->imageInfo().dimensions() * fInverseRasterScale;
362 std::unique_ptr<SkStreamAsset> pageContent = fPageDevice->content();
363 auto resourceDict = fPageDevice->makeResourceDict();
364 SkASSERT(!fPageRefs.empty());
365 fPageDevice = nullptr;
366
367 page->insertObject("Resources", std::move(resourceDict));
368 page->insertObject("MediaBox", SkPDFUtils::RectToArray(SkRect::MakeSize(mediaSize)));
369
370 if (std::unique_ptr<SkPDFArray> annotations = getAnnotations()) {
371 page->insertObject("Annots", std::move(annotations));
372 fCurrentPageLinks.clear();
373 }
374
375 page->insertRef("Contents", SkPDFStreamOut(nullptr, std::move(pageContent), this));
376 // The StructParents unique identifier for each page is just its
377 // 0-based page index.
378 page->insertInt("StructParents", SkToInt(this->currentPageIndex()));
379 fPages.emplace_back(std::move(page));
380}
SkPDFIndirectReference SkPDFStreamOut(std::unique_ptr< SkPDFDict > dict, std::unique_ptr< SkStreamAsset > content, SkPDFDocument *doc, SkPDFSteamCompressionEnabled compress)
constexpr int SkToInt(S x)
Definition SkTo.h:29
const SkImageInfo & imageInfo() const
Definition SkDevice.h:117
std::unique_ptr< SkStreamAsset > content()
std::unique_ptr< SkPDFDict > makeResourceDict()
std::unique_ptr< SkPDFArray > getAnnotations()
std::unique_ptr< SkPDFArray > RectToArray(const SkRect &rect)
static constexpr SkRect MakeSize(const SkSize &size)
Definition SkRect.h:633

◆ pageCount()

size_t SkPDFDocument::pageCount ( )
inline

Definition at line 142 of file SkPDFDocumentPriv.h.

142{ return fPageRefs.size(); }

◆ reserveRef()

SkPDFIndirectReference SkPDFDocument::reserveRef ( )
inline

Definition at line 133 of file SkPDFDocumentPriv.h.

133{ return SkPDFIndirectReference{fNextObjectNumber++}; }

◆ signalJobComplete()

void SkPDFDocument::signalJobComplete ( )

Definition at line 651 of file SkPDFDocument.cpp.

651{ fSemaphore.signal(); }
void signal(int n=1)
Definition SkSemaphore.h:56

Member Data Documentation

◆ fCurrentPageLinks

std::vector<std::unique_ptr<SkPDFLink> > SkPDFDocument::fCurrentPageLinks

Definition at line 171 of file SkPDFDocumentPriv.h.

◆ fFillGSMap

Definition at line 168 of file SkPDFDocumentPriv.h.

◆ fFontDescriptors

skia_private::THashMap<uint32_t, SkPDFIndirectReference> SkPDFDocument::fFontDescriptors

Definition at line 160 of file SkPDFDocumentPriv.h.

◆ fFontMap

skia_private::THashMap<uint64_t, SkPDFFont> SkPDFDocument::fFontMap

Definition at line 162 of file SkPDFDocumentPriv.h.

◆ fGradientPatternMap

Definition at line 152 of file SkPDFDocumentPriv.h.

◆ fICCProfileMap

Definition at line 156 of file SkPDFDocumentPriv.h.

◆ fImageShaderMap

Definition at line 149 of file SkPDFDocumentPriv.h.

◆ fInvertFunction

SkPDFIndirectReference SkPDFDocument::fInvertFunction

Definition at line 169 of file SkPDFDocumentPriv.h.

◆ fNamedDestinations

std::vector<SkPDFNamedDestination> SkPDFDocument::fNamedDestinations

Definition at line 172 of file SkPDFDocumentPriv.h.

◆ fNoSmaskGraphicState

SkPDFIndirectReference SkPDFDocument::fNoSmaskGraphicState

Definition at line 170 of file SkPDFDocumentPriv.h.

◆ fPDFBitmapMap

Definition at line 153 of file SkPDFDocumentPriv.h.

◆ fStrokeGSMap

Definition at line 165 of file SkPDFDocumentPriv.h.

◆ fToUnicodeMap

skia_private::THashMap<uint32_t, std::vector<SkUnichar> > SkPDFDocument::fToUnicodeMap

Definition at line 159 of file SkPDFDocumentPriv.h.

◆ fType1GlyphNames

skia_private::THashMap<uint32_t, std::vector<SkString> > SkPDFDocument::fType1GlyphNames

Definition at line 158 of file SkPDFDocumentPriv.h.

◆ fType3FontDescriptors

skia_private::THashMap<uint32_t, SkPDFIndirectReference> SkPDFDocument::fType3FontDescriptors

Definition at line 161 of file SkPDFDocumentPriv.h.

◆ fTypefaceMetrics

skia_private::THashMap<uint32_t, std::unique_ptr<SkAdvancedTypefaceMetrics> > SkPDFDocument::fTypefaceMetrics

Definition at line 157 of file SkPDFDocumentPriv.h.


The documentation for this class was generated from the following files: