1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 15:38:10 +00:00

LibGfx/PortableFormat: Use finite loops in read_image_data

The `read_image_data` function of each one of[PBM, PGM, PPM]Loader use
the same structure to read an image. This patch harmonizes the three
functions and use finite loops instead of reading until EOF. It allows
to quit early on bloated file, but it's mainly done for refactoring
purpose.
This commit is contained in:
Lucas CHOLLET 2023-03-16 20:17:14 -04:00 committed by Andreas Kling
parent 24087ef6eb
commit b9574c180e
3 changed files with 48 additions and 49 deletions

View file

@ -19,46 +19,46 @@ namespace Gfx {
bool read_image_data(PPMLoadingContext& context, Streamer& streamer)
{
Vector<Gfx::Color> color_data;
color_data.ensure_capacity(context.width * context.height);
auto const context_size = context.width * context.height;
color_data.resize(context_size);
if (context.type == PPMLoadingContext::Type::ASCII) {
while (true) {
for (u64 i = 0; i < context_size; ++i) {
auto const red_or_error = read_number(streamer);
if (red_or_error.is_error())
break;
return false;
if (read_whitespace(context, streamer).is_error())
break;
return false;
auto const green_or_error = read_number(streamer);
if (green_or_error.is_error())
break;
return false;
if (read_whitespace(context, streamer).is_error())
break;
return false;
auto const blue_or_error = read_number(streamer);
if (blue_or_error.is_error())
break;
return false;
if (read_whitespace(context, streamer).is_error())
break;
return false;
Color color { (u8)red_or_error.value(), (u8)green_or_error.value(), (u8)blue_or_error.value() };
if (context.format_details.max_val < 255)
color = adjust_color(context.format_details.max_val, color);
color_data.append(color);
color_data[i] = color;
}
} else if (context.type == PPMLoadingContext::Type::RAWBITS) {
u8 pixel[3];
while (streamer.read_bytes(pixel, 3)) {
color_data.append({ pixel[0], pixel[1], pixel[2] });
for (u64 i = 0; i < context_size; ++i) {
u8 pixel[3];
if (!streamer.read_bytes(pixel, 3))
return false;
color_data[i] = { pixel[0], pixel[1], pixel[2] };
}
}
if (context.width * context.height != color_data.size())
return false;
if (!create_bitmap(context)) {
return false;
}