/* Copyright (C) 2016-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: dk4bifpb.ctr */ /** @file dk4bifpb.c The dk4bifpb module. */ #line 8 "dk4bifpb.ctr" #include "dk4conf.h" #ifndef DK4TYPES_H_INCLUDED #include "dk4types.h" #endif #ifndef DK4MAASZ_H_INCLUDED #include "dk4maasz.h" #endif #ifndef DK4PX_H_INCLUDED #include "dk4px.h" #endif #ifndef DK4BIFTY_H_INCLUDED #include "dk4bifty.h" #endif #ifndef BIF_H_INCLUDED #include "bif.h" #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 40 "dk4bifpb.ctr" static const size_t shift_1bpp[] = { 7, 6, 5, 4, 3, 2, 1, 0 }; static const size_t shift_2bpp[] = { 6, 4, 2, 0 }; static const size_t shift_4bpp[] = { 4, 0 }; dk4_px_t dk4bifpackedbits_get_element( unsigned char const *buffer, size_t elin, size_t bd, size_t nbytes ) { dk4_er_t er; /* Error report for index calculation */ size_t bytei = 0; /* Byte index */ size_t elno = 0; /* Element number within the byte */ size_t shv = 0; /* Number of bits for right shift operation */ dk4_px_t mask = 0; /* Mask value to apply after bit shifting */ dk4_px_t back = 0; /* Result */ #line 75 "dk4bifpb.ctr" #if DK4_USE_ASSERT assert(NULL != buffer); #endif /* Check buffer pointer */ if (NULL == buffer) { goto finished; } /* Check bit depth */ if (8 != bd) { if (16 != bd) { if (1 != bd) { if (4 != bd) { if (2 != bd) { goto finished; } } } } } switch ( (int)bd ) { case 16 : { dk4error_init(&er); bytei = dk4ma_size_t_mul(elin, 2, &er); if ((DK4_E_NONE == er.ec) && (nbytes > bytei)) { back = ((((dk4_px_t)(buffer[bytei])) << 8) & (dk4_px_t)0xFF00U) | (((dk4_px_t)(buffer[bytei+1])) & (dk4_px_t)0x00FFU); } } break; case 8 : { if (nbytes > elin) { back = (dk4_px_t)(buffer[elin]); } } break; default : { switch ( (int)bd ) { case 1 : { bytei = elin / 8; elno = elin % 8; shv = shift_1bpp[elno]; mask = 1U; } break; case 2 : { bytei = elin / 4; elno = elin % 4; shv = shift_2bpp[elno]; mask = 3U; } break; case 4 : { bytei = elin / 2; elno = elin % 2; shv = shift_4bpp[elno]; mask = 15U; } break; } if (nbytes > bytei) { back = buffer[bytei]; if (0 < shv) { back = back >> shv; } back &= mask; } } break; } finished: #line 143 "dk4bifpb.ctr" return back; } /* vim: set ai sw=4 ts=4 : */