| Index: core/fxge/win32/fx_win32_dwrite.cpp
|
| diff --git a/core/fxge/win32/fx_win32_dwrite.cpp b/core/fxge/win32/fx_win32_dwrite.cpp
|
| index 5f620cba4c4901c6e3f1743b73ad8b53dd703863..b3ba28cfc721a1fe3343f3a4ecb3b762383ebcf1 100644
|
| --- a/core/fxge/win32/fx_win32_dwrite.cpp
|
| +++ b/core/fxge/win32/fx_win32_dwrite.cpp
|
| @@ -30,22 +30,29 @@ inline InterfaceType* SafeAcquire(InterfaceType* newObject) {
|
| }
|
| return newObject;
|
| }
|
| +
|
| class CDwFontFileStream final : public IDWriteFontFileStream {
|
| public:
|
| explicit CDwFontFileStream(void const* fontFileReferenceKey,
|
| UINT32 fontFileReferenceKeySize);
|
| - virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
|
| - void** ppvObject);
|
| - virtual ULONG STDMETHODCALLTYPE AddRef();
|
| - virtual ULONG STDMETHODCALLTYPE Release();
|
| - virtual HRESULT STDMETHODCALLTYPE
|
| +
|
| + // IUnknown.
|
| + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
|
| + void** ppvObject) override;
|
| + ULONG STDMETHODCALLTYPE AddRef() override;
|
| + ULONG STDMETHODCALLTYPE Release() override;
|
| +
|
| + // IDWriteFontFileStream.
|
| + HRESULT STDMETHODCALLTYPE
|
| ReadFileFragment(void const** fragmentStart,
|
| UINT64 fileOffset,
|
| UINT64 fragmentSize,
|
| - OUT void** fragmentContext);
|
| - virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
|
| - virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize);
|
| - virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime);
|
| + OUT void** fragmentContext) override;
|
| + void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext) override;
|
| + HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize) override;
|
| + HRESULT STDMETHODCALLTYPE
|
| + GetLastWriteTime(OUT UINT64* lastWriteTime) override;
|
| +
|
| bool IsInitialized() { return !!resourcePtr_; }
|
|
|
| private:
|
| @@ -53,16 +60,20 @@ class CDwFontFileStream final : public IDWriteFontFileStream {
|
| void const* resourcePtr_;
|
| DWORD resourceSize_;
|
| };
|
| +
|
| class CDwFontFileLoader final : public IDWriteFontFileLoader {
|
| public:
|
| - virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
|
| - void** ppvObject);
|
| - virtual ULONG STDMETHODCALLTYPE AddRef();
|
| - virtual ULONG STDMETHODCALLTYPE Release();
|
| - virtual HRESULT STDMETHODCALLTYPE
|
| + // IUnknown.
|
| + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
|
| + void** ppvObject) override;
|
| + ULONG STDMETHODCALLTYPE AddRef() override;
|
| + ULONG STDMETHODCALLTYPE Release() override;
|
| +
|
| + // IDWriteFontFileLoader.
|
| + HRESULT STDMETHODCALLTYPE
|
| CreateStreamFromKey(void const* fontFileReferenceKey,
|
| UINT32 fontFileReferenceKeySize,
|
| - OUT IDWriteFontFileStream** fontFileStream);
|
| + OUT IDWriteFontFileStream** fontFileStream) override;
|
|
|
| static IDWriteFontFileLoader* GetLoader() {
|
| if (!instance_) {
|
| @@ -77,10 +88,12 @@ class CDwFontFileLoader final : public IDWriteFontFileLoader {
|
| ULONG refCount_;
|
| static IDWriteFontFileLoader* instance_;
|
| };
|
| +
|
| class CDwFontContext {
|
| public:
|
| CDwFontContext(IDWriteFactory* dwriteFactory);
|
| ~CDwFontContext();
|
| +
|
| HRESULT Initialize();
|
|
|
| private:
|
| @@ -89,12 +102,14 @@ class CDwFontContext {
|
| HRESULT hr_;
|
| IDWriteFactory* dwriteFactory_;
|
| };
|
| +
|
| class CDwGdiTextRenderer {
|
| public:
|
| CDwGdiTextRenderer(CFX_DIBitmap* pBitmap,
|
| IDWriteBitmapRenderTarget* bitmapRenderTarget,
|
| IDWriteRenderingParams* renderingParams);
|
| ~CDwGdiTextRenderer();
|
| +
|
| HRESULT STDMETHODCALLTYPE DrawGlyphRun(const FX_RECT& text_bbox,
|
| __in_opt CFX_ClipRgn* pClipRgn,
|
| __in_opt DWRITE_MATRIX const* pMatrix,
|
| @@ -109,13 +124,15 @@ class CDwGdiTextRenderer {
|
| IDWriteBitmapRenderTarget* pRenderTarget_;
|
| IDWriteRenderingParams* pRenderingParams_;
|
| };
|
| -CDWriteExt::CDWriteExt() {
|
| - m_hModule = nullptr;
|
| - m_pDWriteFactory = nullptr;
|
| - m_pDwFontContext = nullptr;
|
| - m_pDwTextRenderer = nullptr;
|
| -}
|
| +
|
| +CDWriteExt::CDWriteExt()
|
| + : m_hModule(nullptr),
|
| + m_pDWriteFactory(nullptr),
|
| + m_pDwFontContext(nullptr),
|
| + m_pDwTextRenderer(nullptr) {}
|
| +
|
| void CDWriteExt::Load() {}
|
| +
|
| void CDWriteExt::Unload() {
|
| if (m_pDwFontContext) {
|
| delete (CDwFontContext*)m_pDwFontContext;
|
| @@ -123,9 +140,11 @@ void CDWriteExt::Unload() {
|
| }
|
| SafeRelease((IDWriteFactory**)&m_pDWriteFactory);
|
| }
|
| +
|
| CDWriteExt::~CDWriteExt() {
|
| Unload();
|
| }
|
| +
|
| LPVOID CDWriteExt::DwCreateFontFaceFromStream(uint8_t* pData,
|
| uint32_t size,
|
| int simulation_style) {
|
| @@ -162,6 +181,7 @@ failed:
|
| SafeRelease(&pDwFontFile);
|
| return nullptr;
|
| }
|
| +
|
| FX_BOOL CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap,
|
| void** renderTarget) {
|
| if (pBitmap->GetFormat() > FXDIB_Argb) {
|
| @@ -203,6 +223,7 @@ failed:
|
| SafeRelease(&pRenderingParams);
|
| return FALSE;
|
| }
|
| +
|
| FX_BOOL CDWriteExt::DwRendingString(void* renderTarget,
|
| CFX_ClipRgn* pClipRgn,
|
| FX_RECT& stringRect,
|
| @@ -245,20 +266,24 @@ FX_BOOL CDWriteExt::DwRendingString(void* renderTarget,
|
| RGB(FXARGB_R(text_color), FXARGB_G(text_color), FXARGB_B(text_color)));
|
| return SUCCEEDED(hr);
|
| }
|
| +
|
| void CDWriteExt::DwDeleteRenderingTarget(void* renderTarget) {
|
| delete (CDwGdiTextRenderer*)renderTarget;
|
| }
|
| +
|
| void CDWriteExt::DwDeleteFont(void* pFont) {
|
| if (pFont) {
|
| SafeRelease((IDWriteFontFace**)&pFont);
|
| }
|
| }
|
| +
|
| CDwFontFileStream::CDwFontFileStream(void const* fontFileReferenceKey,
|
| UINT32 fontFileReferenceKeySize) {
|
| refCount_ = 0;
|
| resourcePtr_ = fontFileReferenceKey;
|
| resourceSize_ = fontFileReferenceKeySize;
|
| }
|
| +
|
| HRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid,
|
| void** ppvObject) {
|
| if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
|
| @@ -269,9 +294,11 @@ HRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid,
|
| *ppvObject = nullptr;
|
| return E_NOINTERFACE;
|
| }
|
| +
|
| ULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef() {
|
| return InterlockedIncrement((long*)(&refCount_));
|
| }
|
| +
|
| ULONG STDMETHODCALLTYPE CDwFontFileStream::Release() {
|
| ULONG newCount = InterlockedDecrement((long*)(&refCount_));
|
| if (newCount == 0) {
|
| @@ -279,6 +306,7 @@ ULONG STDMETHODCALLTYPE CDwFontFileStream::Release() {
|
| }
|
| return newCount;
|
| }
|
| +
|
| HRESULT STDMETHODCALLTYPE
|
| CDwFontFileStream::ReadFileFragment(void const** fragmentStart,
|
| UINT64 fileOffset,
|
| @@ -295,17 +323,20 @@ CDwFontFileStream::ReadFileFragment(void const** fragmentStart,
|
| *fragmentContext = nullptr;
|
| return E_FAIL;
|
| }
|
| +
|
| void STDMETHODCALLTYPE
|
| CDwFontFileStream::ReleaseFileFragment(void* fragmentContext) {}
|
| HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetFileSize(OUT UINT64* fileSize) {
|
| *fileSize = resourceSize_;
|
| return S_OK;
|
| }
|
| +
|
| HRESULT STDMETHODCALLTYPE
|
| CDwFontFileStream::GetLastWriteTime(OUT UINT64* lastWriteTime) {
|
| *lastWriteTime = 0;
|
| return E_NOTIMPL;
|
| }
|
| +
|
| IDWriteFontFileLoader* CDwFontFileLoader::instance_ = nullptr;
|
| CDwFontFileLoader::CDwFontFileLoader() : refCount_(0) {}
|
| HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid,
|
| @@ -318,9 +349,11 @@ HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid,
|
| *ppvObject = nullptr;
|
| return E_NOINTERFACE;
|
| }
|
| +
|
| ULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef() {
|
| return InterlockedIncrement((long*)(&refCount_));
|
| }
|
| +
|
| ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release() {
|
| ULONG newCount = InterlockedDecrement((long*)(&refCount_));
|
| if (newCount == 0) {
|
| @@ -329,6 +362,7 @@ ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release() {
|
| }
|
| return newCount;
|
| }
|
| +
|
| HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(
|
| void const* fontFileReferenceKey,
|
| UINT32 fontFileReferenceKeySize,
|
| @@ -343,14 +377,17 @@ HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(
|
| *fontFileStream = SafeAcquire(stream);
|
| return S_OK;
|
| }
|
| +
|
| CDwFontContext::CDwFontContext(IDWriteFactory* dwriteFactory)
|
| : hr_(S_FALSE), dwriteFactory_(SafeAcquire(dwriteFactory)) {}
|
| +
|
| CDwFontContext::~CDwFontContext() {
|
| if (dwriteFactory_ && hr_ == S_OK) {
|
| dwriteFactory_->UnregisterFontFileLoader(CDwFontFileLoader::GetLoader());
|
| }
|
| SafeRelease(&dwriteFactory_);
|
| }
|
| +
|
| HRESULT CDwFontContext::Initialize() {
|
| if (hr_ == S_FALSE) {
|
| return hr_ = dwriteFactory_->RegisterFontFileLoader(
|
| @@ -358,6 +395,7 @@ HRESULT CDwFontContext::Initialize() {
|
| }
|
| return hr_;
|
| }
|
| +
|
| CDwGdiTextRenderer::CDwGdiTextRenderer(
|
| CFX_DIBitmap* pBitmap,
|
| IDWriteBitmapRenderTarget* bitmapRenderTarget,
|
| @@ -369,6 +407,7 @@ CDwGdiTextRenderer::~CDwGdiTextRenderer() {
|
| SafeRelease(&pRenderTarget_);
|
| SafeRelease(&pRenderingParams_);
|
| }
|
| +
|
| STDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun(
|
| const FX_RECT& text_bbox,
|
| __in_opt CFX_ClipRgn* pClipRgn,
|
|
|