⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmp.c

📁 在linux framebuffer上显示模拟的动态水波效果
💻 C
字号:
/*    fbv  --  simple image viewer for the linux framebuffer    Copyright (C) 2002  Tomasz Sterna    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "bmp.h"int fh_bmp_id(char *name){	int fd;	char id[2];	fd = open(name, O_RDONLY);	if (fd == -1) {		return (0);	}	read(fd, id, 2);	close(fd);	if (id[0] == 'B' && id[1] == 'M') {		return (1);	}	return (0);}void fetch_pallete(int fd, struct color pallete[], int count){	unsigned char buff[4];	int i;	lseek(fd, BMP_COLOR_OFFSET, SEEK_SET);	for (i = 0; i < count; i++) {		read(fd, buff, 4);		pallete[i].red = buff[2];		pallete[i].green = buff[1];		pallete[i].blue = buff[0];	}	return;}int fh_bmp_load(char *name, unsigned char *buffer, int x, int y){	int fd, bpp, raster, i, j, k, skip;	unsigned char buff[4];	unsigned char *wr_buffer = buffer + x * (y - 1) * 3;	struct color pallete[256];	fd = open(name, O_RDONLY);	if (fd == -1) {		return (FH_ERROR_FILE);	}	if (lseek(fd, BMP_TORASTER_OFFSET, SEEK_SET) == -1) {		return (FH_ERROR_FORMAT);	}	read(fd, buff, 4);	raster = buff[0] + (buff[1] << 8) + (buff[2] << 16) + (buff[3] << 24);	if (lseek(fd, BMP_BPP_OFFSET, SEEK_SET) == -1) {		return (FH_ERROR_FORMAT);	}	read(fd, buff, 2);	bpp = buff[0] + (buff[1] << 8);	switch (bpp) {	case 1:					/* monochrome */		skip = fill4B(x / 8 + (x % 8 ? 1 : 0));		lseek(fd, raster, SEEK_SET);		for (i = 0; i < y; i++) {			for (j = 0; j < x / 8; j++) {				read(fd, buff, 1);				for (k = 0; k < 8; k++) {					if (buff[0] & 0x80) {						*wr_buffer++ = 0xff;						*wr_buffer++ = 0xff;						*wr_buffer++ = 0xff;					} else {						*wr_buffer++ = 0x00;						*wr_buffer++ = 0x00;						*wr_buffer++ = 0x00;					}					buff[0] = buff[0] << 1;				}			}			if (x % 8) {				read(fd, buff, 1);				for (k = 0; k < x % 8; k++) {					if (buff[0] & 0x80) {						*wr_buffer++ = 0xff;						*wr_buffer++ = 0xff;						*wr_buffer++ = 0xff;					} else {						*wr_buffer++ = 0x00;						*wr_buffer++ = 0x00;						*wr_buffer++ = 0x00;					}					buff[0] = buff[0] << 1;				}			}			if (skip) {				read(fd, buff, skip);			}			wr_buffer -= x * 6;	/* backoff 2 lines - x*2 *3 */		}		break;	case 4:					/* 4bit palletized */		skip = fill4B(x / 2 + x % 2);		fetch_pallete(fd, pallete, 16);		lseek(fd, raster, SEEK_SET);		for (i = 0; i < y; i++) {			for (j = 0; j < x / 2; j++) {				read(fd, buff, 1);				buff[1] = buff[0] >> 4;				buff[2] = buff[0] & 0x0f;				*wr_buffer++ = pallete[buff[1]].red;				*wr_buffer++ = pallete[buff[1]].green;				*wr_buffer++ = pallete[buff[1]].blue;				*wr_buffer++ = pallete[buff[2]].red;				*wr_buffer++ = pallete[buff[2]].green;				*wr_buffer++ = pallete[buff[2]].blue;			}			if (x % 2) {				read(fd, buff, 1);				buff[1] = buff[0] >> 4;				*wr_buffer++ = pallete[buff[1]].red;				*wr_buffer++ = pallete[buff[1]].green;				*wr_buffer++ = pallete[buff[1]].blue;			}			if (skip) {				read(fd, buff, skip);			}			wr_buffer -= x * 6;	/* backoff 2 lines - x*2 *3 */		}		break;	case 8:					/* 8bit palletized */		skip = fill4B(x);		fetch_pallete(fd, pallete, 256);		lseek(fd, raster, SEEK_SET);		for (i = 0; i < y; i++) {			for (j = 0; j < x; j++) {				read(fd, buff, 1);				*wr_buffer++ = pallete[buff[0]].red;				*wr_buffer++ = pallete[buff[0]].green;				*wr_buffer++ = pallete[buff[0]].blue;			}			if (skip) {				read(fd, buff, skip);			}			wr_buffer -= x * 6;	/* backoff 2 lines - x*2 *3 */		}		break;	case 16:					/* 16bit RGB */		return (FH_ERROR_FORMAT);		break;	case 24:					/* 24bit RGB */		skip = fill4B(x * 3);		lseek(fd, raster, SEEK_SET);		for (i = 0; i < y; i++) {			for (j = 0; j < x; j++) {				read(fd, buff, 3);				*wr_buffer++ = buff[2];				*wr_buffer++ = buff[1];				*wr_buffer++ = buff[0];			}			if (skip) {				read(fd, buff, skip);			}			wr_buffer -= x * 6;	/* backoff 2 lines - x*2 *3 */		}		break;	default:		return (FH_ERROR_FORMAT);	}	close(fd);	return (FH_ERROR_OK);}int fh_bmp_getsize(char *name, int *x, int *y){	int fd;	unsigned char size[4];	fd = open(name, O_RDONLY);	if (fd == -1) {		return (FH_ERROR_FILE);	}	if (lseek(fd, BMP_SIZE_OFFSET, SEEK_SET) == -1) {		return (FH_ERROR_FORMAT);	}	read(fd, size, 4);	*x = size[0] + (size[1] << 8) + (size[2] << 16) + (size[3] << 24);//  *x-=1;	read(fd, size, 4);	*y = size[0] + (size[1] << 8) + (size[2] << 16) + (size[3] << 24);	close(fd);	return (FH_ERROR_OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -