Parcourir la source

LibGfx: Fix color alfa for transparent color in GIFLoader

Hüseyin ASLITÜRK il y a 5 ans
Parent
commit
49c801f7fd
1 fichiers modifiés avec 17 ajouts et 7 suppressions
  1. 17 7
      Libraries/LibGfx/GIFLoader.cpp

+ 17 - 7
Libraries/LibGfx/GIFLoader.cpp

@@ -294,6 +294,11 @@ bool decode_frames_up_to_index(GIFLoadingContext& context, size_t frame_index)
         }
         }
 
 
         int pixel_index = 0;
         int pixel_index = 0;
+        RGB transparent_color { 0, 0, 0 };
+        if (image.transparent) {
+            transparent_color = context.logical_screen.color_map[image.transparency_index];
+        }
+
         while (true) {
         while (true) {
             Optional<u16> code = decoder.next_code();
             Optional<u16> code = decoder.next_code();
             if (!code.has_value()) {
             if (!code.has_value()) {
@@ -311,15 +316,20 @@ bool decode_frames_up_to_index(GIFLoadingContext& context, size_t frame_index)
             auto colors = decoder.get_output();
             auto colors = decoder.get_output();
 
 
             for (const auto& color : colors) {
             for (const auto& color : colors) {
-                if (!image.transparent || color != image.transparency_index) {
-                    auto rgb = context.logical_screen.color_map[color];
+                auto rgb = context.logical_screen.color_map[color];
 
 
-                    int x = pixel_index % image.width + image.x;
-                    int y = pixel_index / image.width + image.y;
+                int x = pixel_index % image.width + image.x;
+                int y = pixel_index / image.width + image.y;
 
 
-                    Color c = Color(rgb.r, rgb.g, rgb.b);
-                    image.bitmap->set_pixel(x, y, c);
+                Color c = Color(rgb.r, rgb.g, rgb.b);
+
+                if (image.transparent) {
+                    if (rgb.r == transparent_color.r && rgb.g == transparent_color.g && rgb.b == transparent_color.b) {
+                        c.set_alpha(0);
+                    }
                 }
                 }
+
+                image.bitmap->set_pixel(x, y, c);
                 ++pixel_index;
                 ++pixel_index;
             }
             }
         }
         }
@@ -536,7 +546,7 @@ GIFImageDecoderPlugin::GIFImageDecoderPlugin(const u8* data, size_t size)
     m_context->data_size = size;
     m_context->data_size = size;
 }
 }
 
 
-GIFImageDecoderPlugin::~GIFImageDecoderPlugin() { }
+GIFImageDecoderPlugin::~GIFImageDecoderPlugin() {}
 
 
 IntSize GIFImageDecoderPlugin::size()
 IntSize GIFImageDecoderPlugin::size()
 {
 {