mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:37:46 +00:00
LibGfx: Factorize handling of miscellaneous and tables segments
Miscellaneous and tables segments can also be placed between scans, placing this code in a function will allow us to avoid duplication when we get there.
This commit is contained in:
parent
90573652fd
commit
f1aa189027
1 changed files with 54 additions and 27 deletions
|
@ -1099,6 +1099,55 @@ static ErrorOr<void> compose_bitmap(JPEGLoadingContext& context, Vector<Macroblo
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_app_marker(Marker const marker)
|
||||||
|
{
|
||||||
|
return marker >= JPEG_APPN0 && marker <= JPEG_APPNF;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_miscellaneous_or_table_marker(Marker const marker)
|
||||||
|
{
|
||||||
|
// B.6 - Summary
|
||||||
|
// See: Figure B.17 – Flow of marker segment
|
||||||
|
|
||||||
|
bool const is_misc = marker == JPEG_COM || marker == JPEG_DRI || is_app_marker(marker);
|
||||||
|
bool const is_table = marker == JPEG_DQT || marker == JPEG_DAC || marker == JPEG_DHT;
|
||||||
|
|
||||||
|
return is_misc || is_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ErrorOr<void> handle_miscellaneous_or_table(AK::SeekableStream& stream, JPEGLoadingContext& context, Marker const marker)
|
||||||
|
{
|
||||||
|
if (is_app_marker(marker)) {
|
||||||
|
TRY(read_app_marker(stream, context, marker - JPEG_APPN0));
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (marker) {
|
||||||
|
case JPEG_COM:
|
||||||
|
case JPEG_DAC:
|
||||||
|
dbgln_if(JPEG_DEBUG, "TODO: implement marker \"{:x}\"", marker);
|
||||||
|
if (auto result = skip_segment(stream); result.is_error()) {
|
||||||
|
dbgln_if(JPEG_DEBUG, "{}: Error skipping marker: {:x}!", TRY(stream.tell()), marker);
|
||||||
|
return result.release_error();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case JPEG_DHT:
|
||||||
|
TRY(read_huffman_table(stream, context));
|
||||||
|
break;
|
||||||
|
case JPEG_DQT:
|
||||||
|
TRY(read_quantization_table(stream, context));
|
||||||
|
break;
|
||||||
|
case JPEG_DRI:
|
||||||
|
TRY(read_restart_interval(stream, context));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dbgln("Unexpected marker: {:x}", marker);
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
static ErrorOr<void> parse_header(AK::SeekableStream& stream, JPEGLoadingContext& context)
|
static ErrorOr<void> parse_header(AK::SeekableStream& stream, JPEGLoadingContext& context)
|
||||||
{
|
{
|
||||||
auto marker = TRY(read_marker_at_cursor(stream));
|
auto marker = TRY(read_marker_at_cursor(stream));
|
||||||
|
@ -1109,6 +1158,11 @@ static ErrorOr<void> parse_header(AK::SeekableStream& stream, JPEGLoadingContext
|
||||||
for (;;) {
|
for (;;) {
|
||||||
marker = TRY(read_marker_at_cursor(stream));
|
marker = TRY(read_marker_at_cursor(stream));
|
||||||
|
|
||||||
|
if (is_miscellaneous_or_table_marker(marker)) {
|
||||||
|
TRY(handle_miscellaneous_or_table(stream, context, marker));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Set frame type if the marker marks a new frame.
|
// Set frame type if the marker marks a new frame.
|
||||||
if (is_frame_marker(marker))
|
if (is_frame_marker(marker))
|
||||||
context.frame.type = static_cast<StartOfFrame::FrameType>(marker & 0xF);
|
context.frame.type = static_cast<StartOfFrame::FrameType>(marker & 0xF);
|
||||||
|
@ -1127,37 +1181,10 @@ static ErrorOr<void> parse_header(AK::SeekableStream& stream, JPEGLoadingContext
|
||||||
case JPEG_EOI:
|
case JPEG_EOI:
|
||||||
dbgln_if(JPEG_DEBUG, "{}: Unexpected marker {:x}!", TRY(stream.tell()), marker);
|
dbgln_if(JPEG_DEBUG, "{}: Unexpected marker {:x}!", TRY(stream.tell()), marker);
|
||||||
return Error::from_string_literal("Unexpected marker");
|
return Error::from_string_literal("Unexpected marker");
|
||||||
case JPEG_APPN0:
|
|
||||||
case JPEG_APPN1:
|
|
||||||
case JPEG_APPN2:
|
|
||||||
case JPEG_APPN3:
|
|
||||||
case JPEG_APPN4:
|
|
||||||
case JPEG_APPN5:
|
|
||||||
case JPEG_APPN6:
|
|
||||||
case JPEG_APPN7:
|
|
||||||
case JPEG_APPN8:
|
|
||||||
case JPEG_APPN9:
|
|
||||||
case JPEG_APPNA:
|
|
||||||
case JPEG_APPNB:
|
|
||||||
case JPEG_APPNC:
|
|
||||||
case JPEG_APPND:
|
|
||||||
case JPEG_APPNE:
|
|
||||||
case JPEG_APPNF:
|
|
||||||
TRY(read_app_marker(stream, context, marker - JPEG_APPN0));
|
|
||||||
break;
|
|
||||||
case JPEG_SOF0:
|
case JPEG_SOF0:
|
||||||
TRY(read_start_of_frame(stream, context));
|
TRY(read_start_of_frame(stream, context));
|
||||||
context.state = JPEGLoadingContext::FrameDecoded;
|
context.state = JPEGLoadingContext::FrameDecoded;
|
||||||
break;
|
break;
|
||||||
case JPEG_DQT:
|
|
||||||
TRY(read_quantization_table(stream, context));
|
|
||||||
break;
|
|
||||||
case JPEG_DRI:
|
|
||||||
TRY(read_restart_interval(stream, context));
|
|
||||||
break;
|
|
||||||
case JPEG_DHT:
|
|
||||||
TRY(read_huffman_table(stream, context));
|
|
||||||
break;
|
|
||||||
case JPEG_SOS:
|
case JPEG_SOS:
|
||||||
return read_start_of_scan(stream, context);
|
return read_start_of_scan(stream, context);
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue