solenv/clang-format/excludelist |    1 
 vcl/inc/win/salgdi.h            |    2 
 vcl/win/gdi/dw-extra.h          |  141 ++++++++++++++++++++++++++++++++++++++++
 vcl/win/gdi/salfont.cxx         |   36 ++++++++++
 4 files changed, 180 insertions(+)

New commits:
commit e65b0bf83b8225fde81ee7b10c1fa4b9f32b6ed1
Author:     Khaled Hosny <kha...@aliftype.com>
AuthorDate: Sat Nov 19 09:34:56 2022 +0200
Commit:     خالد حسني <kha...@aliftype.com>
CommitDate: Sat Nov 19 12:44:58 2022 +0100

    vcl: add WinFontFace::GetVariations()
    
    This makes font variation settings to be applied to glyph advances and
    text layout, not only glyph shapes.
    
    The sw-extra.h file is needed because we target Windows 7 and the
    interfaces we want to use are only exposed for Windows 10. File copied
    from:
    
    
https://hg.mozilla.org/mozilla-central/file/704f09a557a4dfc9057f1672b711789f64f74a82/gfx/2d/dw-extra.h
    
    Change-Id: I7bbb4c3f2b70274754f844fedb0c4329c8f649a3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142347
    Tested-by: Jenkins
    Reviewed-by: خالد حسني <kha...@aliftype.com>

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

Reply via email to