Browse Source

LibGfx/JPEG2000: Decode tile-part QCD and QCC marker segment data

Nico Weber 1 năm trước cách đây
mục cha
commit
dbe179f0d5

+ 9 - 1
Userland/Libraries/LibGfx/ImageFormats/JPEG2000Loader.cpp

@@ -469,6 +469,8 @@ struct TilePartData {
 };
 };
 
 
 struct TileData {
 struct TileData {
+    Optional<QuantizationDefault> qcd;
+    Vector<QuantizationComponent> qccs;
     Vector<TilePartData> tile_parts;
     Vector<TilePartData> tile_parts;
 };
 };
 
 
@@ -660,7 +662,13 @@ static ErrorOr<void> parse_codestream_tile_header(JPEG2000LoadingContext& contex
         case J2K_PLT:
         case J2K_PLT:
         case J2K_COM: {
         case J2K_COM: {
             auto marker = TRY(read_marker_at_cursor(context));
             auto marker = TRY(read_marker_at_cursor(context));
-            if (marker.marker == J2K_COM) {
+            if (marker.marker == J2K_QCD) {
+                if (tile.qcd.has_value())
+                    return Error::from_string_literal("JPEG2000ImageDecoderPlugin: Multiple QCD markers in tile header");
+                tile.qcd = TRY(read_quantization_default(marker.data.value()));
+            } else if (marker.marker == J2K_QCC) {
+                tile.qccs.append(TRY(read_quantization_component(marker.data.value(), context.siz.components.size())));
+            } else if (marker.marker == J2K_COM) {
                 tile_part.coms.append(TRY(read_comment(marker.data.value())));
                 tile_part.coms.append(TRY(read_comment(marker.data.value())));
             } else {
             } else {
                 // FIXME: These are valid main header markers. Parse contents.
                 // FIXME: These are valid main header markers. Parse contents.