| Index: core/src/fxge/win32/fx_win32_dwrite.cpp
|
| diff --git a/core/src/fxge/win32/fx_win32_dwrite.cpp b/core/src/fxge/win32/fx_win32_dwrite.cpp
|
| deleted file mode 100644
|
| index 55b9bff2d1c8a714fbc7fe585dffe95debe20b66..0000000000000000000000000000000000000000
|
| --- a/core/src/fxge/win32/fx_win32_dwrite.cpp
|
| +++ /dev/null
|
| @@ -1,410 +0,0 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#include "core/include/fxge/fx_ge.h"
|
| -
|
| -#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_
|
| -#include <dwrite.h>
|
| -
|
| -#include "core/include/fxge/fx_ge_win32.h"
|
| -#include "core/src/fxge/win32/dwrite_int.h"
|
| -
|
| -typedef HRESULT(__stdcall* FuncType_DWriteCreateFactory)(
|
| - __in DWRITE_FACTORY_TYPE,
|
| - __in REFIID,
|
| - __out IUnknown**);
|
| -template <typename InterfaceType>
|
| -inline void SafeRelease(InterfaceType** currentObject) {
|
| - if (*currentObject) {
|
| - (*currentObject)->Release();
|
| - *currentObject = NULL;
|
| - }
|
| -}
|
| -template <typename InterfaceType>
|
| -inline InterfaceType* SafeAcquire(InterfaceType* newObject) {
|
| - if (newObject) {
|
| - newObject->AddRef();
|
| - }
|
| - 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
|
| - 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);
|
| - bool IsInitialized() { return resourcePtr_ != NULL; }
|
| -
|
| - private:
|
| - ULONG refCount_;
|
| - 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
|
| - CreateStreamFromKey(void const* fontFileReferenceKey,
|
| - UINT32 fontFileReferenceKeySize,
|
| - OUT IDWriteFontFileStream** fontFileStream);
|
| -
|
| - static IDWriteFontFileLoader* GetLoader() {
|
| - if (!instance_) {
|
| - instance_ = new CDwFontFileLoader();
|
| - }
|
| - return instance_;
|
| - }
|
| - static bool IsLoaderInitialized() { return instance_ != NULL; }
|
| -
|
| - private:
|
| - CDwFontFileLoader();
|
| - ULONG refCount_;
|
| - static IDWriteFontFileLoader* instance_;
|
| -};
|
| -class CDwFontContext {
|
| - public:
|
| - CDwFontContext(IDWriteFactory* dwriteFactory);
|
| - ~CDwFontContext();
|
| - HRESULT Initialize();
|
| -
|
| - private:
|
| - CDwFontContext(CDwFontContext const&);
|
| - void operator=(CDwFontContext const&);
|
| - 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,
|
| - FLOAT baselineOriginX,
|
| - FLOAT baselineOriginY,
|
| - DWRITE_MEASURING_MODE measuringMode,
|
| - __in DWRITE_GLYPH_RUN const* glyphRun,
|
| - const COLORREF& textColor);
|
| -
|
| - private:
|
| - CFX_DIBitmap* pBitmap_;
|
| - IDWriteBitmapRenderTarget* pRenderTarget_;
|
| - IDWriteRenderingParams* pRenderingParams_;
|
| -};
|
| -CDWriteExt::CDWriteExt() {
|
| - m_hModule = NULL;
|
| - m_pDWriteFactory = NULL;
|
| - m_pDwFontContext = NULL;
|
| - m_pDwTextRenderer = NULL;
|
| -}
|
| -void CDWriteExt::Load() {}
|
| -void CDWriteExt::Unload() {
|
| - if (m_pDwFontContext) {
|
| - delete (CDwFontContext*)m_pDwFontContext;
|
| - m_pDwFontContext = NULL;
|
| - }
|
| - SafeRelease((IDWriteFactory**)&m_pDWriteFactory);
|
| -}
|
| -CDWriteExt::~CDWriteExt() {
|
| - Unload();
|
| -}
|
| -LPVOID CDWriteExt::DwCreateFontFaceFromStream(uint8_t* pData,
|
| - FX_DWORD size,
|
| - int simulation_style) {
|
| - IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
|
| - IDWriteFontFile* pDwFontFile = NULL;
|
| - IDWriteFontFace* pDwFontFace = NULL;
|
| - BOOL isSupportedFontType = FALSE;
|
| - DWRITE_FONT_FILE_TYPE fontFileType;
|
| - DWRITE_FONT_FACE_TYPE fontFaceType;
|
| - UINT32 numberOfFaces;
|
| - DWRITE_FONT_SIMULATIONS fontStyle =
|
| - (DWRITE_FONT_SIMULATIONS)(simulation_style & 3);
|
| - HRESULT hr = S_OK;
|
| - hr = pDwFactory->CreateCustomFontFileReference(
|
| - (void const*)pData, (UINT32)size, CDwFontFileLoader::GetLoader(),
|
| - &pDwFontFile);
|
| - if (FAILED(hr)) {
|
| - goto failed;
|
| - }
|
| - hr = pDwFontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType,
|
| - &numberOfFaces);
|
| - if (FAILED(hr) || !isSupportedFontType ||
|
| - fontFaceType == DWRITE_FONT_FACE_TYPE_UNKNOWN) {
|
| - goto failed;
|
| - }
|
| - hr = pDwFactory->CreateFontFace(fontFaceType, 1, &pDwFontFile, 0, fontStyle,
|
| - &pDwFontFace);
|
| - if (FAILED(hr)) {
|
| - goto failed;
|
| - }
|
| - SafeRelease(&pDwFontFile);
|
| - return pDwFontFace;
|
| -failed:
|
| - SafeRelease(&pDwFontFile);
|
| - return NULL;
|
| -}
|
| -FX_BOOL CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap,
|
| - void** renderTarget) {
|
| - if (pBitmap->GetFormat() > FXDIB_Argb) {
|
| - return FALSE;
|
| - }
|
| - IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
|
| - IDWriteGdiInterop* pGdiInterop = NULL;
|
| - IDWriteBitmapRenderTarget* pBitmapRenderTarget = NULL;
|
| - IDWriteRenderingParams* pRenderingParams = NULL;
|
| - HRESULT hr = S_OK;
|
| - hr = pDwFactory->GetGdiInterop(&pGdiInterop);
|
| - if (FAILED(hr)) {
|
| - goto failed;
|
| - }
|
| - hr = pGdiInterop->CreateBitmapRenderTarget(
|
| - NULL, pBitmap->GetWidth(), pBitmap->GetHeight(), &pBitmapRenderTarget);
|
| - if (FAILED(hr)) {
|
| - goto failed;
|
| - }
|
| - hr = pDwFactory->CreateCustomRenderingParams(
|
| - 1.0f, 0.0f, 1.0f, DWRITE_PIXEL_GEOMETRY_RGB,
|
| - DWRITE_RENDERING_MODE_DEFAULT, &pRenderingParams);
|
| - if (FAILED(hr)) {
|
| - goto failed;
|
| - }
|
| - hr = pBitmapRenderTarget->SetPixelsPerDip(1.0f);
|
| - if (FAILED(hr)) {
|
| - goto failed;
|
| - }
|
| - *(CDwGdiTextRenderer**)renderTarget =
|
| - new CDwGdiTextRenderer(pBitmap, pBitmapRenderTarget, pRenderingParams);
|
| - SafeRelease(&pGdiInterop);
|
| - SafeRelease(&pBitmapRenderTarget);
|
| - SafeRelease(&pRenderingParams);
|
| - return TRUE;
|
| -failed:
|
| - SafeRelease(&pGdiInterop);
|
| - SafeRelease(&pBitmapRenderTarget);
|
| - SafeRelease(&pRenderingParams);
|
| - return FALSE;
|
| -}
|
| -FX_BOOL CDWriteExt::DwRendingString(void* renderTarget,
|
| - CFX_ClipRgn* pClipRgn,
|
| - FX_RECT& stringRect,
|
| - CFX_Matrix* pMatrix,
|
| - void* font,
|
| - FX_FLOAT font_size,
|
| - FX_ARGB text_color,
|
| - int glyph_count,
|
| - unsigned short* glyph_indices,
|
| - FX_FLOAT baselineOriginX,
|
| - FX_FLOAT baselineOriginY,
|
| - void* glyph_offsets,
|
| - FX_FLOAT* glyph_advances) {
|
| - if (!renderTarget) {
|
| - return TRUE;
|
| - }
|
| - CDwGdiTextRenderer* pTextRenderer = (CDwGdiTextRenderer*)renderTarget;
|
| - DWRITE_MATRIX transform;
|
| - DWRITE_GLYPH_RUN glyphRun;
|
| - HRESULT hr = S_OK;
|
| - if (pMatrix) {
|
| - transform.m11 = pMatrix->a;
|
| - transform.m12 = pMatrix->b;
|
| - transform.m21 = pMatrix->c;
|
| - transform.m22 = pMatrix->d;
|
| - transform.dx = pMatrix->e;
|
| - transform.dy = pMatrix->f;
|
| - }
|
| - glyphRun.fontFace = (IDWriteFontFace*)font;
|
| - glyphRun.fontEmSize = font_size;
|
| - glyphRun.glyphCount = glyph_count;
|
| - glyphRun.glyphIndices = glyph_indices;
|
| - glyphRun.glyphAdvances = glyph_advances;
|
| - glyphRun.glyphOffsets = (DWRITE_GLYPH_OFFSET*)glyph_offsets;
|
| - glyphRun.isSideways = FALSE;
|
| - glyphRun.bidiLevel = 0;
|
| - hr = pTextRenderer->DrawGlyphRun(
|
| - stringRect, pClipRgn, pMatrix ? &transform : NULL, baselineOriginX,
|
| - baselineOriginY, DWRITE_MEASURING_MODE_NATURAL, &glyphRun,
|
| - 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)) {
|
| - *ppvObject = this;
|
| - AddRef();
|
| - return S_OK;
|
| - }
|
| - *ppvObject = NULL;
|
| - return E_NOINTERFACE;
|
| -}
|
| -ULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef() {
|
| - return InterlockedIncrement((long*)(&refCount_));
|
| -}
|
| -ULONG STDMETHODCALLTYPE CDwFontFileStream::Release() {
|
| - ULONG newCount = InterlockedDecrement((long*)(&refCount_));
|
| - if (newCount == 0) {
|
| - delete this;
|
| - }
|
| - return newCount;
|
| -}
|
| -HRESULT STDMETHODCALLTYPE
|
| -CDwFontFileStream::ReadFileFragment(void const** fragmentStart,
|
| - UINT64 fileOffset,
|
| - UINT64 fragmentSize,
|
| - OUT void** fragmentContext) {
|
| - if (fileOffset <= resourceSize_ &&
|
| - fragmentSize <= resourceSize_ - fileOffset) {
|
| - *fragmentStart = static_cast<uint8_t const*>(resourcePtr_) +
|
| - static_cast<size_t>(fileOffset);
|
| - *fragmentContext = NULL;
|
| - return S_OK;
|
| - }
|
| - *fragmentStart = NULL;
|
| - *fragmentContext = NULL;
|
| - 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_ = NULL;
|
| -CDwFontFileLoader::CDwFontFileLoader() : refCount_(0) {}
|
| -HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid,
|
| - void** ppvObject) {
|
| - if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {
|
| - *ppvObject = this;
|
| - AddRef();
|
| - return S_OK;
|
| - }
|
| - *ppvObject = NULL;
|
| - return E_NOINTERFACE;
|
| -}
|
| -ULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef() {
|
| - return InterlockedIncrement((long*)(&refCount_));
|
| -}
|
| -ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release() {
|
| - ULONG newCount = InterlockedDecrement((long*)(&refCount_));
|
| - if (newCount == 0) {
|
| - instance_ = NULL;
|
| - delete this;
|
| - }
|
| - return newCount;
|
| -}
|
| -HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(
|
| - void const* fontFileReferenceKey,
|
| - UINT32 fontFileReferenceKeySize,
|
| - OUT IDWriteFontFileStream** fontFileStream) {
|
| - *fontFileStream = NULL;
|
| - CDwFontFileStream* stream =
|
| - new CDwFontFileStream(fontFileReferenceKey, fontFileReferenceKeySize);
|
| - if (!stream->IsInitialized()) {
|
| - delete stream;
|
| - return E_FAIL;
|
| - }
|
| - *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(
|
| - CDwFontFileLoader::GetLoader());
|
| - }
|
| - return hr_;
|
| -}
|
| -CDwGdiTextRenderer::CDwGdiTextRenderer(
|
| - CFX_DIBitmap* pBitmap,
|
| - IDWriteBitmapRenderTarget* bitmapRenderTarget,
|
| - IDWriteRenderingParams* renderingParams)
|
| - : pBitmap_(pBitmap),
|
| - pRenderTarget_(SafeAcquire(bitmapRenderTarget)),
|
| - pRenderingParams_(SafeAcquire(renderingParams)) {}
|
| -CDwGdiTextRenderer::~CDwGdiTextRenderer() {
|
| - SafeRelease(&pRenderTarget_);
|
| - SafeRelease(&pRenderingParams_);
|
| -}
|
| -STDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun(
|
| - const FX_RECT& text_bbox,
|
| - __in_opt CFX_ClipRgn* pClipRgn,
|
| - __in_opt DWRITE_MATRIX const* pMatrix,
|
| - FLOAT baselineOriginX,
|
| - FLOAT baselineOriginY,
|
| - DWRITE_MEASURING_MODE measuringMode,
|
| - __in DWRITE_GLYPH_RUN const* glyphRun,
|
| - const COLORREF& textColor) {
|
| - HRESULT hr = S_OK;
|
| - if (pMatrix) {
|
| - hr = pRenderTarget_->SetCurrentTransform(pMatrix);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| - }
|
| - HDC hDC = pRenderTarget_->GetMemoryDC();
|
| - HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hDC, OBJ_BITMAP);
|
| - BITMAP bitmap;
|
| - GetObject(hBitmap, sizeof bitmap, &bitmap);
|
| - CFX_DIBitmap dib;
|
| - dib.Create(bitmap.bmWidth, bitmap.bmHeight,
|
| - bitmap.bmBitsPixel == 24 ? FXDIB_Rgb : FXDIB_Rgb32,
|
| - (uint8_t*)bitmap.bmBits);
|
| - dib.CompositeBitmap(text_bbox.left, text_bbox.top, text_bbox.Width(),
|
| - text_bbox.Height(), pBitmap_, text_bbox.left,
|
| - text_bbox.top, FXDIB_BLEND_NORMAL, NULL);
|
| - hr = pRenderTarget_->DrawGlyphRun(baselineOriginX, baselineOriginY,
|
| - measuringMode, glyphRun, pRenderingParams_,
|
| - textColor);
|
| - if (FAILED(hr)) {
|
| - return hr;
|
| - }
|
| - pBitmap_->CompositeBitmap(text_bbox.left, text_bbox.top, text_bbox.Width(),
|
| - text_bbox.Height(), &dib, text_bbox.left,
|
| - text_bbox.top, FXDIB_BLEND_NORMAL, pClipRgn);
|
| - return hr;
|
| -}
|
| -#endif
|
|
|