Explorar el Código

win-capture: Fix mask handling on some color cursors

windwakr hace 5 años
padre
commit
884c43f8c0
Se han modificado 1 ficheros con 12 adiciones y 6 borrados
  1. 12 6
      plugins/win-capture/cursor-capture.c

+ 12 - 6
plugins/win-capture/cursor-capture.c

@@ -6,8 +6,7 @@ static uint8_t *get_bitmap_data(HBITMAP hbmp, BITMAP *bmp)
 {
 	if (GetObject(hbmp, sizeof(*bmp), bmp) != 0) {
 		uint8_t *output;
-		unsigned int size =
-			(bmp->bmHeight * bmp->bmWidth * bmp->bmBitsPixel) / 8;
+		unsigned int size = bmp->bmHeight * bmp->bmWidthBytes;
 
 		output = bmalloc(size);
 		GetBitmapBits(hbmp, size, output);
@@ -40,10 +39,17 @@ static inline bool bitmap_has_alpha(uint8_t *data, long num_pixels)
 	return false;
 }
 
-static inline void apply_mask(uint8_t *color, uint8_t *mask, long num_pixels)
+static inline void apply_mask(uint8_t *color, uint8_t *mask, BITMAP *bmp_mask)
 {
-	for (long i = 0; i < num_pixels; i++)
-		color[i * 4 + 3] = bit_to_alpha(mask, i, false);
+	long mask_pix_offs;
+
+	for (long y = 0; y < bmp_mask->bmHeight; y++) {
+		for (long x = 0; x < bmp_mask->bmWidth; x++) {
+			mask_pix_offs = y * (bmp_mask->bmWidthBytes * 8) + x;
+			color[(y * bmp_mask->bmWidth + x) * 4 + 3] =
+				bit_to_alpha(mask, mask_pix_offs, false);
+		}
+	}
 }
 
 static inline uint8_t *copy_from_color(ICONINFO *ii, uint32_t *width,
@@ -69,7 +75,7 @@ static inline uint8_t *copy_from_color(ICONINFO *ii, uint32_t *width,
 		long pixels = bmp_color.bmHeight * bmp_color.bmWidth;
 
 		if (!bitmap_has_alpha(color, pixels))
-			apply_mask(color, mask, pixels);
+			apply_mask(color, mask, &bmp_mask);
 
 		bfree(mask);
 	}