summaryrefslogtreecommitdiff
path: root/vcl/source/font/PhysicalFontFace.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/source/font/PhysicalFontFace.cxx')
-rw-r--r--vcl/source/font/PhysicalFontFace.cxx28
1 files changed, 28 insertions, 0 deletions
diff --git a/vcl/source/font/PhysicalFontFace.cxx b/vcl/source/font/PhysicalFontFace.cxx
index 997b1c155160..305a06a4edcf 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -27,6 +27,7 @@
#include <fontselect.hxx>
#include <impfontcharmap.hxx>
+#include <sft.hxx>
#include <PhysicalFontFace.hxx>
PhysicalFontFace::PhysicalFontFace( const FontAttributes& rDFA )
@@ -34,6 +35,7 @@ PhysicalFontFace::PhysicalFontFace( const FontAttributes& rDFA )
, mnWidth(0)
, mnHeight(0)
, mpHbFace(nullptr)
+ , mbCapabilitiesRead(false)
{
// StarSymbol is a unicode font, but it still deserves the symbol flag
if( !IsSymbolFont() )
@@ -248,4 +250,30 @@ const FontCharMapRef& PhysicalFontFace::GetCharMap() const
return mxCharMap;
}
+bool PhysicalFontFace::GetCapabilities(vcl::FontCapabilities &rCapabilities) const
+{
+ // Read this only once.
+ if (mbCapabilitiesRead)
+ {
+ rCapabilities = maCapabilities;
+ return rCapabilities.oUnicodeRange || rCapabilities.oCodePageRange;
+ }
+
+ mbCapabilitiesRead = true;
+
+ hb_blob_t* pBlob = hb_face_reference_table(mpHbFace, HB_TAG('O', 'S', '/', '2'));
+ const unsigned char* pData = reinterpret_cast<const unsigned char*>(hb_blob_get_data(pBlob, nullptr));
+ size_t nSize = hb_blob_get_length(pBlob);
+ if (nSize > 0)
+ {
+ vcl::getTTCoverage(maCapabilities.oUnicodeRange,
+ maCapabilities.oCodePageRange,
+ pData, nSize);
+ }
+ hb_blob_destroy(pBlob);
+
+ rCapabilities = maCapabilities;
+ return rCapabilities.oUnicodeRange || rCapabilities.oCodePageRange;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */