jpc_qmfb.c.svn-base
来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· SVN-BASE 代码 · 共 1,657 行 · 第 1/3 页
SVN-BASE
1,657 行
*hptr pmeqop (*lptr + lptr[(step)]) >> 1; \
hptr += (step); \
lptr += (step); \
} \
if ((hendind) >= (lendind)) { \
*hptr pmeqop *lptr; \
} \
}
#define RFT_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, pmeqop) \
{ \
register jpc_fix_t *lptr = (lstartptr); \
register jpc_fix_t *hptr = (hstartptr); \
register int n = (lendind) - (lstartind); \
if ((hstartind) >= (lstartind)) { \
*lptr pmeqop ((*hptr << 1) + 2) >> 2; \
lptr += (step); \
--n; \
} \
if ((lendind) > (hendind)) { \
--n; \
} \
while (n-- > 0) { \
*lptr pmeqop ((*hptr + hptr[(step)]) + 2) >> 2; \
lptr += (step); \
hptr += (step); \
} \
if ((lendind) > (hendind)) { \
*lptr pmeqop ((*hptr << 1) + 2) >> 2; \
} \
}
static void jpc_ft_analyze(jpc_qmfb1d_t *qmfb, int flags, jas_seq2d_t *x)
{
jpc_fix_t *startptr;
int startind;
int endind;
jpc_fix_t * lstartptr;
int lstartind;
int lendind;
jpc_fix_t * hstartptr;
int hstartind;
int hendind;
int interstep;
int intrastep;
int numseq;
/* Avoid compiler warnings about unused parameters. */
qmfb = 0;
if (flags & JPC_QMFB1D_VERT) {
interstep = 1;
intrastep = jas_seq2d_rowstep(x);
numseq = jas_seq2d_width(x);
startind = jas_seq2d_ystart(x);
endind = jas_seq2d_yend(x);
} else {
interstep = jas_seq2d_rowstep(x);
intrastep = 1;
numseq = jas_seq2d_height(x);
startind = jas_seq2d_xstart(x);
endind = jas_seq2d_xend(x);
}
assert(startind < endind);
startptr = jas_seq2d_getref(x, jas_seq2d_xstart(x), jas_seq2d_ystart(x));
if (flags & JPC_QMFB1D_RITIMODE) {
while (numseq-- > 0) {
jpc_qmfb1d_setup(startptr, startind, endind, intrastep,
&lstartptr, &lstartind, &lendind, &hstartptr,
&hstartind, &hendind);
if (endind - startind > 1) {
jpc_qmfb1d_split(startptr, startind, endind,
intrastep, lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind);
RFT_LIFT0(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep, -=);
RFT_LIFT1(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep, +=);
} else {
if (lstartind == lendind) {
*startptr <<= 1;
}
}
startptr += interstep;
}
} else {
while (numseq-- > 0) {
jpc_qmfb1d_setup(startptr, startind, endind, intrastep,
&lstartptr, &lstartind, &lendind, &hstartptr,
&hstartind, &hendind);
if (endind - startind > 1) {
jpc_qmfb1d_split(startptr, startind, endind,
intrastep, lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind);
NFT_LIFT0(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_fix_minuseq);
NFT_LIFT1(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_fix_pluseq);
} else {
if (lstartind == lendind) {
*startptr = jpc_fix_asl(*startptr, 1);
}
}
startptr += interstep;
}
}
}
static void jpc_ft_synthesize(jpc_qmfb1d_t *qmfb, int flags, jas_seq2d_t *x)
{
jpc_fix_t *startptr;
int startind;
int endind;
jpc_fix_t *lstartptr;
int lstartind;
int lendind;
jpc_fix_t *hstartptr;
int hstartind;
int hendind;
int interstep;
int intrastep;
int numseq;
/* Avoid compiler warnings about unused parameters. */
qmfb = 0;
if (flags & JPC_QMFB1D_VERT) {
interstep = 1;
intrastep = jas_seq2d_rowstep(x);
numseq = jas_seq2d_width(x);
startind = jas_seq2d_ystart(x);
endind = jas_seq2d_yend(x);
} else {
interstep = jas_seq2d_rowstep(x);
intrastep = 1;
numseq = jas_seq2d_height(x);
startind = jas_seq2d_xstart(x);
endind = jas_seq2d_xend(x);
}
assert(startind < endind);
startptr = jas_seq2d_getref(x, jas_seq2d_xstart(x), jas_seq2d_ystart(x));
if (flags & JPC_QMFB1D_RITIMODE) {
while (numseq-- > 0) {
jpc_qmfb1d_setup(startptr, startind, endind, intrastep,
&lstartptr, &lstartind, &lendind, &hstartptr,
&hstartind, &hendind);
if (endind - startind > 1) {
RFT_LIFT1(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep, -=);
RFT_LIFT0(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep, +=);
jpc_qmfb1d_join(startptr, startind, endind,
intrastep, lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind);
} else {
if (lstartind == lendind) {
*startptr >>= 1;
}
}
startptr += interstep;
}
} else {
while (numseq-- > 0) {
jpc_qmfb1d_setup(startptr, startind, endind, intrastep,
&lstartptr, &lstartind, &lendind, &hstartptr,
&hstartind, &hendind);
if (endind - startind > 1) {
NFT_LIFT1(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_fix_minuseq);
NFT_LIFT0(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_fix_pluseq);
jpc_qmfb1d_join(startptr, startind, endind,
intrastep, lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind);
} else {
if (lstartind == lendind) {
*startptr = jpc_fix_asr(*startptr, 1);
}
}
startptr += interstep;
}
}
}
/******************************************************************************\
* Code for 9/7 transform.
\******************************************************************************/
static int jpc_ns_getnumchans(jpc_qmfb1d_t *qmfb)
{
/* Avoid compiler warnings about unused parameters. */
qmfb = 0;
return 2;
}
static int jpc_ns_getanalfilters(jpc_qmfb1d_t *qmfb, int len, jas_seq2d_t **filters)
{
/* Avoid compiler warnings about unused parameters. */
qmfb = 0;
len = 0;
filters = 0;
jas_error( JAS_ERR_INCOMPLETE_STUB_INVOKED_JPC_NS_GETANALFILTERS,
"JAS_ERR_INCOMPLETE_STUB_INVOKED_JPC_NS_GETANALFILTERS"
);
return -1;
}
static int jpc_ns_getsynfilters(jpc_qmfb1d_t *qmfb, int len, jas_seq2d_t **filters)
{
jas_seq_t *lf;
jas_seq_t *hf;
/* Avoid compiler warnings about unused parameters. */
qmfb = 0;
lf = 0;
hf = 0;
if (len > 1 || (!len)) {
if (!(lf = jas_seq_create(-3, 4))) {
goto error;
}
jas_seq_set(lf, -3, jpc_dbltofix(-0.09127176311424948));
jas_seq_set(lf, -2, jpc_dbltofix(-0.05754352622849957));
jas_seq_set(lf, -1, jpc_dbltofix(0.5912717631142470));
jas_seq_set(lf, 0, jpc_dbltofix(1.115087052456994));
jas_seq_set(lf, 1, jpc_dbltofix(0.5912717631142470));
jas_seq_set(lf, 2, jpc_dbltofix(-0.05754352622849957));
jas_seq_set(lf, 3, jpc_dbltofix(-0.09127176311424948));
if (!(hf = jas_seq_create(-3, 6))) {
goto error;
}
jas_seq_set(hf, -3, jpc_dbltofix(-0.02674875741080976 * 2.0));
jas_seq_set(hf, -2, jpc_dbltofix(-0.01686411844287495 * 2.0));
jas_seq_set(hf, -1, jpc_dbltofix(0.07822326652898785 * 2.0));
jas_seq_set(hf, 0, jpc_dbltofix(0.2668641184428723 * 2.0));
jas_seq_set(hf, 1, jpc_dbltofix(-0.6029490182363579 * 2.0));
jas_seq_set(hf, 2, jpc_dbltofix(0.2668641184428723 * 2.0));
jas_seq_set(hf, 3, jpc_dbltofix(0.07822326652898785 * 2.0));
jas_seq_set(hf, 4, jpc_dbltofix(-0.01686411844287495 * 2.0));
jas_seq_set(hf, 5, jpc_dbltofix(-0.02674875741080976 * 2.0));
} else if (len == 1) {
if (!(lf = jas_seq_create(0, 1))) {
goto error;
}
jas_seq_set(lf, 0, jpc_dbltofix(1.0));
if (!(hf = jas_seq_create(0, 1))) {
goto error;
}
jas_seq_set(hf, 0, jpc_dbltofix(2.0));
} else {
jas_error( JAS_ERR_INVALID_LEN_PARAM_JPC_NS_GETSYNFILTERS,
"JAS_ERR_INVALID_LEN_PARAM_JPC_NS_GETSYNFILTERS"
);
goto error;
}
filters[0] = lf;
filters[1] = hf;
return 0;
error:
if (lf) {
jas_seq_destroy(lf);
}
if (hf) {
jas_seq_destroy(hf);
}
return -1;
}
#define NNS_LIFT0(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, alpha) \
{ \
register jpc_fix_t *lptr = (lstartptr); \
register jpc_fix_t *hptr = (hstartptr); \
register int n = (hendind) - (hstartind); \
jpc_fix_t twoalpha = jpc_fix_mulbyint(alpha, 2); \
if ((hstartind) < (lstartind)) { \
jpc_fix_pluseq(*hptr, jpc_fix_mul(*lptr, (twoalpha))); \
hptr += (step); \
--n; \
} \
if ((hendind) >= (lendind)) { \
--n; \
} \
while (n-- > 0) { \
jpc_fix_pluseq(*hptr, jpc_fix_mul(jpc_fix_add(*lptr, lptr[(step)]), (alpha))); \
hptr += (step); \
lptr += (step); \
} \
if ((hendind) >= (lendind)) { \
jpc_fix_pluseq(*hptr, jpc_fix_mul(*lptr, (twoalpha))); \
} \
}
#define NNS_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, alpha) \
{ \
register jpc_fix_t *lptr = (lstartptr); \
register jpc_fix_t *hptr = (hstartptr); \
register int n = (lendind) - (lstartind); \
int twoalpha = jpc_fix_mulbyint(alpha, 2); \
if ((hstartind) >= (lstartind)) { \
jpc_fix_pluseq(*lptr, jpc_fix_mul(*hptr, (twoalpha))); \
lptr += (step); \
--n; \
} \
if ((lendind) > (hendind)) { \
--n; \
} \
while (n-- > 0) { \
jpc_fix_pluseq(*lptr, jpc_fix_mul(jpc_fix_add(*hptr, hptr[(step)]), (alpha))); \
lptr += (step); \
hptr += (step); \
} \
if ((lendind) > (hendind)) { \
jpc_fix_pluseq(*lptr, jpc_fix_mul(*hptr, (twoalpha))); \
} \
}
#define NNS_SCALE(startptr, startind, endind, step, alpha) \
{ \
register jpc_fix_t *ptr = (startptr); \
register int n = (endind) - (startind); \
while (n-- > 0) { \
jpc_fix_muleq(*ptr, alpha); \
ptr += (step); \
} \
}
static void jpc_ns_analyze(jpc_qmfb1d_t *qmfb, int flags, jas_seq2d_t *x)
{
jpc_fix_t *startptr;
int startind;
int endind;
jpc_fix_t *lstartptr;
int lstartind;
int lendind;
jpc_fix_t *hstartptr;
int hstartind;
int hendind;
int interstep;
int intrastep;
int numseq;
/* Avoid compiler warnings about unused parameters. */
qmfb = 0;
if (flags & JPC_QMFB1D_VERT) {
interstep = 1;
intrastep = jas_seq2d_rowstep(x);
numseq = jas_seq2d_width(x);
startind = jas_seq2d_ystart(x);
endind = jas_seq2d_yend(x);
} else {
interstep = jas_seq2d_rowstep(x);
intrastep = 1;
numseq = jas_seq2d_height(x);
startind = jas_seq2d_xstart(x);
endind = jas_seq2d_xend(x);
}
assert(startind < endind);
startptr = jas_seq2d_getref(x, jas_seq2d_xstart(x), jas_seq2d_ystart(x));
if (!(flags & JPC_QMFB1D_RITIMODE)) {
while (numseq-- > 0) {
jpc_qmfb1d_setup(startptr, startind, endind, intrastep,
&lstartptr, &lstartind, &lendind, &hstartptr,
&hstartind, &hendind);
if (endind - startind > 1) {
jpc_qmfb1d_split(startptr, startind, endind,
intrastep, lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind);
NNS_LIFT0(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_dbltofix(-1.586134342));
NNS_LIFT1(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_dbltofix(-0.052980118));
NNS_LIFT0(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_dbltofix(0.882911075));
NNS_LIFT1(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_dbltofix(0.443506852));
NNS_SCALE(lstartptr, lstartind, lendind,
intrastep, jpc_dbltofix(1.0/1.23017410558578));
NNS_SCALE(hstartptr, hstartind, hendind,
intrastep, jpc_dbltofix(1.0/1.62578613134411));
} else {
#if 0
if (lstartind == lendind) {
*startptr = jpc_fix_asl(*startptr, 1);
}
#endif
}
startptr += interstep;
}
} else {
/* The reversible integer-to-integer mode is not supported
for this transform. */
jas_error( JAS_ERR_UNSUPPORTED_MODE_JPC_NS_ANALYZE,
"JAS_ERR_UNSUPPORTED_MODE_JPC_NS_ANALYZE"
);
}
}
#ifdef USE_ASM_WIN32
#define DBL_FIX_A (0x0000275d)
#define DBL_FIX_B (0x00003406)
#define DBL_FIX_C (0xfffff1cf)
#define DBL_FIX_D (0xffffe3c0)
#define DBL_FIX_E (0x000001b2)
#define DBL_FIX_F (0x000032c1)
#define twoalpha_C (0xffffe39e)
#define twoalpha_D (0xffffc780)
#define twoalpha_E (0x00000364)
#define twoalpha_F (0x00006582)
#endif
void jpc_ns_synthesize(jpc_qmfb1d_t *qmfb, int flags, jas_seq2d_t *x)
{
jpc_fix_t *startptr;
int startind;
int endind;
jpc_fix_t *lstartptr;
int lstartind;
int lendind;
jpc_fix_t *hstartptr;
int hstartind;
int hendind;
int interstep;
int intrastep;
int numseq;
/* Avoid compiler warnings about unused parameters. */
qmfb = 0;
if (flags & JPC_QMFB1D_VERT) {
interstep = 1;
intrastep = jas_seq2d_rowstep(x);
numseq = jas_seq2d_width(x);
startind = jas_seq2d_ystart(x);
endind = jas_seq2d_yend(x);
} else {
interstep = jas_seq2d_rowstep(x);
intrastep = 1;
numseq = jas_seq2d_height(x);
startind = jas_seq2d_xstart(x);
endind = jas_seq2d_xend(x);
}
assert(startind < endind);
startptr = jas_seq2d_getref(x, jas_seq2d_xstart(x), jas_seq2d_ystart(x));
if (!(flags & JPC_QMFB1D_RITIMODE)) {
while (numseq-- > 0) {
jpc_qmfb1d_setup(startptr, startind, endind, intrastep,
&lstartptr, &lstartind, &lendind, &hstartptr,
&hstartind, &hendind);
if (endind - startind > 1) {
NNS_SCALE(lstartptr, lstartind, lendind,
intrastep, jpc_dbltofix(1.23017410558578));
NNS_SCALE(hstartptr, hstartind, hendind,
intrastep, jpc_dbltofix(1.62578613134411));
NNS_LIFT1(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_dbltofix(-0.443506852));
NNS_LIFT0(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_dbltofix(-0.882911075));
NNS_LIFT1(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_dbltofix(0.052980118));
NNS_LIFT0(lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind, intrastep,
jpc_dbltofix(1.586134342));
jpc_qmfb1d_join(startptr, startind, endind,
intrastep, lstartptr, lstartind, lendind,
hstartptr, hstartind, hendind);
} else {
#if 0
if (lstartind == lendind) {
*startptr = jpc_fix_asr(*startptr, 1);
}
#endif
}
startptr += interstep;
}
} else {
/* The reversible integer-to-integer mode is not supported
for this transform. */
jas_error( JAS_ERR_UNSUPPORTED_MODE_JPC_NS_SYNTHESIZE,
"JAS_ERR_UNSUPPORTED_MODE_JPC_NS_SYNTHESIZE"
);
}
}
#ifdef USE_ASM_WIN32
#define USE_LF_ASM
void jpc_win32_ns_synthesize( jpc_qmfb1d_t *qmfb,
int flags,
jas_seq2d_t *x
)
{
jpc_fix_t *startptr;
int startind;
int endind;
jpc_fix_t *lstartptr;
int lstartind;
int lendind;
jpc_fix_t *hstartptr;
int hstartind;
int hendind;
int interstep;
int intrastep;
int numseq;
/* Avoid compiler warnings about unused parameters. */
qmfb = 0;
if (flags & JPC_QMFB1D_VERT)
{
interstep = 1;
intrastep = jas_seq2d_rowstep(x);
numseq = jas_seq2d_width(x);
startind = jas_seq2d_ystart(x);
endind = jas_seq2d_yend(x);
}
else
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?