Addressing post-review comments on r191934.
[WebKit-https.git] / Source / WebCore / platform / graphics / mac / FontCustomPlatformData.cpp
1 /*
2  * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20
21 #include "config.h"
22 #include "FontCustomPlatformData.h"
23
24 #include "FontCache.h"
25 #include "FontDescription.h"
26 #include "FontPlatformData.h"
27 #include "SharedBuffer.h"
28 #include <CoreGraphics/CoreGraphics.h>
29 #include <CoreText/CoreText.h>
30
31 namespace WebCore {
32
33 FontCustomPlatformData::~FontCustomPlatformData()
34 {
35 }
36
37 FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings)
38 {
39     int size = fontDescription.computedPixelSize();
40     FontOrientation orientation = fontDescription.orientation();
41     FontWidthVariant widthVariant = fontDescription.widthVariant();
42 #if CORETEXT_WEB_FONTS
43     RetainPtr<CTFontRef> font = adoptCF(CTFontCreateWithFontDescriptor(m_fontDescriptor.get(), size, nullptr));
44     font = preparePlatformFont(font.get(), fontDescription.textRenderingMode(), &fontFaceFeatures, &fontFaceVariantSettings, fontDescription.featureSettings(), fontDescription.variantSettings());
45     return FontPlatformData(font.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode());
46 #else
47     UNUSED_PARAM(fontFaceFeatures);
48     UNUSED_PARAM(fontFaceVariantSettings);
49     return FontPlatformData(m_cgFont.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode());
50 #endif
51 }
52
53 std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer)
54 {
55     RetainPtr<CFDataRef> bufferData = buffer.createCFData();
56
57 #if CORETEXT_WEB_FONTS
58     RetainPtr<CTFontDescriptorRef> fontDescriptor = adoptCF(CTFontManagerCreateFontDescriptorFromData(bufferData.get()));
59     if (!fontDescriptor)
60         return nullptr;
61
62     return std::make_unique<FontCustomPlatformData>(fontDescriptor.get());
63
64 #else
65
66     RetainPtr<CGDataProviderRef> dataProvider = adoptCF(CGDataProviderCreateWithCFData(bufferData.get()));
67
68     RetainPtr<CGFontRef> cgFontRef = adoptCF(CGFontCreateWithDataProvider(dataProvider.get()));
69     if (!cgFontRef)
70         return nullptr;
71
72     return std::make_unique<FontCustomPlatformData>(cgFontRef.get());
73 #endif
74 }
75
76 bool FontCustomPlatformData::supportsFormat(const String& format)
77 {
78     return equalIgnoringCase(format, "truetype") || equalIgnoringCase(format, "opentype")
79 #if (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 100000) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200)
80         || equalIgnoringCase(format, "woff2")
81 #endif
82         || equalIgnoringCase(format, "woff");
83 }
84
85 }