blob: 23cb65ea2bca850bea3eda6d0fa26c1881d7bbd5 [file] [log] [blame]
/*====================================================================*
- Copyright (C) 2001 Leptonica. All rights reserved.
- This software is distributed in the hope that it will be
- useful, but with NO WARRANTY OF ANY KIND.
- No author or distributor accepts responsibility to anyone for the
- consequences of using this software, or for whether it serves any
- particular purpose or works at all, unless he or she says so in
- writing. Everyone is granted permission to copy, modify and
- redistribute this source code, for commercial or non-commercial
- purposes, with the following restrictions: (1) the origin of this
- source code must not be misrepresented; (2) modified versions must
- be plainly marked as such; and (3) this notice may not be removed
- or altered from any source or modified source distribution.
*====================================================================*/
/*
* Low-level fast hit-miss transform with auto-generated sels
*
* Dispatcher:
* l_int32 fhmtgen_low_1()
*
* Static Low-level:
* void fhmt_1_*()
*/
#include <stdio.h>
#include "allheaders.h"
static void fhmt_1_0(l_uint32 *, l_int32, l_int32, l_int32, l_uint32 *, l_int32);
static void fhmt_1_1(l_uint32 *, l_int32, l_int32, l_int32, l_uint32 *, l_int32);
static void fhmt_1_2(l_uint32 *, l_int32, l_int32, l_int32, l_uint32 *, l_int32);
static void fhmt_1_3(l_uint32 *, l_int32, l_int32, l_int32, l_uint32 *, l_int32);
static void fhmt_1_4(l_uint32 *, l_int32, l_int32, l_int32, l_uint32 *, l_int32);
static void fhmt_1_5(l_uint32 *, l_int32, l_int32, l_int32, l_uint32 *, l_int32);
/*---------------------------------------------------------------------*
* Fast hmt dispatcher *
*---------------------------------------------------------------------*/
/*
* fhmtgen_low_1()
*
* a dispatcher to appropriate low-level code
*/
l_int32
fhmtgen_low_1(l_uint32 *datad,
l_int32 w,
l_int32 h,
l_int32 wpld,
l_uint32 *datas,
l_int32 wpls,
l_int32 index)
{
switch (index)
{
case 0:
fhmt_1_0(datad, w, h, wpld, datas, wpls);
break;
case 1:
fhmt_1_1(datad, w, h, wpld, datas, wpls);
break;
case 2:
fhmt_1_2(datad, w, h, wpld, datas, wpls);
break;
case 3:
fhmt_1_3(datad, w, h, wpld, datas, wpls);
break;
case 4:
fhmt_1_4(datad, w, h, wpld, datas, wpls);
break;
case 5:
fhmt_1_5(datad, w, h, wpld, datas, wpls);
break;
}
return 0;
}
/*--------------------------------------------------------------------------*
* Low-level auto-generated static routines *
*--------------------------------------------------------------------------*/
/*
* N.B. In all the low-level routines, the part of the image
* that is accessed has been clipped by 32 pixels on
* all four sides. This is done in the higher level
* code by redefining w and h smaller and by moving the
* start-of-image pointers up to the beginning of this
* interior rectangle.
*/
static void
fhmt_1_0(l_uint32 *datad,
l_int32 w,
l_int32 h,
l_int32 wpld,
l_uint32 *datas,
l_int32 wpls)
{
l_int32 i;
register l_int32 j, pwpls;
register l_uint32 *sptr, *dptr;
pwpls = (l_uint32)(w + 31) / 32; /* proper wpl of src */
for (i = 0; i < h; i++) {
sptr = datas + i * wpls;
dptr = datad + i * wpld;
for (j = 0; j < pwpls; j++, sptr++, dptr++) {
*dptr = ((~*(sptr - wpls) >> 1) | (~*(sptr - wpls - 1) << 31)) &
(~*(sptr - wpls)) &
((~*(sptr - wpls) << 1) | (~*(sptr - wpls + 1) >> 31)) &
((~*(sptr) >> 1) | (~*(sptr - 1) << 31)) &
(*sptr) &
((~*(sptr) << 1) | (~*(sptr + 1) >> 31)) &
((~*(sptr + wpls) >> 1) | (~*(sptr + wpls - 1) << 31)) &
(~*(sptr + wpls)) &
((~*(sptr + wpls) << 1) | (~*(sptr + wpls + 1) >> 31));
}
}
}
static void
fhmt_1_1(l_uint32 *datad,
l_int32 w,
l_int32 h,
l_int32 wpld,
l_uint32 *datas,
l_int32 wpls)
{
l_int32 i;
register l_int32 j, pwpls;
register l_uint32 *sptr, *dptr;
pwpls = (l_uint32)(w + 31) / 32; /* proper wpl of src */
for (i = 0; i < h; i++) {
sptr = datas + i * wpls;
dptr = datad + i * wpld;
for (j = 0; j < pwpls; j++, sptr++, dptr++) {
*dptr = ((*(sptr) >> 1) | (*(sptr - 1) << 31)) &
(*sptr) &
((*(sptr) << 1) | (*(sptr + 1) >> 31)) &
((~*(sptr + wpls) >> 1) | (~*(sptr + wpls - 1) << 31)) &
(~*(sptr + wpls)) &
((~*(sptr + wpls) << 1) | (~*(sptr + wpls + 1) >> 31));
}
}
}
static void
fhmt_1_2(l_uint32 *datad,
l_int32 w,
l_int32 h,
l_int32 wpld,
l_uint32 *datas,
l_int32 wpls)
{
l_int32 i;
register l_int32 j, pwpls;
register l_uint32 *sptr, *dptr;
pwpls = (l_uint32)(w + 31) / 32; /* proper wpl of src */
for (i = 0; i < h; i++) {
sptr = datas + i * wpls;
dptr = datad + i * wpld;
for (j = 0; j < pwpls; j++, sptr++, dptr++) {
*dptr = ((~*(sptr - wpls) >> 1) | (~*(sptr - wpls - 1) << 31)) &
(~*(sptr - wpls)) &
((~*(sptr - wpls) << 1) | (~*(sptr - wpls + 1) >> 31)) &
((*(sptr) >> 1) | (*(sptr - 1) << 31)) &
(*sptr) &
((*(sptr) << 1) | (*(sptr + 1) >> 31));
}
}
}
static void
fhmt_1_3(l_uint32 *datad,
l_int32 w,
l_int32 h,
l_int32 wpld,
l_uint32 *datas,
l_int32 wpls)
{
l_int32 i;
register l_int32 j, pwpls;
register l_uint32 *sptr, *dptr;
pwpls = (l_uint32)(w + 31) / 32; /* proper wpl of src */
for (i = 0; i < h; i++) {
sptr = datas + i * wpls;
dptr = datad + i * wpld;
for (j = 0; j < pwpls; j++, sptr++, dptr++) {
*dptr = (*(sptr - wpls)) &
((~*(sptr - wpls) << 1) | (~*(sptr - wpls + 1) >> 31)) &
(*sptr) &
((~*(sptr) << 1) | (~*(sptr + 1) >> 31)) &
(*(sptr + wpls)) &
((~*(sptr + wpls) << 1) | (~*(sptr + wpls + 1) >> 31));
}
}
}
static void
fhmt_1_4(l_uint32 *datad,
l_int32 w,
l_int32 h,
l_int32 wpld,
l_uint32 *datas,
l_int32 wpls)
{
l_int32 i;
register l_int32 j, pwpls;
register l_uint32 *sptr, *dptr;
pwpls = (l_uint32)(w + 31) / 32; /* proper wpl of src */
for (i = 0; i < h; i++) {
sptr = datas + i * wpls;
dptr = datad + i * wpld;
for (j = 0; j < pwpls; j++, sptr++, dptr++) {
*dptr = ((~*(sptr - wpls) >> 1) | (~*(sptr - wpls - 1) << 31)) &
(*(sptr - wpls)) &
((~*(sptr) >> 1) | (~*(sptr - 1) << 31)) &
(*sptr) &
((~*(sptr + wpls) >> 1) | (~*(sptr + wpls - 1) << 31)) &
(*(sptr + wpls));
}
}
}
static void
fhmt_1_5(l_uint32 *datad,
l_int32 w,
l_int32 h,
l_int32 wpld,
l_uint32 *datas,
l_int32 wpls)
{
l_int32 i;
register l_int32 j, pwpls;
register l_uint32 *sptr, *dptr;
l_int32 wpls2, wpls3, wpls4;
l_int32 wpls5, wpls6;
wpls2 = 2 * wpls;
wpls3 = 3 * wpls;
wpls4 = 4 * wpls;
wpls5 = 5 * wpls;
wpls6 = 6 * wpls;
pwpls = (l_uint32)(w + 31) / 32; /* proper wpl of src */
for (i = 0; i < h; i++) {
sptr = datas + i * wpls;
dptr = datad + i * wpld;
for (j = 0; j < pwpls; j++, sptr++, dptr++) {
*dptr = ((~*(sptr - wpls6) << 1) | (~*(sptr - wpls6 + 1) >> 31)) &
((*(sptr - wpls6) << 3) | (*(sptr - wpls6 + 1) >> 29)) &
(~*(sptr - wpls2)) &
((*(sptr - wpls2) << 2) | (*(sptr - wpls2 + 1) >> 30)) &
((~*(sptr + wpls2) >> 1) | (~*(sptr + wpls2 - 1) << 31)) &
((*(sptr + wpls2) << 1) | (*(sptr + wpls2 + 1) >> 31)) &
((~*(sptr + wpls6) >> 2) | (~*(sptr + wpls6 - 1) << 30)) &
(*(sptr + wpls6));
}
}
}