diff options
-rw-r--r-- | solenv/clang-format/excludelist | 1 | ||||
-rw-r--r-- | vcl/inc/win/salgdi.h | 2 | ||||
-rw-r--r-- | vcl/win/gdi/dw-extra.h | 141 | ||||
-rw-r--r-- | vcl/win/gdi/salfont.cxx | 36 |
4 files changed, 180 insertions, 0 deletions
diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist index f3f6c774e7a3..b50d8bf4f4f0 100644 --- a/solenv/clang-format/excludelist +++ b/solenv/clang-format/excludelist @@ -15082,6 +15082,7 @@ vcl/win/dtrans/XNotifyingDataObject.hxx vcl/win/dtrans/XTDataObject.cxx vcl/win/dtrans/XTDataObject.hxx vcl/win/gdi/DWriteTextRenderer.cxx +vcl/win/gdi/dw-extra.h vcl/win/gdi/gdiimpl.cxx vcl/win/gdi/gdiimpl.hxx vcl/win/gdi/salbmp.cxx diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h index 8d93577e4cb1..e0661dec5a1c 100644 --- a/vcl/inc/win/salgdi.h +++ b/vcl/inc/win/salgdi.h @@ -76,6 +76,8 @@ public: hb_blob_t* GetHbTable(hb_tag_t nTag) const override; + std::vector<hb_variation_t> GetVariations() const override; + private: sal_IntPtr mnId; diff --git a/vcl/win/gdi/dw-extra.h b/vcl/win/gdi/dw-extra.h new file mode 100644 index 000000000000..4c07d81d2126 --- /dev/null +++ b/vcl/win/gdi/dw-extra.h @@ -0,0 +1,141 @@ +// +// copied from: +// https://hg.mozilla.org/mozilla-central/file/704f09a557a4dfc9057f1672b711789f64f74a82/gfx/2d/dw-extra.h +// + +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * New DirectWrite interfaces based on Win10 Fall Creators Update versions + * of dwrite_3.h and dcommon.h (from SDK 10.0.17061.0). This particular + * subset of declarations is intended to be just sufficient to compile the + * Gecko DirectWrite font code; it omits many other new interfaces, etc. + */ + +#ifndef DWRITE_EXTRA_H +#define DWRITE_EXTRA_H + +#pragma once + +interface IDWriteFontResource; +interface IDWriteFontFaceReference1; + +enum DWRITE_GLYPH_IMAGE_FORMATS { + DWRITE_GLYPH_IMAGE_FORMATS_NONE = 0x00000000, + DWRITE_GLYPH_IMAGE_FORMATS_TRUETYPE = 0x00000001, + DWRITE_GLYPH_IMAGE_FORMATS_CFF = 0x00000002, + DWRITE_GLYPH_IMAGE_FORMATS_COLR = 0x00000004, + DWRITE_GLYPH_IMAGE_FORMATS_SVG = 0x00000008, + DWRITE_GLYPH_IMAGE_FORMATS_PNG = 0x00000010, + DWRITE_GLYPH_IMAGE_FORMATS_JPEG = 0x00000020, + DWRITE_GLYPH_IMAGE_FORMATS_TIFF = 0x00000040, + DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8 = 0x00000080, +}; + +#ifdef DEFINE_ENUM_FLAG_OPERATORS +DEFINE_ENUM_FLAG_OPERATORS(DWRITE_GLYPH_IMAGE_FORMATS); +#endif + +#define DWRITE_MAKE_FONT_AXIS_TAG(a, b, c, d) \ + (static_cast<DWRITE_FONT_AXIS_TAG>(DWRITE_MAKE_OPENTYPE_TAG(a, b, c, d))) + +enum DWRITE_FONT_AXIS_TAG : UINT32 { + DWRITE_FONT_AXIS_TAG_WEIGHT = DWRITE_MAKE_FONT_AXIS_TAG('w', 'g', 'h', 't'), + DWRITE_FONT_AXIS_TAG_WIDTH = DWRITE_MAKE_FONT_AXIS_TAG('w', 'd', 't', 'h'), + DWRITE_FONT_AXIS_TAG_SLANT = DWRITE_MAKE_FONT_AXIS_TAG('s', 'l', 'n', 't'), + DWRITE_FONT_AXIS_TAG_OPTICAL_SIZE = + DWRITE_MAKE_FONT_AXIS_TAG('o', 'p', 's', 'z'), + DWRITE_FONT_AXIS_TAG_ITALIC = DWRITE_MAKE_FONT_AXIS_TAG('i', 't', 'a', 'l'), +}; + +enum DWRITE_FONT_AXIS_ATTRIBUTES { + DWRITE_FONT_AXIS_ATTRIBUTES_NONE = 0x0000, + DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE = 0x0001, + DWRITE_FONT_AXIS_ATTRIBUTES_HIDDEN = 0x0002, +}; + +struct DWRITE_FONT_AXIS_VALUE { + DWRITE_FONT_AXIS_TAG axisTag; + FLOAT value; +}; + +struct DWRITE_FONT_AXIS_RANGE { + DWRITE_FONT_AXIS_TAG axisTag; + FLOAT minValue; + FLOAT maxValue; +}; + +struct DWRITE_GLYPH_IMAGE_DATA { + const void* imageData; + UINT32 imageDataSize; + UINT32 uniqueDataId; + UINT32 pixelsPerEm; + D2D1_SIZE_U pixelSize; + D2D1_POINT_2L horizontalLeftOrigin; + D2D1_POINT_2L horizontalRightOrigin; + D2D1_POINT_2L verticalTopOrigin; + D2D1_POINT_2L verticalBottomOrigin; +}; + +interface DWRITE_DECLARE_INTERFACE("27F2A904-4EB8-441D-9678-0563F53E3E2F") + IDWriteFontFace4 : public IDWriteFontFace3 { + STDMETHOD_(DWRITE_GLYPH_IMAGE_FORMATS, GetGlyphImageFormats)() PURE; + STDMETHOD(GetGlyphImageFormats) + (UINT16 glyphId, UINT32 pixelsPerEmFirst, UINT32 pixelsPerEmLast, + _Out_ DWRITE_GLYPH_IMAGE_FORMATS* glyphImageFormats) PURE; + STDMETHOD(GetGlyphImageData) + (_In_ UINT16 glyphId, UINT32 pixelsPerEm, + DWRITE_GLYPH_IMAGE_FORMATS glyphImageFormat, + _Out_ DWRITE_GLYPH_IMAGE_DATA* glyphData, + _Outptr_result_maybenull_ void** glyphDataContext) PURE; + STDMETHOD_(void, ReleaseGlyphImageData)(void* glyphDataContext) PURE; +}; + +interface DWRITE_DECLARE_INTERFACE("98EFF3A5-B667-479A-B145-E2FA5B9FDC29") + IDWriteFontFace5 : public IDWriteFontFace4 { + STDMETHOD_(UINT32, GetFontAxisValueCount)() PURE; + STDMETHOD(GetFontAxisValues) + (_Out_writes_(fontAxisValueCount) DWRITE_FONT_AXIS_VALUE* fontAxisValues, + UINT32 fontAxisValueCount) PURE; + STDMETHOD_(BOOL, HasVariations)() PURE; + STDMETHOD(GetFontResource) + (_COM_Outptr_ IDWriteFontResource** fontResource) PURE; + STDMETHOD_(BOOL, Equals)(IDWriteFontFace* fontFace) PURE; +}; + +interface DWRITE_DECLARE_INTERFACE("1F803A76-6871-48E8-987F-B975551C50F2") + IDWriteFontResource : public IUnknown { + STDMETHOD(GetFontFile)(_COM_Outptr_ IDWriteFontFile** fontFile) PURE; + STDMETHOD_(UINT32, GetFontFaceIndex)() PURE; + STDMETHOD_(UINT32, GetFontAxisCount)() PURE; + STDMETHOD(GetDefaultFontAxisValues) + (_Out_writes_(fontAxisValueCount) DWRITE_FONT_AXIS_VALUE* fontAxisValues, + UINT32 fontAxisValueCount) PURE; + STDMETHOD(GetFontAxisRanges) + (_Out_writes_(fontAxisRangeCount) DWRITE_FONT_AXIS_RANGE* fontAxisRanges, + UINT32 fontAxisRangeCount) PURE; + STDMETHOD_(DWRITE_FONT_AXIS_ATTRIBUTES, GetFontAxisAttributes) + (UINT32 axisIndex) PURE; + STDMETHOD(GetAxisNames) + (UINT32 axisIndex, _COM_Outptr_ IDWriteLocalizedStrings** names) PURE; + STDMETHOD_(UINT32, GetAxisValueNameCount)(UINT32 axisIndex) PURE; + STDMETHOD(GetAxisValueNames) + (UINT32 axisIndex, UINT32 axisValueIndex, + _Out_ DWRITE_FONT_AXIS_RANGE* fontAxisRange, + _COM_Outptr_ IDWriteLocalizedStrings** names) PURE; + STDMETHOD_(BOOL, HasVariations)() PURE; + STDMETHOD(CreateFontFace) + (DWRITE_FONT_SIMULATIONS fontSimulations, + _In_reads_(fontAxisValueCount) DWRITE_FONT_AXIS_VALUE const* fontAxisValues, + UINT32 fontAxisValueCount, _COM_Outptr_ IDWriteFontFace5** fontFace) PURE; + STDMETHOD(CreateFontFaceReference) + (DWRITE_FONT_SIMULATIONS fontSimulations, + _In_reads_(fontAxisValueCount) DWRITE_FONT_AXIS_VALUE const* fontAxisValues, + UINT32 fontAxisValueCount, + _COM_Outptr_ IDWriteFontFaceReference1** fontFaceReference) PURE; +}; + +#endif /* DWRITE_EXTRA_H */ diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx index 1db4f0d8c2b0..986b09433da1 100644 --- a/vcl/win/gdi/salfont.cxx +++ b/vcl/win/gdi/salfont.cxx @@ -32,6 +32,13 @@ #include <svsys.h> #include <vector> +#include <dwrite_3.h> +// Currently, we build with _WIN32_WINNT=0x0601 (Windows 7), which means newer +// declarations in dwrite_3.h will not be visible. +#if WINVER < 0x0A00 +# include "dw-extra.h" +#endif + #include <o3tl/lru_map.hxx> #include <basegfx/matrix/b2dhommatrixtools.hxx> #include <basegfx/polygon/b2dpolygon.hxx> @@ -559,6 +566,35 @@ IDWriteFontFace* WinFontFace::GetDWFontFace() const return mxDWFontFace; } +std::vector<hb_variation_t> WinFontFace::GetVariations() const +{ + if (m_aVariations.empty()) + { + auto pDWFontFace = WinFontFace::GetDWFontFace(); + if (pDWFontFace) + { + sal::systools::COMReference<IDWriteFontFace5> xDWFontFace5; + auto hr = pDWFontFace->QueryInterface(__uuidof(IDWriteFontFace5), + reinterpret_cast<void**>(&xDWFontFace5)); + if (SUCCEEDED(hr) && xDWFontFace5->HasVariations()) + { + std::vector<DWRITE_FONT_AXIS_VALUE> aAxisValues( + xDWFontFace5->GetFontAxisValueCount()); + hr = xDWFontFace5->GetFontAxisValues(aAxisValues.data(), aAxisValues.size()); + if (SUCCEEDED(hr)) + { + m_aVariations.reserve(aAxisValues.size()); + for (auto& rAxisValue : aAxisValues) + m_aVariations.push_back( + { OSL_NETDWORD(rAxisValue.axisTag), rAxisValue.value }); + } + } + } + } + + return m_aVariations; +} + namespace { struct BlobReference |