1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 21:27:35 +00:00

LibGfx: Use common class template for PBM/PGM/PPM image loaders

PBM, PGM, and PPM image loaders are mostly common. The only difference
is how the data is read and the associated magic numbers. The magic
numbers are already made common using the loading contexts. Now make
the implementations common via a class template which accepts the
context to disambiguate.
This commit is contained in:
Lenny Maiorani 2022-03-13 11:58:58 -06:00 committed by Andreas Kling
parent 786b02730c
commit 6a23dfbc92
7 changed files with 123 additions and 327 deletions

View file

@ -16,7 +16,7 @@
namespace Gfx {
static bool read_image_data(PPMLoadingContext& context, Streamer& streamer)
bool read_image_data(PPMLoadingContext& context, Streamer& streamer)
{
Vector<Gfx::Color> color_data;
color_data.ensure_capacity(context.width * context.height);
@ -69,91 +69,4 @@ static bool read_image_data(PPMLoadingContext& context, Streamer& streamer)
context.state = PPMLoadingContext::State::Bitmap;
return true;
}
PPMImageDecoderPlugin::PPMImageDecoderPlugin(const u8* data, size_t size)
{
m_context = make<PPMLoadingContext>();
m_context->data = data;
m_context->data_size = size;
}
PPMImageDecoderPlugin::~PPMImageDecoderPlugin()
{
}
IntSize PPMImageDecoderPlugin::size()
{
if (m_context->state == PPMLoadingContext::State::Error)
return {};
if (m_context->state < PPMLoadingContext::State::Decoded) {
bool success = decode(*m_context);
if (!success)
return {};
}
return { m_context->width, m_context->height };
}
void PPMImageDecoderPlugin::set_volatile()
{
if (m_context->bitmap)
m_context->bitmap->set_volatile();
}
bool PPMImageDecoderPlugin::set_nonvolatile(bool& was_purged)
{
if (!m_context->bitmap)
return false;
return m_context->bitmap->set_nonvolatile(was_purged);
}
bool PPMImageDecoderPlugin::sniff()
{
if (m_context->data_size < 2)
return false;
if (m_context->data[0] == 'P' && m_context->data[1] == '3')
return true;
if (m_context->data[0] == 'P' && m_context->data[1] == '6')
return true;
return false;
}
bool PPMImageDecoderPlugin::is_animated()
{
return false;
}
size_t PPMImageDecoderPlugin::loop_count()
{
return 0;
}
size_t PPMImageDecoderPlugin::frame_count()
{
return 1;
}
ErrorOr<ImageFrameDescriptor> PPMImageDecoderPlugin::frame(size_t index)
{
if (index > 0)
return Error::from_string_literal("PPMImageDecoderPlugin: Invalid frame index"sv);
if (m_context->state == PPMLoadingContext::State::Error)
return Error::from_string_literal("PGMImageDecoderPlugin: Decoding failed"sv);
if (m_context->state < PPMLoadingContext::State::Decoded) {
bool success = decode(*m_context);
if (!success)
return Error::from_string_literal("PGMImageDecoderPlugin: Decoding failed"sv);
}
VERIFY(m_context->bitmap);
return ImageFrameDescriptor { m_context->bitmap, 0 };
}
}