Browse Source

quickpreview fixes

Benjamin Schaaf 4 years ago
parent
commit
3573486267
1 changed files with 19 additions and 4 deletions
  1. 19 4
      quickpreview.c

+ 19 - 4
quickpreview.c

@@ -51,6 +51,14 @@ static inline uint32_t apply_colormatrix(uint32_t color, const float *colormatri
 	uint32_t r = (color >> 16) * colormatrix[0] + ((color >> 8) & 0xFF) * colormatrix[1] + (color & 0xFF) * colormatrix[2];
 	uint32_t g = (color >> 16) * colormatrix[3] + ((color >> 8) & 0xFF) * colormatrix[4] + (color & 0xFF) * colormatrix[5];
 	uint32_t b = (color >> 16) * colormatrix[6] + ((color >> 8) & 0xFF) * colormatrix[7] + (color & 0xFF) * colormatrix[8];
+
+	// Clip colors
+	if (r > 0xFF)
+		r = 0xFF;
+	if (g > 0xFF)
+		g = 0xFF;
+	if (b > 0xFF)
+		b = 0xFF;
 	return pack_rgb(r, g, b);
 }
 
@@ -126,7 +134,6 @@ static void quick_preview_rggb8(
 
 			color = apply_colormatrix(color, colormatrix);
 
-			// printf("?? %d:%d\n", dst_x, dst_y);
 			dst[coord_map(dst_x, dst_y, dst_width, dst_height, rotation, mirrored)] = color;
 
 			src_x += 2 + 2 * skip;
@@ -219,6 +226,11 @@ static void quick_preview_yuv(
 
 	uint32_t width_bytes = src_width * 2;
 
+	uint32_t unrot_dst_width = dst_width;
+	if (rotation != 0 && rotation != 180) {
+		unrot_dst_width = dst_height;
+	}
+
 	uint32_t src_y = 0, dst_y = 0;
 	while (src_y < src_height) {
 		uint32_t src_x = 0, dst_x = 0;
@@ -251,9 +263,12 @@ static void quick_preview_yuv(
 			dst[dst_i1] = color1;
 			++dst_x;
 
-			uint32_t dst_i2 = coord_map(dst_x, dst_y, dst_width, dst_height, rotation, mirrored);
-			dst[dst_i2] = color2;
-			++dst_x;
+			// The last pixel needs to be skipped if we have an odd un-rotated width
+			if (dst_x < unrot_dst_width) {
+				uint32_t dst_i2 = coord_map(dst_x, dst_y, dst_width, dst_height, rotation, mirrored);
+				dst[dst_i2] = color2;
+				++dst_x;
+			}
 
 			src_x += 4 + 4 * skip;
 		}