Add testing flag for XPS for deterministic ids.
BUG=skia:455
R=mtklein@google.com
Review URL: https://codereview.chromium.org/494423002
diff --git a/include/device/xps/SkXPSDevice.h b/include/device/xps/SkXPSDevice.h
index 5170957..2aa7ba8 100644
--- a/include/device/xps/SkXPSDevice.h
+++ b/include/device/xps/SkXPSDevice.h
@@ -26,6 +26,8 @@
#include "SkTScopedComPtr.h"
#include "SkTypeface.h"
+//#define SK_XPS_USE_DETERMINISTIC_IDS
+
/** \class SkXPSDevice
The drawing context for the XPS backend.
@@ -172,6 +174,18 @@
SkTArray<TypefaceUse, true> fTypefaces;
+ /** Creates a GUID based id and places it into buffer.
+ buffer should have space for at least GUID_ID_LEN wide characters.
+ The string will always be wchar null terminated.
+ XXXXXXXXsXXXXsXXXXsXXXXsXXXXXXXXXXXX0
+ The string may begin with a digit,
+ and so may not be suitable as a bare resource key.
+ */
+ HRESULT createId(wchar_t* buffer, size_t bufferSize, wchar_t sep = '-');
+#ifdef SK_XPS_USE_DETERMINISTIC_IDS
+ decltype(GUID::Data1) fNextId = 0;
+#endif
+
HRESULT initXpsDocumentWriter(IXpsOMImageResource* image);
HRESULT createXpsPage(
diff --git a/src/device/xps/SkXPSDevice.cpp b/src/device/xps/SkXPSDevice.cpp
index bdc612f..73de0b3 100644
--- a/src/device/xps/SkXPSDevice.cpp
+++ b/src/device/xps/SkXPSDevice.cpp
@@ -30,6 +30,7 @@
#include "SkIStream.h"
#include "SkMaskFilter.h"
#include "SkPaint.h"
+#include "SkPathOps.h"
#include "SkPoint.h"
#include "SkRasterizer.h"
#include "SkSFNTHeader.h"
@@ -48,9 +49,9 @@
//make it clear when converting a scalar that this is what is wanted.
#define SkScalarToFLOAT(n) SkScalarToFloat(n)
-//Dummy representation of a GUID from create_id.
+//Dummy representation of a GUID from createId.
#define L_GUID_ID L"XXXXXXXXsXXXXsXXXXsXXXXsXXXXXXXXXXXX"
-//Length of GUID representation from create_id, including NULL terminator.
+//Length of GUID representation from createId, including NULL terminator.
#define GUID_ID_LEN SK_ARRAY_COUNT(L_GUID_ID)
/**
@@ -84,18 +85,16 @@
guid.Data4[7]);
}
-/**
- Creates a GUID based id and places it into buffer.
- buffer should have space for at least GUID_ID_LEN wide characters.
- The string will always be wchar null terminated.
- XXXXXXXXsXXXXsXXXXsXXXXsXXXXXXXXXXXX0
- The string may begin with a digit,
- and so may not be suitable as a bare resource key.
- */
-static HRESULT create_id(wchar_t* buffer, size_t bufferSize,
- wchar_t sep = '-') {
+HRESULT SkXPSDevice::createId(wchar_t* buffer, size_t bufferSize, wchar_t sep) {
GUID guid = {};
+#ifdef SK_XPS_USE_DETERMINISTIC_IDS
+ guid.Data1 = fNextId++;
+ // The following make this a valid Type4 UUID.
+ guid.Data3 = 0x4000;
+ guid.Data4[0] = 0x80;
+#else
HRM(CoCreateGuid(&guid), "Could not create GUID for id.");
+#endif
if (format_guid(guid, buffer, bufferSize, sep) == -1) {
HRM(E_UNEXPECTED, "Could not format GUID into id.");
@@ -193,7 +192,7 @@
swprintf_s(buffer, size, L"/Documents/1/Metadata/%u.png", pageNum);
} else {
wchar_t id[GUID_ID_LEN];
- HR(create_id(id, GUID_ID_LEN));
+ HR(this->createId(id, GUID_ID_LEN));
swprintf_s(buffer, size, L"/Metadata/%s.png", id);
}
HRM(this->fXpsFactory->CreatePartUri(buffer, &partUri),
@@ -647,7 +646,7 @@
SK_ARRAY_COUNT(L"/Documents/1/Resources/Images/" L_GUID_ID L".png");
wchar_t buffer[size];
wchar_t id[GUID_ID_LEN];
- HR(create_id(id, GUID_ID_LEN));
+ HR(this->createId(id, GUID_ID_LEN));
swprintf_s(buffer, size, L"/Documents/1/Resources/Images/%s.png", id);
SkTScopedComPtr<IOpcPartUri> imagePartUri;
@@ -1437,7 +1436,7 @@
const size_t size = SK_ARRAY_COUNT(L"ID" L_GUID_ID);
wchar_t buffer[size];
wchar_t id[GUID_ID_LEN];
- HR(create_id(id, GUID_ID_LEN, '_'));
+ HR(this->createId(id, GUID_ID_LEN, '_'));
swprintf_s(buffer, size, L"ID%s", id);
HRM(newDictionary->Append(buffer, this->fCurrentXpsCanvas.get()),
"Could not add canvas to inverse dictionary.");
@@ -2058,7 +2057,7 @@
SK_ARRAY_COUNT(L"/Resources/Fonts/" L_GUID_ID L".odttf");
wchar_t buffer[size];
wchar_t id[GUID_ID_LEN];
- HR(create_id(id, GUID_ID_LEN));
+ HR(this->createId(id, GUID_ID_LEN));
swprintf_s(buffer, size, L"/Resources/Fonts/%s.odttf", id);
SkTScopedComPtr<IOpcPartUri> partUri;