pikapython/package/Arm2D/__arm_2d_alpha_mask.inc
2021-11-09 22:19:51 +08:00

1794 lines
68 KiB
C++

/*
* Copyright (C) 2010-2021 Arm Limited or its affiliates. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* ----------------------------------------------------------------------
* Project: Arm-2D Library
* Title: __arm_2d_alpha_mask.inc
* Description: c code template for copy and fill like operations
*
* $Date: 30. Sept 2021
* $Revision: V.1.0.0
*
* -------------------------------------------------------------------- */
#ifndef __API_CAFWM_COLOUR
# error You have to define __API_CAFWM_COLOUR before using this c template
#endif
#ifndef __API_CAFWM_INT_TYPE
# error You have to define the __API_CAFWM_INT_TYPE before using this c template
#endif
#ifndef __API_CAFWM_INT_TYPE_BIT_NUM
# error You have to define the __API_CAFWM_INT_TYPE_BIT_NUM before using this c template
#endif
#ifndef __API_CAFWM_PIXEL_BLENDING
# error You have to define __API_PIXEL_BLENDING before using this c template
#endif
/*! disable this feature by default */
#ifndef __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
# define __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING 0
#endif
#ifndef __API_CAFWM_CFG_1_HORIZONTAL_LINE
# define __API_CAFWM_CFG_1_HORIZONTAL_LINE 0
#endif
#ifndef __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
# define __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT 0
#endif
#if __API_CAFWM_CFG_1_HORIZONTAL_LINE && !__API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
//! rename functions for 'c8bit' 1 horizontal line target mask
# define masks_fill src_msk_1h_des_msk_fill
# define masks_fill_x_mirror src_msk_1h_des_msk_fill_x_mirror
# define masks_fill_y_mirror src_msk_1h_des_msk_fill_y_mirror
# define masks_fill_xy_mirror src_msk_1h_des_msk_fill_xy_mirror
# define masks_fill_mirror src_msk_1h_des_msk_fill_mirror
# define des_msk_fill 1h_des_msk_fill
# define des_msk_fill_x_mirror 1h_des_msk_fill_x_mirror
# define des_msk_fill_y_mirror 1h_des_msk_fill_y_mirror
# define des_msk_fill_xy_mirror 1h_des_msk_fill_xy_mirror
# define des_msk_fill_mirror 1h_des_msk_fill_mirror
# define masks_copy src_msk_1h_des_msk_copy
# define masks_copy_x_mirror src_msk_1h_des_msk_copy_x_mirror
# define masks_copy_y_mirror src_msk_1h_des_msk_copy_y_mirror
# define masks_copy_xy_mirror src_msk_1h_des_msk_copy_xy_mirror
# define masks_copy_mirror src_msk_1h_des_msk_copy_mirror
# define des_msk_copy 1h_des_msk_copy
# define des_msk_copy_x_mirror 1h_des_msk_copy_x_mirror
# define des_msk_copy_y_mirror 1h_des_msk_copy_y_mirror
# define des_msk_copy_xy_mirror 1h_des_msk_copy_xy_mirror
# define des_msk_copy_mirror 1h_des_msk_copy_mirror
#elif __API_CAFWM_CFG_1_HORIZONTAL_LINE && __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
//! rename functions for '8in32 channel' 1 horizontal line target mask
# error Do NOT Support this combination: __API_CAFWM_CFG_1_HORIZONTAL_LINE=1 \
and __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT=1 !
#elif !__API_CAFWM_CFG_1_HORIZONTAL_LINE && __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
//! rename functions for '8in32 channel'
# define des_msk_fill des_chn_msk_fill
# define des_msk_fill_x_mirror des_chn_msk_fill_x_mirror
# define des_msk_fill_y_mirror des_chn_msk_fill_y_mirror
# define des_msk_fill_xy_mirror des_chn_msk_fill_xy_mirror
# define des_msk_fill_mirror des_chn_msk_fill_mirror
# define des_msk_copy des_chn_msk_copy
# define des_msk_copy_x_mirror des_chn_msk_copy_x_mirror
# define des_msk_copy_y_mirror des_chn_msk_copy_y_mirror
# define des_msk_copy_xy_mirror des_chn_msk_copy_xy_mirror
# define des_msk_copy_mirror des_chn_msk_copy_mirror
# define src_msk_fill src_chn_msk_fill
# define src_msk_fill_x_mirror src_chn_msk_fill_x_mirror
# define src_msk_fill_y_mirror src_chn_msk_fill_y_mirror
# define src_msk_fill_xy_mirror src_chn_msk_fill_xy_mirror
# define src_msk_fill_mirror src_chn_msk_fill_mirror
# define src_msk_copy src_chn_msk_copy
# define src_msk_copy_x_mirror src_chn_msk_copy_x_mirror
# define src_msk_copy_y_mirror src_chn_msk_copy_y_mirror
# define src_msk_copy_xy_mirror src_chn_msk_copy_xy_mirror
# define src_msk_copy_mirror src_chn_msk_copy_mirror
#endif
#undef ____CAFWM_FUNC
#undef ___CAFWM_FUNC
#undef __CAFWM_FUNC
#ifndef __API_CAFWM_OP_NAME
# define ____CAFWM_FUNC(__NAME, __COLOUR) \
__arm_2d_impl_##__COLOUR##_##__NAME
# define ___CAFWM_FUNC(__NAME, __COLOUR) ____CAFWM_FUNC(__NAME, __COLOUR)
#else
# define _____CAFWM_FUNC(__OP_NAME, __NAME, __COLOUR) \
__arm_2d_impl_##__COLOUR##_##__OP_NAME##_##__NAME
# define ____CAFWM_FUNC(__OP_NAME, __NAME, __COLOUR) \
_____CAFWM_FUNC(__OP_NAME, __NAME, __COLOUR)
# define ___CAFWM_FUNC(__NAME, __COLOUR) \
____CAFWM_FUNC(__API_CAFWM_OP_NAME, __NAME, __COLOUR)
#endif
#define __CAFWM_FUNC(__NAME) ___CAFWM_FUNC(__NAME, __API_CAFWM_COLOUR)
#undef ____CAFWM_TYPE
#undef ___CAFWM_TYPE
#undef __CAFWM_TYPE
#ifndef __API_CAFWM_OP_NAME
# define ____CAFWM_TYPE(__NAME, __COLOUR) arm_2d_##__COLOUR##_##__NAME
# define ___CAFWM_TYPE(__NAME, __COLOUR) ____CAFWM_TYPE(__NAME, __COLOUR)
#else
# define _____CAFWM_TYPE(__OP_NAME, __NAME, __COLOUR) \
arm_2d_##__COLOUR##_##__OP_NAME##_##__NAME
# define ____CAFWM_TYPE(__OP_NAME, __NAME, __COLOUR) \
_____CAFWM_TYPE(__OP_NAME, __NAME, __COLOUR)
# define ___CAFWM_TYPE(__NAME, __COLOUR) \
____CAFWM_TYPE(__API_CAFWM_OP_NAME, __NAME, __COLOUR)
#endif
#define __CAFWM_TYPE(__NAME) ___CAFWM_TYPE(__NAME, __API_CAFWM_COLOUR)
/*----------------------------------------------------------------------------*
* Fill with Mirroring (both masks) *
*----------------------------------------------------------------------------*/
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
/*! \note source mask only */
# define __API_MCWM_COLOUR __API_CAFWM_COLOUR
# define __API_MCWM_INT_TYPE __API_CAFWM_INT_TYPE
# define __API_MCWM_INT_TYPE_BIT_NUM __API_CAFWM_INT_TYPE_BIT_NUM
# define __API_MCWM_PIXEL_BLENDING __API_CAFWM_PIXEL_BLENDING
# if defined(__API_CAFWM_OP_NAME)
# define __API_MCWM_OP_NAME __API_CAFWM_OP_NAME
# endif
# define __API_MCWM_CFG_SUPPORT_SRC_MSK_WRAPING \
__API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
# define __API_MCWM_CFG_1_HORIZONTAL_LINE 0
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT 1
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT_ON_SOURCE_SIDE 1
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT_ON_TARGET_SIDE 0
# define masks_fill src_chn_msk_des_msk_fill
# define masks_fill_x_mirror src_chn_msk_des_msk_fill_x_mirror
# define masks_fill_y_mirror src_chn_msk_des_msk_fill_y_mirror
# define masks_fill_xy_mirror src_chn_msk_des_msk_fill_xy_mirror
# define masks_fill_mirror src_chn_msk_des_msk_fill_mirror
# define masks_copy src_chn_msk_des_msk_copy
# define masks_copy_x_mirror src_chn_msk_des_msk_copy_x_mirror
# define masks_copy_y_mirror src_chn_msk_des_msk_copy_y_mirror
# define masks_copy_xy_mirror src_chn_msk_des_msk_copy_xy_mirror
# define masks_copy_mirror src_chn_msk_des_msk_copy_mirror
# include "__arm_2d_meta_copy_with_masks.inc"
/*! \note source mask only */
# define __API_MCWM_COLOUR __API_CAFWM_COLOUR
# define __API_MCWM_INT_TYPE __API_CAFWM_INT_TYPE
# define __API_MCWM_INT_TYPE_BIT_NUM __API_CAFWM_INT_TYPE_BIT_NUM
# define __API_MCWM_PIXEL_BLENDING __API_CAFWM_PIXEL_BLENDING
# if defined(__API_CAFWM_OP_NAME)
# define __API_MCWM_OP_NAME __API_CAFWM_OP_NAME
# endif
# define __API_MCWM_CFG_SUPPORT_SRC_MSK_WRAPING \
__API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
# define __API_MCWM_CFG_1_HORIZONTAL_LINE 1
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT 1
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT_ON_SOURCE_SIDE 1
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT_ON_TARGET_SIDE 0
# define masks_fill src_chn_msk_1h_des_msk_fill
# define masks_fill_x_mirror src_chn_msk_1h_des_msk_fill_x_mirror
# define masks_fill_y_mirror src_chn_msk_1h_des_msk_fill_y_mirror
# define masks_fill_xy_mirror src_chn_msk_1h_des_msk_fill_xy_mirror
# define masks_fill_mirror src_chn_msk_1h_des_msk_fill_mirror
# define masks_copy src_chn_msk_1h_des_msk_copy
# define masks_copy_x_mirror src_chn_msk_1h_des_msk_copy_x_mirror
# define masks_copy_y_mirror src_chn_msk_1h_des_msk_copy_y_mirror
# define masks_copy_xy_mirror src_chn_msk_1h_des_msk_copy_xy_mirror
# define masks_copy_mirror src_chn_msk_1h_des_msk_copy_mirror
# include "__arm_2d_meta_copy_with_masks.inc"
/*! \note des mask only */
# define __API_MCWM_COLOUR __API_CAFWM_COLOUR
# define __API_MCWM_INT_TYPE __API_CAFWM_INT_TYPE
# define __API_MCWM_INT_TYPE_BIT_NUM __API_CAFWM_INT_TYPE_BIT_NUM
# define __API_MCWM_PIXEL_BLENDING __API_CAFWM_PIXEL_BLENDING
# if defined(__API_CAFWM_OP_NAME)
# define __API_MCWM_OP_NAME __API_CAFWM_OP_NAME
# endif
# define __API_MCWM_CFG_SUPPORT_SRC_MSK_WRAPING \
__API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
# define __API_MCWM_CFG_1_HORIZONTAL_LINE 0
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT 1
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT_ON_SOURCE_SIDE 0
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT_ON_TARGET_SIDE 1
# define masks_fill src_msk_des_chn_msk_fill
# define masks_fill_x_mirror src_msk_des_chn_msk_fill_x_mirror
# define masks_fill_y_mirror src_msk_des_chn_msk_fill_y_mirror
# define masks_fill_xy_mirror src_msk_des_chn_msk_fill_xy_mirror
# define masks_fill_mirror src_msk_des_chn_msk_fill_mirror
# define masks_copy src_msk_des_chn_msk_copy
# define masks_copy_x_mirror src_msk_des_chn_msk_copy_x_mirror
# define masks_copy_y_mirror src_msk_des_chn_msk_copy_y_mirror
# define masks_copy_xy_mirror src_msk_des_chn_msk_copy_xy_mirror
# define masks_copy_mirror src_msk_des_chn_msk_copy_mirror
# include "__arm_2d_meta_copy_with_masks.inc"
/*! \note both masks */
# define __API_MCWM_COLOUR __API_CAFWM_COLOUR
# define __API_MCWM_INT_TYPE __API_CAFWM_INT_TYPE
# define __API_MCWM_INT_TYPE_BIT_NUM __API_CAFWM_INT_TYPE_BIT_NUM
# define __API_MCWM_PIXEL_BLENDING __API_CAFWM_PIXEL_BLENDING
# if defined(__API_CAFWM_OP_NAME)
# define __API_MCWM_OP_NAME __API_CAFWM_OP_NAME
# endif
# define __API_MCWM_CFG_SUPPORT_SRC_MSK_WRAPING \
__API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
# define __API_MCWM_CFG_1_HORIZONTAL_LINE 0
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT 1
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT_ON_SOURCE_SIDE 1
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT_ON_TARGET_SIDE 1
# define masks_fill src_chn_msk_des_chn_msk_fill
# define masks_fill_x_mirror src_chn_msk_des_chn_msk_fill_x_mirror
# define masks_fill_y_mirror src_chn_msk_des_chn_msk_fill_y_mirror
# define masks_fill_xy_mirror src_chn_msk_des_chn_msk_fill_xy_mirror
# define masks_fill_mirror src_chn_msk_des_chn_msk_fill_mirror
# define masks_copy src_chn_msk_des_chn_msk_copy
# define masks_copy_x_mirror src_chn_msk_des_chn_msk_copy_x_mirror
# define masks_copy_y_mirror src_chn_msk_des_chn_msk_copy_y_mirror
# define masks_copy_xy_mirror src_chn_msk_des_chn_msk_copy_xy_mirror
# define masks_copy_mirror src_chn_msk_des_chn_msk_copy_mirror
# include "__arm_2d_meta_copy_with_masks.inc"
#else
# define __API_MCWM_COLOUR __API_CAFWM_COLOUR
# define __API_MCWM_INT_TYPE __API_CAFWM_INT_TYPE
# define __API_MCWM_INT_TYPE_BIT_NUM __API_CAFWM_INT_TYPE_BIT_NUM
# define __API_MCWM_PIXEL_BLENDING __API_CAFWM_PIXEL_BLENDING
# if defined(__API_CAFWM_OP_NAME)
# define __API_MCWM_OP_NAME __API_CAFWM_OP_NAME
# endif
# define __API_MCWM_CFG_SUPPORT_SRC_MSK_WRAPING \
__API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
# define __API_MCWM_CFG_1_HORIZONTAL_LINE \
__API_CAFWM_CFG_1_HORIZONTAL_LINE
# define __API_MCWM_CFG_CHANNEL_8in32_SUPPORT 0
# include "__arm_2d_meta_copy_with_masks.inc"
#endif
/*----------------------------------------------------------------------------*
* Fill with Mirroring (target mask only) *
*----------------------------------------------------------------------------*/
__WEAK
void __CAFWM_FUNC(des_msk_fill)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMaskBase,
#else
uint8_t *__RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize)
{
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMaskLineBase = ptTargetMaskBase;
#else
uint8_t *__RESTRICT ptTargetMaskLineBase = ptTargetMaskBase;
#endif
for (int_fast16_t iTargetY = 0; iTargetY < ptTargetSize->iHeight;) {
//! reset source
__API_CAFWM_INT_TYPE *__RESTRICT ptSource = ptSourceBase;
for (int_fast16_t iSourceY = 0; iSourceY < ptSourceSize->iHeight; iSourceY++) {
__API_CAFWM_INT_TYPE *__RESTRICT ptTarget = ptTargetBase;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMask = ptTargetMaskLineBase;
#else
uint8_t *__RESTRICT ptTargetMask = ptTargetMaskLineBase;
#endif
/*---------------- Height Loop Begin----------------*/
uint_fast32_t wLengthLeft = ptTargetSize->iWidth;
do {
uint_fast32_t wLength = MIN(wLengthLeft, ptSourceSize->iWidth);
/*---------------- Width Loop Begin----------------*/
__API_CAFWM_INT_TYPE *__RESTRICT ptSrc = ptSource;
for (int_fast16_t x = 0; x < wLength; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptTargetMask++);
#else
uint16_t hwOpacity = 256 - (*ptTargetMask++);
#endif
__API_CAFWM_PIXEL_BLENDING(ptSrc++, ptTarget++, hwOpacity);
}
/*---------------- Width Loop End----------------*/
wLengthLeft -= wLength;
} while (wLengthLeft);
/*---------------- Height Loop End----------------*/
ptSource += iSourceStride;
ptTargetBase += iTargetStride;
#if __API_CAFWM_CFG_1_HORIZONTAL_LINE
ptTargetMaskLineBase = ptTargetMaskBase;
#else
ptTargetMaskLineBase += iTargetMaskStride;
#endif
iTargetY++;
if (iTargetY >= ptTargetSize->iHeight) {
break;
}
}
}
}
__WEAK
void __CAFWM_FUNC(des_msk_fill_x_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMaskBase,
#else
uint8_t *__RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize)
{
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMaskLineBase = ptTargetMaskBase;
#else
uint8_t *__RESTRICT ptTargetMaskLineBase = ptTargetMaskBase;
#endif
for (int_fast16_t iTargetY = 0; iTargetY < ptTargetSize->iHeight;) {
//! reset source
__API_CAFWM_INT_TYPE *__RESTRICT ptSource = ptSourceBase;
for (int_fast16_t iSourceY = 0; iSourceY < ptSourceSize->iHeight; iSourceY++) {
__API_CAFWM_INT_TYPE *__RESTRICT ptTarget = ptTargetBase;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMask = ptTargetMaskLineBase;
#else
uint8_t *__RESTRICT ptTargetMask = ptTargetMaskLineBase;
#endif
/*---------------- Height Loop Begin----------------*/
uint_fast32_t wLengthLeft = ptTargetSize->iWidth;
do {
uint_fast32_t wLength = MIN(wLengthLeft, ptSourceSize->iWidth);
/*---------------- Width Loop Begin----------------*/
__API_CAFWM_INT_TYPE *__RESTRICT ptSrc = ptSource;
ptSrc += ptSourceSize->iWidth - 1;
for (int_fast16_t x = 0; x < wLength; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptTargetMask++);
#else
uint16_t hwOpacity = 256 - (*ptTargetMask++);
#endif
__API_CAFWM_PIXEL_BLENDING(ptSrc--, ptTarget++, hwOpacity);
}
/*---------------- Width Loop End----------------*/
wLengthLeft -= wLength;
} while (wLengthLeft);
/*---------------- Height Loop End----------------*/
ptSource += iSourceStride;
ptTargetBase += iTargetStride;
#if __API_CAFWM_CFG_1_HORIZONTAL_LINE
ptTargetMaskLineBase = ptTargetMaskBase;
#else
ptTargetMaskLineBase += iTargetMaskStride;
#endif
iTargetY++;
if (iTargetY >= ptTargetSize->iHeight) {
break;
}
}
}
}
__WEAK
void __CAFWM_FUNC(des_msk_fill_y_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMaskBase,
#else
uint8_t *__RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize)
{
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMaskLineBase = ptTargetMaskBase;
#else
uint8_t *__RESTRICT ptTargetMaskLineBase = ptTargetMaskBase;
#endif
for (int_fast16_t iTargetY = 0; iTargetY < ptTargetSize->iHeight;) {
//! reset source
__API_CAFWM_INT_TYPE *__RESTRICT ptSource
= ptSourceBase + iSourceStride * (ptSourceSize->iHeight - 1);
for (int_fast16_t iSourceY = 0; iSourceY < ptSourceSize->iHeight; iSourceY++) {
__API_CAFWM_INT_TYPE *__RESTRICT ptTarget = ptTargetBase;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMask = ptTargetMaskLineBase;
#else
uint8_t *__RESTRICT ptTargetMask = ptTargetMaskLineBase;
#endif
/*---------------- Height Loop Begin----------------*/
uint_fast32_t wLengthLeft = ptTargetSize->iWidth;
do {
uint_fast32_t wLength = MIN(wLengthLeft, ptSourceSize->iWidth);
/*---------------- Width Loop Begin----------------*/
__API_CAFWM_INT_TYPE *__RESTRICT ptSrc = ptSource;
for (int_fast16_t x = 0; x < wLength; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptTargetMask++);
#else
uint16_t hwOpacity = 256 - (*ptTargetMask++);
#endif
__API_CAFWM_PIXEL_BLENDING(ptSrc++, ptTarget++, hwOpacity);
}
/*---------------- Width Loop End----------------*/
wLengthLeft -= wLength;
} while (wLengthLeft);
/*---------------- Height Loop End----------------*/
ptSource -= iSourceStride;
ptTargetBase += iTargetStride;
#if __API_CAFWM_CFG_1_HORIZONTAL_LINE
ptTargetMaskLineBase = ptTargetMaskBase;
#else
ptTargetMaskLineBase += iTargetMaskStride;
#endif
iTargetY++;
if (iTargetY >= ptTargetSize->iHeight) {
break;
}
}
}
}
__WEAK
void __CAFWM_FUNC(des_msk_fill_xy_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMaskBase,
#else
uint8_t *__RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize)
{
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMaskLineBase = ptTargetMaskBase;
#else
uint8_t *__RESTRICT ptTargetMaskLineBase = ptTargetMaskBase;
#endif
for (int_fast16_t iTargetY = 0; iTargetY < ptTargetSize->iHeight;) {
//! reset source
__API_CAFWM_INT_TYPE *__RESTRICT ptSource
= ptSourceBase + iSourceStride * (ptSourceSize->iHeight - 1);
for (int_fast16_t iSourceY = 0; iSourceY < ptSourceSize->iHeight; iSourceY++) {
__API_CAFWM_INT_TYPE *__RESTRICT ptTarget = ptTargetBase;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMask = ptTargetMaskLineBase;
#else
uint8_t *__RESTRICT ptTargetMask = ptTargetMaskLineBase;
#endif
/*---------------- Height Loop Begin----------------*/
uint_fast32_t wLengthLeft = ptTargetSize->iWidth;
do {
uint_fast32_t wLength = MIN(wLengthLeft, ptSourceSize->iWidth);
/*---------------- Width Loop Begin----------------*/
__API_CAFWM_INT_TYPE *__RESTRICT ptSrc = ptSource;
ptSrc += ptSourceSize->iWidth - 1;
for (int_fast16_t x = 0; x < wLength; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptTargetMask++);
#else
uint16_t hwOpacity = 256 - (*ptTargetMask++);
#endif
__API_CAFWM_PIXEL_BLENDING(ptSrc--, ptTarget++, hwOpacity);
}
/*---------------- Width Loop End----------------*/
wLengthLeft -= wLength;
} while (wLengthLeft);
/*---------------- Height Loop End----------------*/
ptSource -= iSourceStride;
ptTargetBase += iTargetStride;
#if __API_CAFWM_CFG_1_HORIZONTAL_LINE
ptTargetMaskLineBase = ptTargetMaskBase;
#else
ptTargetMaskLineBase += iTargetMaskStride;
#endif
iTargetY++;
if (iTargetY >= ptTargetSize->iHeight) {
break;
}
}
}
}
__WEAK
void __CAFWM_FUNC(des_msk_fill_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptTargetMaskBase,
#else
uint8_t *__RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize,
uint32_t wMode)
{
switch (wMode & (ARM_2D_CP_MODE_Y_MIRROR | ARM_2D_CP_MODE_X_MIRROR)) {
case ARM_2D_CP_MODE_X_MIRROR:
__CAFWM_FUNC(des_msk_fill_x_mirror)(
ptSourceBase, iSourceStride, ptSourceSize,
ptTargetBase, iTargetStride, ptTargetSize,
ptTargetMaskBase, iTargetMaskStride, ptTargetMaskSize);
break;
case ARM_2D_CP_MODE_Y_MIRROR:
__CAFWM_FUNC(des_msk_fill_y_mirror)(
ptSourceBase, iSourceStride, ptSourceSize,
ptTargetBase, iTargetStride, ptTargetSize,
ptTargetMaskBase, iTargetMaskStride, ptTargetMaskSize);
break;
case ARM_2D_CP_MODE_Y_MIRROR | ARM_2D_CP_MODE_X_MIRROR :
__CAFWM_FUNC(des_msk_fill_xy_mirror)(
ptSourceBase, iSourceStride, ptSourceSize,
ptTargetBase, iTargetStride, ptTargetSize,
ptTargetMaskBase, iTargetMaskStride, ptTargetMaskSize);
break;
default:
assert(false); /*! this should not happen */
//break;
}
}
/*----------------------------------------------------------------------------*
* Fill with Mirroring (src mask only) *
*----------------------------------------------------------------------------*/
#if !__API_CAFWM_CFG_1_HORIZONTAL_LINE
__WEAK
void __CAFWM_FUNC(src_msk_fill)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize)
{
for (int_fast16_t iTargetY = 0; iTargetY < ptTargetSize->iHeight;) {
//! reset source
__API_CAFWM_INT_TYPE *__RESTRICT ptSource = ptSourceBase;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptSourceMask = ptSourceMaskBase;
#else
uint8_t *ptSourceMask = ptSourceMaskBase;
#endif
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
int_fast16_t iSourceMaskY = 0;
#endif
for (int_fast16_t iSourceY = 0; iSourceY < ptSourceSize->iHeight; iSourceY++) {
__API_CAFWM_INT_TYPE *__RESTRICT ptTarget = ptTargetBase;
/*---------------- Height Loop Begin----------------*/
uint_fast32_t wLengthLeft = ptTargetSize->iWidth;
do {
uint_fast32_t wLength = MIN(wLengthLeft, ptSourceSize->iWidth);
/*---------------- Width Loop Begin----------------*/
__API_CAFWM_INT_TYPE *__RESTRICT ptSrc = ptSource;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptSrcMsk = ptSourceMask;
#else
uint8_t *__RESTRICT ptSrcMsk = ptSourceMask;
#endif
for (int_fast16_t x = 0; x < wLength; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptSrcMsk++);
#else
uint16_t hwOpacity = 256 - (*ptSrcMsk++);
#endif
__API_CAFWM_PIXEL_BLENDING(ptSrc++, ptTarget++, hwOpacity);
}
/*---------------- Width Loop End----------------*/
wLengthLeft -= wLength;
} while (wLengthLeft);
/*---------------- Height Loop End----------------*/
ptSource += iSourceStride;
ptTargetBase += iTargetStride;
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
iSourceMaskY++;
//! handle source mask
if ( (iSourceMaskY >= ptSourceMaskSize->iHeight)
|| (iSourceMaskY >= ptSourceSize->iHeight)) {
ptSourceMask = ptSourceMaskBase;
iSourceMaskY = 0;
} else {
ptSourceMask += iSourceMaskStride;
}
#else
ptSourceMask += iSourceMaskStride;
#endif
iTargetY++;
if (iTargetY >= ptTargetSize->iHeight) {
break;
}
}
}
}
__WEAK
void __CAFWM_FUNC(src_msk_fill_x_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize)
{
for (int_fast16_t iTargetY = 0; iTargetY < ptTargetSize->iHeight;) {
//! reset source
__API_CAFWM_INT_TYPE *__RESTRICT ptSource = ptSourceBase;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptSourceMask = ptSourceMaskBase;
#else
uint8_t *ptSourceMask = ptSourceMaskBase;
#endif
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
int_fast16_t iSourceMaskY = 0;
#endif
for (int_fast16_t iSourceY = 0; iSourceY < ptSourceSize->iHeight; iSourceY++) {
__API_CAFWM_INT_TYPE *__RESTRICT ptTarget = ptTargetBase;
/*---------------- Height Loop Begin----------------*/
uint_fast32_t wLengthLeft = ptTargetSize->iWidth;
do {
uint_fast32_t wLength = MIN(wLengthLeft, ptSourceSize->iWidth);
/*---------------- Width Loop Begin----------------*/
__API_CAFWM_INT_TYPE *__RESTRICT ptSrc = ptSource;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptSrcMsk = ptSourceMask;
#else
uint8_t *__RESTRICT ptSrcMsk = ptSourceMask;
#endif
ptSrc += ptSourceSize->iWidth - 1;
ptSrcMsk += ptSourceSize->iWidth - 1;
for (int_fast16_t x = 0; x < wLength; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptSrcMsk--);
#else
uint16_t hwOpacity = 256 - (*ptSrcMsk--);
#endif
__API_CAFWM_PIXEL_BLENDING(ptSrc--, ptTarget++, hwOpacity);
}
/*---------------- Width Loop End----------------*/
wLengthLeft -= wLength;
} while (wLengthLeft);
/*---------------- Height Loop End----------------*/
ptSource += iSourceStride;
ptTargetBase += iTargetStride;
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
iSourceMaskY++;
//! handle source mask
if ( (iSourceMaskY >= ptSourceMaskSize->iHeight)
|| (iSourceMaskY >= ptSourceSize->iHeight)) {
ptSourceMask = ptSourceMaskBase;
iSourceMaskY = 0;
} else {
ptSourceMask += iSourceMaskStride;
}
#else
ptSourceMask += iSourceMaskStride;
#endif
iTargetY++;
if (iTargetY >= ptTargetSize->iHeight) {
break;
}
}
}
}
__WEAK
void __CAFWM_FUNC(src_msk_fill_y_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize)
{
assert(ptSourceSize->iHeight <= ptSourceMaskSize->iHeight);
ptSourceMaskBase += iSourceMaskStride * (ptSourceSize->iHeight - 1);
for (int_fast16_t iTargetY = 0; iTargetY < ptTargetSize->iHeight;) {
//! reset source
__API_CAFWM_INT_TYPE *__RESTRICT ptSource
= ptSourceBase + iSourceStride * (ptSourceSize->iHeight - 1);
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptSourceMask = ptSourceMaskBase;
#else
uint8_t *ptSourceMask = ptSourceMaskBase;
#endif
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
int_fast16_t iSourceMaskY = 0;
#endif
for (int_fast16_t iSourceY = 0; iSourceY < ptSourceSize->iHeight; iSourceY++) {
__API_CAFWM_INT_TYPE *__RESTRICT ptTarget = ptTargetBase;
/*---------------- Height Loop Begin----------------*/
uint_fast32_t wLengthLeft = ptTargetSize->iWidth;
do {
uint_fast32_t wLength = MIN(wLengthLeft, ptSourceSize->iWidth);
/*---------------- Width Loop Begin----------------*/
__API_CAFWM_INT_TYPE *__RESTRICT ptSrc = ptSource;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptSrcMsk = ptSourceMask;
#else
uint8_t *__RESTRICT ptSrcMsk = ptSourceMask;
#endif
for (int_fast16_t x = 0; x < wLength; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptSrcMsk++);
#else
uint16_t hwOpacity = 256 - (*ptSrcMsk++);
#endif
__API_CAFWM_PIXEL_BLENDING(ptSrc++, ptTarget++, hwOpacity);
}
/*---------------- Width Loop End----------------*/
wLengthLeft -= wLength;
} while (wLengthLeft);
/*---------------- Height Loop End----------------*/
ptSource -= iSourceStride;
ptTargetBase += iTargetStride;
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
iSourceMaskY++;
//! handle source mask
if ( (iSourceMaskY >= ptSourceMaskSize->iHeight)
|| (iSourceMaskY >= ptSourceSize->iHeight)) {
ptSourceMask = ptSourceMaskBase;
iSourceMaskY = 0;
} else {
ptSourceMask -= iSourceMaskStride;
}
#else
ptSourceMask -= iSourceMaskStride;
#endif
iTargetY++;
if (iTargetY >= ptTargetSize->iHeight) {
break;
}
}
}
}
__WEAK
void __CAFWM_FUNC(src_msk_fill_xy_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize)
{
assert(ptSourceSize->iHeight <= ptSourceMaskSize->iHeight);
ptSourceMaskBase += iSourceMaskStride * (ptSourceSize->iHeight - 1);
for (int_fast16_t iTargetY = 0; iTargetY < ptTargetSize->iHeight;) {
//! reset source
__API_CAFWM_INT_TYPE *__RESTRICT ptSource
= ptSourceBase + iSourceStride * (ptSourceSize->iHeight - 1);
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptSourceMask = ptSourceMaskBase;
#else
uint8_t *ptSourceMask = ptSourceMaskBase;
#endif
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
int_fast16_t iSourceMaskY = 0;
#endif
for (int_fast16_t iSourceY = 0; iSourceY < ptSourceSize->iHeight; iSourceY++) {
__API_CAFWM_INT_TYPE *__RESTRICT ptTarget = ptTargetBase;
/*---------------- Height Loop Begin----------------*/
uint_fast32_t wLengthLeft = ptTargetSize->iWidth;
do {
uint_fast32_t wLength = MIN(wLengthLeft, ptSourceSize->iWidth);
/*---------------- Width Loop Begin----------------*/
__API_CAFWM_INT_TYPE *__RESTRICT ptSrc = ptSource;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *__RESTRICT ptSrcMsk = ptSourceMask;
#else
uint8_t *__RESTRICT ptSrcMsk = ptSourceMask;
#endif
ptSrc += ptSourceSize->iWidth - 1;
ptSrcMsk += ptSourceSize->iWidth - 1;
for (int_fast16_t x = 0; x < wLength; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptSrcMsk--);
#else
uint16_t hwOpacity = 256 - (*ptSrcMsk--);
#endif
__API_CAFWM_PIXEL_BLENDING(ptSrc--, ptTarget++, hwOpacity);
}
/*---------------- Width Loop End----------------*/
wLengthLeft -= wLength;
} while (wLengthLeft);
/*---------------- Height Loop End----------------*/
ptSource -= iSourceStride;
ptTargetBase += iTargetStride;
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
iSourceMaskY++;
//! handle source mask
if ( (iSourceMaskY >= ptSourceMaskSize->iHeight)
|| (iSourceMaskY >= ptSourceSize->iHeight)) {
ptSourceMask = ptSourceMaskBase;
iSourceMaskY = 0;
} else {
ptSourceMask -= iSourceMaskStride;
}
#else
ptSourceMask -= iSourceMaskStride;
#endif
iTargetY++;
if (iTargetY >= ptTargetSize->iHeight) {
break;
}
}
}
}
__WEAK
void __CAFWM_FUNC(src_msk_fill_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT ptSourceBase,
int16_t iSourceStride,
arm_2d_size_t *__RESTRICT ptSourceSize,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE *__RESTRICT ptTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptTargetSize,
uint32_t wMode)
{
switch (wMode & (ARM_2D_CP_MODE_Y_MIRROR | ARM_2D_CP_MODE_X_MIRROR)) {
case ARM_2D_CP_MODE_X_MIRROR:
__CAFWM_FUNC(src_msk_fill_x_mirror)(
ptSourceBase, iSourceStride, ptSourceSize,
ptSourceMaskBase, iSourceMaskStride, ptSourceMaskSize,
ptTargetBase, iTargetStride, ptTargetSize);
break;
case ARM_2D_CP_MODE_Y_MIRROR:
__CAFWM_FUNC(src_msk_fill_y_mirror)(
ptSourceBase, iSourceStride, ptSourceSize,
ptSourceMaskBase, iSourceMaskStride, ptSourceMaskSize,
ptTargetBase, iTargetStride, ptTargetSize);
break;
case ARM_2D_CP_MODE_Y_MIRROR | ARM_2D_CP_MODE_X_MIRROR :
__CAFWM_FUNC(src_msk_fill_xy_mirror)(
ptSourceBase, iSourceStride, ptSourceSize,
ptSourceMaskBase, iSourceMaskStride, ptSourceMaskSize,
ptTargetBase, iTargetStride, ptTargetSize);
break;
default:
assert(false); /*! this should not happen */
//break;
}
}
#endif
/*----------------------------------------------------------------------------*
* Copy with Mirroring (target mask only) *
*----------------------------------------------------------------------------*/
__WEAK
void __CAFWM_FUNC(des_msk_copy)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptTargetMaskBase,
#else
uint8_t * __RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize,
arm_2d_size_t * __RESTRICT ptCopySize)
{
int_fast16_t iHeight = ptCopySize->iHeight;
int_fast16_t iWidth = ptCopySize->iWidth;
//uint16_t hwRatioCompl = 256 - chRatio;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptTargetMask = ptTargetMaskBase;
#else
uint8_t *ptTargetMask = ptTargetMaskBase;
#endif
for ( int_fast16_t y = 0;
y < iHeight;
y++) {
for (int_fast16_t x = 0; x < iWidth; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptTargetMask++);
#else
uint16_t hwOpacity = 256 - (*ptTargetMask++);
#endif
__API_CAFWM_PIXEL_BLENDING( pSourceBase++, pTargetBase++, hwOpacity);
}
pSourceBase += (iSourceStride - iWidth);
pTargetBase += (iTargetStride - iWidth);
#if __API_CAFWM_CFG_1_HORIZONTAL_LINE
ptTargetMask = ptTargetMaskBase;
#else
ptTargetMask += (iTargetMaskStride - iWidth);
#endif
}
}
__WEAK
void __CAFWM_FUNC(des_msk_copy_x_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptTargetMaskBase,
#else
uint8_t * __RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize,
arm_2d_size_t * __RESTRICT ptCopySize)
{
int_fast16_t iHeight = ptCopySize->iHeight;
int_fast16_t iWidth = ptCopySize->iWidth;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptTargetMask = ptTargetMaskBase;
#else
uint8_t *ptTargetMask = ptTargetMaskBase;
#endif
for ( int_fast16_t y = 0;
y < iHeight;
y++) {
//__API_CAFWM_INT_TYPE *ptTargetCur = pTargetBase;
__API_CAFWM_INT_TYPE *ptSourceCur = pSourceBase;
ptSourceCur += ptCopySize->iWidth - 1;
for (int_fast16_t x = 0; x < iWidth; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptTargetMask++);
#else
uint16_t hwOpacity = 256 - (*ptTargetMask++);
#endif
__API_CAFWM_PIXEL_BLENDING( ptSourceCur--, pTargetBase++, hwOpacity);
}
pSourceBase += iSourceStride;
pTargetBase += (iTargetStride - iWidth);
#if __API_CAFWM_CFG_1_HORIZONTAL_LINE
ptTargetMask = ptTargetMaskBase;
#else
ptTargetMask += (iTargetMaskStride - iWidth);
#endif
}
}
__WEAK
void __CAFWM_FUNC(des_msk_copy_y_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptTargetMaskBase,
#else
uint8_t * __RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize,
arm_2d_size_t * __RESTRICT ptCopySize)
{
int_fast16_t iHeight = ptCopySize->iHeight;
int_fast16_t iWidth = ptCopySize->iWidth;
pSourceBase += iSourceStride * (ptCopySize->iHeight - 1);
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptTargetMask = ptTargetMaskBase;
#else
uint8_t *ptTargetMask = ptTargetMaskBase;
#endif
for ( int_fast16_t y = 0; y < iHeight; y++) {
__API_CAFWM_INT_TYPE *ptSourceCur = pSourceBase;
for (int_fast16_t x = 0; x < iWidth; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptTargetMask++);
#else
uint16_t hwOpacity = 256 - (*ptTargetMask++);
#endif
__API_CAFWM_PIXEL_BLENDING( ptSourceCur++, pTargetBase++, hwOpacity);
}
pSourceBase -= iSourceStride;
pTargetBase += (iTargetStride - iWidth);
#if __API_CAFWM_CFG_1_HORIZONTAL_LINE
ptTargetMask = ptTargetMaskBase;
#else
ptTargetMask += (iTargetMaskStride - iWidth);
#endif
}
}
__WEAK
void __CAFWM_FUNC(des_msk_copy_xy_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptTargetMaskBase,
#else
uint8_t * __RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize,
arm_2d_size_t * __RESTRICT ptCopySize)
{
int_fast16_t iHeight = ptCopySize->iHeight;
int_fast16_t iWidth = ptCopySize->iWidth;
pSourceBase += iSourceStride * (ptCopySize->iHeight - 1);
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptTargetMask = ptTargetMaskBase;
#else
uint8_t *ptTargetMask = ptTargetMaskBase;
#endif
for ( int_fast16_t y = 0; y < iHeight; y++) {
__API_CAFWM_INT_TYPE *ptSourceCur = pSourceBase;
ptSourceCur += ptCopySize->iWidth - 1;
for (int_fast16_t x = 0; x < iWidth; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptTargetMask++);
#else
uint16_t hwOpacity = 256 - (*ptTargetMask++);
#endif
__API_CAFWM_PIXEL_BLENDING( ptSourceCur--, pTargetBase++, hwOpacity);
}
pSourceBase -= iSourceStride;
pTargetBase += (iTargetStride - iWidth);
#if __API_CAFWM_CFG_1_HORIZONTAL_LINE
ptTargetMask = ptTargetMaskBase;
#else
ptTargetMask += (iTargetMaskStride - iWidth);
#endif
}
}
__WEAK
void __CAFWM_FUNC(des_msk_copy_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptTargetMaskBase,
#else
uint8_t * __RESTRICT ptTargetMaskBase,
#endif
int16_t iTargetMaskStride,
arm_2d_size_t *__RESTRICT ptTargetMaskSize,
arm_2d_size_t * __RESTRICT ptCopySize,
uint32_t wMode)
{
switch (wMode & (ARM_2D_CP_MODE_Y_MIRROR | ARM_2D_CP_MODE_X_MIRROR)) {
case ARM_2D_CP_MODE_X_MIRROR:
__CAFWM_FUNC(des_msk_copy_x_mirror)(pSourceBase, iSourceStride,
pTargetBase, iTargetStride,
ptTargetMaskBase, iTargetMaskStride,
ptTargetMaskSize,
ptCopySize);
break;
case ARM_2D_CP_MODE_Y_MIRROR:
__CAFWM_FUNC(des_msk_copy_y_mirror)(pSourceBase, iSourceStride,
pTargetBase, iTargetStride,
ptTargetMaskBase, iTargetMaskStride,
ptTargetMaskSize,
ptCopySize);
break;
case ARM_2D_CP_MODE_Y_MIRROR | ARM_2D_CP_MODE_X_MIRROR:
__CAFWM_FUNC(des_msk_copy_xy_mirror)(pSourceBase, iSourceStride,
pTargetBase, iTargetStride,
ptTargetMaskBase, iTargetMaskStride,
ptTargetMaskSize,
ptCopySize);
break;
default:
assert(false); /*! this should not happen */
//break;
}
}
/*----------------------------------------------------------------------------*
* Copy with Mirroring (src mask only) *
*----------------------------------------------------------------------------*/
#if !__API_CAFWM_CFG_1_HORIZONTAL_LINE
__WEAK
void __CAFWM_FUNC(src_msk_copy)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t * __RESTRICT ptCopySize)
{
int_fast16_t iHeight = ptCopySize->iHeight;
int_fast16_t iWidth = ptCopySize->iWidth;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptSourceMask = ptSourceMaskBase;
#else
uint8_t *ptSourceMask = ptSourceMaskBase;
#endif
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
int_fast16_t iSourceMaskY = 0;
#endif
for (int_fast16_t y = 0; y < iHeight; y++) {
for (int_fast16_t x = 0; x < iWidth; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(ptSourceMask++);
#else
uint16_t hwOpacity = 256 - (*ptSourceMask++);
#endif
__API_CAFWM_PIXEL_BLENDING( pSourceBase++, pTargetBase++, hwOpacity);
}
pSourceBase += (iSourceStride - iWidth);
pTargetBase += (iTargetStride - iWidth);
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
//! handle source mask
iSourceMaskY++;
if ( (iSourceMaskY >= ptSourceMaskSize->iHeight)
|| (iSourceMaskY >= iHeight)) {
ptSourceMask = ptSourceMaskBase;
iSourceMaskY = 0;
} else {
ptSourceMask += (iSourceMaskStride - iWidth);
}
#else
ptSourceMask += (iSourceMaskStride - iWidth);
#endif
}
}
__WEAK
void __CAFWM_FUNC(src_msk_copy_x_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t * __RESTRICT ptCopySize)
{
int_fast16_t iHeight = ptCopySize->iHeight;
int_fast16_t iWidth = ptCopySize->iWidth;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptSourceMask = ptSourceMaskBase;
#else
uint8_t *ptSourceMask = ptSourceMaskBase;
#endif
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
int_fast16_t iSourceMaskY = 0;
#endif
for (int_fast16_t y = 0; y < iHeight; y++) {
__API_CAFWM_INT_TYPE *ptTargetCur = pTargetBase;
__API_CAFWM_INT_TYPE *ptSourceCur = pSourceBase;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *pchSourceMaskCur = ptSourceMask;
#else
uint8_t *pchSourceMaskCur = ptSourceMask;
#endif
ptSourceCur += ptCopySize->iWidth - 1;
//! \note do not use ptSourceMaskSize->iWidth
pchSourceMaskCur += ptCopySize->iWidth - 1;
for (int_fast16_t x = 0; x < iWidth; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(pchSourceMaskCur--);
#else
uint16_t hwOpacity = 256 - (*pchSourceMaskCur--);
#endif
__API_CAFWM_PIXEL_BLENDING( ptSourceCur--, ptTargetCur++, hwOpacity);
}
pSourceBase += iSourceStride;
pTargetBase += iTargetStride;
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
//! handle source mask
iSourceMaskY++;
if ( (iSourceMaskY >= ptSourceMaskSize->iHeight)
|| (iSourceMaskY >= iHeight)) {
ptSourceMask = ptSourceMaskBase;
iSourceMaskY = 0;
} else {
ptSourceMask += iSourceMaskStride;
}
#else
ptSourceMask += iSourceMaskStride;
#endif
}
}
__WEAK
void __CAFWM_FUNC(src_msk_copy_y_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t * __RESTRICT ptCopySize)
{
int_fast16_t iHeight = ptCopySize->iHeight;
int_fast16_t iWidth = ptCopySize->iWidth;
pSourceBase += iSourceStride * (ptCopySize->iHeight - 1);
assert (ptCopySize->iHeight <= ptSourceMaskSize->iHeight);
ptSourceMaskBase += iSourceMaskStride * (ptCopySize->iHeight - 1);
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptSourceMask = ptSourceMaskBase;
#else
uint8_t *ptSourceMask = ptSourceMaskBase;
#endif
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
int_fast16_t iSourceMaskY = 0;
#endif
for (int_fast16_t y = 0; y < iHeight; y++) {
__API_CAFWM_INT_TYPE *ptSourceCur = pSourceBase;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *pchSourceMaskCur = ptSourceMask;
#else
uint8_t *pchSourceMaskCur = ptSourceMask;
#endif
for (int_fast16_t x = 0; x < iWidth; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(pchSourceMaskCur++);
#else
uint16_t hwOpacity = 256 - (*pchSourceMaskCur++);
#endif
__API_CAFWM_PIXEL_BLENDING( ptSourceCur++, pTargetBase++, hwOpacity);
}
pSourceBase -= iSourceStride;
pTargetBase += (iTargetStride - iWidth);
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
//! handle source mask
iSourceMaskY++;
if ( (iSourceMaskY >= ptSourceMaskSize->iHeight)
|| (iSourceMaskY >= iHeight)) {
ptSourceMask = ptSourceMaskBase;
iSourceMaskY = 0;
} else {
ptSourceMask -= iSourceMaskStride;
}
#else
ptSourceMask -= iSourceMaskStride;
#endif
}
}
__WEAK
void __CAFWM_FUNC(src_msk_copy_xy_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t * __RESTRICT ptCopySize)
{
int_fast16_t iHeight = ptCopySize->iHeight;
int_fast16_t iWidth = ptCopySize->iWidth;
pSourceBase += iSourceStride * (ptCopySize->iHeight - 1);
assert (ptCopySize->iHeight <= ptSourceMaskSize->iHeight);
ptSourceMaskBase += iSourceMaskStride * (ptCopySize->iHeight - 1);
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *ptSourceMask = ptSourceMaskBase;
#else
uint8_t *ptSourceMask = ptSourceMaskBase;
#endif
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
int_fast16_t iSourceMaskY = 0;
#endif
for (int_fast16_t y = 0; y < iHeight; y++) {
__API_CAFWM_INT_TYPE *ptSourceCur = pSourceBase;
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t *pchSourceMaskCur = ptSourceMask;
#else
uint8_t *pchSourceMaskCur = ptSourceMask;
#endif
ptSourceCur += ptCopySize->iWidth - 1;
//! \note do not use ptSourceMaskSize->iWidth
pchSourceMaskCur += ptCopySize->iWidth - 1;
for (int_fast16_t x = 0; x < iWidth; x++) {
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint16_t hwOpacity = 256 - *(uint8_t *)(pchSourceMaskCur--);
#else
uint16_t hwOpacity = 256 - (*pchSourceMaskCur--);
#endif
__API_CAFWM_PIXEL_BLENDING( ptSourceCur--, pTargetBase++, hwOpacity);
}
pSourceBase -= iSourceStride;
pTargetBase += (iTargetStride - iWidth);
#if __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
//! handle source mask
iSourceMaskY++;
if ( (iSourceMaskY >= ptSourceMaskSize->iHeight)
|| (iSourceMaskY >= iHeight)) {
ptSourceMask = ptSourceMaskBase;
iSourceMaskY = 0;
} else {
ptSourceMask -= iSourceMaskStride;
}
#else
ptSourceMask -= iSourceMaskStride;
#endif
}
}
__WEAK
void __CAFWM_FUNC(src_msk_copy_mirror)(
__API_CAFWM_INT_TYPE * __RESTRICT pSourceBase,
int16_t iSourceStride,
#if __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT
uint32_t * __RESTRICT ptSourceMaskBase,
#else
uint8_t * __RESTRICT ptSourceMaskBase,
#endif
int16_t iSourceMaskStride,
arm_2d_size_t *__RESTRICT ptSourceMaskSize,
__API_CAFWM_INT_TYPE * __RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t * __RESTRICT ptCopySize,
uint32_t wMode)
{
switch (wMode & (ARM_2D_CP_MODE_Y_MIRROR | ARM_2D_CP_MODE_X_MIRROR)) {
case ARM_2D_CP_MODE_X_MIRROR:
__CAFWM_FUNC(src_msk_copy_x_mirror)(pSourceBase, iSourceStride,
ptSourceMaskBase, iSourceMaskStride,
ptSourceMaskSize,
pTargetBase, iTargetStride,
ptCopySize);
break;
case ARM_2D_CP_MODE_Y_MIRROR:
__CAFWM_FUNC(src_msk_copy_y_mirror)(pSourceBase, iSourceStride,
ptSourceMaskBase, iSourceMaskStride,
ptSourceMaskSize,
pTargetBase, iTargetStride,
ptCopySize);
break;
case ARM_2D_CP_MODE_Y_MIRROR | ARM_2D_CP_MODE_X_MIRROR:
__CAFWM_FUNC(src_msk_copy_xy_mirror)(pSourceBase, iSourceStride,
ptSourceMaskBase, iSourceMaskStride,
ptSourceMaskSize,
pTargetBase, iTargetStride,
ptCopySize);
break;
default:
assert(false); /*! this should not happen */
//break;
}
}
#endif
#undef masks_fill
#undef masks_fill_x_mirror
#undef masks_fill_y_mirror
#undef masks_fill_xy_mirror
#undef masks_fill_mirror
#undef des_msk_fill
#undef des_msk_fill_x_mirror
#undef des_msk_fill_y_mirror
#undef des_msk_fill_xy_mirror
#undef des_msk_fill_mirror
#undef masks_copy
#undef masks_copy_x_mirror
#undef masks_copy_y_mirror
#undef masks_copy_xy_mirror
#undef masks_copy_mirror
#undef des_msk_copy
#undef des_msk_copy_x_mirror
#undef des_msk_copy_y_mirror
#undef des_msk_copy_xy_mirror
#undef des_msk_copy_mirror
#undef src_msk_fill
#undef src_msk_fill_x_mirror
#undef src_msk_fill_y_mirror
#undef src_msk_fill_xy_mirror
#undef src_msk_fill_mirror
#undef src_msk_copy
#undef src_msk_copy_x_mirror
#undef src_msk_copy_y_mirror
#undef src_msk_copy_xy_mirror
#undef src_msk_copy_mirror
#undef __API_CAFWM_COPY_LIKE_OP_NAME
#undef __API_CAFWM_OP_NAME
#undef __API_CAFWM_PIXEL_BLENDING
#undef ____CAFWM_FUNC
#undef ___CAFWM_FUNC
#undef __CAFWM_FUNC
#undef __API_CAFWM_COLOUR
#undef __API_CAFWM_INT_TYPE
#undef __API_CAFWM_INT_TYPE_BIT_NUM
#undef ____CAFWM_TYPE
#undef ___CAFWM_TYPE
#undef __CAFWM_TYPE
#undef __API_CAFWM_CFG_SUPPORT_SRC_MSK_WRAPING
#undef __API_CAFWM_CFG_1_HORIZONTAL_LINE
#undef __API_CAFWM_CFG_CHANNEL_8in32_SUPPORT