parent
							
								
									9481802539
								
							
						
					
					
						commit
						6dc79637f3
					
				| @ -45,14 +45,14 @@ enum QuickdrawOpcodes { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static int parse_palette(AVCodecContext *avctx, GetByteContext *gbc, | static int parse_palette(AVCodecContext *avctx, GetByteContext *gbc, | ||||||
|                          uint32_t *pal, int colors) |                          uint32_t *pal, int colors, int pixmap) | ||||||
| { | { | ||||||
|     int i; |     int i; | ||||||
| 
 | 
 | ||||||
|     for (i = 0; i <= colors; i++) { |     for (i = 0; i <= colors; i++) { | ||||||
|         uint8_t r, g, b; |         uint8_t r, g, b; | ||||||
|         unsigned int idx = bytestream2_get_be16(gbc); /* color index */ |         unsigned int idx = bytestream2_get_be16(gbc); /* color index */ | ||||||
|         if (idx > 255) { |         if (idx > 255 && !pixmap) { | ||||||
|             av_log(avctx, AV_LOG_WARNING, |             av_log(avctx, AV_LOG_WARNING, | ||||||
|                    "Palette index out of range: %u\n", idx); |                    "Palette index out of range: %u\n", idx); | ||||||
|             bytestream2_skip(gbc, 6); |             bytestream2_skip(gbc, 6); | ||||||
| @ -66,7 +66,7 @@ static int parse_palette(AVCodecContext *avctx, GetByteContext *gbc, | |||||||
|         bytestream2_skip(gbc, 1); |         bytestream2_skip(gbc, 1); | ||||||
|         b = bytestream2_get_byte(gbc); |         b = bytestream2_get_byte(gbc); | ||||||
|         bytestream2_skip(gbc, 1); |         bytestream2_skip(gbc, 1); | ||||||
|         pal[idx] = (0xFFU << 24) | (r << 16) | (g << 8) | b; |         pal[pixmap ? i : idx] = (0xFFU << 24) | (r << 16) | (g << 8) | b; | ||||||
|     } |     } | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @ -335,6 +335,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||||
|     while (bytestream2_get_bytes_left(&gbc) >= 4) { |     while (bytestream2_get_bytes_left(&gbc) >= 4) { | ||||||
|         int bppcnt, bpp; |         int bppcnt, bpp; | ||||||
|         int rowbytes, pack_type; |         int rowbytes, pack_type; | ||||||
|  |         int flags; | ||||||
|         int opcode = bytestream2_get_be16(&gbc); |         int opcode = bytestream2_get_be16(&gbc); | ||||||
| 
 | 
 | ||||||
|         switch(opcode) { |         switch(opcode) { | ||||||
| @ -345,7 +346,8 @@ static int decode_frame(AVCodecContext *avctx, | |||||||
|         case PACKBITSRGN: |         case PACKBITSRGN: | ||||||
|             av_log(avctx, AV_LOG_DEBUG, "Parsing Packbit opcode\n"); |             av_log(avctx, AV_LOG_DEBUG, "Parsing Packbit opcode\n"); | ||||||
| 
 | 
 | ||||||
|             bytestream2_skip(&gbc, 30); |             flags = bytestream2_get_be16(&gbc) & 0xC000; | ||||||
|  |             bytestream2_skip(&gbc, 28); | ||||||
|             bppcnt = bytestream2_get_be16(&gbc); /* cmpCount */ |             bppcnt = bytestream2_get_be16(&gbc); /* cmpCount */ | ||||||
|             bpp    = bytestream2_get_be16(&gbc); /* cmpSize */ |             bpp    = bytestream2_get_be16(&gbc); /* cmpSize */ | ||||||
| 
 | 
 | ||||||
| @ -380,7 +382,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||||
|             if ((ret = ff_get_buffer(avctx, p, 0)) < 0) |             if ((ret = ff_get_buffer(avctx, p, 0)) < 0) | ||||||
|                 return ret; |                 return ret; | ||||||
| 
 | 
 | ||||||
|             ret = parse_palette(avctx, &gbc, (uint32_t *)p->data[1], colors); |             ret = parse_palette(avctx, &gbc, (uint32_t *)p->data[1], colors, flags & 0x8000); | ||||||
|             if (ret < 0) |             if (ret < 0) | ||||||
|                 return ret; |                 return ret; | ||||||
|             p->palette_has_changed = 1; |             p->palette_has_changed = 1; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user