/* Copyright (C) 2017-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4pxres.ctr */ /** @file dk4pxres.c The dk4pxres module. */ #line 148 "dk4pxres.ctr" #include "dk4conf.h" #ifndef DK4PXRES_H_INCLUDED #include "dk4pxres.h" #endif #ifndef DK4PXBIT_H_INCLUDED #include "dk4pxbit.h" #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 168 "dk4pxres.ctr" void dk4pxres_init(dk4_px_resample_t *pxrptr) { #line 175 "dk4pxres.ctr" #if DK4_USE_ASSERT assert(NULL != pxrptr); #endif if (NULL != pxrptr) { pxrptr->nom = 255UL; pxrptr->denom = 255UL; pxrptr->denom2 = 127UL; } #line 184 "dk4pxres.ctr" } int dk4pxres_setup( dk4_px_resample_t *pxrptr, size_t ibits, size_t obits ) { dk4_px_t nom; dk4_px_t denom; int back = 0; #line 199 "dk4pxres.ctr" #if DK4_USE_ASSERT assert(NULL != pxrptr); #endif /* Check pointer */ if (NULL == pxrptr) { goto finished; } pxrptr->nom = 255UL; pxrptr->denom = 255UL; pxrptr->denom2 = 127UL; /* Attempt to retrieve values */ nom = dk4pxbit_get_max(obits); denom = dk4pxbit_get_max(ibits); if ((0 == nom) || (0 == denom)) { goto finished; } /* Set values and indicate success */ pxrptr->nom = (unsigned long)nom; pxrptr->denom = (unsigned long)denom; pxrptr->denom2 = pxrptr->denom / 2UL; #line 226 "dk4pxres.ctr" back = 1; finished: #line 229 "dk4pxres.ctr" return back; } int dk4pxres_setup_from_maxval( dk4_px_resample_t *pxrptr, dk4_px_t imaxval, size_t obits ) { int back = 0; unsigned long nom; unsigned long denom; #line 245 "dk4pxres.ctr" #if DK4_USE_ASSERT assert(NULL != pxrptr); #endif /* Check pointer */ if (NULL == pxrptr) { goto finished; } /* Set defaults */ pxrptr->nom = 255UL; pxrptr->denom = 255UL; pxrptr->denom2 = 127UL; /* Retrieve values */ nom = dk4pxbit_get_max(obits); if ((0 == nom) || (0 == imaxval)) { goto finished; } /* Set values and indicate success */ pxrptr->nom = (unsigned long)nom; pxrptr->denom = denom = (unsigned long)imaxval; pxrptr->denom2 = (unsigned long)imaxval / 2UL; #line 273 "dk4pxres.ctr" back = 1; finished: #line 277 "dk4pxres.ctr" return back; } int dk4pxres_setup_to_maxval( dk4_px_resample_t *pxrptr, size_t ibits, dk4_px_t omaxval ) { unsigned long nom; unsigned long denom; int back = 0; #line 293 "dk4pxres.ctr" #if DK4_USE_ASSERT assert(NULL != pxrptr); #endif /* Check pointer */ if (NULL == pxrptr) { goto finished; } /* Set defaults */ pxrptr->nom = 255UL; pxrptr->denom = 255UL; pxrptr->denom2 = 127UL; /* Find nominator and denominator */ nom = (unsigned long)omaxval; denom = (unsigned long)dk4pxbit_get_max(ibits); if ((0UL == nom) || (0UL == denom)) { goto finished; } pxrptr->nom = nom; pxrptr->denom = denom; pxrptr->denom2 = denom / 2UL; #line 316 "dk4pxres.ctr" back = 1; finished: #line 320 "dk4pxres.ctr" return back; } dk4_px_t dk4pxres_get( dk4_px_resample_t const *pxrptr, dk4_px_t in ) { unsigned long prod; dk4_px_t back = 0U; #line 334 "dk4pxres.ctr" #if DK4_USE_ASSERT assert(NULL != pxrptr); #endif /* Check pointer */ if (NULL == pxrptr) { goto finished; } /* Leave value unchanged for equal size */ if (pxrptr->nom == pxrptr->denom) { back = in; goto finished; } /* Calculate */ if (0 == pxrptr->denom) { goto finished; } prod = (unsigned long)in * pxrptr->nom; back = (dk4_px_t)(prod / pxrptr->denom); if (pxrptr->denom2 < (prod % pxrptr->denom)) { back++; } finished: #line 363 "dk4pxres.ctr" return back; } int dk4pxres_check( dk4_px_resample_t const *pxrptr, dk4_px_t in ) { unsigned long prod; int back = 0; #line 377 "dk4pxres.ctr" #if DK4_USE_ASSERT assert(NULL != pxrptr); #endif if (NULL == pxrptr) { goto finished; } if (pxrptr->nom == pxrptr->denom) { back = 1; goto finished; } if (0 == pxrptr->denom) { goto finished; } prod = (unsigned long)in * pxrptr->nom; if (0 == (prod % pxrptr->denom)) { back = 1; } finished: #line 396 "dk4pxres.ctr" return back; } int dk4pxres_multiple( dk4_px_t *dptr, size_t dsz, dk4_px_resample_t const *pxrptr ) { int back = 0; #line 410 "dk4pxres.ctr" #if DK4_USE_ASSERT assert(NULL != dptr); assert(0 < dsz); #endif if ((NULL == dptr) || (NULL == pxrptr)) { goto finished; } back = 1; while (0 < dsz--) { *dptr = dk4pxres_get(pxrptr, *dptr); dptr++; } finished: #line 424 "dk4pxres.ctr" return back; } /* vim: set ai sw=4 ts=4 : */