Note typeface usage in layers.

Typeface usage in layers was not propagated back up to the top level,
so it is easy to lose track of typefaces when layers are used.

Change-Id: I464325c0d9bce7c41592e78855ee0e21e2e6e5be
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/290816
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Ben Wagner <bungeman@google.com>
diff --git a/src/xps/SkXPSDevice.cpp b/src/xps/SkXPSDevice.cpp
index e9f045c..174a0bc 100644
--- a/src/xps/SkXPSDevice.cpp
+++ b/src/xps/SkXPSDevice.cpp
@@ -116,7 +116,7 @@
 SkXPSDevice::SkXPSDevice(SkISize s)
     : INHERITED(SkImageInfo::MakeUnknown(s.width(), s.height()),
                 SkSurfaceProps(0, kUnknown_SkPixelGeometry))
-    , fCurrentPage(0) {}
+    , fCurrentPage(0), fTopTypefaces(&fTypefaces) {}
 
 SkXPSDevice::~SkXPSDevice() {}
 
@@ -414,7 +414,7 @@
 
 bool SkXPSDevice::endPortfolio() {
     //Subset fonts
-    for (const TypefaceUse& current : this->fTypefaces) {
+    for (const TypefaceUse& current : *this->fTopTypefaces) {
         //Ignore return for now, if it didn't subset, let it be.
         subset_typeface(current);
     }
@@ -1726,7 +1726,7 @@
 
     //Check cache.
     const SkFontID typefaceID = typeface->uniqueID();
-    for (TypefaceUse& current : this->fTypefaces) {
+    for (TypefaceUse& current : *this->fTopTypefaces) {
         if (current.typefaceId == typefaceID) {
             *typefaceUse = &current;
             return S_OK;
@@ -1774,7 +1774,7 @@
 
     int glyphCount = typeface->countGlyphs();
 
-    TypefaceUse& newTypefaceUse = this->fTypefaces.emplace_back(
+    TypefaceUse& newTypefaceUse = this->fTopTypefaces->emplace_back(
         typefaceID,
         isTTC ? ttcIndex : -1,
         std::move(fontData),
@@ -1954,10 +1954,11 @@
     }
 }
 
-void SkXPSDevice::drawDevice( SkBaseDevice* dev,
+void SkXPSDevice::drawDevice(SkBaseDevice* dev,
                              int x, int y,
                              const SkPaint&) {
     SkXPSDevice* that = static_cast<SkXPSDevice*>(dev);
+    SkASSERT(that->fTopTypefaces == this->fTopTypefaces);
 
     SkTScopedComPtr<IXpsOMMatrixTransform> xpsTransform;
     // TODO(halcanary): assert that current transform is identity rather than calling setter.
@@ -1988,8 +1989,11 @@
     }
 #endif
     SkXPSDevice* dev = new SkXPSDevice(info.fInfo.dimensions());
-    // TODO(halcanary) implement copy constructor on SkTScopedCOmPtr
     dev->fXpsFactory.reset(SkRefComPtr(fXpsFactory.get()));
+    dev->fCurrentCanvasSize = this->fCurrentCanvasSize;
+    dev->fCurrentUnitsPerMeter = this->fCurrentUnitsPerMeter;
+    dev->fCurrentPixelsPerMeter = this->fCurrentPixelsPerMeter;
+    dev->fTopTypefaces = this->fTopTypefaces;
     SkAssertResult(dev->createCanvasForLayer());
     return dev;
 }
diff --git a/src/xps/SkXPSDevice.h b/src/xps/SkXPSDevice.h
index c0e6679..0dcbb9b 100644
--- a/src/xps/SkXPSDevice.h
+++ b/src/xps/SkXPSDevice.h
@@ -125,6 +125,7 @@
     SkVector fCurrentPixelsPerMeter;
 
     SkTArray<TypefaceUse, true> fTypefaces;
+    SkTArray<TypefaceUse, true>* fTopTypefaces;
 
     /** Creates a GUID based id and places it into buffer.
         buffer should have space for at least GUID_ID_LEN wide characters.