📄 jpc_cs.c
字号:
fprintf(out, "\n");
}
} else {
fprintf(out, "\n");
}
}
/******************************************************************************\
* SOT marker segment operations.
\******************************************************************************/
static int jpc_sot_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in)
{
jpc_sot_t *sot = &ms->parms.sot;
/* Eliminate compiler warning about unused variables. */
cstate = 0;
if (jpc_getuint16(in, &sot->tileno) ||
jpc_getuint32(in, &sot->len) ||
jpc_getuint8(in, &sot->partno) ||
jpc_getuint8(in, &sot->numparts)) {
return -1;
}
if (jas_stream_eof(in)) {
return -1;
}
return 0;
}
static int jpc_sot_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out)
{
jpc_sot_t *sot = &ms->parms.sot;
/* Eliminate compiler warning about unused variables. */
cstate = 0;
if (jpc_putuint16(out, sot->tileno) ||
jpc_putuint32(out, sot->len) ||
jpc_putuint8(out, sot->partno) ||
jpc_putuint8(out, sot->numparts)) {
return -1;
}
return 0;
}
static int jpc_sot_dumpparms(jpc_ms_t *ms, FILE *out)
{
jpc_sot_t *sot = &ms->parms.sot;
fprintf(out, "tileno = %d; len = %d; partno = %d; numparts = %d\n",
sot->tileno, sot->len, sot->partno, sot->numparts);
return 0;
}
/******************************************************************************\
* SIZ marker segment operations.
\******************************************************************************/
static void jpc_siz_destroyparms(jpc_ms_t *ms)
{
jpc_siz_t *siz = &ms->parms.siz;
if (siz->comps) {
jas_free(siz->comps);
}
}
static int jpc_siz_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate,
jas_stream_t *in)
{
jpc_siz_t *siz = &ms->parms.siz;
unsigned int i;
uint_fast8_t tmp;
/* Eliminate compiler warning about unused variables. */
cstate = 0;
if (jpc_getuint16(in, &siz->caps) ||
jpc_getuint32(in, &siz->width) ||
jpc_getuint32(in, &siz->height) ||
jpc_getuint32(in, &siz->xoff) ||
jpc_getuint32(in, &siz->yoff) ||
jpc_getuint32(in, &siz->tilewidth) ||
jpc_getuint32(in, &siz->tileheight) ||
jpc_getuint32(in, &siz->tilexoff) ||
jpc_getuint32(in, &siz->tileyoff) ||
jpc_getuint16(in, &siz->numcomps)) {
return -1;
}
if (!siz->width || !siz->height || !siz->tilewidth ||
!siz->tileheight || !siz->numcomps) {
return -1;
}
if (!(siz->comps = jas_malloc(siz->numcomps * sizeof(jpc_sizcomp_t)))) {
return -1;
}
for (i = 0; i < siz->numcomps; ++i) {
if (jpc_getuint8(in, &tmp) ||
jpc_getuint8(in, &siz->comps[i].hsamp) ||
jpc_getuint8(in, &siz->comps[i].vsamp)) {
jas_free(siz->comps);
return -1;
}
siz->comps[i].sgnd = (tmp >> 7) & 1;
siz->comps[i].prec = (tmp & 0x7f) + 1;
}
if (jas_stream_eof(in)) {
jas_free(siz->comps);
return -1;
}
return 0;
}
static int jpc_siz_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out)
{
jpc_siz_t *siz = &ms->parms.siz;
unsigned int i;
/* Eliminate compiler warning about unused variables. */
cstate = 0;
assert(siz->width && siz->height && siz->tilewidth &&
siz->tileheight && siz->numcomps);
if (jpc_putuint16(out, siz->caps) ||
jpc_putuint32(out, siz->width) ||
jpc_putuint32(out, siz->height) ||
jpc_putuint32(out, siz->xoff) ||
jpc_putuint32(out, siz->yoff) ||
jpc_putuint32(out, siz->tilewidth) ||
jpc_putuint32(out, siz->tileheight) ||
jpc_putuint32(out, siz->tilexoff) ||
jpc_putuint32(out, siz->tileyoff) ||
jpc_putuint16(out, siz->numcomps)) {
return -1;
}
for (i = 0; i < siz->numcomps; ++i) {
if (jpc_putuint8(out, ((siz->comps[i].sgnd & 1) << 7) |
((siz->comps[i].prec - 1) & 0x7f)) ||
jpc_putuint8(out, siz->comps[i].hsamp) ||
jpc_putuint8(out, siz->comps[i].vsamp)) {
return -1;
}
}
return 0;
}
static int jpc_siz_dumpparms(jpc_ms_t *ms, FILE *out)
{
jpc_siz_t *siz = &ms->parms.siz;
unsigned int i;
fprintf(out, "caps = 0x%02x;\n", siz->caps);
fprintf(out, "width = %d; height = %d; xoff = %d; yoff = %d;\n",
siz->width, siz->height, siz->xoff, siz->yoff);
fprintf(out, "tilewidth = %d; tileheight = %d; tilexoff = %d; "
"tileyoff = %d;\n", siz->tilewidth, siz->tileheight, siz->tilexoff,
siz->tileyoff);
for (i = 0; i < siz->numcomps; ++i) {
fprintf(out, "prec[%d] = %d; sgnd[%d] = %d; hsamp[%d] = %d; "
"vsamp[%d] = %d\n", i, siz->comps[i].prec, i,
siz->comps[i].sgnd, i, siz->comps[i].hsamp, i,
siz->comps[i].vsamp);
}
return 0;
}
/******************************************************************************\
* COD marker segment operations.
\******************************************************************************/
static void jpc_cod_destroyparms(jpc_ms_t *ms)
{
jpc_cod_t *cod = &ms->parms.cod;
jpc_cox_destroycompparms(&cod->compparms);
}
static int jpc_cod_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in)
{
jpc_cod_t *cod = &ms->parms.cod;
if (jpc_getuint8(in, &cod->csty)) {
return -1;
}
if (jpc_getuint8(in, &cod->prg) ||
jpc_getuint16(in, &cod->numlyrs) ||
jpc_getuint8(in, &cod->mctrans)) {
return -1;
}
if (jpc_cox_getcompparms(ms, cstate, in,
(cod->csty & JPC_COX_PRT) != 0, &cod->compparms)) {
return -1;
}
if (jas_stream_eof(in)) {
jpc_cod_destroyparms(ms);
return -1;
}
return 0;
}
static int jpc_cod_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out)
{
jpc_cod_t *cod = &ms->parms.cod;
assert(cod->numlyrs > 0 && cod->compparms.numdlvls <= 32);
assert(cod->compparms.numdlvls == cod->compparms.numrlvls - 1);
if (jpc_putuint8(out, cod->compparms.csty) ||
jpc_putuint8(out, cod->prg) ||
jpc_putuint16(out, cod->numlyrs) ||
jpc_putuint8(out, cod->mctrans)) {
return -1;
}
if (jpc_cox_putcompparms(ms, cstate, out,
(cod->csty & JPC_COX_PRT) != 0, &cod->compparms)) {
return -1;
}
return 0;
}
static int jpc_cod_dumpparms(jpc_ms_t *ms, FILE *out)
{
jpc_cod_t *cod = &ms->parms.cod;
int i;
fprintf(out, "csty = 0x%02x;\n", cod->compparms.csty);
fprintf(out, "numdlvls = %d; qmfbid = %d; mctrans = %d\n",
cod->compparms.numdlvls, cod->compparms.qmfbid, cod->mctrans);
fprintf(out, "prg = %d; numlyrs = %d;\n",
cod->prg, cod->numlyrs);
fprintf(out, "cblkwidthval = %d; cblkheightval = %d; "
"cblksty = 0x%02x;\n", cod->compparms.cblkwidthval, cod->compparms.cblkheightval,
cod->compparms.cblksty);
if (cod->csty & JPC_COX_PRT) {
for (i = 0; i < cod->compparms.numrlvls; ++i) {
jas_eprintf("prcwidth[%d] = %d, prcheight[%d] = %d\n",
i, cod->compparms.rlvls[i].parwidthval,
i, cod->compparms.rlvls[i].parheightval);
}
}
return 0;
}
/******************************************************************************\
* COC marker segment operations.
\******************************************************************************/
static void jpc_coc_destroyparms(jpc_ms_t *ms)
{
jpc_coc_t *coc = &ms->parms.coc;
jpc_cox_destroycompparms(&coc->compparms);
}
static int jpc_coc_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in)
{
jpc_coc_t *coc = &ms->parms.coc;
uint_fast8_t tmp;
if (cstate->numcomps <= 256) {
if (jpc_getuint8(in, &tmp)) {
return -1;
}
coc->compno = tmp;
} else {
if (jpc_getuint16(in, &coc->compno)) {
return -1;
}
}
if (jpc_getuint8(in, &coc->compparms.csty)) {
return -1;
}
if (jpc_cox_getcompparms(ms, cstate, in,
(coc->compparms.csty & JPC_COX_PRT) != 0, &coc->compparms)) {
return -1;
}
if (jas_stream_eof(in)) {
return -1;
}
return 0;
}
static int jpc_coc_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out)
{
jpc_coc_t *coc = &ms->parms.coc;
assert(coc->compparms.numdlvls <= 32);
if (cstate->numcomps <= 256) {
if (jpc_putuint8(out, coc->compno)) {
return -1;
}
} else {
if (jpc_putuint16(out, coc->compno)) {
return -1;
}
}
if (jpc_putuint8(out, coc->compparms.csty)) {
return -1;
}
if (jpc_cox_putcompparms(ms, cstate, out,
(coc->compparms.csty & JPC_COX_PRT) != 0, &coc->compparms)) {
return -1;
}
return 0;
}
static int jpc_coc_dumpparms(jpc_ms_t *ms, FILE *out)
{
jpc_coc_t *coc = &ms->parms.coc;
fprintf(out, "compno = %d; csty = 0x%02x; numdlvls = %d;\n",
coc->compno, coc->compparms.csty, coc->compparms.numdlvls);
fprintf(out, "cblkwidthval = %d; cblkheightval = %d; "
"cblksty = 0x%02x; qmfbid = %d;\n", coc->compparms.cblkwidthval,
coc->compparms.cblkheightval, coc->compparms.cblksty, coc->compparms.qmfbid);
return 0;
}
/******************************************************************************\
* COD/COC marker segment operation helper functions.
\******************************************************************************/
static void jpc_cox_destroycompparms(jpc_coxcp_t *compparms)
{
/* Eliminate compiler warning about unused variables. */
compparms = 0;
}
static int jpc_cox_getcompparms(jpc_ms_t *ms, jpc_cstate_t *cstate,
jas_stream_t *in, int prtflag, jpc_coxcp_t *compparms)
{
uint_fast8_t tmp;
int i;
/* Eliminate compiler warning about unused variables. */
ms = 0;
cstate = 0;
if (jpc_getuint8(in, &compparms->numdlvls) ||
jpc_getuint8(in, &compparms->cblkwidthval) ||
jpc_getuint8(in, &compparms->cblkheightval) ||
jpc_getuint8(in, &compparms->cblksty) ||
jpc_getuint8(in, &compparms->qmfbid)) {
return -1;
}
compparms->numrlvls = compparms->numdlvls + 1;
if (prtflag) {
for (i = 0; i < compparms->numrlvls; ++i) {
if (jpc_getuint8(in, &tmp)) {
jpc_cox_destroycompparms(compparms);
return -1;
}
compparms->rlvls[i].parwidthval = tmp & 0xf;
compparms->rlvls[i].parheightval = (tmp >> 4) & 0xf;
}
/* Sigh. This bit should be in the same field in both COC and COD mrk segs. */
compparms->csty |= JPC_COX_PRT;
} else {
}
if (jas_stream_eof(in)) {
jpc_cox_destroycompparms(compparms);
return -1;
}
return 0;
}
static int jpc_cox_putcompparms(jpc_ms_t *ms, jpc_cstate_t *cstate,
jas_stream_t *out, int prtflag, jpc_coxcp_t *compparms)
{
int i;
assert(compparms->numdlvls <= 32);
/* Eliminate compiler warning about unused variables. */
ms = 0;
cstate = 0;
if (jpc_putuint8(out, compparms->numdlvls) ||
jpc_putuint8(out, compparms->cblkwidthval) ||
jpc_putuint8(out, compparms->cblkheightval) ||
jpc_putuint8(out, compparms->cblksty) ||
jpc_putuint8(out, compparms->qmfbid)) {
return -1;
}
if (prtflag) {
for (i = 0; i < compparms->numrlvls; ++i) {
if (jpc_putuint8(out,
((compparms->rlvls[i].parheightval & 0xf) << 4) |
(compparms->rlvls[i].parwidthval & 0xf))) {
return -1;
}
}
}
return 0;
}
/******************************************************************************\
* RGN marker segment operations.
\******************************************************************************/
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) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -