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

📄 jiv.c

📁 这是个图象压缩解压软件的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	reginh = (gs.botleftx >= 0 && gs.toprightx <= gs.vp.width);	reginv = (gs.botlefty >= 0 && gs.toprighty <= gs.vp.height);	if (cmdopts.verbose) {		fprintf(stderr, "start of panzoom\n");		dumpstate();		fprintf(stderr, "reginh=%d reginv=%d\n", reginh, reginv);	}	if (dx || dy) {		gs.botleftx += dx;		gs.botlefty += dy;		gs.toprightx += dx;		gs.toprighty += dy;	}	if (sx != 1.0 || sy != 1.0) {		cx = (gs.botleftx + gs.toprightx) / 2.0;		cy = (gs.botlefty + gs.toprighty) / 2.0;		w = gs.toprightx - gs.botleftx;		h = gs.toprighty - gs.botlefty;		gs.botleftx = cx - 0.5 * w / sx;		gs.botlefty = cy - 0.5 * h / sy;		gs.toprightx = cx + 0.5 * w / sx;		gs.toprighty = cy + 0.5 * h / sy;	}	if (reginh) {		if (gs.botleftx < 0) {			dx = -gs.botleftx;			gs.botleftx += dx;			gs.toprightx += dx;		} else if (gs.toprightx > gs.vp.width) {			dx = gs.vp.width - gs.toprightx;			gs.botleftx += dx;			gs.toprightx += dx;		}	}	if (gs.botleftx < 0 || gs.toprightx > gs.vp.width) {		float w;		w = gs.toprightx - gs.botleftx;		gs.botleftx = 0.5 * gs.vp.width - 0.5 * w;		gs.toprightx = 0.5 * gs.vp.width + 0.5 * w;	}	if (reginv) {		if (gs.botlefty < 0) {			dy = -gs.botlefty;			gs.botlefty += dy;			gs.toprighty += dy;		} else if (gs.toprighty > gs.vp.height) {			dy = gs.vp.height - gs.toprighty;			gs.botlefty += dy;			gs.toprighty += dy;		}	}	if (gs.botlefty < 0 || gs.toprighty > gs.vp.height) {		float h;		h = gs.toprighty - gs.botlefty;		gs.botlefty = 0.5 * gs.vp.height - 0.5 * h;		gs.toprighty = 0.5 * gs.vp.height + 0.5 * h;	}	if (cmdopts.verbose) {		fprintf(stderr, "end of panzoom\n");		dumpstate();	}}static void nextcmpt(){	if (gs.monomode) {		if (gs.cmptno == jas_image_numcmpts(gs.image) - 1) {			if (gs.altimage) {				gs.monomode = 0;			} else {				gs.cmptno = 0;			}		} else {			++gs.cmptno;		}	} else {		gs.monomode = 1;		gs.cmptno = 0;	}	render();	glutPostRedisplay();}static void prevcmpt(){	if (gs.monomode) {		if (!gs.cmptno) {			gs.monomode = 0;		} else {			--gs.cmptno;		}	} else {		gs.monomode = 1;		gs.cmptno = jas_image_numcmpts(gs.image) - 1;	}	render();	glutPostRedisplay();}static void nextimage(){	int n;	unloadimage();	for (n = cmdopts.numfiles; n > 0; --n) {		++gs.filenum;		if (gs.filenum >= cmdopts.numfiles) {			if (cmdopts.loop) {				gs.filenum = 0;			} else {				cleanupandexit(EXIT_SUCCESS);			}		}		if (!loadimage()) {			return;		}		fprintf(stderr, "cannot load image\n");	}	cleanupandexit(EXIT_SUCCESS);}static void previmage(){	int n;	unloadimage();	for (n = cmdopts.numfiles; n > 0; --n) {		--gs.filenum;		if (gs.filenum < 0) {			if (cmdopts.loop) {				gs.filenum = cmdopts.numfiles - 1;			} else {				cleanupandexit(EXIT_SUCCESS);			}		}		if (!loadimage()) {			return;		}	}	cleanupandexit(EXIT_SUCCESS);}static int loadimage(){	int reshapeflag;	jas_stream_t *in;	int scrnwidth;	int scrnheight;	int vh;	int vw;	char *pathname;	jas_cmprof_t *outprof;	assert(!gs.image);	assert(!gs.altimage);	gs.image = 0;	gs.altimage = 0;	pathname = cmdopts.filenames[gs.filenum];	if (pathname && pathname[0] != '\0') {		if (cmdopts.verbose) {			fprintf(stderr, "opening file %s\n", pathname);		}		/* The input image is to be read from a file. */		if (!(in = jas_stream_fopen(pathname, "rb"))) {			fprintf(stderr, "error: cannot open file %s\n", pathname);			goto error;		}	} else {		/* The input image is to be read from standard input. */		in = streamin;	}	if (cmdopts.verbose) {		fprintf(stderr, "decoding image\n");	}	/* Get the input image data. */	if (!(gs.image = jas_image_decode(in, -1, 0))) {		fprintf(stderr, "error: cannot load image data\n");		goto error;	}	/* Close the input stream. */	if (in != streamin) {		jas_stream_close(in);	}	if (cmdopts.verbose) {		fprintf(stderr, "creating color profile\n");	}	if (!(outprof = jas_cmprof_createfromclrspc(JAS_CLRSPC_SRGB)))		goto error;	if (!(gs.altimage = jas_image_chclrspc(gs.image, outprof, JAS_CMXFORM_INTENT_PER)))		goto error;	vw = jas_image_width(gs.image);	vh = jas_image_height(gs.image);	gs.botleftx = jas_image_tlx(gs.image);	gs.botlefty = jas_image_tly(gs.image);	gs.toprightx = jas_image_brx(gs.image);	gs.toprighty = jas_image_bry(gs.image);	if (gs.altimage) {		gs.monomode = 0;	} else {		gs.monomode = 1;		gs.cmptno = 0;	}	if (cmdopts.verbose) {		fprintf(stderr, "num of components %d\n", jas_image_numcmpts(gs.image));		fprintf(stderr, "dimensions %d %d\n", jas_image_width(gs.image), jas_image_height(gs.image));	}	gs.viewportwidth = vw;	gs.viewportheight = vh;	pixmap_resize(&gs.vp, vw, vh);	if (cmdopts.verbose) {		fprintf(stderr, "preparing image for viewing\n");	}	render();	if (cmdopts.verbose) {		fprintf(stderr, "done preparing image for viewing\n");	}	if (vw != glutGet(GLUT_WINDOW_WIDTH) ||	  vh != glutGet(GLUT_WINDOW_HEIGHT)) {		glutReshapeWindow(vw, vh);	}	if (cmdopts.title) {		glutSetWindowTitle(cmdopts.title);	} else {		glutSetWindowTitle((pathname && pathname[0] != '\0') ? pathname :		  "stdin");	}	/* If we reshaped the window, GLUT will automatically invoke both	  the reshape and display callback (in this order).  Therefore, we	  only need to explicitly force the display callback to be invoked	  if the window was not reshaped. */	glutPostRedisplay();	if (cmdopts.tmout != 0) {		glutTimerFunc(cmdopts.tmout, timerfunc, gs.nexttmid);		gs.activetmid = gs.nexttmid;		++gs.nexttmid;	}	return 0;error:	unloadimage();	return -1;}static void unloadimage(){	if (gs.image) {		jas_image_destroy(gs.image);		gs.image = 0;	}	if (gs.altimage) {		jas_image_destroy(gs.altimage);		gs.altimage = 0;	}}/******************************************************************************\*\******************************************************************************/static void pixmap_clear(pixmap_t *p){	memset(p->data, 0, 4 * p->width * p->height * sizeof(GLshort));}static int pixmap_resize(pixmap_t *p, int w, int h){	p->width = w;	p->height = h;	if (!(p->data = realloc(p->data, w * h * 4 * sizeof(GLshort)))) {		return -1;	}	return 0;}static void dumpstate(){	printf("blx=%f bly=%f trx=%f try=%f\n", gs.botleftx, gs.botlefty, gs.toprightx, gs.toprighty);}#define	vctocc(i, co, cs, vo, vs) \  (((vo) + (i) * (vs) - (co)) / (cs))static int jas_image_render(jas_image_t *image, float vtlx, float vtly,  float vsx, float vsy, int vw, int vh, GLshort *vdata){	int i;	int j;	int k;	int x;	int y;	int v[3];	GLshort *vdatap;	int cmptlut[3];	int width;	int height;	int hs;	int vs;	int tlx;	int tly;	if ((cmptlut[0] = jas_image_getcmptbytype(image,	  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_R))) < 0 ||	  (cmptlut[1] = jas_image_getcmptbytype(image,	  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_G))) < 0 ||	  (cmptlut[2] = jas_image_getcmptbytype(image,	  JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_B))) < 0)		goto error;	width = jas_image_cmptwidth(image, cmptlut[0]);	height = jas_image_cmptheight(image, cmptlut[0]);	tlx = jas_image_cmpttlx(image, cmptlut[0]);	tly = jas_image_cmpttly(image, cmptlut[0]);	vs = jas_image_cmptvstep(image, cmptlut[0]);	hs = jas_image_cmpthstep(image, cmptlut[0]);	for (i = 1; i < 3; ++i) {		if (jas_image_cmptwidth(image, cmptlut[i]) != width ||		  jas_image_cmptheight(image, cmptlut[i]) != height)			goto error;	}	for (i = 0; i < vh; ++i) {		vdatap = &vdata[(vh - 1 - i) * (4 * vw)];		for (j = 0; j < vw; ++j) {			x = vctocc(j, tlx, hs, vtlx, vsx);			y = vctocc(i, tly, vs, vtly, vsy);			if (x >= 0 && x < width && y >= 0 && y < height) {				for (k = 0; k < 3; ++k) {					v[k] = jas_image_readcmptsample(image, cmptlut[k], x, y);					v[k] <<= 16 - jas_image_cmptprec(image, cmptlut[k]);					if (v[k] < 0) {						v[k] = 0;					} else if (v[k] > 65535) {						v[k] = 65535;					}				}			} else {				v[0] = 0;				v[1] = 0;				v[2] = 0;			}				*vdatap++ = v[0];			*vdatap++ = v[1];			*vdatap++ = v[2];			*vdatap++ = 0;		}	}	return 0;error:	return -1;}static int jas_image_render2(jas_image_t *image, int cmptno, float vtlx,  float vtly, float vsx, float vsy, int vw, int vh, GLshort *vdata){	int i;	int j;	int x;	int y;	int v;	GLshort *vdatap;	if (cmptno < 0 || cmptno >= image->numcmpts_) {		fprintf(stderr, "bad parameter\n");		goto error;	}	for (i = 0; i < vh; ++i) {		vdatap = &vdata[(vh - 1 - i) * (4 * vw)];		for (j = 0; j < vw; ++j) {			x = vctocc(j, jas_image_cmpttlx(image, cmptno), jas_image_cmpthstep(image, cmptno), vtlx, vsx);			y = vctocc(i, jas_image_cmpttly(image, cmptno), jas_image_cmptvstep(image, cmptno), vtly, vsy);			v = (x >= 0 && x < jas_image_cmptwidth(image, cmptno) && y >=0 && y < jas_image_cmptheight(image, cmptno)) ? jas_image_readcmptsample(image, cmptno, x, y) : 0;			v <<= 16 - jas_image_cmptprec(image, cmptno);			if (v < 0) {				v = 0;			} else if (v > 65535) {				v = 65535;			}			*vdatap++ = v;			*vdatap++ = v;			*vdatap++ = v;			*vdatap++ = 0;		}	}	return 0;error:	return -1;}static void render(){	float vtlx;	float vtly;	vtlx = gs.botleftx;	vtly = gs.toprighty;	if (cmdopts.verbose) {//		fprintf(stderr, "vtlx=%f, vtly=%f, vsx=%f, vsy=%f\n",//		  vtlx, vtly, gs.sx, gs.sy);	}	if (gs.monomode) {		if (cmdopts.verbose) {			fprintf(stderr, "component %d\n", gs.cmptno);		}		jas_image_render2(gs.image, gs.cmptno, 0.0, 0.0,		  1.0, 1.0, gs.vp.width, gs.vp.height, gs.vp.data);	} else {		if (cmdopts.verbose) {			fprintf(stderr, "color\n");		}		jas_image_render(gs.altimage, 0.0, 0.0, 1.0, 1.0,		  gs.vp.width, gs.vp.height, gs.vp.data);	}}#if 0#define	vctocc(i, co, cs, vo, vs) \  (((vo) + (i) * (vs) - (co)) / (cs))static void drawview(jas_image_t *image, float vtlx, float vtly,  float sx, float sy, pixmap_t *p){	int i;	int j;	int k;	int red;	int grn;	int blu;	int lum;	GLshort *datap;	int x;	int y;	int *cmptlut;	int numcmpts;	int v[4];	int u[4];	int color;	cmptlut = gs.cmptlut;	switch (jas_image_colorspace(gs.image)) {	case JAS_IMAGE_CS_RGB:	case JAS_IMAGE_CS_YCBCR:		color = 1;		numcmpts = 3;		break;	case JAS_IMAGE_CS_GRAY:	default:		numcmpts = 1;		color = 0;		break;	}	for (i = 0; i < p->height; ++i) {		datap = &p->data[(p->height - 1 - i) * (4 * p->width)];		for (j = 0; j < p->width; ++j) {			if (!gs.monomode && color) {				for (k = 0; k < numcmpts; ++k) {					x = vctocc(j, jas_image_cmpttlx(gs.image, cmptlut[k]), jas_image_cmpthstep(gs.image, cmptlut[k]), vtlx, sx);					y = vctocc(i, jas_image_cmpttly(gs.image, cmptlut[k]), jas_image_cmptvstep(gs.image, cmptlut[k]), vtly, sy);					v[k] = (x >= 0 && x < jas_image_cmptwidth(gs.image, cmptlut[k]) && y >=0 && y < jas_image_cmptheight(gs.image, cmptlut[k])) ? jas_matrix_get(gs.cmpts[cmptlut[k]], y, x) : 0;					v[k] <<= 16 - jas_image_cmptprec(gs.image, cmptlut[k]);				}				switch (jas_image_colorspace(gs.image)) {				case JAS_IMAGE_CS_RGB:					break;				case JAS_IMAGE_CS_YCBCR:					u[0] = (1/1.772) * (v[0] + 1.402 * v[2]);					u[1] = (1/1.772) * (v[0] - 0.34413 * v[1] - 0.71414 * v[2]);					u[2] = (1/1.772) * (v[0] + 1.772 * v[1]);					v[0] = u[0];					v[1] = u[1];					v[2] = u[2];					break;				}			} else {				x = vctocc(j, jas_image_cmpttlx(gs.image, gs.cmptno), jas_image_cmpthstep(gs.image, gs.cmptno), vtlx, sx);				y = vctocc(i, jas_image_cmpttly(gs.image, gs.cmptno), jas_image_cmptvstep(gs.image, gs.cmptno), vtly, sy);				v[0] = (x >= 0 && x < jas_image_cmptwidth(gs.image, gs.cmptno) && y >=0 && y < jas_image_cmptheight(gs.image, gs.cmptno)) ? jas_matrix_get(gs.cmpts[gs.cmptno], y, x) : 0;				v[0] <<= 16 - jas_image_cmptprec(gs.image, gs.cmptno);				v[1] = v[0];				v[2] = v[0];				v[3] = 0;			}for (k = 0; k < 3; ++k) {	if (v[k] < 0) {		v[k] = 0;	} else if (v[k] > 65535) {		v[k] = 65535;	}}			*datap++ = v[0];			*datap++ = v[1];			*datap++ = v[2];			*datap++ = 0;		}	}}#endifstatic void cleanupandexit(int status){	unloadimage();	exit(status);}static void init(){	gs.filenum = -1;	gs.image = 0;	gs.altimage = 0;	gs.nexttmid = 0;	gs.vp.width = 0;	gs.vp.height = 0;	gs.vp.data = 0;	gs.viewportwidth = -1;	gs.viewportheight = -1;}

⌨️ 快捷键说明

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