mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-28 06:12:37 -06:00
884 lines
21 KiB
C
884 lines
21 KiB
C
/*====================================================================*
|
|
- 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.
|
|
*====================================================================*/
|
|
|
|
/*
|
|
* fpix1.c
|
|
*
|
|
* This file has basic constructors, destructors and field accessors
|
|
* for FPix and DPix.
|
|
*
|
|
* FPix Create/copy/destroy
|
|
* FPIX *fpixCreate()
|
|
* FPIX *fpixCreateTemplate()
|
|
* FPIX *fpixClone()
|
|
* FPIX *fpixCopy()
|
|
* l_int32 fpixResizeImageData()
|
|
* void fpixDestroy()
|
|
*
|
|
* FPix accessors
|
|
* l_int32 fpixGetDimensions()
|
|
* l_int32 fpixSetDimensions()
|
|
* l_int32 fpixGetWpl()
|
|
* l_int32 fpixSetWpl()
|
|
* l_int32 fpixGetRefcount()
|
|
* l_int32 fpixChangeRefcount()
|
|
* l_int32 fpixGetResolution()
|
|
* l_int32 fpixSetResolution()
|
|
* l_int32 fpixCopyResolution()
|
|
* l_float32 *fpixGetData()
|
|
* l_int32 fpixSetData()
|
|
*
|
|
* DPix Create/copy/destroy
|
|
* DPIX *dpixCreate()
|
|
* DPIX *dpixCreateTemplate()
|
|
* DPIX *dpixClone()
|
|
* DPIX *dpixCopy()
|
|
* l_int32 dpixResizeImageData()
|
|
* void dpixDestroy()
|
|
*
|
|
* DPix accessors
|
|
* l_int32 dpixGetDimensions()
|
|
* l_int32 dpixSetDimensions()
|
|
* l_int32 dpixGetWpl()
|
|
* l_int32 dpixSetWpl()
|
|
* l_int32 dpixGetRefcount()
|
|
* l_int32 dpixChangeRefcount()
|
|
* l_int32 dpixGetResolution()
|
|
* l_int32 dpixSetResolution()
|
|
* l_int32 dpixCopyResolution()
|
|
* l_float64 *dpixGetData()
|
|
* l_int32 dpixSetData()
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "allheaders.h"
|
|
|
|
|
|
/*--------------------------------------------------------------------*
|
|
* FPix Create/copy/destroy *
|
|
*--------------------------------------------------------------------*/
|
|
/*!
|
|
* fpixCreate()
|
|
*
|
|
* Input: width, height
|
|
* Return: fpixd (with data allocated and initialized to 0),
|
|
* or null on error
|
|
*
|
|
* Notes:
|
|
* (1) Makes a FPix of specified size, with the data array
|
|
* allocated and initialized to 0.
|
|
*/
|
|
FPIX *
|
|
fpixCreate(l_int32 width,
|
|
l_int32 height)
|
|
{
|
|
l_float32 *data;
|
|
FPIX *fpixd;
|
|
|
|
PROCNAME("fpixCreate");
|
|
|
|
if (width <= 0)
|
|
return (FPIX *)ERROR_PTR("width must be > 0", procName, NULL);
|
|
if (height <= 0)
|
|
return (FPIX *)ERROR_PTR("height must be > 0", procName, NULL);
|
|
|
|
if ((fpixd = (FPIX *)CALLOC(1, sizeof(FPIX))) == NULL)
|
|
return (FPIX *)ERROR_PTR("CALLOC fail for fpixd", procName, NULL);
|
|
fpixSetDimensions(fpixd, width, height);
|
|
fpixSetWpl(fpixd, width);
|
|
fpixd->refcount = 1;
|
|
|
|
data = (l_float32 *)CALLOC(width * height, sizeof(l_float32));
|
|
if (!data)
|
|
return (FPIX *)ERROR_PTR("CALLOC fail for data", procName, NULL);
|
|
fpixSetData(fpixd, data);
|
|
|
|
return fpixd;
|
|
}
|
|
|
|
|
|
/*!
|
|
* fpixCreateTemplate()
|
|
*
|
|
* Input: fpixs
|
|
* Return: fpixd, or null on error
|
|
*
|
|
* Notes:
|
|
* (1) Makes a FPix of the same size as the input FPix, with the
|
|
* data array allocated and initialized to 0.
|
|
* (2) Copies the resolution.
|
|
*/
|
|
FPIX *
|
|
fpixCreateTemplate(FPIX *fpixs)
|
|
{
|
|
l_int32 w, h;
|
|
FPIX *fpixd;
|
|
|
|
PROCNAME("fpixCreateTemplate");
|
|
|
|
if (!fpixs)
|
|
return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
|
|
|
|
fpixGetDimensions(fpixs, &w, &h);
|
|
fpixd = fpixCreate(w, h);
|
|
fpixCopyResolution(fpixd, fpixs);
|
|
return fpixd;
|
|
}
|
|
|
|
|
|
/*!
|
|
* fpixClone()
|
|
*
|
|
* Input: fpix
|
|
* Return: same fpix (ptr), or null on error
|
|
*
|
|
* Notes:
|
|
* (1) See pixClone() for definition and usage.
|
|
*/
|
|
FPIX *
|
|
fpixClone(FPIX *fpix)
|
|
{
|
|
PROCNAME("fpixClone");
|
|
|
|
if (!fpix)
|
|
return (FPIX *)ERROR_PTR("fpix not defined", procName, NULL);
|
|
fpixChangeRefcount(fpix, 1);
|
|
|
|
return fpix;
|
|
}
|
|
|
|
|
|
/*!
|
|
* fpixCopy()
|
|
*
|
|
* Input: fpixd (<optional>; can be null, or equal to fpixs,
|
|
* or different from fpixs)
|
|
* fpixs
|
|
* Return: fpixd, or null on error
|
|
*
|
|
* Notes:
|
|
* (1) There are three cases:
|
|
* (a) fpixd == null (makes a new fpix; refcount = 1)
|
|
* (b) fpixd == fpixs (no-op)
|
|
* (c) fpixd != fpixs (data copy; no change in refcount)
|
|
* If the refcount of fpixd > 1, case (c) will side-effect
|
|
* these handles.
|
|
* (2) The general pattern of use is:
|
|
* fpixd = fpixCopy(fpixd, fpixs);
|
|
* This will work for all three cases.
|
|
* For clarity when the case is known, you can use:
|
|
* (a) fpixd = fpixCopy(NULL, fpixs);
|
|
* (c) fpixCopy(fpixd, fpixs);
|
|
* (3) For case (c), we check if fpixs and fpixd are the same size.
|
|
* If so, the data is copied directly.
|
|
* Otherwise, the data is reallocated to the correct size
|
|
* and the copy proceeds. The refcount of fpixd is unchanged.
|
|
* (4) This operation, like all others that may involve a pre-existing
|
|
* fpixd, will side-effect any existing clones of fpixd.
|
|
*/
|
|
FPIX *
|
|
fpixCopy(FPIX *fpixd, /* can be null */
|
|
FPIX *fpixs)
|
|
{
|
|
l_int32 w, h, bytes;
|
|
l_float32 *datas, *datad;
|
|
|
|
PROCNAME("fpixCopy");
|
|
|
|
if (!fpixs)
|
|
return (FPIX *)ERROR_PTR("fpixs not defined", procName, NULL);
|
|
if (fpixs == fpixd)
|
|
return fpixd;
|
|
|
|
/* Total bytes in image data */
|
|
fpixGetDimensions(fpixs, &w, &h);
|
|
bytes = 4 * w * h;
|
|
|
|
/* If we're making a new fpix ... */
|
|
if (!fpixd) {
|
|
if ((fpixd = fpixCreateTemplate(fpixs)) == NULL)
|
|
return (FPIX *)ERROR_PTR("fpixd not made", procName, NULL);
|
|
datas = fpixGetData(fpixs);
|
|
datad = fpixGetData(fpixd);
|
|
memcpy((char *)datad, (char *)datas, bytes);
|
|
return fpixd;
|
|
}
|
|
|
|
/* Reallocate image data if sizes are different */
|
|
fpixResizeImageData(fpixd, fpixs);
|
|
|
|
/* Copy data */
|
|
fpixCopyResolution(fpixd, fpixs);
|
|
datas = fpixGetData(fpixs);
|
|
datad = fpixGetData(fpixd);
|
|
memcpy((char*)datad, (char*)datas, bytes);
|
|
return fpixd;
|
|
}
|
|
|
|
|
|
/*!
|
|
* fpixResizeImageData()
|
|
*
|
|
* Input: fpixd, fpixs
|
|
* Return: 0 if OK, 1 on error
|
|
*/
|
|
l_int32
|
|
fpixResizeImageData(FPIX *fpixd,
|
|
FPIX *fpixs)
|
|
{
|
|
l_int32 ws, hs, wd, hd, bytes;
|
|
l_float32 *data;
|
|
|
|
PROCNAME("fpixResizeImageData");
|
|
|
|
if (!fpixs)
|
|
return ERROR_INT("fpixs not defined", procName, 1);
|
|
if (!fpixd)
|
|
return ERROR_INT("fpixd not defined", procName, 1);
|
|
|
|
fpixGetDimensions(fpixs, &ws, &hs);
|
|
fpixGetDimensions(fpixd, &wd, &hd);
|
|
if (ws == wd && hs == hd) /* nothing to do */
|
|
return 0;
|
|
|
|
fpixSetDimensions(fpixd, ws, hs);
|
|
fpixSetWpl(fpixd, ws);
|
|
bytes = 4 * ws * hs;
|
|
data = fpixGetData(fpixd);
|
|
if (data) FREE(data);
|
|
if ((data = (l_float32 *)MALLOC(bytes)) == NULL)
|
|
return ERROR_INT("MALLOC fail for data", procName, 1);
|
|
fpixSetData(fpixd, data);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*!
|
|
* fpixDestroy()
|
|
*
|
|
* Input: &fpix <will be nulled>
|
|
* Return: void
|
|
*
|
|
* Notes:
|
|
* (1) Decrements the ref count and, if 0, destroys the fpix.
|
|
* (2) Always nulls the input ptr.
|
|
*/
|
|
void
|
|
fpixDestroy(FPIX **pfpix)
|
|
{
|
|
l_float32 *data;
|
|
FPIX *fpix;
|
|
|
|
PROCNAME("fpixDestroy");
|
|
|
|
if (!pfpix) {
|
|
L_WARNING("ptr address is null!", procName);
|
|
return;
|
|
}
|
|
|
|
if ((fpix = *pfpix) == NULL)
|
|
return;
|
|
|
|
/* Decrement the ref count. If it is 0, destroy the fpix. */
|
|
fpixChangeRefcount(fpix, -1);
|
|
if (fpixGetRefcount(fpix) <= 0) {
|
|
if ((data = fpixGetData(fpix)) != NULL)
|
|
FREE(data);
|
|
FREE(fpix);
|
|
}
|
|
|
|
*pfpix = NULL;
|
|
return;
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------------------*
|
|
* FPix Accessors *
|
|
*--------------------------------------------------------------------*/
|
|
/*!
|
|
* fpixGetDimensions()
|
|
*
|
|
* Input: fpix
|
|
* &w, &h (<optional return>; each can be null)
|
|
* Return: 0 if OK, 1 on error
|
|
*/
|
|
l_int32
|
|
fpixGetDimensions(FPIX *fpix,
|
|
l_int32 *pw,
|
|
l_int32 *ph)
|
|
{
|
|
PROCNAME("fpixGetDimensions");
|
|
|
|
if (!fpix)
|
|
return ERROR_INT("fpix not defined", procName, 1);
|
|
if (pw) *pw = fpix->w;
|
|
if (ph) *ph = fpix->h;
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*!
|
|
* fpixSetDimensions()
|
|
*
|
|
* Input: fpix
|
|
* w, h
|
|
* Return: 0 if OK, 1 on error
|
|
*/
|
|
l_int32
|
|
fpixSetDimensions(FPIX *fpix,
|
|
l_int32 w,
|
|
l_int32 h)
|
|
{
|
|
PROCNAME("fpixSetDimensions");
|
|
|
|
if (!fpix)
|
|
return ERROR_INT("fpix not defined", procName, 1);
|
|
fpix->w = w;
|
|
fpix->h = h;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
fpixGetWpl(FPIX *fpix)
|
|
{
|
|
PROCNAME("fpixGetWpl");
|
|
|
|
if (!fpix)
|
|
return ERROR_INT("fpix not defined", procName, 1);
|
|
return fpix->wpl;
|
|
}
|
|
|
|
|
|
l_int32
|
|
fpixSetWpl(FPIX *fpix,
|
|
l_int32 wpl)
|
|
{
|
|
PROCNAME("fpixSetWpl");
|
|
|
|
if (!fpix)
|
|
return ERROR_INT("fpix not defined", procName, 1);
|
|
|
|
fpix->wpl = wpl;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
fpixGetRefcount(FPIX *fpix)
|
|
{
|
|
PROCNAME("fpixGetRefcount");
|
|
|
|
if (!fpix)
|
|
return ERROR_INT("fpix not defined", procName, UNDEF);
|
|
return fpix->refcount;
|
|
}
|
|
|
|
|
|
l_int32
|
|
fpixChangeRefcount(FPIX *fpix,
|
|
l_int32 delta)
|
|
{
|
|
PROCNAME("fpixChangeRefcount");
|
|
|
|
if (!fpix)
|
|
return ERROR_INT("fpix not defined", procName, 1);
|
|
|
|
fpix->refcount += delta;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
fpixGetResolution(FPIX *fpix,
|
|
l_int32 *pxres,
|
|
l_int32 *pyres)
|
|
{
|
|
PROCNAME("fpixGetResolution");
|
|
|
|
if (!fpix)
|
|
return ERROR_INT("fpix not defined", procName, 1);
|
|
if (pxres) *pxres = fpix->xres;
|
|
if (pyres) *pyres = fpix->yres;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
fpixSetResolution(FPIX *fpix,
|
|
l_int32 xres,
|
|
l_int32 yres)
|
|
{
|
|
PROCNAME("fpixSetResolution");
|
|
|
|
if (!fpix)
|
|
return ERROR_INT("fpix not defined", procName, 1);
|
|
|
|
fpix->xres = xres;
|
|
fpix->yres = yres;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
fpixCopyResolution(FPIX *fpixd,
|
|
FPIX *fpixs)
|
|
{
|
|
l_int32 xres, yres;
|
|
PROCNAME("fpixCopyResolution");
|
|
|
|
if (!fpixs || !fpixd)
|
|
return ERROR_INT("fpixs and fpixd not both defined", procName, 1);
|
|
|
|
fpixGetResolution(fpixs, &xres, &yres);
|
|
fpixSetResolution(fpixd, xres, yres);
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_float32 *
|
|
fpixGetData(FPIX *fpix)
|
|
{
|
|
PROCNAME("fpixGetData");
|
|
|
|
if (!fpix)
|
|
return (l_float32 *)ERROR_PTR("fpix not defined", procName, NULL);
|
|
return fpix->data;
|
|
}
|
|
|
|
|
|
l_int32
|
|
fpixSetData(FPIX *fpix,
|
|
l_float32 *data)
|
|
{
|
|
PROCNAME("fpixSetData");
|
|
|
|
if (!fpix)
|
|
return ERROR_INT("fpix not defined", procName, 1);
|
|
|
|
fpix->data = data;
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------------------*
|
|
* DPix Create/copy/destroy *
|
|
*--------------------------------------------------------------------*/
|
|
/*!
|
|
* dpixCreate()
|
|
*
|
|
* Input: width, height
|
|
* Return: dpix (with data allocated and initialized to 0),
|
|
* or null on error
|
|
*
|
|
* Notes:
|
|
* (1) Makes a DPix of specified size, with the data array
|
|
* allocated and initialized to 0.
|
|
*/
|
|
DPIX *
|
|
dpixCreate(l_int32 width,
|
|
l_int32 height)
|
|
{
|
|
l_float64 *data;
|
|
DPIX *dpix;
|
|
|
|
PROCNAME("dpixCreate");
|
|
|
|
if (width <= 0)
|
|
return (DPIX *)ERROR_PTR("width must be > 0", procName, NULL);
|
|
if (height <= 0)
|
|
return (DPIX *)ERROR_PTR("height must be > 0", procName, NULL);
|
|
|
|
if ((dpix = (DPIX *)CALLOC(1, sizeof(DPIX))) == NULL)
|
|
return (DPIX *)ERROR_PTR("CALLOC fail for dpix", procName, NULL);
|
|
dpixSetDimensions(dpix, width, height);
|
|
dpixSetWpl(dpix, width);
|
|
dpix->refcount = 1;
|
|
|
|
data = (l_float64 *)CALLOC(width * height, sizeof(l_float64));
|
|
if (!data)
|
|
return (DPIX *)ERROR_PTR("CALLOC fail for data", procName, NULL);
|
|
dpixSetData(dpix, data);
|
|
|
|
return dpix;
|
|
}
|
|
|
|
|
|
/*!
|
|
* dpixCreateTemplate()
|
|
*
|
|
* Input: dpixs
|
|
* Return: dpixd, or null on error
|
|
*
|
|
* Notes:
|
|
* (1) Makes a DPix of the same size as the input DPix, with the
|
|
* data array allocated and initialized to 0.
|
|
* (2) Copies the resolution.
|
|
*/
|
|
DPIX *
|
|
dpixCreateTemplate(DPIX *dpixs)
|
|
{
|
|
l_int32 w, h;
|
|
DPIX *dpixd;
|
|
|
|
PROCNAME("dpixCreateTemplate");
|
|
|
|
if (!dpixs)
|
|
return (DPIX *)ERROR_PTR("dpixs not defined", procName, NULL);
|
|
|
|
dpixGetDimensions(dpixs, &w, &h);
|
|
dpixd = dpixCreate(w, h);
|
|
dpixCopyResolution(dpixd, dpixs);
|
|
return dpixd;
|
|
}
|
|
|
|
|
|
/*!
|
|
* dpixClone()
|
|
*
|
|
* Input: dpix
|
|
* Return: same dpix (ptr), or null on error
|
|
*
|
|
* Notes:
|
|
* (1) See pixClone() for definition and usage.
|
|
*/
|
|
DPIX *
|
|
dpixClone(DPIX *dpix)
|
|
{
|
|
PROCNAME("dpixClone");
|
|
|
|
if (!dpix)
|
|
return (DPIX *)ERROR_PTR("dpix not defined", procName, NULL);
|
|
dpixChangeRefcount(dpix, 1);
|
|
|
|
return dpix;
|
|
}
|
|
|
|
|
|
/*!
|
|
* dpixCopy()
|
|
*
|
|
* Input: dpixd (<optional>; can be null, or equal to dpixs,
|
|
* or different from dpixs)
|
|
* dpixs
|
|
* Return: dpixd, or null on error
|
|
*
|
|
* Notes:
|
|
* (1) There are three cases:
|
|
* (a) dpixd == null (makes a new dpix; refcount = 1)
|
|
* (b) dpixd == dpixs (no-op)
|
|
* (c) dpixd != dpixs (data copy; no change in refcount)
|
|
* If the refcount of dpixd > 1, case (c) will side-effect
|
|
* these handles.
|
|
* (2) The general pattern of use is:
|
|
* dpixd = dpixCopy(dpixd, dpixs);
|
|
* This will work for all three cases.
|
|
* For clarity when the case is known, you can use:
|
|
* (a) dpixd = dpixCopy(NULL, dpixs);
|
|
* (c) dpixCopy(dpixd, dpixs);
|
|
* (3) For case (c), we check if dpixs and dpixd are the same size.
|
|
* If so, the data is copied directly.
|
|
* Otherwise, the data is reallocated to the correct size
|
|
* and the copy proceeds. The refcount of dpixd is unchanged.
|
|
* (4) This operation, like all others that may involve a pre-existing
|
|
* dpixd, will side-effect any existing clones of dpixd.
|
|
*/
|
|
DPIX *
|
|
dpixCopy(DPIX *dpixd, /* can be null */
|
|
DPIX *dpixs)
|
|
{
|
|
l_int32 w, h, bytes;
|
|
l_float64 *datas, *datad;
|
|
|
|
PROCNAME("dpixCopy");
|
|
|
|
if (!dpixs)
|
|
return (DPIX *)ERROR_PTR("dpixs not defined", procName, NULL);
|
|
if (dpixs == dpixd)
|
|
return dpixd;
|
|
|
|
/* Total bytes in image data */
|
|
dpixGetDimensions(dpixs, &w, &h);
|
|
bytes = 8 * w * h;
|
|
|
|
/* If we're making a new dpix ... */
|
|
if (!dpixd) {
|
|
if ((dpixd = dpixCreateTemplate(dpixs)) == NULL)
|
|
return (DPIX *)ERROR_PTR("dpixd not made", procName, NULL);
|
|
datas = dpixGetData(dpixs);
|
|
datad = dpixGetData(dpixd);
|
|
memcpy((char *)datad, (char *)datas, bytes);
|
|
return dpixd;
|
|
}
|
|
|
|
/* Reallocate image data if sizes are different */
|
|
dpixResizeImageData(dpixd, dpixs);
|
|
|
|
/* Copy data */
|
|
dpixCopyResolution(dpixd, dpixs);
|
|
datas = dpixGetData(dpixs);
|
|
datad = dpixGetData(dpixd);
|
|
memcpy((char*)datad, (char*)datas, bytes);
|
|
return dpixd;
|
|
}
|
|
|
|
|
|
/*!
|
|
* dpixResizeImageData()
|
|
*
|
|
* Input: dpixd, dpixs
|
|
* Return: 0 if OK, 1 on error
|
|
*/
|
|
l_int32
|
|
dpixResizeImageData(DPIX *dpixd,
|
|
DPIX *dpixs)
|
|
{
|
|
l_int32 ws, hs, wd, hd, bytes;
|
|
l_float64 *data;
|
|
|
|
PROCNAME("dpixResizeImageData");
|
|
|
|
if (!dpixs)
|
|
return ERROR_INT("dpixs not defined", procName, 1);
|
|
if (!dpixd)
|
|
return ERROR_INT("dpixd not defined", procName, 1);
|
|
|
|
dpixGetDimensions(dpixs, &ws, &hs);
|
|
dpixGetDimensions(dpixd, &wd, &hd);
|
|
if (ws == wd && hs == hd) /* nothing to do */
|
|
return 0;
|
|
|
|
dpixSetDimensions(dpixd, ws, hs);
|
|
dpixSetWpl(dpixd, ws);
|
|
bytes = 8 * ws * hs;
|
|
data = dpixGetData(dpixd);
|
|
if (data) FREE(data);
|
|
if ((data = (l_float64 *)MALLOC(bytes)) == NULL)
|
|
return ERROR_INT("MALLOC fail for data", procName, 1);
|
|
dpixSetData(dpixd, data);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*!
|
|
* dpixDestroy()
|
|
*
|
|
* Input: &dpix <will be nulled>
|
|
* Return: void
|
|
*
|
|
* Notes:
|
|
* (1) Decrements the ref count and, if 0, destroys the dpix.
|
|
* (2) Always nulls the input ptr.
|
|
*/
|
|
void
|
|
dpixDestroy(DPIX **pdpix)
|
|
{
|
|
l_float64 *data;
|
|
DPIX *dpix;
|
|
|
|
PROCNAME("dpixDestroy");
|
|
|
|
if (!pdpix) {
|
|
L_WARNING("ptr address is null!", procName);
|
|
return;
|
|
}
|
|
|
|
if ((dpix = *pdpix) == NULL)
|
|
return;
|
|
|
|
/* Decrement the ref count. If it is 0, destroy the dpix. */
|
|
dpixChangeRefcount(dpix, -1);
|
|
if (dpixGetRefcount(dpix) <= 0) {
|
|
if ((data = dpixGetData(dpix)) != NULL)
|
|
FREE(data);
|
|
FREE(dpix);
|
|
}
|
|
|
|
*pdpix = NULL;
|
|
return;
|
|
}
|
|
|
|
|
|
/*--------------------------------------------------------------------*
|
|
* DPix Accessors *
|
|
*--------------------------------------------------------------------*/
|
|
/*!
|
|
* dpixGetDimensions()
|
|
*
|
|
* Input: dpix
|
|
* &w, &h (<optional return>; each can be null)
|
|
* Return: 0 if OK, 1 on error
|
|
*/
|
|
l_int32
|
|
dpixGetDimensions(DPIX *dpix,
|
|
l_int32 *pw,
|
|
l_int32 *ph)
|
|
{
|
|
PROCNAME("dpixGetDimensions");
|
|
|
|
if (!dpix)
|
|
return ERROR_INT("dpix not defined", procName, 1);
|
|
if (pw) *pw = dpix->w;
|
|
if (ph) *ph = dpix->h;
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*!
|
|
* dpixSetDimensions()
|
|
*
|
|
* Input: dpix
|
|
* w, h
|
|
* Return: 0 if OK, 1 on error
|
|
*/
|
|
l_int32
|
|
dpixSetDimensions(DPIX *dpix,
|
|
l_int32 w,
|
|
l_int32 h)
|
|
{
|
|
PROCNAME("dpixSetDimensions");
|
|
|
|
if (!dpix)
|
|
return ERROR_INT("dpix not defined", procName, 1);
|
|
dpix->w = w;
|
|
dpix->h = h;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
dpixGetWpl(DPIX *dpix)
|
|
{
|
|
PROCNAME("dpixGetWpl");
|
|
|
|
if (!dpix)
|
|
return ERROR_INT("dpix not defined", procName, 1);
|
|
return dpix->wpl;
|
|
}
|
|
|
|
|
|
l_int32
|
|
dpixSetWpl(DPIX *dpix,
|
|
l_int32 wpl)
|
|
{
|
|
PROCNAME("dpixSetWpl");
|
|
|
|
if (!dpix)
|
|
return ERROR_INT("dpix not defined", procName, 1);
|
|
|
|
dpix->wpl = wpl;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
dpixGetRefcount(DPIX *dpix)
|
|
{
|
|
PROCNAME("dpixGetRefcount");
|
|
|
|
if (!dpix)
|
|
return ERROR_INT("dpix not defined", procName, UNDEF);
|
|
return dpix->refcount;
|
|
}
|
|
|
|
|
|
l_int32
|
|
dpixChangeRefcount(DPIX *dpix,
|
|
l_int32 delta)
|
|
{
|
|
PROCNAME("dpixChangeRefcount");
|
|
|
|
if (!dpix)
|
|
return ERROR_INT("dpix not defined", procName, 1);
|
|
|
|
dpix->refcount += delta;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
dpixGetResolution(DPIX *dpix,
|
|
l_int32 *pxres,
|
|
l_int32 *pyres)
|
|
{
|
|
PROCNAME("dpixGetResolution");
|
|
|
|
if (!dpix)
|
|
return ERROR_INT("dpix not defined", procName, 1);
|
|
if (pxres) *pxres = dpix->xres;
|
|
if (pyres) *pyres = dpix->yres;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
dpixSetResolution(DPIX *dpix,
|
|
l_int32 xres,
|
|
l_int32 yres)
|
|
{
|
|
PROCNAME("dpixSetResolution");
|
|
|
|
if (!dpix)
|
|
return ERROR_INT("dpix not defined", procName, 1);
|
|
|
|
dpix->xres = xres;
|
|
dpix->yres = yres;
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_int32
|
|
dpixCopyResolution(DPIX *dpixd,
|
|
DPIX *dpixs)
|
|
{
|
|
l_int32 xres, yres;
|
|
PROCNAME("dpixCopyResolution");
|
|
|
|
if (!dpixs || !dpixd)
|
|
return ERROR_INT("dpixs and dpixd not both defined", procName, 1);
|
|
|
|
dpixGetResolution(dpixs, &xres, &yres);
|
|
dpixSetResolution(dpixd, xres, yres);
|
|
return 0;
|
|
}
|
|
|
|
|
|
l_float64 *
|
|
dpixGetData(DPIX *dpix)
|
|
{
|
|
PROCNAME("dpixGetData");
|
|
|
|
if (!dpix)
|
|
return (l_float64 *)ERROR_PTR("dpix not defined", procName, NULL);
|
|
return dpix->data;
|
|
}
|
|
|
|
|
|
l_int32
|
|
dpixSetData(DPIX *dpix,
|
|
l_float64 *data)
|
|
{
|
|
PROCNAME("dpixSetData");
|
|
|
|
if (!dpix)
|
|
return ERROR_INT("dpix not defined", procName, 1);
|
|
|
|
dpix->data = data;
|
|
return 0;
|
|
}
|
|
|
|
|