support transparent images
This commit is contained in:
		
							
								
								
									
										19
									
								
								sent.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								sent.c
									
									
									
									
									
								
							@ -215,6 +215,8 @@ int ffread(Image *img)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t y, x;
 | 
						uint32_t y, x;
 | 
				
			||||||
	uint16_t *row;
 | 
						uint16_t *row;
 | 
				
			||||||
 | 
						uint8_t opac;
 | 
				
			||||||
 | 
						uint8_t fg_r, fg_g, fg_b, bg_r, bg_g, bg_b;
 | 
				
			||||||
	size_t rowlen, off, nbytes;
 | 
						size_t rowlen, off, nbytes;
 | 
				
			||||||
	ssize_t r;
 | 
						ssize_t r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -239,6 +241,11 @@ int ffread(Image *img)
 | 
				
			|||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* extract window background color channels for transparency */
 | 
				
			||||||
 | 
						bg_r = (sc->bg.pix >> 16) % 256;
 | 
				
			||||||
 | 
						bg_g = (sc->bg.pix >>  8) % 256;
 | 
				
			||||||
 | 
						bg_b = (sc->bg.pix >>  0) % 256;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (off = 0, y = 0; y < img->bufheight; y++) {
 | 
						for (off = 0, y = 0; y < img->bufheight; y++) {
 | 
				
			||||||
		nbytes = 0;
 | 
							nbytes = 0;
 | 
				
			||||||
		while (nbytes < rowlen) {
 | 
							while (nbytes < rowlen) {
 | 
				
			||||||
@ -248,9 +255,15 @@ int ffread(Image *img)
 | 
				
			|||||||
			nbytes += r;
 | 
								nbytes += r;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for (x = 0; x < rowlen / 2; x += 4) {
 | 
							for (x = 0; x < rowlen / 2; x += 4) {
 | 
				
			||||||
			img->buf[off++] = ntohs(row[x + 0]) / 257;
 | 
								fg_r = ntohs(row[x + 0]) / 256;
 | 
				
			||||||
			img->buf[off++] = ntohs(row[x + 1]) / 257;
 | 
								fg_g = ntohs(row[x + 1]) / 256;
 | 
				
			||||||
			img->buf[off++] = ntohs(row[x + 2]) / 257;
 | 
								fg_b = ntohs(row[x + 2]) / 256;
 | 
				
			||||||
 | 
								opac = ntohs(row[x + 3]) / 256;
 | 
				
			||||||
 | 
								/* blend opaque part of image data with window background color to
 | 
				
			||||||
 | 
								 * emulate transparency */
 | 
				
			||||||
 | 
								img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 256;
 | 
				
			||||||
 | 
								img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) / 256;
 | 
				
			||||||
 | 
								img->buf[off++] = (fg_b * opac + bg_b * (255 - opac)) / 256;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user