1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-09 09:34:57 +09:00
ladybird/Libraries/LibGfx/Font/WOFF2/Loader.cpp
Sam Atkins 6b762331df LibGfx: Rename WOFF[2]::try_load_from_externally_owned_memory()
Typeface::try_load_from_externally_owned_memory() relies on that
external owner keeping the memory around. However, neither WOFF nor
WOFF2 do so - they both create separate ByteBuffers to hold the TTF
data. So, rename them to make it clearer that they don't have any
requirements on the byte owner.
2025-05-03 12:01:43 +01:00

70 lines
1.9 KiB
C++

/*
* Copyright (c) 2024, Andreas Kling <andreas@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibGfx/Font/Typeface.h>
#include <LibGfx/Font/WOFF2/Loader.h>
#include <woff2/decode.h>
namespace WOFF2 {
class WOFF2ByteBufferOut final : public woff2::WOFF2Out {
public:
explicit WOFF2ByteBufferOut(ByteBuffer& buffer)
: m_buffer(buffer)
{
}
// Append n bytes of data from buf.
// Return true if all written, false otherwise.
virtual bool Write(void const* data, size_t size) override
{
auto result = m_buffer.try_append(static_cast<u8 const*>(data), size);
if (result.is_error()) {
VERIFY_NOT_REACHED();
}
return true;
}
// Write n bytes of data from buf at offset.
// Return true if all written, false otherwise.
virtual bool Write(void const* data, size_t offset, size_t n) override
{
if (Checked<size_t>::addition_would_overflow(offset, n)) {
return false;
}
if (offset + n > m_buffer.size()) {
if (m_buffer.try_resize(offset + n).is_error()) {
return false;
}
}
memcpy(m_buffer.offset_pointer(offset), data, n);
return true;
}
virtual size_t Size() override
{
return m_buffer.size();
}
private:
ByteBuffer& m_buffer;
};
ErrorOr<NonnullRefPtr<Gfx::Typeface>> try_load_from_bytes(ReadonlyBytes bytes)
{
auto ttf_buffer = TRY(ByteBuffer::create_uninitialized(0));
auto output = WOFF2ByteBufferOut { ttf_buffer };
auto result = woff2::ConvertWOFF2ToTTF(bytes.data(), bytes.size(), &output);
if (!result) {
return Error::from_string_literal("Failed to convert the WOFF2 font to TTF");
}
auto font_data = Gfx::FontData::create_from_byte_buffer(move(ttf_buffer));
auto input_font = TRY(Gfx::Typeface::try_load_from_font_data(move(font_data)));
return input_font;
}
}