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

📄 jpc_cs.c

📁 用C语言实现的JPEG编码
💻 C
📖 第 1 页 / 共 4 页
字号:
static int jpc_rgn_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_rgn_t *rgn = &ms->parms.rgn;	uint_fast8_t tmp;	if (cstate->numcomps <= 256) {		if (jpc_getuint8(in, &tmp)) {			return -1;		}		rgn->compno = tmp;	} else {		if (jpc_getuint16(in, &rgn->compno)) {			return -1;		}	}	if (jpc_getuint8(in, &rgn->roisty) ||	  jpc_getuint8(in, &rgn->roishift)) {		return -1;	}	return 0;}static int jpc_rgn_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_rgn_t *rgn = &ms->parms.rgn;	if (cstate->numcomps <= 256) {		if (jpc_putuint8(out, rgn->compno)) {			return -1;		}	} else {		if (jpc_putuint16(out, rgn->compno)) {			return -1;		}	}	if (jpc_putuint8(out, rgn->roisty) ||	  jpc_putuint8(out, rgn->roishift)) {		return -1;	}	return 0;}static int jpc_rgn_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_rgn_t *rgn = &ms->parms.rgn;	fprintf(out, "compno = %d; roisty = %d; roishift = %d\n",	  rgn->compno, rgn->roisty, rgn->roishift);	return 0;}/******************************************************************************\* QCD marker segment operations.\******************************************************************************/static void jpc_qcd_destroyparms(jpc_ms_t *ms){	jpc_qcd_t *qcd = &ms->parms.qcd;	jpc_qcx_destroycompparms(&qcd->compparms);}static int jpc_qcd_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_qcxcp_t *compparms = &ms->parms.qcd.compparms;	return jpc_qcx_getcompparms(compparms, cstate, in, ms->len);}static int jpc_qcd_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_qcxcp_t *compparms = &ms->parms.qcd.compparms;	return jpc_qcx_putcompparms(compparms, cstate, out);}static int jpc_qcd_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_qcd_t *qcd = &ms->parms.qcd;	int i;	fprintf(out, "qntsty = %d; numguard = %d; numstepsizes = %d\n",	  (int) qcd->compparms.qntsty, qcd->compparms.numguard, qcd->compparms.numstepsizes);	for (i = 0; i < qcd->compparms.numstepsizes; ++i) {		fprintf(out, "expn[%d] = 0x%04x; mant[%d] = 0x%04x;\n",		  i, (unsigned) JPC_QCX_GETEXPN(qcd->compparms.stepsizes[i]),		  i, (unsigned) JPC_QCX_GETMANT(qcd->compparms.stepsizes[i]));	}	return 0;}/******************************************************************************\* QCC marker segment operations.\******************************************************************************/static void jpc_qcc_destroyparms(jpc_ms_t *ms){	jpc_qcc_t *qcc = &ms->parms.qcc;	jpc_qcx_destroycompparms(&qcc->compparms);}static int jpc_qcc_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_qcc_t *qcc = &ms->parms.qcc;	uint_fast8_t tmp;	int len;	len = ms->len;	if (cstate->numcomps <= 256) {		jpc_getuint8(in, &tmp);		qcc->compno = tmp;		--len;	} else {		jpc_getuint16(in, &qcc->compno);		len -= 2;	}	if (jpc_qcx_getcompparms(&qcc->compparms, cstate, in, len)) {		return -1;	}	if (jas_stream_eof(in)) {		jpc_qcc_destroyparms(ms);		return -1;	}	return 0;}static int jpc_qcc_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_qcc_t *qcc = &ms->parms.qcc;	if (cstate->numcomps <= 256) {		jpc_putuint8(out, qcc->compno);	} else {		jpc_putuint16(out, qcc->compno);	}	if (jpc_qcx_putcompparms(&qcc->compparms, cstate, out)) {		return -1;	}	return 0;}static int jpc_qcc_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_qcc_t *qcc = &ms->parms.qcc;	int i;	fprintf(out, "compno = %d; qntsty = %d; numguard = %d; "	  "numstepsizes = %d\n", qcc->compno, qcc->compparms.qntsty, qcc->compparms.numguard,	  qcc->compparms.numstepsizes);	for (i = 0; i < qcc->compparms.numstepsizes; ++i) {		fprintf(out, "expn[%d] = 0x%04x; mant[%d] = 0x%04x;\n",		  i, (unsigned) JPC_QCX_GETEXPN(qcc->compparms.stepsizes[i]),		  i, (unsigned) JPC_QCX_GETMANT(qcc->compparms.stepsizes[i]));	}	return 0;}/******************************************************************************\* QCD/QCC marker segment helper functions.\******************************************************************************/static void jpc_qcx_destroycompparms(jpc_qcxcp_t *compparms){	if (compparms->stepsizes) {		jas_free(compparms->stepsizes);	}}static int jpc_qcx_getcompparms(jpc_qcxcp_t *compparms, jpc_cstate_t *cstate,  jas_stream_t *in, uint_fast16_t len){	uint_fast8_t tmp;	int n;	int i;	/* Eliminate compiler warning about unused variables. */	cstate = 0;	n = 0;	jpc_getuint8(in, &tmp);	++n;	compparms->qntsty = tmp & 0x1f;	compparms->numguard = (tmp >> 5) & 7;	switch (compparms->qntsty) {	case JPC_QCX_SIQNT:		compparms->numstepsizes = 1;		break;	case JPC_QCX_NOQNT:		compparms->numstepsizes = (len - n);		break;	case JPC_QCX_SEQNT:		/* XXX - this is a hack */		compparms->numstepsizes = (len - n) / 2;		break;	}if (compparms->numstepsizes > 0) {	compparms->stepsizes = jas_malloc(compparms->numstepsizes *	  sizeof(uint_fast32_t));	assert(compparms->stepsizes);	for (i = 0; i < compparms->numstepsizes; ++i) {		if (compparms->qntsty == JPC_QCX_NOQNT) {			jpc_getuint8(in, &tmp);			compparms->stepsizes[i] = JPC_QCX_EXPN(tmp >> 3);		} else {			jpc_getuint16(in, &compparms->stepsizes[i]);		}	}} else {	compparms->stepsizes = 0;}	if (jas_stream_error(in) || jas_stream_eof(in)) {		jpc_qcx_destroycompparms(compparms);		return -1;	}	return 0;}static int jpc_qcx_putcompparms(jpc_qcxcp_t *compparms, jpc_cstate_t *cstate,  jas_stream_t *out){	int i;	/* Eliminate compiler warning about unused variables. */	cstate = 0;	jpc_putuint8(out, ((compparms->numguard & 7) << 5) | compparms->qntsty);	for (i = 0; i < compparms->numstepsizes; ++i) {		if (compparms->qntsty == JPC_QCX_NOQNT) {			jpc_putuint8(out, JPC_QCX_GETEXPN(			  compparms->stepsizes[i]) << 3);		} else {			jpc_putuint16(out, compparms->stepsizes[i]);		}	}	return 0;}/******************************************************************************\* SOP marker segment operations.\******************************************************************************/static int jpc_sop_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_sop_t *sop = &ms->parms.sop;	/* Eliminate compiler warning about unused variable. */	cstate = 0;	if (jpc_getuint16(in, &sop->seqno)) {		return -1;	}	return 0;}static int jpc_sop_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_sop_t *sop = &ms->parms.sop;	/* Eliminate compiler warning about unused variable. */	cstate = 0;	if (jpc_putuint16(out, sop->seqno)) {		return -1;	}	return 0;}static int jpc_sop_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_sop_t *sop = &ms->parms.sop;	fprintf(out, "seqno = %d;\n", sop->seqno);	return 0;}/******************************************************************************\* PPM marker segment operations.\******************************************************************************/static void jpc_ppm_destroyparms(jpc_ms_t *ms){	jpc_ppm_t *ppm = &ms->parms.ppm;	if (ppm->data) {		jas_free(ppm->data);	}}static int jpc_ppm_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_ppm_t *ppm = &ms->parms.ppm;	/* Eliminate compiler warning about unused variables. */	cstate = 0;	ppm->data = 0;	if (ms->len < 1) {		goto error;	}	if (jpc_getuint8(in, &ppm->ind)) {		goto error;	}	ppm->len = ms->len - 1;	if (ppm->len > 0) {		if (!(ppm->data = jas_malloc(ppm->len * sizeof(unsigned char)))) {			goto error;		}		if (JAS_CAST(uint, jas_stream_read(in, ppm->data, ppm->len)) != ppm->len) {			goto error;		}	} else {		ppm->data = 0;	}	return 0;error:	jpc_ppm_destroyparms(ms);	return -1;}static int jpc_ppm_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_ppm_t *ppm = &ms->parms.ppm;	/* Eliminate compiler warning about unused variables. */	cstate = 0;	if (JAS_CAST(uint, jas_stream_write(out, (char *) ppm->data, ppm->len)) != ppm->len) {		return -1;	}	return 0;}static int jpc_ppm_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_ppm_t *ppm = &ms->parms.ppm;	fprintf(out, "ind=%d; len = %d;\n", ppm->ind, ppm->len);	if (ppm->len > 0) {		fprintf(out, "data =\n");		jas_memdump(out, ppm->data, ppm->len);	}	return 0;}/******************************************************************************\* PPT marker segment operations.\******************************************************************************/static void jpc_ppt_destroyparms(jpc_ms_t *ms){	jpc_ppt_t *ppt = &ms->parms.ppt;	if (ppt->data) {		jas_free(ppt->data);	}}static int jpc_ppt_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_ppt_t *ppt = &ms->parms.ppt;	/* Eliminate compiler warning about unused variables. */	cstate = 0;	ppt->data = 0;	if (ms->len < 1) {		goto error;	}	if (jpc_getuint8(in, &ppt->ind)) {		goto error;	}	ppt->len = ms->len - 1;	if (ppt->len > 0) {		if (!(ppt->data = jas_malloc(ppt->len * sizeof(unsigned char)))) {			goto error;		}		if (jas_stream_read(in, (char *) ppt->data, ppt->len) != JAS_CAST(int, ppt->len)) {			goto error;		}	} else {		ppt->data = 0;	}	return 0;error:	jpc_ppt_destroyparms(ms);	return -1;}static int jpc_ppt_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_ppt_t *ppt = &ms->parms.ppt;	/* Eliminate compiler warning about unused variable. */	cstate = 0;	if (jpc_putuint8(out, ppt->ind)) {		return -1;	}	if (jas_stream_write(out, (char *) ppt->data, ppt->len) != JAS_CAST(int, ppt->len)) {		return -1;	}	return 0;}static int jpc_ppt_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_ppt_t *ppt = &ms->parms.ppt;	fprintf(out, "ind=%d; len = %d;\n", ppt->ind, ppt->len);	if (ppt->len > 0) {		fprintf(out, "data =\n");		jas_memdump(out, ppt->data, ppt->len);	}	return 0;}/******************************************************************************\* POC marker segment operations.\******************************************************************************/static void jpc_poc_destroyparms(jpc_ms_t *ms){	jpc_poc_t *poc = &ms->parms.poc;	if (poc->pchgs) {		jas_free(poc->pchgs);	}}static int jpc_poc_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_poc_t *poc = &ms->parms.poc;	jpc_pocpchg_t *pchg;	int pchgno;

⌨️ 快捷键说明

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