FontCustomPlatformData.cpp [plain text]
#include "config.h"
#include "FontCustomPlatformData.h"
#include <wtf/RetainPtr.h>
#include <ApplicationServices/ApplicationServices.h>
#include "SharedBuffer.h"
#include "FontPlatformData.h"
namespace WebCore {
FontCustomPlatformData::~FontCustomPlatformData()
{
CGFontRelease(m_cgFont);
}
FontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, bool italic)
{
return FontPlatformData(m_cgFont, size, bold, italic);
}
const void* getData(void* info)
{
SharedBuffer* buffer = static_cast<SharedBuffer*>(info);
buffer->ref();
return (void*)buffer->data();
}
void releaseData(void* info, const void* data)
{
static_cast<SharedBuffer*>(info)->deref();
}
size_t getBytesWithOffset(void *info, void* buffer, size_t offset, size_t count)
{
SharedBuffer* sharedBuffer = static_cast<SharedBuffer*>(info);
size_t availBytes = count;
if (offset + count > sharedBuffer->size())
availBytes -= (offset + count) - sharedBuffer->size();
memcpy(buffer, sharedBuffer->data() + offset, availBytes);
return availBytes;
}
FontCustomPlatformData* createFontCustomPlatformData(SharedBuffer* buffer)
{
ASSERT_ARG(buffer, buffer);
CGDataProviderDirectAccessCallbacks callbacks = { &getData, &releaseData, &getBytesWithOffset, NULL };
RetainPtr<CGDataProviderRef> dataProvider(AdoptCF, CGDataProviderCreateDirectAccess(buffer, buffer->size(), &callbacks));
CGFontRef cgFont = CGFontCreateWithDataProvider(dataProvider.get());
if (!cgFont)
return 0;
return new FontCustomPlatformData(cgFont);
}
}