blob: dc0afa3f917fb9d5311f41fdf3c1e5f78c047558 [file] [log] [blame]
/*
* Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#include "config.h"
#include "FontCustomPlatformData.h"
#include "FontCache.h"
#include "FontCacheCoreText.h"
#include "FontDescription.h"
#include "FontPlatformData.h"
#include "SharedBuffer.h"
#include <CoreFoundation/CoreFoundation.h>
#include <CoreGraphics/CoreGraphics.h>
#include <CoreText/CoreText.h>
#include <pal/spi/cocoa/CoreTextSPI.h>
namespace WebCore {
FontCustomPlatformData::~FontCustomPlatformData() = default;
FontPlatformData FontCustomPlatformData::fontPlatformData(const FontDescription& fontDescription, bool bold, bool italic, const FontFeatureSettings& fontFaceFeatures, const FontVariantSettings& fontFaceVariantSettings, FontSelectionSpecifiedCapabilities fontFaceCapabilities)
{
auto attributes = adoptCF(CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
addAttributesForWebFonts(attributes.get(), fontDescription.shouldAllowUserInstalledFonts());
auto modifiedFontDescriptor = adoptCF(CTFontDescriptorCreateCopyWithAttributes(m_fontDescriptor.get(), attributes.get()));
ASSERT(modifiedFontDescriptor);
int size = fontDescription.computedPixelSize();
FontOrientation orientation = fontDescription.orientation();
FontWidthVariant widthVariant = fontDescription.widthVariant();
RetainPtr<CTFontRef> font = adoptCF(CTFontCreateWithFontDescriptor(modifiedFontDescriptor.get(), size, nullptr));
font = preparePlatformFont(font.get(), fontDescription, &fontFaceFeatures, &fontFaceVariantSettings, fontFaceCapabilities, fontDescription.computedSize());
ASSERT(font);
return FontPlatformData(font.get(), size, bold, italic, orientation, widthVariant, fontDescription.textRenderingMode());
}
std::unique_ptr<FontCustomPlatformData> createFontCustomPlatformData(SharedBuffer& buffer, unsigned index)
{
RetainPtr<CFDataRef> bufferData = buffer.createCFData();
RetainPtr<CTFontDescriptorRef> fontDescriptor;
#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000)
auto array = adoptCF(CTFontManagerCreateFontDescriptorsFromData(bufferData.get()));
if (!array)
return nullptr;
auto length = CFArrayGetCount(array.get());
if (length <= 0)
return nullptr;
if (index > 0)
--index;
if (index >= static_cast<unsigned>(length))
index = 0;
fontDescriptor = static_cast<CTFontDescriptorRef>(CFArrayGetValueAtIndex(array.get(), index));
#else
UNUSED_PARAM(index);
fontDescriptor = adoptCF(CTFontManagerCreateFontDescriptorFromData(bufferData.get()));
#endif
if (!fontDescriptor)
return nullptr;
return std::make_unique<FontCustomPlatformData>(fontDescriptor.get());
}
bool FontCustomPlatformData::supportsFormat(const String& format)
{
return equalLettersIgnoringASCIICase(format, "truetype")
|| equalLettersIgnoringASCIICase(format, "opentype")
|| equalLettersIgnoringASCIICase(format, "woff2")
#if ENABLE(VARIATION_FONTS)
|| equalLettersIgnoringASCIICase(format, "woff2-variations")
#endif
#if ENABLE(VARIATION_FONTS)
|| equalLettersIgnoringASCIICase(format, "woff-variations")
|| equalLettersIgnoringASCIICase(format, "truetype-variations")
|| equalLettersIgnoringASCIICase(format, "opentype-variations")
#endif
|| equalLettersIgnoringASCIICase(format, "woff");
}
}