Home | History | Annotate | Download | only in libjasper
      1 /*
      2  * Copyright (c) 1999-2000 Image Power, Inc. and the University of
      3  *   British Columbia.
      4  * Copyright (c) 2001-2003 Michael David Adams.
      5  * All rights reserved.
      6  */
      7 
      8 /* __START_OF_JASPER_LICENSE__
      9  *
     10  * JasPer License Version 2.0
     11  *
     12  * Copyright (c) 2001-2006 Michael David Adams
     13  * Copyright (c) 1999-2000 Image Power, Inc.
     14  * Copyright (c) 1999-2000 The University of British Columbia
     15  *
     16  * All rights reserved.
     17  *
     18  * Permission is hereby granted, free of charge, to any person (the
     19  * "User") obtaining a copy of this software and associated documentation
     20  * files (the "Software"), to deal in the Software without restriction,
     21  * including without limitation the rights to use, copy, modify, merge,
     22  * publish, distribute, and/or sell copies of the Software, and to permit
     23  * persons to whom the Software is furnished to do so, subject to the
     24  * following conditions:
     25  *
     26  * 1.  The above copyright notices and this permission notice (which
     27  * includes the disclaimer below) shall be included in all copies or
     28  * substantial portions of the Software.
     29  *
     30  * 2.  The name of a copyright holder shall not be used to endorse or
     31  * promote products derived from the Software without specific prior
     32  * written permission.
     33  *
     34  * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
     35  * LICENSE.  NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
     36  * THIS DISCLAIMER.  THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
     37  * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
     38  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
     39  * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO
     40  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
     41  * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
     42  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
     43  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
     44  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  NO ASSURANCES ARE
     45  * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
     46  * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
     47  * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
     48  * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
     49  * PROPERTY RIGHTS OR OTHERWISE.  AS A CONDITION TO EXERCISING THE RIGHTS
     50  * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
     51  * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY.  THE SOFTWARE
     52  * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
     53  * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
     54  * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
     55  * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
     56  * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
     57  * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
     58  * RISK ACTIVITIES").  THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
     59  * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
     60  *
     61  * __END_OF_JASPER_LICENSE__
     62  */
     63 
     64 /*
     65  * Quadrature Mirror-Image Filter Bank (QMFB) Library
     66  *
     67  * $Id: jpc_qmfb.c,v 1.2 2008-05-26 09:40:52 vp153 Exp $
     68  */
     69 
     70 /******************************************************************************\
     71 *
     72 \******************************************************************************/
     73 
     74 #undef WT_LENONE /* This is not needed due to normalization. */
     75 #define WT_DOSCALE
     76 
     77 /******************************************************************************\
     78 * Includes.
     79 \******************************************************************************/
     80 
     81 #include <assert.h>
     82 #include "jasper/jas_fix.h"
     83 #include "jasper/jas_malloc.h"
     84 #include "jasper/jas_math.h"
     85 
     86 #include "jpc_qmfb.h"
     87 #include "jpc_tsfb.h"
     88 #include "jpc_math.h"
     89 
     90 /******************************************************************************\
     91 *
     92 \******************************************************************************/
     93 
     94 #define QMFB_SPLITBUFSIZE	4096
     95 #define	QMFB_JOINBUFSIZE	4096
     96 
     97 int jpc_ft_analyze(int *a, int xstart, int ystart, int width, int height,
     98   int stride);
     99 int jpc_ft_synthesize(int *a, int xstart, int ystart, int width, int height,
    100   int stride);
    101 
    102 int jpc_ns_analyze(int *a, int xstart, int ystart, int width, int height,
    103   int stride);
    104 int jpc_ns_synthesize(int *a, int xstart, int ystart, int width,
    105   int height, int stride);
    106 
    107 void jpc_ft_fwdlift_row(jpc_fix_t *a, int numcols, int parity);
    108 void jpc_ft_fwdlift_col(jpc_fix_t *a, int numrows, int stride,
    109   int parity);
    110 void jpc_ft_fwdlift_colgrp(jpc_fix_t *a, int numrows, int stride,
    111   int parity);
    112 void jpc_ft_fwdlift_colres(jpc_fix_t *a, int numrows, int numcols,
    113   int stride, int parity);
    114 
    115 void jpc_ft_invlift_row(jpc_fix_t *a, int numcols, int parity);
    116 void jpc_ft_invlift_col(jpc_fix_t *a, int numrows, int stride,
    117   int parity);
    118 void jpc_ft_invlift_colgrp(jpc_fix_t *a, int numrows, int stride,
    119   int parity);
    120 void jpc_ft_invlift_colres(jpc_fix_t *a, int numrows, int numcols,
    121   int stride, int parity);
    122 
    123 void jpc_ns_fwdlift_row(jpc_fix_t *a, int numcols, int parity);
    124 void jpc_ns_fwdlift_colgrp(jpc_fix_t *a, int numrows, int stride, int parity);
    125 void jpc_ns_fwdlift_colres(jpc_fix_t *a, int numrows, int numcols, int stride,
    126   int parity);
    127 void jpc_ns_invlift_row(jpc_fix_t *a, int numcols, int parity);
    128 void jpc_ns_invlift_colgrp(jpc_fix_t *a, int numrows, int stride, int parity);
    129 void jpc_ns_invlift_colres(jpc_fix_t *a, int numrows, int numcols, int stride,
    130   int parity);
    131 
    132 void jpc_qmfb_split_row(jpc_fix_t *a, int numcols, int parity);
    133 void jpc_qmfb_split_col(jpc_fix_t *a, int numrows, int stride, int parity);
    134 void jpc_qmfb_split_colgrp(jpc_fix_t *a, int numrows, int stride, int parity);
    135 void jpc_qmfb_split_colres(jpc_fix_t *a, int numrows, int numcols, int stride,
    136   int parity);
    137 
    138 void jpc_qmfb_join_row(jpc_fix_t *a, int numcols, int parity);
    139 void jpc_qmfb_join_col(jpc_fix_t *a, int numrows, int stride, int parity);
    140 void jpc_qmfb_join_colgrp(jpc_fix_t *a, int numrows, int stride, int parity);
    141 void jpc_qmfb_join_colres(jpc_fix_t *a, int numrows, int numcols, int stride,
    142   int parity);
    143 
    144 double jpc_ft_lpenergywts[32] = {
    145     1.2247448713915889,
    146     1.6583123951776999,
    147     2.3184046238739260,
    148     3.2691742076555053,
    149     4.6199296531440819,
    150     6.5323713152269596,
    151     9.2377452606141937,
    152     13.0639951297449581,
    153     18.4752262333915667,
    154     26.1278968190610392,
    155     36.9504194305524791,
    156     52.2557819580462777,
    157     73.9008347315741645,
    158     104.5115624560829133,
    159     147.8016689469569656,
    160     209.0231247296646018,
    161     295.6033378293900000,
    162     418.0462494347059419,
    163     591.2066756503630813,
    164     836.0924988714708661,
    165     /* approximations */
    166     836.0924988714708661,
    167     836.0924988714708661,
    168     836.0924988714708661,
    169     836.0924988714708661,
    170     836.0924988714708661,
    171     836.0924988714708661,
    172     836.0924988714708661,
    173     836.0924988714708661,
    174     836.0924988714708661,
    175     836.0924988714708661,
    176     836.0924988714708661,
    177     836.0924988714708661
    178 };
    179 
    180 double jpc_ft_hpenergywts[32] = {
    181     0.8477912478906585,
    182     0.9601432184835760,
    183     1.2593401049756179,
    184     1.7444107171191079,
    185     2.4538713036750726,
    186     3.4656517695088755,
    187     4.8995276398597856,
    188     6.9283970402160842,
    189     9.7980274940131444,
    190     13.8564306871112652,
    191     19.5959265076535587,
    192     27.7128159494245487,
    193     39.1918369552045860,
    194     55.4256262207444053,
    195     78.3836719028959124,
    196     110.8512517317256822,
    197     156.7673435548526868,
    198     221.7025033739244293,
    199     313.5346870787551552,
    200     443.4050067351659550,
    201     /* approximations */
    202     443.4050067351659550,
    203     443.4050067351659550,
    204     443.4050067351659550,
    205     443.4050067351659550,
    206     443.4050067351659550,
    207     443.4050067351659550,
    208     443.4050067351659550,
    209     443.4050067351659550,
    210     443.4050067351659550,
    211     443.4050067351659550,
    212     443.4050067351659550,
    213     443.4050067351659550
    214 };
    215 
    216 double jpc_ns_lpenergywts[32] = {
    217     1.4021081679297411,
    218     2.0303718560817923,
    219     2.9011625562785555,
    220     4.1152851751758002,
    221     5.8245108637728071,
    222     8.2387599345725171,
    223     11.6519546479210838,
    224     16.4785606470644375,
    225     23.3042776444606794,
    226     32.9572515613740435,
    227     46.6086013487782793,
    228     65.9145194076860861,
    229     93.2172084551803977,
    230     131.8290408510004283,
    231     186.4344176300625691,
    232     263.6580819564562148,
    233     372.8688353500955373,
    234     527.3161639447193920,
    235     745.7376707114038936,
    236     1054.6323278917823245,
    237     /* approximations follow */
    238     1054.6323278917823245,
    239     1054.6323278917823245,
    240     1054.6323278917823245,
    241     1054.6323278917823245,
    242     1054.6323278917823245,
    243     1054.6323278917823245,
    244     1054.6323278917823245,
    245     1054.6323278917823245,
    246     1054.6323278917823245,
    247     1054.6323278917823245,
    248     1054.6323278917823245,
    249     1054.6323278917823245
    250 };
    251 
    252 double jpc_ns_hpenergywts[32] = {
    253     1.4425227650161456,
    254     1.9669426082455688,
    255     2.8839248082788891,
    256     4.1475208393432981,
    257     5.8946497530677817,
    258     8.3471789178590949,
    259     11.8086046551047463,
    260     16.7012780415647804,
    261     23.6196657032246620,
    262     33.4034255108592362,
    263     47.2396388881632632,
    264     66.8069597416714061,
    265     94.4793162154500692,
    266     133.6139330736999113,
    267     188.9586372358249378,
    268     267.2278678461869390,
    269     377.9172750722391356,
    270     534.4557359047058753,
    271     755.8345502191498326,
    272     1068.9114718353569060,
    273     /* approximations follow */
    274     1068.9114718353569060,
    275     1068.9114718353569060,
    276     1068.9114718353569060,
    277     1068.9114718353569060,
    278     1068.9114718353569060,
    279     1068.9114718353569060,
    280     1068.9114718353569060,
    281     1068.9114718353569060,
    282     1068.9114718353569060,
    283     1068.9114718353569060,
    284     1068.9114718353569060
    285 };
    286 
    287 jpc_qmfb2d_t jpc_ft_qmfb2d = {
    288     jpc_ft_analyze,
    289     jpc_ft_synthesize,
    290     jpc_ft_lpenergywts,
    291     jpc_ft_hpenergywts
    292 };
    293 
    294 jpc_qmfb2d_t jpc_ns_qmfb2d = {
    295     jpc_ns_analyze,
    296     jpc_ns_synthesize,
    297     jpc_ns_lpenergywts,
    298     jpc_ns_hpenergywts
    299 };
    300 
    301 /******************************************************************************\
    302 * generic
    303 \******************************************************************************/
    304 
    305 void jpc_qmfb_split_row(jpc_fix_t *a, int numcols, int parity)
    306 {
    307 
    308     int bufsize = JPC_CEILDIVPOW2(numcols, 1);
    309 #if !defined(HAVE_VLA)
    310     jpc_fix_t splitbuf[QMFB_SPLITBUFSIZE];
    311 #else
    312     jpc_fix_t splitbuf[bufsize];
    313 #endif
    314     jpc_fix_t *buf = splitbuf;
    315     register jpc_fix_t *srcptr;
    316     register jpc_fix_t *dstptr;
    317     register int n;
    318     register int m;
    319     int hstartcol;
    320 
    321 #if !defined(HAVE_VLA)
    322     /* Get a buffer. */
    323     if (bufsize > QMFB_SPLITBUFSIZE) {
    324         if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) {
    325             /* We have no choice but to commit suicide in this case. */
    326             abort();
    327         }
    328     }
    329 #endif
    330 
    331     if (numcols >= 2) {
    332         hstartcol = (numcols + 1 - parity) >> 1;
    333         m = (parity) ? hstartcol : (numcols - hstartcol);
    334         /* Save the samples destined for the highpass channel. */
    335         n = m;
    336         dstptr = buf;
    337         srcptr = &a[1 - parity];
    338         while (n-- > 0) {
    339             *dstptr = *srcptr;
    340             ++dstptr;
    341             srcptr += 2;
    342         }
    343         /* Copy the appropriate samples into the lowpass channel. */
    344         dstptr = &a[1 - parity];
    345         srcptr = &a[2 - parity];
    346         n = numcols - m - (!parity);
    347         while (n-- > 0) {
    348             *dstptr = *srcptr;
    349             ++dstptr;
    350             srcptr += 2;
    351         }
    352         /* Copy the saved samples into the highpass channel. */
    353         dstptr = &a[hstartcol];
    354         srcptr = buf;
    355         n = m;
    356         while (n-- > 0) {
    357             *dstptr = *srcptr;
    358             ++dstptr;
    359             ++srcptr;
    360         }
    361     }
    362 
    363 #if !defined(HAVE_VLA)
    364     /* If the split buffer was allocated on the heap, free this memory. */
    365     if (buf != splitbuf) {
    366         jas_free(buf);
    367     }
    368 #endif
    369 
    370 }
    371 
    372 void jpc_qmfb_split_col(jpc_fix_t *a, int numrows, int stride,
    373   int parity)
    374 {
    375 
    376     int bufsize = JPC_CEILDIVPOW2(numrows, 1);
    377 #if !defined(HAVE_VLA)
    378     jpc_fix_t splitbuf[QMFB_SPLITBUFSIZE];
    379 #else
    380     jpc_fix_t splitbuf[bufsize];
    381 #endif
    382     jpc_fix_t *buf = splitbuf;
    383     register jpc_fix_t *srcptr;
    384     register jpc_fix_t *dstptr;
    385     register int n;
    386     register int m;
    387     int hstartcol;
    388 
    389 #if !defined(HAVE_VLA)
    390     /* Get a buffer. */
    391     if (bufsize > QMFB_SPLITBUFSIZE) {
    392         if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) {
    393             /* We have no choice but to commit suicide in this case. */
    394             abort();
    395         }
    396     }
    397 #endif
    398 
    399     if (numrows >= 2) {
    400         hstartcol = (numrows + 1 - parity) >> 1;
    401         m = (parity) ? hstartcol : (numrows - hstartcol);
    402         /* Save the samples destined for the highpass channel. */
    403         n = m;
    404         dstptr = buf;
    405         srcptr = &a[(1 - parity) * stride];
    406         while (n-- > 0) {
    407             *dstptr = *srcptr;
    408             ++dstptr;
    409             srcptr += stride << 1;
    410         }
    411         /* Copy the appropriate samples into the lowpass channel. */
    412         dstptr = &a[(1 - parity) * stride];
    413         srcptr = &a[(2 - parity) * stride];
    414         n = numrows - m - (!parity);
    415         while (n-- > 0) {
    416             *dstptr = *srcptr;
    417             dstptr += stride;
    418             srcptr += stride << 1;
    419         }
    420         /* Copy the saved samples into the highpass channel. */
    421         dstptr = &a[hstartcol * stride];
    422         srcptr = buf;
    423         n = m;
    424         while (n-- > 0) {
    425             *dstptr = *srcptr;
    426             dstptr += stride;
    427             ++srcptr;
    428         }
    429     }
    430 
    431 #if !defined(HAVE_VLA)
    432     /* If the split buffer was allocated on the heap, free this memory. */
    433     if (buf != splitbuf) {
    434         jas_free(buf);
    435     }
    436 #endif
    437 
    438 }
    439 
    440 void jpc_qmfb_split_colgrp(jpc_fix_t *a, int numrows, int stride,
    441   int parity)
    442 {
    443 
    444     int bufsize = JPC_CEILDIVPOW2(numrows, 1);
    445 #if !defined(HAVE_VLA)
    446     jpc_fix_t splitbuf[QMFB_SPLITBUFSIZE * JPC_QMFB_COLGRPSIZE];
    447 #else
    448     jpc_fix_t splitbuf[bufsize * JPC_QMFB_COLGRPSIZE];
    449 #endif
    450     jpc_fix_t *buf = splitbuf;
    451     jpc_fix_t *srcptr;
    452     jpc_fix_t *dstptr;
    453     register jpc_fix_t *srcptr2;
    454     register jpc_fix_t *dstptr2;
    455     register int n;
    456     register int i;
    457     int m;
    458     int hstartcol;
    459 
    460 #if !defined(HAVE_VLA)
    461     /* Get a buffer. */
    462     if (bufsize > QMFB_SPLITBUFSIZE) {
    463         if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) {
    464             /* We have no choice but to commit suicide in this case. */
    465             abort();
    466         }
    467     }
    468 #endif
    469 
    470     if (numrows >= 2) {
    471         hstartcol = (numrows + 1 - parity) >> 1;
    472         m = (parity) ? hstartcol : (numrows - hstartcol);
    473         /* Save the samples destined for the highpass channel. */
    474         n = m;
    475         dstptr = buf;
    476         srcptr = &a[(1 - parity) * stride];
    477         while (n-- > 0) {
    478             dstptr2 = dstptr;
    479             srcptr2 = srcptr;
    480             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
    481                 *dstptr2 = *srcptr2;
    482                 ++dstptr2;
    483                 ++srcptr2;
    484             }
    485             dstptr += JPC_QMFB_COLGRPSIZE;
    486             srcptr += stride << 1;
    487         }
    488         /* Copy the appropriate samples into the lowpass channel. */
    489         dstptr = &a[(1 - parity) * stride];
    490         srcptr = &a[(2 - parity) * stride];
    491         n = numrows - m - (!parity);
    492         while (n-- > 0) {
    493             dstptr2 = dstptr;
    494             srcptr2 = srcptr;
    495             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
    496                 *dstptr2 = *srcptr2;
    497                 ++dstptr2;
    498                 ++srcptr2;
    499             }
    500             dstptr += stride;
    501             srcptr += stride << 1;
    502         }
    503         /* Copy the saved samples into the highpass channel. */
    504         dstptr = &a[hstartcol * stride];
    505         srcptr = buf;
    506         n = m;
    507         while (n-- > 0) {
    508             dstptr2 = dstptr;
    509             srcptr2 = srcptr;
    510             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
    511                 *dstptr2 = *srcptr2;
    512                 ++dstptr2;
    513                 ++srcptr2;
    514             }
    515             dstptr += stride;
    516             srcptr += JPC_QMFB_COLGRPSIZE;
    517         }
    518     }
    519 
    520 #if !defined(HAVE_VLA)
    521     /* If the split buffer was allocated on the heap, free this memory. */
    522     if (buf != splitbuf) {
    523         jas_free(buf);
    524     }
    525 #endif
    526 
    527 }
    528 
    529 void jpc_qmfb_split_colres(jpc_fix_t *a, int numrows, int numcols,
    530   int stride, int parity)
    531 {
    532 
    533     int bufsize = JPC_CEILDIVPOW2(numrows, 1);
    534 #if !defined(HAVE_VLA)
    535     jpc_fix_t splitbuf[QMFB_SPLITBUFSIZE * JPC_QMFB_COLGRPSIZE];
    536 #else
    537     jpc_fix_t splitbuf[bufsize * numcols];
    538 #endif
    539     jpc_fix_t *buf = splitbuf;
    540     jpc_fix_t *srcptr;
    541     jpc_fix_t *dstptr;
    542     register jpc_fix_t *srcptr2;
    543     register jpc_fix_t *dstptr2;
    544     register int n;
    545     register int i;
    546     int m;
    547     int hstartcol;
    548 
    549 #if !defined(HAVE_VLA)
    550     /* Get a buffer. */
    551     if (bufsize > QMFB_SPLITBUFSIZE) {
    552         if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) {
    553             /* We have no choice but to commit suicide in this case. */
    554             abort();
    555         }
    556     }
    557 #endif
    558 
    559     if (numrows >= 2) {
    560         hstartcol = (numrows + 1 - parity) >> 1;
    561         m = (parity) ? hstartcol : (numrows - hstartcol);
    562         /* Save the samples destined for the highpass channel. */
    563         n = m;
    564         dstptr = buf;
    565         srcptr = &a[(1 - parity) * stride];
    566         while (n-- > 0) {
    567             dstptr2 = dstptr;
    568             srcptr2 = srcptr;
    569             for (i = 0; i < numcols; ++i) {
    570                 *dstptr2 = *srcptr2;
    571                 ++dstptr2;
    572                 ++srcptr2;
    573             }
    574             dstptr += numcols;
    575             srcptr += stride << 1;
    576         }
    577         /* Copy the appropriate samples into the lowpass channel. */
    578         dstptr = &a[(1 - parity) * stride];
    579         srcptr = &a[(2 - parity) * stride];
    580         n = numrows - m - (!parity);
    581         while (n-- > 0) {
    582             dstptr2 = dstptr;
    583             srcptr2 = srcptr;
    584             for (i = 0; i < numcols; ++i) {
    585                 *dstptr2 = *srcptr2;
    586                 ++dstptr2;
    587                 ++srcptr2;
    588             }
    589             dstptr += stride;
    590             srcptr += stride << 1;
    591         }
    592         /* Copy the saved samples into the highpass channel. */
    593         dstptr = &a[hstartcol * stride];
    594         srcptr = buf;
    595         n = m;
    596         while (n-- > 0) {
    597             dstptr2 = dstptr;
    598             srcptr2 = srcptr;
    599             for (i = 0; i < numcols; ++i) {
    600                 *dstptr2 = *srcptr2;
    601                 ++dstptr2;
    602                 ++srcptr2;
    603             }
    604             dstptr += stride;
    605             srcptr += numcols;
    606         }
    607     }
    608 
    609 #if !defined(HAVE_VLA)
    610     /* If the split buffer was allocated on the heap, free this memory. */
    611     if (buf != splitbuf) {
    612         jas_free(buf);
    613     }
    614 #endif
    615 
    616 }
    617 
    618 void jpc_qmfb_join_row(jpc_fix_t *a, int numcols, int parity)
    619 {
    620 
    621     int bufsize = JPC_CEILDIVPOW2(numcols, 1);
    622 #if !defined(HAVE_VLA)
    623     jpc_fix_t joinbuf[QMFB_JOINBUFSIZE];
    624 #else
    625     jpc_fix_t joinbuf[bufsize];
    626 #endif
    627     jpc_fix_t *buf = joinbuf;
    628     register jpc_fix_t *srcptr;
    629     register jpc_fix_t *dstptr;
    630     register int n;
    631     int hstartcol;
    632 
    633 #if !defined(HAVE_VLA)
    634     /* Allocate memory for the join buffer from the heap. */
    635     if (bufsize > QMFB_JOINBUFSIZE) {
    636         if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) {
    637             /* We have no choice but to commit suicide. */
    638             abort();
    639         }
    640     }
    641 #endif
    642 
    643     hstartcol = (numcols + 1 - parity) >> 1;
    644 
    645     /* Save the samples from the lowpass channel. */
    646     n = hstartcol;
    647     srcptr = &a[0];
    648     dstptr = buf;
    649     while (n-- > 0) {
    650         *dstptr = *srcptr;
    651         ++srcptr;
    652         ++dstptr;
    653     }
    654     /* Copy the samples from the highpass channel into place. */
    655     srcptr = &a[hstartcol];
    656     dstptr = &a[1 - parity];
    657     n = numcols - hstartcol;
    658     while (n-- > 0) {
    659         *dstptr = *srcptr;
    660         dstptr += 2;
    661         ++srcptr;
    662     }
    663     /* Copy the samples from the lowpass channel into place. */
    664     srcptr = buf;
    665     dstptr = &a[parity];
    666     n = hstartcol;
    667     while (n-- > 0) {
    668         *dstptr = *srcptr;
    669         dstptr += 2;
    670         ++srcptr;
    671     }
    672 
    673 #if !defined(HAVE_VLA)
    674     /* If the join buffer was allocated on the heap, free this memory. */
    675     if (buf != joinbuf) {
    676         jas_free(buf);
    677     }
    678 #endif
    679 
    680 }
    681 
    682 void jpc_qmfb_join_col(jpc_fix_t *a, int numrows, int stride,
    683   int parity)
    684 {
    685 
    686     int bufsize = JPC_CEILDIVPOW2(numrows, 1);
    687 #if !defined(HAVE_VLA)
    688     jpc_fix_t joinbuf[QMFB_JOINBUFSIZE];
    689 #else
    690     jpc_fix_t joinbuf[bufsize];
    691 #endif
    692     jpc_fix_t *buf = joinbuf;
    693     register jpc_fix_t *srcptr;
    694     register jpc_fix_t *dstptr;
    695     register int n;
    696     int hstartcol;
    697 
    698 #if !defined(HAVE_VLA)
    699     /* Allocate memory for the join buffer from the heap. */
    700     if (bufsize > QMFB_JOINBUFSIZE) {
    701         if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) {
    702             /* We have no choice but to commit suicide. */
    703             abort();
    704         }
    705     }
    706 #endif
    707 
    708     hstartcol = (numrows + 1 - parity) >> 1;
    709 
    710     /* Save the samples from the lowpass channel. */
    711     n = hstartcol;
    712     srcptr = &a[0];
    713     dstptr = buf;
    714     while (n-- > 0) {
    715         *dstptr = *srcptr;
    716         srcptr += stride;
    717         ++dstptr;
    718     }
    719     /* Copy the samples from the highpass channel into place. */
    720     srcptr = &a[hstartcol * stride];
    721     dstptr = &a[(1 - parity) * stride];
    722     n = numrows - hstartcol;
    723     while (n-- > 0) {
    724         *dstptr = *srcptr;
    725         dstptr += 2 * stride;
    726         srcptr += stride;
    727     }
    728     /* Copy the samples from the lowpass channel into place. */
    729     srcptr = buf;
    730     dstptr = &a[parity * stride];
    731     n = hstartcol;
    732     while (n-- > 0) {
    733         *dstptr = *srcptr;
    734         dstptr += 2 * stride;
    735         ++srcptr;
    736     }
    737 
    738 #if !defined(HAVE_VLA)
    739     /* If the join buffer was allocated on the heap, free this memory. */
    740     if (buf != joinbuf) {
    741         jas_free(buf);
    742     }
    743 #endif
    744 
    745 }
    746 
    747 void jpc_qmfb_join_colgrp(jpc_fix_t *a, int numrows, int stride,
    748   int parity)
    749 {
    750 
    751     int bufsize = JPC_CEILDIVPOW2(numrows, 1);
    752 #if !defined(HAVE_VLA)
    753     jpc_fix_t joinbuf[QMFB_JOINBUFSIZE * JPC_QMFB_COLGRPSIZE];
    754 #else
    755     jpc_fix_t joinbuf[bufsize * JPC_QMFB_COLGRPSIZE];
    756 #endif
    757     jpc_fix_t *buf = joinbuf;
    758     jpc_fix_t *srcptr;
    759     jpc_fix_t *dstptr;
    760     register jpc_fix_t *srcptr2;
    761     register jpc_fix_t *dstptr2;
    762     register int n;
    763     register int i;
    764     int hstartcol;
    765 
    766 #if !defined(HAVE_VLA)
    767     /* Allocate memory for the join buffer from the heap. */
    768     if (bufsize > QMFB_JOINBUFSIZE) {
    769         if (!(buf = jas_alloc2(bufsize, JPC_QMFB_COLGRPSIZE * sizeof(jpc_fix_t)))) {
    770             /* We have no choice but to commit suicide. */
    771             abort();
    772         }
    773     }
    774 #endif
    775 
    776     hstartcol = (numrows + 1 - parity) >> 1;
    777 
    778     /* Save the samples from the lowpass channel. */
    779     n = hstartcol;
    780     srcptr = &a[0];
    781     dstptr = buf;
    782     while (n-- > 0) {
    783         dstptr2 = dstptr;
    784         srcptr2 = srcptr;
    785         for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
    786             *dstptr2 = *srcptr2;
    787             ++dstptr2;
    788             ++srcptr2;
    789         }
    790         srcptr += stride;
    791         dstptr += JPC_QMFB_COLGRPSIZE;
    792     }
    793     /* Copy the samples from the highpass channel into place. */
    794     srcptr = &a[hstartcol * stride];
    795     dstptr = &a[(1 - parity) * stride];
    796     n = numrows - hstartcol;
    797     while (n-- > 0) {
    798         dstptr2 = dstptr;
    799         srcptr2 = srcptr;
    800         for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
    801             *dstptr2 = *srcptr2;
    802             ++dstptr2;
    803             ++srcptr2;
    804         }
    805         dstptr += 2 * stride;
    806         srcptr += stride;
    807     }
    808     /* Copy the samples from the lowpass channel into place. */
    809     srcptr = buf;
    810     dstptr = &a[parity * stride];
    811     n = hstartcol;
    812     while (n-- > 0) {
    813         dstptr2 = dstptr;
    814         srcptr2 = srcptr;
    815         for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
    816             *dstptr2 = *srcptr2;
    817             ++dstptr2;
    818             ++srcptr2;
    819         }
    820         dstptr += 2 * stride;
    821         srcptr += JPC_QMFB_COLGRPSIZE;
    822     }
    823 
    824 #if !defined(HAVE_VLA)
    825     /* If the join buffer was allocated on the heap, free this memory. */
    826     if (buf != joinbuf) {
    827         jas_free(buf);
    828     }
    829 #endif
    830 
    831 }
    832 
    833 void jpc_qmfb_join_colres(jpc_fix_t *a, int numrows, int numcols,
    834   int stride, int parity)
    835 {
    836 
    837     int bufsize = JPC_CEILDIVPOW2(numrows, 1);
    838 #if !defined(HAVE_VLA)
    839     jpc_fix_t joinbuf[QMFB_JOINBUFSIZE * JPC_QMFB_COLGRPSIZE];
    840 #else
    841     jpc_fix_t joinbuf[bufsize * numcols];
    842 #endif
    843     jpc_fix_t *buf = joinbuf;
    844     jpc_fix_t *srcptr;
    845     jpc_fix_t *dstptr;
    846     register jpc_fix_t *srcptr2;
    847     register jpc_fix_t *dstptr2;
    848     register int n;
    849     register int i;
    850     int hstartcol;
    851 
    852 #if !defined(HAVE_VLA)
    853     /* Allocate memory for the join buffer from the heap. */
    854     if (bufsize > QMFB_JOINBUFSIZE) {
    855         if (!(buf = jas_alloc3(bufsize, numcols, sizeof(jpc_fix_t)))) {
    856             /* We have no choice but to commit suicide. */
    857             abort();
    858         }
    859     }
    860 #endif
    861 
    862     hstartcol = (numrows + 1 - parity) >> 1;
    863 
    864     /* Save the samples from the lowpass channel. */
    865     n = hstartcol;
    866     srcptr = &a[0];
    867     dstptr = buf;
    868     while (n-- > 0) {
    869         dstptr2 = dstptr;
    870         srcptr2 = srcptr;
    871         for (i = 0; i < numcols; ++i) {
    872             *dstptr2 = *srcptr2;
    873             ++dstptr2;
    874             ++srcptr2;
    875         }
    876         srcptr += stride;
    877         dstptr += numcols;
    878     }
    879     /* Copy the samples from the highpass channel into place. */
    880     srcptr = &a[hstartcol * stride];
    881     dstptr = &a[(1 - parity) * stride];
    882     n = numrows - hstartcol;
    883     while (n-- > 0) {
    884         dstptr2 = dstptr;
    885         srcptr2 = srcptr;
    886         for (i = 0; i < numcols; ++i) {
    887             *dstptr2 = *srcptr2;
    888             ++dstptr2;
    889             ++srcptr2;
    890         }
    891         dstptr += 2 * stride;
    892         srcptr += stride;
    893     }
    894     /* Copy the samples from the lowpass channel into place. */
    895     srcptr = buf;
    896     dstptr = &a[parity * stride];
    897     n = hstartcol;
    898     while (n-- > 0) {
    899         dstptr2 = dstptr;
    900         srcptr2 = srcptr;
    901         for (i = 0; i < numcols; ++i) {
    902             *dstptr2 = *srcptr2;
    903             ++dstptr2;
    904             ++srcptr2;
    905         }
    906         dstptr += 2 * stride;
    907         srcptr += numcols;
    908     }
    909 
    910 #if !defined(HAVE_VLA)
    911     /* If the join buffer was allocated on the heap, free this memory. */
    912     if (buf != joinbuf) {
    913         jas_free(buf);
    914     }
    915 #endif
    916 
    917 }
    918 
    919 /******************************************************************************\
    920 * 5/3 transform
    921 \******************************************************************************/
    922 
    923 void jpc_ft_fwdlift_row(jpc_fix_t *a, int numcols, int parity)
    924 {
    925 
    926     register jpc_fix_t *lptr;
    927     register jpc_fix_t *hptr;
    928     register int n;
    929     int llen;
    930 
    931     llen = (numcols + 1 - parity) >> 1;
    932 
    933     if (numcols > 1) {
    934 
    935         /* Apply the first lifting step. */
    936         lptr = &a[0];
    937         hptr = &a[llen];
    938         if (parity) {
    939             hptr[0] -= lptr[0];
    940             ++hptr;
    941         }
    942         n = numcols - llen - parity - (parity == (numcols & 1));
    943         while (n-- > 0) {
    944             hptr[0] -= (lptr[0] + lptr[1]) >> 1;
    945             ++hptr;
    946             ++lptr;
    947         }
    948         if (parity == (numcols & 1)) {
    949             hptr[0] -= lptr[0];
    950         }
    951 
    952         /* Apply the second lifting step. */
    953         lptr = &a[0];
    954         hptr = &a[llen];
    955         if (!parity) {
    956             lptr[0] += (hptr[0] + 1) >> 1;
    957             ++lptr;
    958         }
    959         n = llen - (!parity) - (parity != (numcols & 1));
    960         while (n-- > 0) {
    961             lptr[0] += (hptr[0] + hptr[1] + 2) >> 2;
    962             ++lptr;
    963             ++hptr;
    964         }
    965         if (parity != (numcols & 1)) {
    966             lptr[0] += (hptr[0] + 1) >> 1;
    967         }
    968 
    969     } else {
    970 
    971         if (parity) {
    972             lptr = &a[0];
    973             lptr[0] <<= 1;
    974         }
    975 
    976     }
    977 
    978 }
    979 
    980 void jpc_ft_fwdlift_col(jpc_fix_t *a, int numrows, int stride, int parity)
    981 {
    982 
    983     jpc_fix_t *lptr;
    984     jpc_fix_t *hptr;
    985 #if 0
    986     register jpc_fix_t *lptr2;
    987     register jpc_fix_t *hptr2;
    988     register int i;
    989 #endif
    990     register int n;
    991     int llen;
    992 
    993     llen = (numrows + 1 - parity) >> 1;
    994 
    995     if (numrows > 1) {
    996 
    997         /* Apply the first lifting step. */
    998         lptr = &a[0];
    999         hptr = &a[llen * stride];
   1000         if (parity) {
   1001             hptr[0] -= lptr[0];
   1002             hptr += stride;
   1003         }
   1004         n = numrows - llen - parity - (parity == (numrows & 1));
   1005         while (n-- > 0) {
   1006             hptr[0] -= (lptr[0] + lptr[stride]) >> 1;
   1007             hptr += stride;
   1008             lptr += stride;
   1009         }
   1010         if (parity == (numrows & 1)) {
   1011             hptr[0] -= lptr[0];
   1012         }
   1013 
   1014         /* Apply the second lifting step. */
   1015         lptr = &a[0];
   1016         hptr = &a[llen * stride];
   1017         if (!parity) {
   1018             lptr[0] += (hptr[0] + 1) >> 1;
   1019             lptr += stride;
   1020         }
   1021         n = llen - (!parity) - (parity != (numrows & 1));
   1022         while (n-- > 0) {
   1023             lptr[0] += (hptr[0] + hptr[stride] + 2) >> 2;
   1024             lptr += stride;
   1025             hptr += stride;
   1026         }
   1027         if (parity != (numrows & 1)) {
   1028             lptr[0] += (hptr[0] + 1) >> 1;
   1029         }
   1030 
   1031     } else {
   1032 
   1033         if (parity) {
   1034             lptr = &a[0];
   1035             lptr[0] <<= 1;
   1036         }
   1037 
   1038     }
   1039 
   1040 }
   1041 
   1042 void jpc_ft_fwdlift_colgrp(jpc_fix_t *a, int numrows, int stride, int parity)
   1043 {
   1044 
   1045     jpc_fix_t *lptr;
   1046     jpc_fix_t *hptr;
   1047     register jpc_fix_t *lptr2;
   1048     register jpc_fix_t *hptr2;
   1049     register int n;
   1050     register int i;
   1051     int llen;
   1052 
   1053     llen = (numrows + 1 - parity) >> 1;
   1054 
   1055     if (numrows > 1) {
   1056 
   1057         /* Apply the first lifting step. */
   1058         lptr = &a[0];
   1059         hptr = &a[llen * stride];
   1060         if (parity) {
   1061             lptr2 = lptr;
   1062             hptr2 = hptr;
   1063             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1064                 hptr2[0] -= lptr2[0];
   1065                 ++hptr2;
   1066                 ++lptr2;
   1067             }
   1068             hptr += stride;
   1069         }
   1070         n = numrows - llen - parity - (parity == (numrows & 1));
   1071         while (n-- > 0) {
   1072             lptr2 = lptr;
   1073             hptr2 = hptr;
   1074             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1075                 hptr2[0] -= (lptr2[0] + lptr2[stride]) >> 1;
   1076                 ++lptr2;
   1077                 ++hptr2;
   1078             }
   1079             hptr += stride;
   1080             lptr += stride;
   1081         }
   1082         if (parity == (numrows & 1)) {
   1083             lptr2 = lptr;
   1084             hptr2 = hptr;
   1085             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1086                 hptr2[0] -= lptr2[0];
   1087                 ++lptr2;
   1088                 ++hptr2;
   1089             }
   1090         }
   1091 
   1092         /* Apply the second lifting step. */
   1093         lptr = &a[0];
   1094         hptr = &a[llen * stride];
   1095         if (!parity) {
   1096             lptr2 = lptr;
   1097             hptr2 = hptr;
   1098             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1099                 lptr2[0] += (hptr2[0] + 1) >> 1;
   1100                 ++lptr2;
   1101                 ++hptr2;
   1102             }
   1103             lptr += stride;
   1104         }
   1105         n = llen - (!parity) - (parity != (numrows & 1));
   1106         while (n-- > 0) {
   1107             lptr2 = lptr;
   1108             hptr2 = hptr;
   1109             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1110                 lptr2[0] += (hptr2[0] + hptr2[stride] + 2) >> 2;
   1111                 ++lptr2;
   1112                 ++hptr2;
   1113             }
   1114             lptr += stride;
   1115             hptr += stride;
   1116         }
   1117         if (parity != (numrows & 1)) {
   1118             lptr2 = lptr;
   1119             hptr2 = hptr;
   1120             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1121                 lptr2[0] += (hptr2[0] + 1) >> 1;
   1122                 ++lptr2;
   1123                 ++hptr2;
   1124             }
   1125         }
   1126 
   1127     } else {
   1128 
   1129         if (parity) {
   1130             lptr2 = &a[0];
   1131             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1132                 lptr2[0] <<= 1;
   1133                 ++lptr2;
   1134             }
   1135         }
   1136 
   1137     }
   1138 
   1139 }
   1140 
   1141 void jpc_ft_fwdlift_colres(jpc_fix_t *a, int numrows, int numcols, int stride,
   1142   int parity)
   1143 {
   1144 
   1145     jpc_fix_t *lptr;
   1146     jpc_fix_t *hptr;
   1147     register jpc_fix_t *lptr2;
   1148     register jpc_fix_t *hptr2;
   1149     register int n;
   1150     register int i;
   1151     int llen;
   1152 
   1153     llen = (numrows + 1 - parity) >> 1;
   1154 
   1155     if (numrows > 1) {
   1156 
   1157         /* Apply the first lifting step. */
   1158         lptr = &a[0];
   1159         hptr = &a[llen * stride];
   1160         if (parity) {
   1161             lptr2 = lptr;
   1162             hptr2 = hptr;
   1163             for (i = 0; i < numcols; ++i) {
   1164                 hptr2[0] -= lptr2[0];
   1165                 ++hptr2;
   1166                 ++lptr2;
   1167             }
   1168             hptr += stride;
   1169         }
   1170         n = numrows - llen - parity - (parity == (numrows & 1));
   1171         while (n-- > 0) {
   1172             lptr2 = lptr;
   1173             hptr2 = hptr;
   1174             for (i = 0; i < numcols; ++i) {
   1175                 hptr2[0] -= (lptr2[0] + lptr2[stride]) >> 1;
   1176                 ++lptr2;
   1177                 ++hptr2;
   1178             }
   1179             hptr += stride;
   1180             lptr += stride;
   1181         }
   1182         if (parity == (numrows & 1)) {
   1183             lptr2 = lptr;
   1184             hptr2 = hptr;
   1185             for (i = 0; i < numcols; ++i) {
   1186                 hptr2[0] -= lptr2[0];
   1187                 ++lptr2;
   1188                 ++hptr2;
   1189             }
   1190         }
   1191 
   1192         /* Apply the second lifting step. */
   1193         lptr = &a[0];
   1194         hptr = &a[llen * stride];
   1195         if (!parity) {
   1196             lptr2 = lptr;
   1197             hptr2 = hptr;
   1198             for (i = 0; i < numcols; ++i) {
   1199                 lptr2[0] += (hptr2[0] + 1) >> 1;
   1200                 ++lptr2;
   1201                 ++hptr2;
   1202             }
   1203             lptr += stride;
   1204         }
   1205         n = llen - (!parity) - (parity != (numrows & 1));
   1206         while (n-- > 0) {
   1207             lptr2 = lptr;
   1208             hptr2 = hptr;
   1209             for (i = 0; i < numcols; ++i) {
   1210                 lptr2[0] += (hptr2[0] + hptr2[stride] + 2) >> 2;
   1211                 ++lptr2;
   1212                 ++hptr2;
   1213             }
   1214             lptr += stride;
   1215             hptr += stride;
   1216         }
   1217         if (parity != (numrows & 1)) {
   1218             lptr2 = lptr;
   1219             hptr2 = hptr;
   1220             for (i = 0; i < numcols; ++i) {
   1221                 lptr2[0] += (hptr2[0] + 1) >> 1;
   1222                 ++lptr2;
   1223                 ++hptr2;
   1224             }
   1225         }
   1226 
   1227     } else {
   1228 
   1229         if (parity) {
   1230             lptr2 = &a[0];
   1231             for (i = 0; i < numcols; ++i) {
   1232                 lptr2[0] <<= 1;
   1233                 ++lptr2;
   1234             }
   1235         }
   1236 
   1237     }
   1238 
   1239 }
   1240 
   1241 void jpc_ft_invlift_row(jpc_fix_t *a, int numcols, int parity)
   1242 {
   1243 
   1244     register jpc_fix_t *lptr;
   1245     register jpc_fix_t *hptr;
   1246     register int n;
   1247     int llen;
   1248 
   1249     llen = (numcols + 1 - parity) >> 1;
   1250 
   1251     if (numcols > 1) {
   1252 
   1253         /* Apply the first lifting step. */
   1254         lptr = &a[0];
   1255         hptr = &a[llen];
   1256         if (!parity) {
   1257             lptr[0] -= (hptr[0] + 1) >> 1;
   1258             ++lptr;
   1259         }
   1260         n = llen - (!parity) - (parity != (numcols & 1));
   1261         while (n-- > 0) {
   1262             lptr[0] -= (hptr[0] + hptr[1] + 2) >> 2;
   1263             ++lptr;
   1264             ++hptr;
   1265         }
   1266         if (parity != (numcols & 1)) {
   1267             lptr[0] -= (hptr[0] + 1) >> 1;
   1268         }
   1269 
   1270         /* Apply the second lifting step. */
   1271         lptr = &a[0];
   1272         hptr = &a[llen];
   1273         if (parity) {
   1274             hptr[0] += lptr[0];
   1275             ++hptr;
   1276         }
   1277         n = numcols - llen - parity - (parity == (numcols & 1));
   1278         while (n-- > 0) {
   1279             hptr[0] += (lptr[0] + lptr[1]) >> 1;
   1280             ++hptr;
   1281             ++lptr;
   1282         }
   1283         if (parity == (numcols & 1)) {
   1284             hptr[0] += lptr[0];
   1285         }
   1286 
   1287     } else {
   1288 
   1289         if (parity) {
   1290             lptr = &a[0];
   1291             lptr[0] >>= 1;
   1292         }
   1293 
   1294     }
   1295 
   1296 }
   1297 
   1298 void jpc_ft_invlift_col(jpc_fix_t *a, int numrows, int stride, int parity)
   1299 {
   1300 
   1301     jpc_fix_t *lptr;
   1302     jpc_fix_t *hptr;
   1303 #if 0
   1304     register jpc_fix_t *lptr2;
   1305     register jpc_fix_t *hptr2;
   1306     register int i;
   1307 #endif
   1308     register int n;
   1309     int llen;
   1310 
   1311     llen = (numrows + 1 - parity) >> 1;
   1312 
   1313     if (numrows > 1) {
   1314 
   1315         /* Apply the first lifting step. */
   1316         lptr = &a[0];
   1317         hptr = &a[llen * stride];
   1318         if (!parity) {
   1319             lptr[0] -= (hptr[0] + 1) >> 1;
   1320             lptr += stride;
   1321         }
   1322         n = llen - (!parity) - (parity != (numrows & 1));
   1323         while (n-- > 0) {
   1324             lptr[0] -= (hptr[0] + hptr[stride] + 2) >> 2;
   1325             lptr += stride;
   1326             hptr += stride;
   1327         }
   1328         if (parity != (numrows & 1)) {
   1329             lptr[0] -= (hptr[0] + 1) >> 1;
   1330         }
   1331 
   1332         /* Apply the second lifting step. */
   1333         lptr = &a[0];
   1334         hptr = &a[llen * stride];
   1335         if (parity) {
   1336             hptr[0] += lptr[0];
   1337             hptr += stride;
   1338         }
   1339         n = numrows - llen - parity - (parity == (numrows & 1));
   1340         while (n-- > 0) {
   1341             hptr[0] += (lptr[0] + lptr[stride]) >> 1;
   1342             hptr += stride;
   1343             lptr += stride;
   1344         }
   1345         if (parity == (numrows & 1)) {
   1346             hptr[0] += lptr[0];
   1347         }
   1348 
   1349     } else {
   1350 
   1351         if (parity) {
   1352             lptr = &a[0];
   1353             lptr[0] >>= 1;
   1354         }
   1355 
   1356     }
   1357 
   1358 }
   1359 
   1360 void jpc_ft_invlift_colgrp(jpc_fix_t *a, int numrows, int stride, int parity)
   1361 {
   1362 
   1363     jpc_fix_t *lptr;
   1364     jpc_fix_t *hptr;
   1365     register jpc_fix_t *lptr2;
   1366     register jpc_fix_t *hptr2;
   1367     register int n;
   1368     register int i;
   1369     int llen;
   1370 
   1371     llen = (numrows + 1 - parity) >> 1;
   1372 
   1373     if (numrows > 1) {
   1374 
   1375         /* Apply the first lifting step. */
   1376         lptr = &a[0];
   1377         hptr = &a[llen * stride];
   1378         if (!parity) {
   1379             lptr2 = lptr;
   1380             hptr2 = hptr;
   1381             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1382                 lptr2[0] -= (hptr2[0] + 1) >> 1;
   1383                 ++lptr2;
   1384                 ++hptr2;
   1385             }
   1386             lptr += stride;
   1387         }
   1388         n = llen - (!parity) - (parity != (numrows & 1));
   1389         while (n-- > 0) {
   1390             lptr2 = lptr;
   1391             hptr2 = hptr;
   1392             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1393                 lptr2[0] -= (hptr2[0] + hptr2[stride] + 2) >> 2;
   1394                 ++lptr2;
   1395                 ++hptr2;
   1396             }
   1397             lptr += stride;
   1398             hptr += stride;
   1399         }
   1400         if (parity != (numrows & 1)) {
   1401             lptr2 = lptr;
   1402             hptr2 = hptr;
   1403             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1404                 lptr2[0] -= (hptr2[0] + 1) >> 1;
   1405                 ++lptr2;
   1406                 ++hptr2;
   1407             }
   1408         }
   1409 
   1410         /* Apply the second lifting step. */
   1411         lptr = &a[0];
   1412         hptr = &a[llen * stride];
   1413         if (parity) {
   1414             lptr2 = lptr;
   1415             hptr2 = hptr;
   1416             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1417                 hptr2[0] += lptr2[0];
   1418                 ++hptr2;
   1419                 ++lptr2;
   1420             }
   1421             hptr += stride;
   1422         }
   1423         n = numrows - llen - parity - (parity == (numrows & 1));
   1424         while (n-- > 0) {
   1425             lptr2 = lptr;
   1426             hptr2 = hptr;
   1427             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1428                 hptr2[0] += (lptr2[0] + lptr2[stride]) >> 1;
   1429                 ++lptr2;
   1430                 ++hptr2;
   1431             }
   1432             hptr += stride;
   1433             lptr += stride;
   1434         }
   1435         if (parity == (numrows & 1)) {
   1436             lptr2 = lptr;
   1437             hptr2 = hptr;
   1438             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1439                 hptr2[0] += lptr2[0];
   1440                 ++lptr2;
   1441                 ++hptr2;
   1442             }
   1443         }
   1444 
   1445     } else {
   1446 
   1447         if (parity) {
   1448             lptr2 = &a[0];
   1449             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1450                 lptr2[0] >>= 1;
   1451                 ++lptr2;
   1452             }
   1453         }
   1454 
   1455     }
   1456 
   1457 }
   1458 
   1459 void jpc_ft_invlift_colres(jpc_fix_t *a, int numrows, int numcols, int stride,
   1460   int parity)
   1461 {
   1462 
   1463     jpc_fix_t *lptr;
   1464     jpc_fix_t *hptr;
   1465     register jpc_fix_t *lptr2;
   1466     register jpc_fix_t *hptr2;
   1467     register int n;
   1468     register int i;
   1469     int llen;
   1470 
   1471     llen = (numrows + 1 - parity) >> 1;
   1472 
   1473     if (numrows > 1) {
   1474 
   1475         /* Apply the first lifting step. */
   1476         lptr = &a[0];
   1477         hptr = &a[llen * stride];
   1478         if (!parity) {
   1479             lptr2 = lptr;
   1480             hptr2 = hptr;
   1481             for (i = 0; i < numcols; ++i) {
   1482                 lptr2[0] -= (hptr2[0] + 1) >> 1;
   1483                 ++lptr2;
   1484                 ++hptr2;
   1485             }
   1486             lptr += stride;
   1487         }
   1488         n = llen - (!parity) - (parity != (numrows & 1));
   1489         while (n-- > 0) {
   1490             lptr2 = lptr;
   1491             hptr2 = hptr;
   1492             for (i = 0; i < numcols; ++i) {
   1493                 lptr2[0] -= (hptr2[0] + hptr2[stride] + 2) >> 2;
   1494                 ++lptr2;
   1495                 ++hptr2;
   1496             }
   1497             lptr += stride;
   1498             hptr += stride;
   1499         }
   1500         if (parity != (numrows & 1)) {
   1501             lptr2 = lptr;
   1502             hptr2 = hptr;
   1503             for (i = 0; i < numcols; ++i) {
   1504                 lptr2[0] -= (hptr2[0] + 1) >> 1;
   1505                 ++lptr2;
   1506                 ++hptr2;
   1507             }
   1508         }
   1509 
   1510         /* Apply the second lifting step. */
   1511         lptr = &a[0];
   1512         hptr = &a[llen * stride];
   1513         if (parity) {
   1514             lptr2 = lptr;
   1515             hptr2 = hptr;
   1516             for (i = 0; i < numcols; ++i) {
   1517                 hptr2[0] += lptr2[0];
   1518                 ++hptr2;
   1519                 ++lptr2;
   1520             }
   1521             hptr += stride;
   1522         }
   1523         n = numrows - llen - parity - (parity == (numrows & 1));
   1524         while (n-- > 0) {
   1525             lptr2 = lptr;
   1526             hptr2 = hptr;
   1527             for (i = 0; i < numcols; ++i) {
   1528                 hptr2[0] += (lptr2[0] + lptr2[stride]) >> 1;
   1529                 ++lptr2;
   1530                 ++hptr2;
   1531             }
   1532             hptr += stride;
   1533             lptr += stride;
   1534         }
   1535         if (parity == (numrows & 1)) {
   1536             lptr2 = lptr;
   1537             hptr2 = hptr;
   1538             for (i = 0; i < numcols; ++i) {
   1539                 hptr2[0] += lptr2[0];
   1540                 ++lptr2;
   1541                 ++hptr2;
   1542             }
   1543         }
   1544 
   1545     } else {
   1546 
   1547         if (parity) {
   1548             lptr2 = &a[0];
   1549             for (i = 0; i < numcols; ++i) {
   1550                 lptr2[0] >>= 1;
   1551                 ++lptr2;
   1552             }
   1553         }
   1554 
   1555     }
   1556 
   1557 }
   1558 
   1559 int jpc_ft_analyze(int *a, int xstart, int ystart, int width, int height,
   1560   int stride)
   1561 {
   1562     int numrows = height;
   1563     int numcols = width;
   1564     int rowparity = ystart & 1;
   1565     int colparity = xstart & 1;
   1566     int i;
   1567     jpc_fix_t *startptr;
   1568     int maxcols;
   1569 
   1570     maxcols = (numcols / JPC_QMFB_COLGRPSIZE) * JPC_QMFB_COLGRPSIZE;
   1571     startptr = (jpc_fix_t*)&a[0];
   1572     for (i = 0; i < maxcols; i += JPC_QMFB_COLGRPSIZE) {
   1573         jpc_qmfb_split_colgrp(startptr, numrows, stride, rowparity);
   1574         jpc_ft_fwdlift_colgrp(startptr, numrows, stride, rowparity);
   1575         startptr += JPC_QMFB_COLGRPSIZE;
   1576     }
   1577     if (maxcols < numcols) {
   1578         jpc_qmfb_split_colres(startptr, numrows, numcols - maxcols, stride,
   1579           rowparity);
   1580         jpc_ft_fwdlift_colres(startptr, numrows, numcols - maxcols, stride,
   1581           rowparity);
   1582     }
   1583 
   1584     startptr = (jpc_fix_t*)&a[0];
   1585     for (i = 0; i < numrows; ++i) {
   1586         jpc_qmfb_split_row(startptr, numcols, colparity);
   1587         jpc_ft_fwdlift_row(startptr, numcols, colparity);
   1588         startptr += stride;
   1589     }
   1590 
   1591     return 0;
   1592 
   1593 }
   1594 
   1595 int jpc_ft_synthesize(int *a, int xstart, int ystart, int width, int height,
   1596   int stride)
   1597 {
   1598     int numrows = height;
   1599     int numcols = width;
   1600     int rowparity = ystart & 1;
   1601     int colparity = xstart & 1;
   1602 
   1603     int maxcols;
   1604     jpc_fix_t *startptr;
   1605     int i;
   1606 
   1607     startptr = (jpc_fix_t*)&a[0];
   1608     for (i = 0; i < numrows; ++i) {
   1609         jpc_ft_invlift_row(startptr, numcols, colparity);
   1610         jpc_qmfb_join_row(startptr, numcols, colparity);
   1611         startptr += stride;
   1612     }
   1613 
   1614     maxcols = (numcols / JPC_QMFB_COLGRPSIZE) * JPC_QMFB_COLGRPSIZE;
   1615     startptr = (jpc_fix_t*)&a[0];
   1616     for (i = 0; i < maxcols; i += JPC_QMFB_COLGRPSIZE) {
   1617         jpc_ft_invlift_colgrp(startptr, numrows, stride, rowparity);
   1618         jpc_qmfb_join_colgrp(startptr, numrows, stride, rowparity);
   1619         startptr += JPC_QMFB_COLGRPSIZE;
   1620     }
   1621     if (maxcols < numcols) {
   1622         jpc_ft_invlift_colres(startptr, numrows, numcols - maxcols, stride,
   1623           rowparity);
   1624         jpc_qmfb_join_colres(startptr, numrows, numcols - maxcols, stride,
   1625           rowparity);
   1626     }
   1627 
   1628     return 0;
   1629 
   1630 }
   1631 
   1632 /******************************************************************************\
   1633 * 9/7 transform
   1634 \******************************************************************************/
   1635 
   1636 #define ALPHA (-1.586134342059924)
   1637 #define BETA (-0.052980118572961)
   1638 #define GAMMA (0.882911075530934)
   1639 #define DELTA (0.443506852043971)
   1640 #define LGAIN (1.0 / 1.23017410558578)
   1641 #define HGAIN (1.0 / 1.62578613134411)
   1642 
   1643 void jpc_ns_fwdlift_row(jpc_fix_t *a, int numcols, int parity)
   1644 {
   1645 
   1646     register jpc_fix_t *lptr;
   1647     register jpc_fix_t *hptr;
   1648     register int n;
   1649     int llen;
   1650 
   1651     llen = (numcols + 1 - parity) >> 1;
   1652 
   1653     if (numcols > 1) {
   1654 
   1655         /* Apply the first lifting step. */
   1656         lptr = &a[0];
   1657         hptr = &a[llen];
   1658         if (parity) {
   1659             jpc_fix_pluseq(hptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   1660               lptr[0]));
   1661             ++hptr;
   1662         }
   1663         n = numcols - llen - parity - (parity == (numcols & 1));
   1664         while (n-- > 0) {
   1665             jpc_fix_pluseq(hptr[0], jpc_fix_mul(jpc_dbltofix(ALPHA),
   1666               jpc_fix_add(lptr[0], lptr[1])));
   1667             ++hptr;
   1668             ++lptr;
   1669         }
   1670         if (parity == (numcols & 1)) {
   1671             jpc_fix_pluseq(hptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   1672               lptr[0]));
   1673         }
   1674 
   1675         /* Apply the second lifting step. */
   1676         lptr = &a[0];
   1677         hptr = &a[llen];
   1678         if (!parity) {
   1679             jpc_fix_pluseq(lptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   1680               hptr[0]));
   1681             ++lptr;
   1682         }
   1683         n = llen - (!parity) - (parity != (numcols & 1));
   1684         while (n-- > 0) {
   1685             jpc_fix_pluseq(lptr[0], jpc_fix_mul(jpc_dbltofix(BETA),
   1686               jpc_fix_add(hptr[0], hptr[1])));
   1687             ++lptr;
   1688             ++hptr;
   1689         }
   1690         if (parity != (numcols & 1)) {
   1691             jpc_fix_pluseq(lptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   1692               hptr[0]));
   1693         }
   1694 
   1695         /* Apply the third lifting step. */
   1696         lptr = &a[0];
   1697         hptr = &a[llen];
   1698         if (parity) {
   1699             jpc_fix_pluseq(hptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   1700               lptr[0]));
   1701             ++hptr;
   1702         }
   1703         n = numcols - llen - parity - (parity == (numcols & 1));
   1704         while (n-- > 0) {
   1705             jpc_fix_pluseq(hptr[0], jpc_fix_mul(jpc_dbltofix(GAMMA),
   1706               jpc_fix_add(lptr[0], lptr[1])));
   1707             ++hptr;
   1708             ++lptr;
   1709         }
   1710         if (parity == (numcols & 1)) {
   1711             jpc_fix_pluseq(hptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   1712               lptr[0]));
   1713         }
   1714 
   1715         /* Apply the fourth lifting step. */
   1716         lptr = &a[0];
   1717         hptr = &a[llen];
   1718         if (!parity) {
   1719             jpc_fix_pluseq(lptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   1720               hptr[0]));
   1721             ++lptr;
   1722         }
   1723         n = llen - (!parity) - (parity != (numcols & 1));
   1724         while (n-- > 0) {
   1725             jpc_fix_pluseq(lptr[0], jpc_fix_mul(jpc_dbltofix(DELTA),
   1726               jpc_fix_add(hptr[0], hptr[1])));
   1727             ++lptr;
   1728             ++hptr;
   1729         }
   1730         if (parity != (numcols & 1)) {
   1731             jpc_fix_pluseq(lptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   1732               hptr[0]));
   1733         }
   1734 
   1735         /* Apply the scaling step. */
   1736 #if defined(WT_DOSCALE)
   1737         lptr = &a[0];
   1738         n = llen;
   1739         while (n-- > 0) {
   1740             lptr[0] = jpc_fix_mul(lptr[0], jpc_dbltofix(LGAIN));
   1741             ++lptr;
   1742         }
   1743         hptr = &a[llen];
   1744         n = numcols - llen;
   1745         while (n-- > 0) {
   1746             hptr[0] = jpc_fix_mul(hptr[0], jpc_dbltofix(HGAIN));
   1747             ++hptr;
   1748         }
   1749 #endif
   1750 
   1751     } else {
   1752 
   1753 #if defined(WT_LENONE)
   1754         if (parity) {
   1755             lptr = &a[0];
   1756             lptr[0] <<= 1;
   1757         }
   1758 #endif
   1759 
   1760     }
   1761 
   1762 }
   1763 
   1764 void jpc_ns_fwdlift_colgrp(jpc_fix_t *a, int numrows, int stride,
   1765   int parity)
   1766 {
   1767 
   1768     jpc_fix_t *lptr;
   1769     jpc_fix_t *hptr;
   1770     register jpc_fix_t *lptr2;
   1771     register jpc_fix_t *hptr2;
   1772     register int n;
   1773     register int i;
   1774     int llen;
   1775 
   1776     llen = (numrows + 1 - parity) >> 1;
   1777 
   1778     if (numrows > 1) {
   1779 
   1780         /* Apply the first lifting step. */
   1781         lptr = &a[0];
   1782         hptr = &a[llen * stride];
   1783         if (parity) {
   1784             lptr2 = lptr;
   1785             hptr2 = hptr;
   1786             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1787                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   1788                   lptr2[0]));
   1789                 ++hptr2;
   1790                 ++lptr2;
   1791             }
   1792             hptr += stride;
   1793         }
   1794         n = numrows - llen - parity - (parity == (numrows & 1));
   1795         while (n-- > 0) {
   1796             lptr2 = lptr;
   1797             hptr2 = hptr;
   1798             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1799                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(ALPHA),
   1800                   jpc_fix_add(lptr2[0], lptr2[stride])));
   1801                 ++lptr2;
   1802                 ++hptr2;
   1803             }
   1804             hptr += stride;
   1805             lptr += stride;
   1806         }
   1807         if (parity == (numrows & 1)) {
   1808             lptr2 = lptr;
   1809             hptr2 = hptr;
   1810             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1811                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   1812                   lptr2[0]));
   1813                 ++lptr2;
   1814                 ++hptr2;
   1815             }
   1816         }
   1817 
   1818         /* Apply the second lifting step. */
   1819         lptr = &a[0];
   1820         hptr = &a[llen * stride];
   1821         if (!parity) {
   1822             lptr2 = lptr;
   1823             hptr2 = hptr;
   1824             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1825                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   1826                   hptr2[0]));
   1827                 ++lptr2;
   1828                 ++hptr2;
   1829             }
   1830             lptr += stride;
   1831         }
   1832         n = llen - (!parity) - (parity != (numrows & 1));
   1833         while (n-- > 0) {
   1834             lptr2 = lptr;
   1835             hptr2 = hptr;
   1836             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1837                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(BETA),
   1838                   jpc_fix_add(hptr2[0], hptr2[stride])));
   1839                 ++lptr2;
   1840                 ++hptr2;
   1841             }
   1842             lptr += stride;
   1843             hptr += stride;
   1844         }
   1845         if (parity != (numrows & 1)) {
   1846             lptr2 = lptr;
   1847             hptr2 = hptr;
   1848             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1849                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   1850                   hptr2[0]));
   1851                 ++lptr2;
   1852                 ++hptr2;
   1853             }
   1854         }
   1855 
   1856         /* Apply the third lifting step. */
   1857         lptr = &a[0];
   1858         hptr = &a[llen * stride];
   1859         if (parity) {
   1860             lptr2 = lptr;
   1861             hptr2 = hptr;
   1862             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1863                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   1864                   lptr2[0]));
   1865                 ++hptr2;
   1866                 ++lptr2;
   1867             }
   1868             hptr += stride;
   1869         }
   1870         n = numrows - llen - parity - (parity == (numrows & 1));
   1871         while (n-- > 0) {
   1872             lptr2 = lptr;
   1873             hptr2 = hptr;
   1874             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1875                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(GAMMA),
   1876                   jpc_fix_add(lptr2[0], lptr2[stride])));
   1877                 ++lptr2;
   1878                 ++hptr2;
   1879             }
   1880             hptr += stride;
   1881             lptr += stride;
   1882         }
   1883         if (parity == (numrows & 1)) {
   1884             lptr2 = lptr;
   1885             hptr2 = hptr;
   1886             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1887                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   1888                   lptr2[0]));
   1889                 ++lptr2;
   1890                 ++hptr2;
   1891             }
   1892         }
   1893 
   1894         /* Apply the fourth lifting step. */
   1895         lptr = &a[0];
   1896         hptr = &a[llen * stride];
   1897         if (!parity) {
   1898             lptr2 = lptr;
   1899             hptr2 = hptr;
   1900             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1901                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   1902                   hptr2[0]));
   1903                 ++lptr2;
   1904                 ++hptr2;
   1905             }
   1906             lptr += stride;
   1907         }
   1908         n = llen - (!parity) - (parity != (numrows & 1));
   1909         while (n-- > 0) {
   1910             lptr2 = lptr;
   1911             hptr2 = hptr;
   1912             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1913                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(DELTA),
   1914                   jpc_fix_add(hptr2[0], hptr2[stride])));
   1915                 ++lptr2;
   1916                 ++hptr2;
   1917             }
   1918             lptr += stride;
   1919             hptr += stride;
   1920         }
   1921         if (parity != (numrows & 1)) {
   1922             lptr2 = lptr;
   1923             hptr2 = hptr;
   1924             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1925                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   1926                   hptr2[0]));
   1927                 ++lptr2;
   1928                 ++hptr2;
   1929             }
   1930         }
   1931 
   1932         /* Apply the scaling step. */
   1933 #if defined(WT_DOSCALE)
   1934         lptr = &a[0];
   1935         n = llen;
   1936         while (n-- > 0) {
   1937             lptr2 = lptr;
   1938             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1939                 lptr2[0] = jpc_fix_mul(lptr2[0], jpc_dbltofix(LGAIN));
   1940                 ++lptr2;
   1941             }
   1942             lptr += stride;
   1943         }
   1944         hptr = &a[llen * stride];
   1945         n = numrows - llen;
   1946         while (n-- > 0) {
   1947             hptr2 = hptr;
   1948             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1949                 hptr2[0] = jpc_fix_mul(hptr2[0], jpc_dbltofix(HGAIN));
   1950                 ++hptr2;
   1951             }
   1952             hptr += stride;
   1953         }
   1954 #endif
   1955 
   1956     } else {
   1957 
   1958 #if defined(WT_LENONE)
   1959         if (parity) {
   1960             lptr2 = &a[0];
   1961             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   1962                 lptr2[0] <<= 1;
   1963                 ++lptr2;
   1964             }
   1965         }
   1966 #endif
   1967 
   1968     }
   1969 
   1970 }
   1971 
   1972 void jpc_ns_fwdlift_colres(jpc_fix_t *a, int numrows, int numcols,
   1973   int stride, int parity)
   1974 {
   1975 
   1976     jpc_fix_t *lptr;
   1977     jpc_fix_t *hptr;
   1978     register jpc_fix_t *lptr2;
   1979     register jpc_fix_t *hptr2;
   1980     register int n;
   1981     register int i;
   1982     int llen;
   1983 
   1984     llen = (numrows + 1 - parity) >> 1;
   1985 
   1986     if (numrows > 1) {
   1987 
   1988         /* Apply the first lifting step. */
   1989         lptr = &a[0];
   1990         hptr = &a[llen * stride];
   1991         if (parity) {
   1992             lptr2 = lptr;
   1993             hptr2 = hptr;
   1994             for (i = 0; i < numcols; ++i) {
   1995                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   1996                   lptr2[0]));
   1997                 ++hptr2;
   1998                 ++lptr2;
   1999             }
   2000             hptr += stride;
   2001         }
   2002         n = numrows - llen - parity - (parity == (numrows & 1));
   2003         while (n-- > 0) {
   2004             lptr2 = lptr;
   2005             hptr2 = hptr;
   2006             for (i = 0; i < numcols; ++i) {
   2007                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(ALPHA),
   2008                   jpc_fix_add(lptr2[0], lptr2[stride])));
   2009                 ++lptr2;
   2010                 ++hptr2;
   2011             }
   2012             hptr += stride;
   2013             lptr += stride;
   2014         }
   2015         if (parity == (numrows & 1)) {
   2016             lptr2 = lptr;
   2017             hptr2 = hptr;
   2018             for (i = 0; i < numcols; ++i) {
   2019                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   2020                   lptr2[0]));
   2021                 ++lptr2;
   2022                 ++hptr2;
   2023             }
   2024         }
   2025 
   2026         /* Apply the second lifting step. */
   2027         lptr = &a[0];
   2028         hptr = &a[llen * stride];
   2029         if (!parity) {
   2030             lptr2 = lptr;
   2031             hptr2 = hptr;
   2032             for (i = 0; i < numcols; ++i) {
   2033                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2034                   hptr2[0]));
   2035                 ++lptr2;
   2036                 ++hptr2;
   2037             }
   2038             lptr += stride;
   2039         }
   2040         n = llen - (!parity) - (parity != (numrows & 1));
   2041         while (n-- > 0) {
   2042             lptr2 = lptr;
   2043             hptr2 = hptr;
   2044             for (i = 0; i < numcols; ++i) {
   2045                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(BETA),
   2046                   jpc_fix_add(hptr2[0], hptr2[stride])));
   2047                 ++lptr2;
   2048                 ++hptr2;
   2049             }
   2050             lptr += stride;
   2051             hptr += stride;
   2052         }
   2053         if (parity != (numrows & 1)) {
   2054             lptr2 = lptr;
   2055             hptr2 = hptr;
   2056             for (i = 0; i < numcols; ++i) {
   2057                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2058                   hptr2[0]));
   2059                 ++lptr2;
   2060                 ++hptr2;
   2061             }
   2062         }
   2063 
   2064         /* Apply the third lifting step. */
   2065         lptr = &a[0];
   2066         hptr = &a[llen * stride];
   2067         if (parity) {
   2068             lptr2 = lptr;
   2069             hptr2 = hptr;
   2070             for (i = 0; i < numcols; ++i) {
   2071                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   2072                   lptr2[0]));
   2073                 ++hptr2;
   2074                 ++lptr2;
   2075             }
   2076             hptr += stride;
   2077         }
   2078         n = numrows - llen - parity - (parity == (numrows & 1));
   2079         while (n-- > 0) {
   2080             lptr2 = lptr;
   2081             hptr2 = hptr;
   2082             for (i = 0; i < numcols; ++i) {
   2083                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(GAMMA),
   2084                   jpc_fix_add(lptr2[0], lptr2[stride])));
   2085                 ++lptr2;
   2086                 ++hptr2;
   2087             }
   2088             hptr += stride;
   2089             lptr += stride;
   2090         }
   2091         if (parity == (numrows & 1)) {
   2092             lptr2 = lptr;
   2093             hptr2 = hptr;
   2094             for (i = 0; i < numcols; ++i) {
   2095                 jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   2096                   lptr2[0]));
   2097                 ++lptr2;
   2098                 ++hptr2;
   2099             }
   2100         }
   2101 
   2102         /* Apply the fourth lifting step. */
   2103         lptr = &a[0];
   2104         hptr = &a[llen * stride];
   2105         if (!parity) {
   2106             lptr2 = lptr;
   2107             hptr2 = hptr;
   2108             for (i = 0; i < numcols; ++i) {
   2109                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   2110                   hptr2[0]));
   2111                 ++lptr2;
   2112                 ++hptr2;
   2113             }
   2114             lptr += stride;
   2115         }
   2116         n = llen - (!parity) - (parity != (numrows & 1));
   2117         while (n-- > 0) {
   2118             lptr2 = lptr;
   2119             hptr2 = hptr;
   2120             for (i = 0; i < numcols; ++i) {
   2121                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(DELTA),
   2122                   jpc_fix_add(hptr2[0], hptr2[stride])));
   2123                 ++lptr2;
   2124                 ++hptr2;
   2125             }
   2126             lptr += stride;
   2127             hptr += stride;
   2128         }
   2129         if (parity != (numrows & 1)) {
   2130             lptr2 = lptr;
   2131             hptr2 = hptr;
   2132             for (i = 0; i < numcols; ++i) {
   2133                 jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   2134                   hptr2[0]));
   2135                 ++lptr2;
   2136                 ++hptr2;
   2137             }
   2138         }
   2139 
   2140         /* Apply the scaling step. */
   2141 #if defined(WT_DOSCALE)
   2142         lptr = &a[0];
   2143         n = llen;
   2144         while (n-- > 0) {
   2145             lptr2 = lptr;
   2146             for (i = 0; i < numcols; ++i) {
   2147                 lptr2[0] = jpc_fix_mul(lptr2[0], jpc_dbltofix(LGAIN));
   2148                 ++lptr2;
   2149             }
   2150             lptr += stride;
   2151         }
   2152         hptr = &a[llen * stride];
   2153         n = numrows - llen;
   2154         while (n-- > 0) {
   2155             hptr2 = hptr;
   2156             for (i = 0; i < numcols; ++i) {
   2157                 hptr2[0] = jpc_fix_mul(hptr2[0], jpc_dbltofix(HGAIN));
   2158                 ++hptr2;
   2159             }
   2160             hptr += stride;
   2161         }
   2162 #endif
   2163 
   2164     } else {
   2165 
   2166 #if defined(WT_LENONE)
   2167         if (parity) {
   2168             lptr2 = &a[0];
   2169             for (i = 0; i < numcols; ++i) {
   2170                 lptr2[0] <<= 1;
   2171                 ++lptr2;
   2172             }
   2173         }
   2174 #endif
   2175 
   2176     }
   2177 
   2178 }
   2179 
   2180 void jpc_ns_fwdlift_col(jpc_fix_t *a, int numrows, int stride,
   2181   int parity)
   2182 {
   2183 
   2184     jpc_fix_t *lptr;
   2185     jpc_fix_t *hptr;
   2186     register jpc_fix_t *lptr2;
   2187     register jpc_fix_t *hptr2;
   2188     register int n;
   2189     int llen;
   2190 
   2191     llen = (numrows + 1 - parity) >> 1;
   2192 
   2193     if (numrows > 1) {
   2194 
   2195         /* Apply the first lifting step. */
   2196         lptr = &a[0];
   2197         hptr = &a[llen * stride];
   2198         if (parity) {
   2199             lptr2 = lptr;
   2200             hptr2 = hptr;
   2201             jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   2202               lptr2[0]));
   2203             ++hptr2;
   2204             ++lptr2;
   2205             hptr += stride;
   2206         }
   2207         n = numrows - llen - parity - (parity == (numrows & 1));
   2208         while (n-- > 0) {
   2209             lptr2 = lptr;
   2210             hptr2 = hptr;
   2211             jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(ALPHA),
   2212               jpc_fix_add(lptr2[0], lptr2[stride])));
   2213             ++lptr2;
   2214             ++hptr2;
   2215             hptr += stride;
   2216             lptr += stride;
   2217         }
   2218         if (parity == (numrows & 1)) {
   2219             lptr2 = lptr;
   2220             hptr2 = hptr;
   2221             jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   2222               lptr2[0]));
   2223             ++lptr2;
   2224             ++hptr2;
   2225         }
   2226 
   2227         /* Apply the second lifting step. */
   2228         lptr = &a[0];
   2229         hptr = &a[llen * stride];
   2230         if (!parity) {
   2231             lptr2 = lptr;
   2232             hptr2 = hptr;
   2233             jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2234               hptr2[0]));
   2235             ++lptr2;
   2236             ++hptr2;
   2237             lptr += stride;
   2238         }
   2239         n = llen - (!parity) - (parity != (numrows & 1));
   2240         while (n-- > 0) {
   2241             lptr2 = lptr;
   2242             hptr2 = hptr;
   2243             jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(BETA),
   2244               jpc_fix_add(hptr2[0], hptr2[stride])));
   2245             ++lptr2;
   2246             ++hptr2;
   2247             lptr += stride;
   2248             hptr += stride;
   2249         }
   2250         if (parity != (numrows & 1)) {
   2251             lptr2 = lptr;
   2252             hptr2 = hptr;
   2253             jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2254               hptr2[0]));
   2255             ++lptr2;
   2256             ++hptr2;
   2257         }
   2258 
   2259         /* Apply the third lifting step. */
   2260         lptr = &a[0];
   2261         hptr = &a[llen * stride];
   2262         if (parity) {
   2263             lptr2 = lptr;
   2264             hptr2 = hptr;
   2265             jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   2266               lptr2[0]));
   2267             ++hptr2;
   2268             ++lptr2;
   2269             hptr += stride;
   2270         }
   2271         n = numrows - llen - parity - (parity == (numrows & 1));
   2272         while (n-- > 0) {
   2273             lptr2 = lptr;
   2274             hptr2 = hptr;
   2275             jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(GAMMA),
   2276               jpc_fix_add(lptr2[0], lptr2[stride])));
   2277             ++lptr2;
   2278             ++hptr2;
   2279             hptr += stride;
   2280             lptr += stride;
   2281         }
   2282         if (parity == (numrows & 1)) {
   2283             lptr2 = lptr;
   2284             hptr2 = hptr;
   2285             jpc_fix_pluseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   2286               lptr2[0]));
   2287             ++lptr2;
   2288             ++hptr2;
   2289         }
   2290 
   2291         /* Apply the fourth lifting step. */
   2292         lptr = &a[0];
   2293         hptr = &a[llen * stride];
   2294         if (!parity) {
   2295             lptr2 = lptr;
   2296             hptr2 = hptr;
   2297             jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   2298               hptr2[0]));
   2299             ++lptr2;
   2300             ++hptr2;
   2301             lptr += stride;
   2302         }
   2303         n = llen - (!parity) - (parity != (numrows & 1));
   2304         while (n-- > 0) {
   2305             lptr2 = lptr;
   2306             hptr2 = hptr;
   2307             jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(DELTA),
   2308               jpc_fix_add(hptr2[0], hptr2[stride])));
   2309             ++lptr2;
   2310             ++hptr2;
   2311             lptr += stride;
   2312             hptr += stride;
   2313         }
   2314         if (parity != (numrows & 1)) {
   2315             lptr2 = lptr;
   2316             hptr2 = hptr;
   2317             jpc_fix_pluseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   2318               hptr2[0]));
   2319             ++lptr2;
   2320             ++hptr2;
   2321         }
   2322 
   2323         /* Apply the scaling step. */
   2324 #if defined(WT_DOSCALE)
   2325         lptr = &a[0];
   2326         n = llen;
   2327         while (n-- > 0) {
   2328             lptr2 = lptr;
   2329             lptr2[0] = jpc_fix_mul(lptr2[0], jpc_dbltofix(LGAIN));
   2330             ++lptr2;
   2331             lptr += stride;
   2332         }
   2333         hptr = &a[llen * stride];
   2334         n = numrows - llen;
   2335         while (n-- > 0) {
   2336             hptr2 = hptr;
   2337             hptr2[0] = jpc_fix_mul(hptr2[0], jpc_dbltofix(HGAIN));
   2338             ++hptr2;
   2339             hptr += stride;
   2340         }
   2341 #endif
   2342 
   2343     } else {
   2344 
   2345 #if defined(WT_LENONE)
   2346         if (parity) {
   2347             lptr2 = &a[0];
   2348             lptr2[0] <<= 1;
   2349             ++lptr2;
   2350         }
   2351 #endif
   2352 
   2353     }
   2354 
   2355 }
   2356 
   2357 void jpc_ns_invlift_row(jpc_fix_t *a, int numcols, int parity)
   2358 {
   2359 
   2360     register jpc_fix_t *lptr;
   2361     register jpc_fix_t *hptr;
   2362     register int n;
   2363     int llen;
   2364 
   2365     llen = (numcols + 1 - parity) >> 1;
   2366 
   2367     if (numcols > 1) {
   2368 
   2369         /* Apply the scaling step. */
   2370 #if defined(WT_DOSCALE)
   2371         lptr = &a[0];
   2372         n = llen;
   2373         while (n-- > 0) {
   2374             lptr[0] = jpc_fix_mul(lptr[0], jpc_dbltofix(1.0 / LGAIN));
   2375             ++lptr;
   2376         }
   2377         hptr = &a[llen];
   2378         n = numcols - llen;
   2379         while (n-- > 0) {
   2380             hptr[0] = jpc_fix_mul(hptr[0], jpc_dbltofix(1.0 / HGAIN));
   2381             ++hptr;
   2382         }
   2383 #endif
   2384 
   2385         /* Apply the first lifting step. */
   2386         lptr = &a[0];
   2387         hptr = &a[llen];
   2388         if (!parity) {
   2389             jpc_fix_minuseq(lptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   2390               hptr[0]));
   2391             ++lptr;
   2392         }
   2393         n = llen - (!parity) - (parity != (numcols & 1));
   2394         while (n-- > 0) {
   2395             jpc_fix_minuseq(lptr[0], jpc_fix_mul(jpc_dbltofix(DELTA),
   2396               jpc_fix_add(hptr[0], hptr[1])));
   2397             ++lptr;
   2398             ++hptr;
   2399         }
   2400         if (parity != (numcols & 1)) {
   2401             jpc_fix_minuseq(lptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * DELTA),
   2402               hptr[0]));
   2403         }
   2404 
   2405         /* Apply the second lifting step. */
   2406         lptr = &a[0];
   2407         hptr = &a[llen];
   2408         if (parity) {
   2409             jpc_fix_minuseq(hptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   2410               lptr[0]));
   2411             ++hptr;
   2412         }
   2413         n = numcols - llen - parity - (parity == (numcols & 1));
   2414         while (n-- > 0) {
   2415             jpc_fix_minuseq(hptr[0], jpc_fix_mul(jpc_dbltofix(GAMMA),
   2416               jpc_fix_add(lptr[0], lptr[1])));
   2417             ++hptr;
   2418             ++lptr;
   2419         }
   2420         if (parity == (numcols & 1)) {
   2421             jpc_fix_minuseq(hptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * GAMMA),
   2422               lptr[0]));
   2423         }
   2424 
   2425         /* Apply the third lifting step. */
   2426         lptr = &a[0];
   2427         hptr = &a[llen];
   2428         if (!parity) {
   2429             jpc_fix_minuseq(lptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2430               hptr[0]));
   2431             ++lptr;
   2432         }
   2433         n = llen - (!parity) - (parity != (numcols & 1));
   2434         while (n-- > 0) {
   2435             jpc_fix_minuseq(lptr[0], jpc_fix_mul(jpc_dbltofix(BETA),
   2436               jpc_fix_add(hptr[0], hptr[1])));
   2437             ++lptr;
   2438             ++hptr;
   2439         }
   2440         if (parity != (numcols & 1)) {
   2441             jpc_fix_minuseq(lptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2442               hptr[0]));
   2443         }
   2444 
   2445         /* Apply the fourth lifting step. */
   2446         lptr = &a[0];
   2447         hptr = &a[llen];
   2448         if (parity) {
   2449             jpc_fix_minuseq(hptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   2450               lptr[0]));
   2451             ++hptr;
   2452         }
   2453         n = numcols - llen - parity - (parity == (numcols & 1));
   2454         while (n-- > 0) {
   2455             jpc_fix_minuseq(hptr[0], jpc_fix_mul(jpc_dbltofix(ALPHA),
   2456               jpc_fix_add(lptr[0], lptr[1])));
   2457             ++hptr;
   2458             ++lptr;
   2459         }
   2460         if (parity == (numcols & 1)) {
   2461             jpc_fix_minuseq(hptr[0], jpc_fix_mul(jpc_dbltofix(2.0 * ALPHA),
   2462               lptr[0]));
   2463         }
   2464 
   2465     } else {
   2466 
   2467 #if defined(WT_LENONE)
   2468         if (parity) {
   2469             lptr = &a[0];
   2470             lptr[0] >>= 1;
   2471         }
   2472 #endif
   2473 
   2474     }
   2475 
   2476 }
   2477 
   2478 void jpc_ns_invlift_colgrp(jpc_fix_t *a, int numrows, int stride,
   2479   int parity)
   2480 {
   2481 
   2482     jpc_fix_t *lptr;
   2483     jpc_fix_t *hptr;
   2484     register jpc_fix_t *lptr2;
   2485     register jpc_fix_t *hptr2;
   2486     register int n;
   2487     register int i;
   2488     int llen;
   2489 
   2490     llen = (numrows + 1 - parity) >> 1;
   2491 
   2492     if (numrows > 1) {
   2493 
   2494         /* Apply the scaling step. */
   2495 #if defined(WT_DOSCALE)
   2496         lptr = &a[0];
   2497         n = llen;
   2498         while (n-- > 0) {
   2499             lptr2 = lptr;
   2500             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2501                 lptr2[0] = jpc_fix_mul(lptr2[0], jpc_dbltofix(1.0 / LGAIN));
   2502                 ++lptr2;
   2503             }
   2504             lptr += stride;
   2505         }
   2506         hptr = &a[llen * stride];
   2507         n = numrows - llen;
   2508         while (n-- > 0) {
   2509             hptr2 = hptr;
   2510             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2511                 hptr2[0] = jpc_fix_mul(hptr2[0], jpc_dbltofix(1.0 / HGAIN));
   2512                 ++hptr2;
   2513             }
   2514             hptr += stride;
   2515         }
   2516 #endif
   2517 
   2518         /* Apply the first lifting step. */
   2519         lptr = &a[0];
   2520         hptr = &a[llen * stride];
   2521         if (!parity) {
   2522             lptr2 = lptr;
   2523             hptr2 = hptr;
   2524             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2525                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2526                   DELTA), hptr2[0]));
   2527                 ++lptr2;
   2528                 ++hptr2;
   2529             }
   2530             lptr += stride;
   2531         }
   2532         n = llen - (!parity) - (parity != (numrows & 1));
   2533         while (n-- > 0) {
   2534             lptr2 = lptr;
   2535             hptr2 = hptr;
   2536             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2537                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(DELTA),
   2538                   jpc_fix_add(hptr2[0], hptr2[stride])));
   2539                 ++lptr2;
   2540                 ++hptr2;
   2541             }
   2542             lptr += stride;
   2543             hptr += stride;
   2544         }
   2545         if (parity != (numrows & 1)) {
   2546             lptr2 = lptr;
   2547             hptr2 = hptr;
   2548             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2549                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2550                   DELTA), hptr2[0]));
   2551                 ++lptr2;
   2552                 ++hptr2;
   2553             }
   2554         }
   2555 
   2556         /* Apply the second lifting step. */
   2557         lptr = &a[0];
   2558         hptr = &a[llen * stride];
   2559         if (parity) {
   2560             lptr2 = lptr;
   2561             hptr2 = hptr;
   2562             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2563                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2564                   GAMMA), lptr2[0]));
   2565                 ++hptr2;
   2566                 ++lptr2;
   2567             }
   2568             hptr += stride;
   2569         }
   2570         n = numrows - llen - parity - (parity == (numrows & 1));
   2571         while (n-- > 0) {
   2572             lptr2 = lptr;
   2573             hptr2 = hptr;
   2574             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2575                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(GAMMA),
   2576                   jpc_fix_add(lptr2[0], lptr2[stride])));
   2577                 ++lptr2;
   2578                 ++hptr2;
   2579             }
   2580             hptr += stride;
   2581             lptr += stride;
   2582         }
   2583         if (parity == (numrows & 1)) {
   2584             lptr2 = lptr;
   2585             hptr2 = hptr;
   2586             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2587                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2588                   GAMMA), lptr2[0]));
   2589                 ++lptr2;
   2590                 ++hptr2;
   2591             }
   2592         }
   2593 
   2594         /* Apply the third lifting step. */
   2595         lptr = &a[0];
   2596         hptr = &a[llen * stride];
   2597         if (!parity) {
   2598             lptr2 = lptr;
   2599             hptr2 = hptr;
   2600             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2601                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2602                   hptr2[0]));
   2603                 ++lptr2;
   2604                 ++hptr2;
   2605             }
   2606             lptr += stride;
   2607         }
   2608         n = llen - (!parity) - (parity != (numrows & 1));
   2609         while (n-- > 0) {
   2610             lptr2 = lptr;
   2611             hptr2 = hptr;
   2612             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2613                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(BETA),
   2614                   jpc_fix_add(hptr2[0], hptr2[stride])));
   2615                 ++lptr2;
   2616                 ++hptr2;
   2617             }
   2618             lptr += stride;
   2619             hptr += stride;
   2620         }
   2621         if (parity != (numrows & 1)) {
   2622             lptr2 = lptr;
   2623             hptr2 = hptr;
   2624             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2625                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2626                   hptr2[0]));
   2627                 ++lptr2;
   2628                 ++hptr2;
   2629             }
   2630         }
   2631 
   2632         /* Apply the fourth lifting step. */
   2633         lptr = &a[0];
   2634         hptr = &a[llen * stride];
   2635         if (parity) {
   2636             lptr2 = lptr;
   2637             hptr2 = hptr;
   2638             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2639                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2640                   ALPHA), lptr2[0]));
   2641                 ++hptr2;
   2642                 ++lptr2;
   2643             }
   2644             hptr += stride;
   2645         }
   2646         n = numrows - llen - parity - (parity == (numrows & 1));
   2647         while (n-- > 0) {
   2648             lptr2 = lptr;
   2649             hptr2 = hptr;
   2650             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2651                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(ALPHA),
   2652                   jpc_fix_add(lptr2[0], lptr2[stride])));
   2653                 ++lptr2;
   2654                 ++hptr2;
   2655             }
   2656             hptr += stride;
   2657             lptr += stride;
   2658         }
   2659         if (parity == (numrows & 1)) {
   2660             lptr2 = lptr;
   2661             hptr2 = hptr;
   2662             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2663                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2664                   ALPHA), lptr2[0]));
   2665                 ++lptr2;
   2666                 ++hptr2;
   2667             }
   2668         }
   2669 
   2670     } else {
   2671 
   2672 #if defined(WT_LENONE)
   2673         if (parity) {
   2674             lptr2 = &a[0];
   2675             for (i = 0; i < JPC_QMFB_COLGRPSIZE; ++i) {
   2676                 lptr2[0] >>= 1;
   2677                 ++lptr2;
   2678             }
   2679         }
   2680 #endif
   2681 
   2682     }
   2683 
   2684 }
   2685 
   2686 void jpc_ns_invlift_colres(jpc_fix_t *a, int numrows, int numcols,
   2687   int stride, int parity)
   2688 {
   2689 
   2690     jpc_fix_t *lptr;
   2691     jpc_fix_t *hptr;
   2692     register jpc_fix_t *lptr2;
   2693     register jpc_fix_t *hptr2;
   2694     register int n;
   2695     register int i;
   2696     int llen;
   2697 
   2698     llen = (numrows + 1 - parity) >> 1;
   2699 
   2700     if (numrows > 1) {
   2701 
   2702         /* Apply the scaling step. */
   2703 #if defined(WT_DOSCALE)
   2704         lptr = &a[0];
   2705         n = llen;
   2706         while (n-- > 0) {
   2707             lptr2 = lptr;
   2708             for (i = 0; i < numcols; ++i) {
   2709                 lptr2[0] = jpc_fix_mul(lptr2[0], jpc_dbltofix(1.0 / LGAIN));
   2710                 ++lptr2;
   2711             }
   2712             lptr += stride;
   2713         }
   2714         hptr = &a[llen * stride];
   2715         n = numrows - llen;
   2716         while (n-- > 0) {
   2717             hptr2 = hptr;
   2718             for (i = 0; i < numcols; ++i) {
   2719                 hptr2[0] = jpc_fix_mul(hptr2[0], jpc_dbltofix(1.0 / HGAIN));
   2720                 ++hptr2;
   2721             }
   2722             hptr += stride;
   2723         }
   2724 #endif
   2725 
   2726         /* Apply the first lifting step. */
   2727         lptr = &a[0];
   2728         hptr = &a[llen * stride];
   2729         if (!parity) {
   2730             lptr2 = lptr;
   2731             hptr2 = hptr;
   2732             for (i = 0; i < numcols; ++i) {
   2733                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2734                   DELTA), hptr2[0]));
   2735                 ++lptr2;
   2736                 ++hptr2;
   2737             }
   2738             lptr += stride;
   2739         }
   2740         n = llen - (!parity) - (parity != (numrows & 1));
   2741         while (n-- > 0) {
   2742             lptr2 = lptr;
   2743             hptr2 = hptr;
   2744             for (i = 0; i < numcols; ++i) {
   2745                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(DELTA),
   2746                   jpc_fix_add(hptr2[0], hptr2[stride])));
   2747                 ++lptr2;
   2748                 ++hptr2;
   2749             }
   2750             lptr += stride;
   2751             hptr += stride;
   2752         }
   2753         if (parity != (numrows & 1)) {
   2754             lptr2 = lptr;
   2755             hptr2 = hptr;
   2756             for (i = 0; i < numcols; ++i) {
   2757                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2758                   DELTA), hptr2[0]));
   2759                 ++lptr2;
   2760                 ++hptr2;
   2761             }
   2762         }
   2763 
   2764         /* Apply the second lifting step. */
   2765         lptr = &a[0];
   2766         hptr = &a[llen * stride];
   2767         if (parity) {
   2768             lptr2 = lptr;
   2769             hptr2 = hptr;
   2770             for (i = 0; i < numcols; ++i) {
   2771                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2772                   GAMMA), lptr2[0]));
   2773                 ++hptr2;
   2774                 ++lptr2;
   2775             }
   2776             hptr += stride;
   2777         }
   2778         n = numrows - llen - parity - (parity == (numrows & 1));
   2779         while (n-- > 0) {
   2780             lptr2 = lptr;
   2781             hptr2 = hptr;
   2782             for (i = 0; i < numcols; ++i) {
   2783                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(GAMMA),
   2784                   jpc_fix_add(lptr2[0], lptr2[stride])));
   2785                 ++lptr2;
   2786                 ++hptr2;
   2787             }
   2788             hptr += stride;
   2789             lptr += stride;
   2790         }
   2791         if (parity == (numrows & 1)) {
   2792             lptr2 = lptr;
   2793             hptr2 = hptr;
   2794             for (i = 0; i < numcols; ++i) {
   2795                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2796                   GAMMA), lptr2[0]));
   2797                 ++lptr2;
   2798                 ++hptr2;
   2799             }
   2800         }
   2801 
   2802         /* Apply the third lifting step. */
   2803         lptr = &a[0];
   2804         hptr = &a[llen * stride];
   2805         if (!parity) {
   2806             lptr2 = lptr;
   2807             hptr2 = hptr;
   2808             for (i = 0; i < numcols; ++i) {
   2809                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2810                   hptr2[0]));
   2811                 ++lptr2;
   2812                 ++hptr2;
   2813             }
   2814             lptr += stride;
   2815         }
   2816         n = llen - (!parity) - (parity != (numrows & 1));
   2817         while (n-- > 0) {
   2818             lptr2 = lptr;
   2819             hptr2 = hptr;
   2820             for (i = 0; i < numcols; ++i) {
   2821                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(BETA),
   2822                   jpc_fix_add(hptr2[0], hptr2[stride])));
   2823                 ++lptr2;
   2824                 ++hptr2;
   2825             }
   2826             lptr += stride;
   2827             hptr += stride;
   2828         }
   2829         if (parity != (numrows & 1)) {
   2830             lptr2 = lptr;
   2831             hptr2 = hptr;
   2832             for (i = 0; i < numcols; ++i) {
   2833                 jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   2834                   hptr2[0]));
   2835                 ++lptr2;
   2836                 ++hptr2;
   2837             }
   2838         }
   2839 
   2840         /* Apply the fourth lifting step. */
   2841         lptr = &a[0];
   2842         hptr = &a[llen * stride];
   2843         if (parity) {
   2844             lptr2 = lptr;
   2845             hptr2 = hptr;
   2846             for (i = 0; i < numcols; ++i) {
   2847                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2848                   ALPHA), lptr2[0]));
   2849                 ++hptr2;
   2850                 ++lptr2;
   2851             }
   2852             hptr += stride;
   2853         }
   2854         n = numrows - llen - parity - (parity == (numrows & 1));
   2855         while (n-- > 0) {
   2856             lptr2 = lptr;
   2857             hptr2 = hptr;
   2858             for (i = 0; i < numcols; ++i) {
   2859                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(ALPHA),
   2860                   jpc_fix_add(lptr2[0], lptr2[stride])));
   2861                 ++lptr2;
   2862                 ++hptr2;
   2863             }
   2864             hptr += stride;
   2865             lptr += stride;
   2866         }
   2867         if (parity == (numrows & 1)) {
   2868             lptr2 = lptr;
   2869             hptr2 = hptr;
   2870             for (i = 0; i < numcols; ++i) {
   2871                 jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2872                   ALPHA), lptr2[0]));
   2873                 ++lptr2;
   2874                 ++hptr2;
   2875             }
   2876         }
   2877 
   2878     } else {
   2879 
   2880 #if defined(WT_LENONE)
   2881         if (parity) {
   2882             lptr2 = &a[0];
   2883             for (i = 0; i < numcols; ++i) {
   2884                 lptr2[0] >>= 1;
   2885                 ++lptr2;
   2886             }
   2887         }
   2888 #endif
   2889 
   2890     }
   2891 
   2892 }
   2893 
   2894 void jpc_ns_invlift_col(jpc_fix_t *a, int numrows, int stride,
   2895   int parity)
   2896 {
   2897 
   2898     jpc_fix_t *lptr;
   2899     jpc_fix_t *hptr;
   2900     register jpc_fix_t *lptr2;
   2901     register jpc_fix_t *hptr2;
   2902     register int n;
   2903     int llen;
   2904 
   2905     llen = (numrows + 1 - parity) >> 1;
   2906 
   2907     if (numrows > 1) {
   2908 
   2909         /* Apply the scaling step. */
   2910 #if defined(WT_DOSCALE)
   2911         lptr = &a[0];
   2912         n = llen;
   2913         while (n-- > 0) {
   2914             lptr2 = lptr;
   2915             lptr2[0] = jpc_fix_mul(lptr2[0], jpc_dbltofix(1.0 / LGAIN));
   2916             ++lptr2;
   2917             lptr += stride;
   2918         }
   2919         hptr = &a[llen * stride];
   2920         n = numrows - llen;
   2921         while (n-- > 0) {
   2922             hptr2 = hptr;
   2923             hptr2[0] = jpc_fix_mul(hptr2[0], jpc_dbltofix(1.0 / HGAIN));
   2924             ++hptr2;
   2925             hptr += stride;
   2926         }
   2927 #endif
   2928 
   2929         /* Apply the first lifting step. */
   2930         lptr = &a[0];
   2931         hptr = &a[llen * stride];
   2932         if (!parity) {
   2933             lptr2 = lptr;
   2934             hptr2 = hptr;
   2935             jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2936               DELTA), hptr2[0]));
   2937             ++lptr2;
   2938             ++hptr2;
   2939             lptr += stride;
   2940         }
   2941         n = llen - (!parity) - (parity != (numrows & 1));
   2942         while (n-- > 0) {
   2943             lptr2 = lptr;
   2944             hptr2 = hptr;
   2945             jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(DELTA),
   2946               jpc_fix_add(hptr2[0], hptr2[stride])));
   2947             ++lptr2;
   2948             ++hptr2;
   2949             lptr += stride;
   2950             hptr += stride;
   2951         }
   2952         if (parity != (numrows & 1)) {
   2953             lptr2 = lptr;
   2954             hptr2 = hptr;
   2955             jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2956               DELTA), hptr2[0]));
   2957             ++lptr2;
   2958             ++hptr2;
   2959         }
   2960 
   2961         /* Apply the second lifting step. */
   2962         lptr = &a[0];
   2963         hptr = &a[llen * stride];
   2964         if (parity) {
   2965             lptr2 = lptr;
   2966             hptr2 = hptr;
   2967             jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2968               GAMMA), lptr2[0]));
   2969             ++hptr2;
   2970             ++lptr2;
   2971             hptr += stride;
   2972         }
   2973         n = numrows - llen - parity - (parity == (numrows & 1));
   2974         while (n-- > 0) {
   2975             lptr2 = lptr;
   2976             hptr2 = hptr;
   2977             jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(GAMMA),
   2978               jpc_fix_add(lptr2[0], lptr2[stride])));
   2979             ++lptr2;
   2980             ++hptr2;
   2981             hptr += stride;
   2982             lptr += stride;
   2983         }
   2984         if (parity == (numrows & 1)) {
   2985             lptr2 = lptr;
   2986             hptr2 = hptr;
   2987             jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   2988               GAMMA), lptr2[0]));
   2989             ++lptr2;
   2990             ++hptr2;
   2991         }
   2992 
   2993         /* Apply the third lifting step. */
   2994         lptr = &a[0];
   2995         hptr = &a[llen * stride];
   2996         if (!parity) {
   2997             lptr2 = lptr;
   2998             hptr2 = hptr;
   2999             jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   3000               hptr2[0]));
   3001             ++lptr2;
   3002             ++hptr2;
   3003             lptr += stride;
   3004         }
   3005         n = llen - (!parity) - (parity != (numrows & 1));
   3006         while (n-- > 0) {
   3007             lptr2 = lptr;
   3008             hptr2 = hptr;
   3009             jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(BETA),
   3010               jpc_fix_add(hptr2[0], hptr2[stride])));
   3011             ++lptr2;
   3012             ++hptr2;
   3013             lptr += stride;
   3014             hptr += stride;
   3015         }
   3016         if (parity != (numrows & 1)) {
   3017             lptr2 = lptr;
   3018             hptr2 = hptr;
   3019             jpc_fix_minuseq(lptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 * BETA),
   3020               hptr2[0]));
   3021             ++lptr2;
   3022             ++hptr2;
   3023         }
   3024 
   3025         /* Apply the fourth lifting step. */
   3026         lptr = &a[0];
   3027         hptr = &a[llen * stride];
   3028         if (parity) {
   3029             lptr2 = lptr;
   3030             hptr2 = hptr;
   3031             jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   3032               ALPHA), lptr2[0]));
   3033             ++hptr2;
   3034             ++lptr2;
   3035             hptr += stride;
   3036         }
   3037         n = numrows - llen - parity - (parity == (numrows & 1));
   3038         while (n-- > 0) {
   3039             lptr2 = lptr;
   3040             hptr2 = hptr;
   3041             jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(ALPHA),
   3042               jpc_fix_add(lptr2[0], lptr2[stride])));
   3043             ++lptr2;
   3044             ++hptr2;
   3045             hptr += stride;
   3046             lptr += stride;
   3047         }
   3048         if (parity == (numrows & 1)) {
   3049             lptr2 = lptr;
   3050             hptr2 = hptr;
   3051             jpc_fix_minuseq(hptr2[0], jpc_fix_mul(jpc_dbltofix(2.0 *
   3052               ALPHA), lptr2[0]));
   3053             ++lptr2;
   3054             ++hptr2;
   3055         }
   3056 
   3057     } else {
   3058 
   3059 #if defined(WT_LENONE)
   3060         if (parity) {
   3061             lptr2 = &a[0];
   3062             lptr2[0] >>= 1;
   3063             ++lptr2;
   3064         }
   3065 #endif
   3066 
   3067     }
   3068 
   3069 }
   3070 
   3071 int jpc_ns_analyze(int *a, int xstart, int ystart, int width, int height,
   3072   int stride)
   3073 {
   3074 
   3075     int numrows = height;
   3076     int numcols = width;
   3077     int rowparity = ystart & 1;
   3078     int colparity = xstart & 1;
   3079     int i;
   3080     jpc_fix_t *startptr;
   3081     int maxcols;
   3082 
   3083     maxcols = (numcols / JPC_QMFB_COLGRPSIZE) * JPC_QMFB_COLGRPSIZE;
   3084     startptr = (jpc_fix_t*)&a[0];
   3085     for (i = 0; i < maxcols; i += JPC_QMFB_COLGRPSIZE) {
   3086         jpc_qmfb_split_colgrp(startptr, numrows, stride, rowparity);
   3087         jpc_ns_fwdlift_colgrp(startptr, numrows, stride, rowparity);
   3088         startptr += JPC_QMFB_COLGRPSIZE;
   3089     }
   3090     if (maxcols < numcols) {
   3091         jpc_qmfb_split_colres(startptr, numrows, numcols - maxcols, stride,
   3092           rowparity);
   3093         jpc_ns_fwdlift_colres(startptr, numrows, numcols - maxcols, stride,
   3094           rowparity);
   3095     }
   3096 
   3097     startptr = (jpc_fix_t*)&a[0];
   3098     for (i = 0; i < numrows; ++i) {
   3099         jpc_qmfb_split_row(startptr, numcols, colparity);
   3100         jpc_ns_fwdlift_row(startptr, numcols, colparity);
   3101         startptr += stride;
   3102     }
   3103 
   3104     return 0;
   3105 
   3106 }
   3107 
   3108 int jpc_ns_synthesize(int *a, int xstart, int ystart, int width,
   3109   int height, int stride)
   3110 {
   3111 
   3112     int numrows = height;
   3113     int numcols = width;
   3114     int rowparity = ystart & 1;
   3115     int colparity = xstart & 1;
   3116     int maxcols;
   3117     jpc_fix_t *startptr;
   3118     int i;
   3119 
   3120     startptr = (jpc_fix_t*)&a[0];
   3121     for (i = 0; i < numrows; ++i) {
   3122         jpc_ns_invlift_row(startptr, numcols, colparity);
   3123         jpc_qmfb_join_row(startptr, numcols, colparity);
   3124         startptr += stride;
   3125     }
   3126 
   3127     maxcols = (numcols / JPC_QMFB_COLGRPSIZE) * JPC_QMFB_COLGRPSIZE;
   3128     startptr = (jpc_fix_t*)&a[0];
   3129     for (i = 0; i < maxcols; i += JPC_QMFB_COLGRPSIZE) {
   3130         jpc_ns_invlift_colgrp(startptr, numrows, stride, rowparity);
   3131         jpc_qmfb_join_colgrp(startptr, numrows, stride, rowparity);
   3132         startptr += JPC_QMFB_COLGRPSIZE;
   3133     }
   3134     if (maxcols < numcols) {
   3135         jpc_ns_invlift_colres(startptr, numrows, numcols - maxcols, stride,
   3136           rowparity);
   3137         jpc_qmfb_join_colres(startptr, numrows, numcols - maxcols, stride,
   3138           rowparity);
   3139     }
   3140 
   3141     return 0;
   3142 
   3143 }
   3144 
   3145