@@ -352,20 +352,67 @@ namespace {
352
352
return E_NOTIMPL;
353
353
}
354
354
355
- class DirectWriteFontFileLoader : public IDWriteFontFileLoader
355
+ class DirectWriteFontFileLoader : public IDWriteLocalFontFileLoader
356
356
{
357
357
public:
358
358
DirectWriteFontFileLoader () : m_referenceCount(0 ) {}
359
359
virtual ~DirectWriteFontFileLoader ()
360
360
{
361
361
}
362
362
363
- inline void addKey (const QByteArray &fontData)
363
+ inline void addKey (const QByteArray &fontData, const QString &filename )
364
364
{
365
365
if (!m_fontDatas.contains (fontData.data ()))
366
- m_fontDatas.insert (fontData.data (), fontData);
366
+ m_fontDatas.insert (fontData.data (), qMakePair ( fontData, filename) );
367
367
}
368
368
369
+ HRESULT STDMETHODCALLTYPE GetFilePathLengthFromKey (void const * fontFileReferenceKey,
370
+ UINT32 fontFileReferenceKeySize,
371
+ UINT32* filePathLength) override
372
+ {
373
+ Q_UNUSED (fontFileReferenceKeySize);
374
+ const void *key = *reinterpret_cast <void * const *>(fontFileReferenceKey);
375
+ auto it = m_fontDatas.constFind (key);
376
+ if (it == m_fontDatas.constEnd ())
377
+ return E_FAIL;
378
+
379
+ *filePathLength = it.value ().second .size ();
380
+ return 0 ;
381
+ }
382
+
383
+ HRESULT STDMETHODCALLTYPE GetFilePathFromKey (void const * fontFileReferenceKey,
384
+ UINT32 fontFileReferenceKeySize,
385
+ WCHAR* filePath,
386
+ UINT32 filePathSize) override
387
+ {
388
+ Q_UNUSED (fontFileReferenceKeySize);
389
+ const void *key = *reinterpret_cast <void * const *>(fontFileReferenceKey);
390
+ const auto it = m_fontDatas.constFind (key);
391
+ if (it == m_fontDatas.constEnd ())
392
+ return E_FAIL;
393
+
394
+ const QString &path = it.value ().second ;
395
+ if (filePathSize < path.size () + 1 )
396
+ return E_FAIL;
397
+
398
+ const qsizetype length = path.toWCharArray (filePath);
399
+ filePath[length] = ' \0 ' ;
400
+
401
+ return 0 ;
402
+ }
403
+
404
+ HRESULT STDMETHODCALLTYPE GetLastWriteTimeFromKey (void const * fontFileReferenceKey,
405
+ UINT32 fontFileReferenceKeySize,
406
+ FILETIME* lastWriteTime) override
407
+ {
408
+ Q_UNUSED (fontFileReferenceKey);
409
+ Q_UNUSED (fontFileReferenceKeySize);
410
+ Q_UNUSED (lastWriteTime);
411
+ // We never call this, so just fail
412
+ return E_FAIL;
413
+ }
414
+
415
+
369
416
inline void removeKey (const void *key)
370
417
{
371
418
m_fontDatas.remove (key);
@@ -386,13 +433,15 @@ namespace {
386
433
387
434
private:
388
435
ULONG m_referenceCount;
389
- QHash<const void *, QByteArray> m_fontDatas;
436
+ QHash<const void *, QPair< QByteArray, QString> > m_fontDatas;
390
437
};
391
438
392
439
HRESULT STDMETHODCALLTYPE DirectWriteFontFileLoader::QueryInterface (const IID &iid,
393
440
void **object)
394
441
{
395
- if (iid == IID_IUnknown || iid == __uuidof (IDWriteFontFileLoader)) {
442
+ if (iid == IID_IUnknown
443
+ || iid == __uuidof (IDWriteFontFileLoader)
444
+ || iid == __uuidof (IDWriteLocalFontFileLoader)) {
396
445
*object = this ;
397
446
AddRef ();
398
447
return S_OK;
@@ -433,7 +482,7 @@ namespace {
433
482
if (it == m_fontDatas.constEnd ())
434
483
return E_FAIL;
435
484
436
- QByteArray fontData = it.value ();
485
+ QByteArray fontData = it.value (). first ;
437
486
DirectWriteFontFileStream *stream = new DirectWriteFontFileStream (fontData);
438
487
stream->AddRef ();
439
488
*fontFileStream = stream;
@@ -469,10 +518,10 @@ class QCustomFontFileLoader
469
518
m_directWriteFactory->Release ();
470
519
}
471
520
472
- void addKey (const QByteArray &fontData)
521
+ void addKey (const QByteArray &fontData, const QString &filename )
473
522
{
474
523
if (m_directWriteFontFileLoader != nullptr )
475
- m_directWriteFontFileLoader->addKey (fontData);
524
+ m_directWriteFontFileLoader->addKey (fontData, filename );
476
525
}
477
526
478
527
void removeKey (const void *key)
@@ -732,13 +781,14 @@ void QWindowsFontDatabaseBase::invalidate()
732
781
#if QT_CONFIG(directwrite) && QT_CONFIG(direct2d)
733
782
IDWriteFontFace *QWindowsFontDatabaseBase::createDirectWriteFace (const QByteArray &fontData)
734
783
{
735
- QList<IDWriteFontFace *> faces = createDirectWriteFaces (fontData, false );
784
+ QList<IDWriteFontFace *> faces = createDirectWriteFaces (fontData, QString{}, false );
736
785
Q_ASSERT (faces.size () <= 1 );
737
786
738
787
return faces.isEmpty () ? nullptr : faces.first ();
739
788
}
740
789
741
790
QList<IDWriteFontFace *> QWindowsFontDatabaseBase::createDirectWriteFaces (const QByteArray &fontData,
791
+ const QString &filename,
742
792
bool queryVariations) const
743
793
{
744
794
QList<IDWriteFontFace *> ret;
@@ -751,7 +801,7 @@ QList<IDWriteFontFace *> QWindowsFontDatabaseBase::createDirectWriteFaces(const
751
801
if (m_fontFileLoader == nullptr )
752
802
m_fontFileLoader.reset (new QCustomFontFileLoader (fontEngineData->directWriteFactory ));
753
803
754
- m_fontFileLoader->addKey (fontData);
804
+ m_fontFileLoader->addKey (fontData, filename );
755
805
756
806
IDWriteFontFile *fontFile = nullptr ;
757
807
const void *key = fontData.data ();
0 commit comments