blob: 84afefb2e5c77cf1379e6f23afd2f2a36407e9bd [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.
*====================================================================*/
/*
* pixacc.c
*
* Pixacc creation, destruction
* PIXACC *pixaccCreate()
* void pixaccDestroy()
*
* Pixacc finalization
* PIX *pixaccFinal()
*
* Pixacc accessors
* PIX *pixaccGetPix()
* l_int32 pixaccGetOffset()
*
* Pixacc accumulators
* l_int32 pixaccAdd()
* l_int32 pixaccSubtract()
* l_int32 pixaccMultConst()
*
* This is a simple interface to some of the pixel arithmetic operations
* in pixarith.c.
*/
#include <stdio.h>
#include <stdlib.h>
#include "allheaders.h"
/*---------------------------------------------------------------------*
* Pixacc creation, destruction *
*---------------------------------------------------------------------*/
/*!
* pixaccCreate()
*
* Input: w, h (of 32 bpp Pix)
* subflag (0 if only addition; 1 if subtraction ops as well
* Return: pixacc, or null on error
*
* Notes:
* (1) Includes the initialization in pixInitAccumulate().
*/
PIXACC *
pixaccCreate(l_int32 w,
l_int32 h,
l_int32 subflag)
{
PIXACC *pixacc;
PROCNAME("pixaccCreate");
if ((pixacc = (PIXACC *)CALLOC(1, sizeof(PIXACC))) == NULL)
return (PIXACC *)ERROR_PTR("pixacc not made", procName, NULL);
pixacc->w = w;
pixacc->h = h;
if ((pixacc->pix = pixCreate(w, h, 32)) == NULL)
return (PIXACC *)ERROR_PTR("pix not made", procName, NULL);
if (subflag) {
pixacc->offset = 0x40000000;
pixSetAllArbitrary(pixacc->pix, pixacc->offset);
}
return pixacc;
}
/*!
* pixaccDestroy()
*
* Input: &pixacc (<can be null>)
* Return: void
*
* Notes:
* (1) Always nulls the input ptr.
*/
void
pixaccDestroy(PIXACC **ppixacc)
{
PIXACC *pixacc;
PROCNAME("pixaccDestroy");
if (ppixacc == NULL) {
L_WARNING("ptr address is NULL!", procName);
return;
}
if ((pixacc = *ppixacc) == NULL)
return;
pixDestroy(&pixacc->pix);
FREE(pixacc);
*ppixacc = NULL;
return;
}
/*---------------------------------------------------------------------*
* Pixacc finalization *
*---------------------------------------------------------------------*/
/*!
* pixaccFinal()
*
* Input: pixacc
* outdepth (8, 16 or 32 bpp)
* Return: pixd (8 , 16 or 32 bpp), or null on error
*/
PIX *
pixaccFinal(PIXACC *pixacc,
l_int32 outdepth)
{
PROCNAME("pixaccFinal");
if (!pixacc)
return (PIX *)ERROR_PTR("pixacc not defined", procName, NULL);
return pixFinalAccumulate(pixaccGetPix(pixacc), pixaccGetOffset(pixacc),
outdepth);
}
/*---------------------------------------------------------------------*
* Pixacc accessors *
*---------------------------------------------------------------------*/
/*!
* pixaccGetPix()
*
* Input: pixacc
* Return: pix, or null on error
*/
PIX *
pixaccGetPix(PIXACC *pixacc)
{
PROCNAME("pixaccGetPix");
if (!pixacc)
return (PIX *)ERROR_PTR("pixacc not defined", procName, NULL);
return pixacc->pix;
}
/*!
* pixaccGetOffset()
*
* Input: pixacc
* Return: offset, or -1 on error
*/
l_int32
pixaccGetOffset(PIXACC *pixacc)
{
PROCNAME("pixaccGetOffset");
if (!pixacc)
return ERROR_INT("pixacc not defined", procName, -1);
return pixacc->offset;
}
/*---------------------------------------------------------------------*
* Pixacc accumulators *
*---------------------------------------------------------------------*/
/*!
* pixaccAdd()
*
* Input: pixacc
* pix (to be added)
* Return: 0 if OK, 1 on error
*/
l_int32
pixaccAdd(PIXACC *pixacc,
PIX *pix)
{
PROCNAME("pixaccAdd");
if (!pixacc)
return ERROR_INT("pixacc not defined", procName, 1);
if (!pix)
return ERROR_INT("pix not defined", procName, 1);
pixAccumulate(pixaccGetPix(pixacc), pix, L_ARITH_ADD);
return 0;
}
/*!
* pixaccSubtract()
*
* Input: pixacc
* pix (to be subtracted)
* Return: 0 if OK, 1 on error
*/
l_int32
pixaccSubtract(PIXACC *pixacc,
PIX *pix)
{
PROCNAME("pixaccSubtract");
if (!pixacc)
return ERROR_INT("pixacc not defined", procName, 1);
if (!pix)
return ERROR_INT("pix not defined", procName, 1);
pixAccumulate(pixaccGetPix(pixacc), pix, L_ARITH_SUBTRACT);
return 0;
}
/*!
* pixaccMultConst()
*
* Input: pixacc
* factor
* Return: 0 if OK, 1 on error
*/
l_int32
pixaccMultConst(PIXACC *pixacc,
l_float32 factor)
{
PROCNAME("pixaccMultConst");
if (!pixacc)
return ERROR_INT("pixacc not defined", procName, 1);
pixMultConstAccumulate(pixaccGetPix(pixacc), factor,
pixaccGetOffset(pixacc));
return 0;
}