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

📄 jpc_t2enc.c

📁 用C语言实现的JPEG编码
💻 C
📖 第 1 页 / 共 2 页
字号:
				}			}			if (jpc_putcommacode(outb, maxadjust)) {				return -1;			}			cblk->numlenbits += maxadjust;			lastpass = endpass - 1;			n = startpass->start;			passcount = 1;			for (pass = startpass; pass != endpass; ++pass) {				if (pass->term || pass == lastpass) {					datalen = pass->end - n;assert(jpc_firstone(datalen) < cblk->numlenbits + jpc_floorlog2(passcount));					if (jpc_bitstream_putbits(outb, cblk->numlenbits + jpc_floorlog2(passcount), datalen) == EOF) {						return -1;					}					n += datalen;					passcount = 1;				} else {					++passcount;				}			}		}	}	jpc_bitstream_outalign(outb, 0);	jpc_bitstream_close(outb);	if (cp->tcp.csty & JPC_COD_EPH) {		if (!(ms = jpc_ms_create(JPC_MS_EPH))) {			return -1;		}		jpc_putms(out, enc->cstate, ms);		jpc_ms_destroy(ms);	}	comp = &tile->tcmpts[compno];	lvl = &comp->rlvls[lvlno];	endbands = &lvl->bands[lvl->numbands];	for (band = lvl->bands; band != endbands; ++band) {		if (!band->data) {			continue;		}		prc = &band->prcs[prcno];		if (!prc->cblks) {			continue;		}		endcblks = &prc->cblks[prc->numcblks];		for (cblk = prc->cblks; cblk != endcblks; ++cblk) {			pass = cblk->curpass;			if (!pass) {				continue;			}			if (pass->lyrno != lyrno) {				assert(pass->lyrno < 0 || pass->lyrno > lyrno);				continue;			}			endpasses = &cblk->passes[cblk->numpasses];			startpass = pass;			endpass = startpass;			while (endpass != endpasses && endpass->lyrno == lyrno){				++endpass;			}			lastpass = endpass - 1;			numnewpasses = endpass - startpass;			jas_stream_seek(cblk->stream, startpass->start, SEEK_SET);			assert(jas_stream_tell(cblk->stream) == startpass->start);			if (jas_stream_copy(out, cblk->stream, lastpass->end - startpass->start)) {				return -1;			}			cblk->curpass = (endpass != endpasses) ? endpass : 0;			cblk->numencpasses += numnewpasses;		}	}	return 0;}void jpc_save_t2state(jpc_enc_t *enc){/* stream pos in embedded T1 stream may be wrong since not saved/restored! */	jpc_enc_tcmpt_t *comp;	jpc_enc_tcmpt_t *endcomps;	jpc_enc_rlvl_t *lvl;	jpc_enc_rlvl_t *endlvls;	jpc_enc_band_t *band;	jpc_enc_band_t *endbands;	jpc_enc_cblk_t *cblk;	jpc_enc_cblk_t *endcblks;	jpc_enc_tile_t *tile;	int prcno;	jpc_enc_prc_t *prc;	tile = enc->curtile;	endcomps = &tile->tcmpts[tile->numtcmpts];	for (comp = tile->tcmpts; comp != endcomps; ++comp) {		endlvls = &comp->rlvls[comp->numrlvls];		for (lvl = comp->rlvls; lvl != endlvls; ++lvl) {			if (!lvl->bands) {				continue;			}			endbands = &lvl->bands[lvl->numbands];			for (band = lvl->bands; band != endbands; ++band) {				if (!band->data) {					continue;				}				for (prcno = 0, prc = band->prcs; prcno < lvl->numprcs; ++prcno, ++prc) {					if (!prc->cblks) {						continue;					}					jpc_tagtree_copy(prc->savincltree, prc->incltree);					jpc_tagtree_copy(prc->savnlibtree, prc->nlibtree);					endcblks = &prc->cblks[prc->numcblks];					for (cblk = prc->cblks; cblk != endcblks; ++cblk) {						cblk->savedcurpass = cblk->curpass;						cblk->savednumencpasses = cblk->numencpasses;						cblk->savednumlenbits = cblk->numlenbits;					}				}			}		}	}}void jpc_restore_t2state(jpc_enc_t *enc){	jpc_enc_tcmpt_t *comp;	jpc_enc_tcmpt_t *endcomps;	jpc_enc_rlvl_t *lvl;	jpc_enc_rlvl_t *endlvls;	jpc_enc_band_t *band;	jpc_enc_band_t *endbands;	jpc_enc_cblk_t *cblk;	jpc_enc_cblk_t *endcblks;	jpc_enc_tile_t *tile;	int prcno;	jpc_enc_prc_t *prc;	tile = enc->curtile;	endcomps = &tile->tcmpts[tile->numtcmpts];	for (comp = tile->tcmpts; comp != endcomps; ++comp) {		endlvls = &comp->rlvls[comp->numrlvls];		for (lvl = comp->rlvls; lvl != endlvls; ++lvl) {			if (!lvl->bands) {				continue;			}			endbands = &lvl->bands[lvl->numbands];			for (band = lvl->bands; band != endbands; ++band) {				if (!band->data) {					continue;				}				for (prcno = 0, prc = band->prcs; prcno < lvl->numprcs; ++prcno, ++prc) {					if (!prc->cblks) {						continue;					}					jpc_tagtree_copy(prc->incltree, prc->savincltree);					jpc_tagtree_copy(prc->nlibtree, prc->savnlibtree);					endcblks = &prc->cblks[prc->numcblks];					for (cblk = prc->cblks; cblk != endcblks; ++cblk) {						cblk->curpass = cblk->savedcurpass;						cblk->numencpasses = cblk->savednumencpasses;						cblk->numlenbits = cblk->savednumlenbits;					}				}			}		}	}}void jpc_init_t2state(jpc_enc_t *enc, int raflag){/* It is assumed that band->numbps and cblk->numbps precomputed */	jpc_enc_tcmpt_t *comp;	jpc_enc_tcmpt_t *endcomps;	jpc_enc_rlvl_t *lvl;	jpc_enc_rlvl_t *endlvls;	jpc_enc_band_t *band;	jpc_enc_band_t *endbands;	jpc_enc_cblk_t *cblk;	jpc_enc_cblk_t *endcblks;	jpc_enc_pass_t *pass;	jpc_enc_pass_t *endpasses;	jpc_tagtreenode_t *leaf;	jpc_enc_tile_t *tile;	int prcno;	jpc_enc_prc_t *prc;	tile = enc->curtile;	endcomps = &tile->tcmpts[tile->numtcmpts];	for (comp = tile->tcmpts; comp != endcomps; ++comp) {		endlvls = &comp->rlvls[comp->numrlvls];		for (lvl = comp->rlvls; lvl != endlvls; ++lvl) {			if (!lvl->bands) {				continue;			}			endbands = &lvl->bands[lvl->numbands];			for (band = lvl->bands; band != endbands; ++band) {				if (!band->data) {					continue;				}				for (prcno = 0, prc = band->prcs; prcno < lvl->numprcs; ++prcno, ++prc) {					if (!prc->cblks) {						continue;					}					jpc_tagtree_reset(prc->incltree);					jpc_tagtree_reset(prc->nlibtree);					endcblks = &prc->cblks[prc->numcblks];					for (cblk = prc->cblks; cblk != endcblks; ++cblk) {						if (jas_stream_rewind(cblk->stream)) {							assert(0);						}						cblk->curpass = (cblk->numpasses > 0) ? cblk->passes : 0;						cblk->numencpasses = 0;						cblk->numlenbits = 3;						cblk->numimsbs = band->numbps - cblk->numbps;						assert(cblk->numimsbs >= 0);						leaf = jpc_tagtree_getleaf(prc->nlibtree, cblk - prc->cblks);						jpc_tagtree_setvalue(prc->nlibtree, leaf, cblk->numimsbs);						if (raflag) {							endpasses = &cblk->passes[cblk->numpasses];							for (pass = cblk->passes; pass != endpasses; ++pass) {								pass->lyrno = -1;								pass->lyrno = 0;							}						}					}				}			}		}	}}jpc_pi_t *jpc_enc_pi_create(jpc_enc_cp_t *cp, jpc_enc_tile_t *tile){	jpc_pi_t *pi;	int compno;	jpc_picomp_t *picomp;	jpc_pirlvl_t *pirlvl;	jpc_enc_tcmpt_t *tcomp;	int rlvlno;	jpc_enc_rlvl_t *rlvl;	int prcno;	int *prclyrno;	if (!(pi = jpc_pi_create0())) {		return 0;	}	pi->pktno = -1;	pi->numcomps = cp->numcmpts;	if (!(pi->picomps = jas_malloc(pi->numcomps * sizeof(jpc_picomp_t)))) {		jpc_pi_destroy(pi);		return 0;	}	for (compno = 0, picomp = pi->picomps; compno < pi->numcomps; ++compno,	  ++picomp) {		picomp->pirlvls = 0;	}	for (compno = 0, tcomp = tile->tcmpts, picomp = pi->picomps;	  compno < pi->numcomps; ++compno, ++tcomp, ++picomp) {		picomp->numrlvls = tcomp->numrlvls;		if (!(picomp->pirlvls = jas_malloc(picomp->numrlvls *		  sizeof(jpc_pirlvl_t)))) {			jpc_pi_destroy(pi);			return 0;		}		for (rlvlno = 0, pirlvl = picomp->pirlvls; rlvlno <		  picomp->numrlvls; ++rlvlno, ++pirlvl) {			pirlvl->prclyrnos = 0;		}		for (rlvlno = 0, pirlvl = picomp->pirlvls, rlvl = tcomp->rlvls;		  rlvlno < picomp->numrlvls; ++rlvlno, ++pirlvl, ++rlvl) {/* XXX sizeof(long) should be sizeof different type */			pirlvl->numprcs = rlvl->numprcs;			if (rlvl->numprcs) {				if (!(pirlvl->prclyrnos = jas_malloc(pirlvl->numprcs *				  sizeof(long)))) {					jpc_pi_destroy(pi);					return 0;				}			} else {				pirlvl->prclyrnos = 0;			}		}	}	pi->maxrlvls = 0;	for (compno = 0, tcomp = tile->tcmpts, picomp = pi->picomps;	  compno < pi->numcomps; ++compno, ++tcomp, ++picomp) {		picomp->hsamp = cp->ccps[compno].sampgrdstepx;		picomp->vsamp = cp->ccps[compno].sampgrdstepy;		for (rlvlno = 0, pirlvl = picomp->pirlvls, rlvl = tcomp->rlvls;		  rlvlno < picomp->numrlvls; ++rlvlno, ++pirlvl, ++rlvl) {			pirlvl->prcwidthexpn = rlvl->prcwidthexpn;			pirlvl->prcheightexpn = rlvl->prcheightexpn;			for (prcno = 0, prclyrno = pirlvl->prclyrnos;			  prcno < pirlvl->numprcs; ++prcno, ++prclyrno) {				*prclyrno = 0;			}			pirlvl->numhprcs = rlvl->numhprcs;		}		if (pi->maxrlvls < tcomp->numrlvls) {			pi->maxrlvls = tcomp->numrlvls;		}	}	pi->numlyrs = tile->numlyrs;	pi->xstart = tile->tlx;	pi->ystart = tile->tly;	pi->xend = tile->brx;	pi->yend = tile->bry;	pi->picomp = 0;	pi->pirlvl = 0;	pi->x = 0;	pi->y = 0;	pi->compno = 0;	pi->rlvlno = 0;	pi->prcno = 0;	pi->lyrno = 0;	pi->xstep = 0;	pi->ystep = 0;	pi->pchgno = -1;	pi->defaultpchg.prgord = tile->prg;	pi->defaultpchg.compnostart = 0;	pi->defaultpchg.compnoend = pi->numcomps;	pi->defaultpchg.rlvlnostart = 0;	pi->defaultpchg.rlvlnoend = pi->maxrlvls;	pi->defaultpchg.lyrnoend = pi->numlyrs;	pi->pchg = 0;	pi->valid = 0;	return pi;}

⌨️ 快捷键说明

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