Browse Source

try to detect when JPEG decoding fails - release

philippe44 2 years ago
parent
commit
97f8051e93
1 changed files with 5 additions and 1 deletions
  1. 5 1
      components/display/core/gds_image.c

+ 5 - 1
components/display/core/gds_image.c

@@ -24,6 +24,7 @@ typedef struct {
     const unsigned char *InData;	// Pointer to jpeg data
     int InPos;						// Current position in jpeg data
 	int Width, Height;	
+	uint32_t Pixels;
 	uint8_t Mode;
 	union {
 		void *OutData;
@@ -142,6 +143,8 @@ static unsigned OutHandlerDirect(JDEC *Decoder, void *Bitmap, JRECT *Frame) {
 	JpegCtx *Context = (JpegCtx*) Decoder->device;
     uint8_t *Pixels = (uint8_t*) Bitmap;
 	int Shift = 8 - Context->Depth;
+	
+	Context->Pixels += (Frame->bottom - Frame->top + 1) * (Frame->right - Frame->left + 1);						\
 
 	// decoded image is RGB888, shift only make sense for grayscale
 	if (Context->Mode == GDS_RGB888) {
@@ -418,10 +421,11 @@ bool GDS_DrawJPEG(struct GDS_Device* Device, uint8_t *Source, int x, int y, int
 		Context.XMin = x - Context.XOfs;
 		Context.YMin = y - Context.YOfs;
 		Context.Mode = Device->Mode;
+		Context.Pixels = 0;
 					
 		// do decompress & draw
 		Res = jd_decomp(&Decoder, OutHandlerDirect, N);
-		if (Res == JDR_OK) {
+		if (Res == JDR_OK && Context.Pixels != (Context.Width + 1) * (Context.Height + 1)) {
 			Device->Dirty = true;
 			Ret = true;
 		} else {