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

337 lines
12 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_draw_pattern.inc
* Description: c code template for drawing pattern
*
* $Date: 14. April 2020
* $Revision: V.1.0.0
*
* -------------------------------------------------------------------- */
#ifndef __API_COLOUR
# error You have to define __API_COLOUR before using this c template
#endif
#ifndef __API_INT_TYPE
# error You have to define the __API_INT_TYPE before using this c template
#endif
#undef ____ARM_2D_FUNC
#undef ___ARM_2D_FUNC
#undef __ARM_2D_FUNC
#define ____ARM_2D_FUNC(__NAME, __COLOUR) __arm_2d_impl_##__COLOUR##_##__NAME
#define ___ARM_2D_FUNC(__NAME, __COLOUR) ____ARM_2D_FUNC(__NAME, __COLOUR)
#define __ARM_2D_FUNC(__NAME) ___ARM_2D_FUNC(__NAME, __API_COLOUR)
__WEAK
void __ARM_2D_FUNC(draw_pattern_fg_only)(uint8_t *__RESTRICT pchSourceBase,
int32_t iOffset,
int16_t iSourceStride,
__API_INT_TYPE *__RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptCopySize,
__API_INT_TYPE ForeColour)
{
//! get in byte offset
iOffset &= 0x07;
iSourceStride = (iSourceStride + 7) & ~0x07;
for (int_fast16_t y = 0; y < ptCopySize->iHeight; y++) {
uint8_t *__RESTRICT pchSrc = pchSourceBase;
__API_INT_TYPE * __RESTRICT pTarget = pTargetBase;
uint8_t chBitMask = _BV(iOffset);
for (int_fast16_t x = 0; x < ptCopySize->iWidth; x++) {
if ((*pchSrc) & chBitMask) {
*pTarget = ForeColour;
}
pTarget++;
chBitMask <<= 1;
if (!chBitMask) {
chBitMask = 1;
pchSrc++;
}
}
//chBitMask = 1;
pchSourceBase += (iSourceStride >> 3);
pTargetBase += iTargetStride;
}
}
__WEAK
void __ARM_2D_FUNC(draw_pattern_no_bg_comp)(
uint8_t *__RESTRICT pchSourceBase,
int32_t iOffset,
int16_t iSourceStride,
__API_INT_TYPE *__RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptCopySize)
{
//! get in byte offset
iOffset &= 0x07;
iSourceStride = (iSourceStride + 7) & ~0x07;
for (int_fast16_t y = 0; y < ptCopySize->iHeight; y++) {
uint8_t *__RESTRICT pchSrc = pchSourceBase;
__API_INT_TYPE * __RESTRICT pTarget = pTargetBase;
uint8_t chBitMask = _BV(iOffset);
for (int_fast16_t x = 0; x < ptCopySize->iWidth; x++) {
if ((*pchSrc) & chBitMask) {
*pTarget = ~(*pTarget);
}
pTarget++;
chBitMask <<= 1;
if (!chBitMask) {
chBitMask = 1;
pchSrc++;
}
}
chBitMask = 1;
pchSourceBase += (iSourceStride >> 3);
pTargetBase += iTargetStride;
}
}
__WEAK
void __ARM_2D_FUNC(draw_pattern_bg_only)( uint8_t *__RESTRICT pchSourceBase,
int32_t iOffset,
int16_t iSourceStride,
__API_INT_TYPE *__RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptCopySize,
__API_INT_TYPE BackColour)
{
//! get in byte offset
iOffset &= 0x07;
iSourceStride = (iSourceStride + 7) & ~0x07;
for (int_fast16_t y = 0; y < ptCopySize->iHeight; y++) {
uint8_t *__RESTRICT pchSrc = pchSourceBase;
__API_INT_TYPE * __RESTRICT pTarget = pTargetBase;
uint8_t chBitMask = _BV(iOffset);
for (int_fast16_t x = 0; x < ptCopySize->iWidth; x++) {
if (!((*pchSrc) & chBitMask)) {
*pTarget = BackColour;
}
pTarget++;
chBitMask <<= 1;
if (!chBitMask) {
chBitMask = 1;
pchSrc++;
}
}
chBitMask = 1;
pchSourceBase += (iSourceStride >> 3);
pTargetBase += iTargetStride;
}
}
__WEAK
void __ARM_2D_FUNC(draw_pattern_bg_fg)( uint8_t *__RESTRICT pchSourceBase,
int32_t iOffset,
int16_t iSourceStride,
__API_INT_TYPE *__RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptCopySize,
__API_INT_TYPE ForeColour,
__API_INT_TYPE BackColour)
{
//! get in byte offset
iOffset &= 0x07;
iSourceStride = (iSourceStride + 7) & ~0x07;
for (int_fast16_t y = 0; y < ptCopySize->iHeight; y++) {
uint8_t *__RESTRICT pchSrc = pchSourceBase;
__API_INT_TYPE * __RESTRICT pTarget = pTargetBase;
uint8_t chBitMask = _BV(iOffset);
for (int_fast16_t x = 0; x < ptCopySize->iWidth; x++) {
if ((*pchSrc) & chBitMask) {
*pTarget++ = ForeColour;
} else {
*pTarget++ = BackColour;
}
chBitMask <<= 1;
if (!chBitMask) {
chBitMask = 1;
pchSrc++;
}
}
chBitMask = 1;
pchSourceBase += (iSourceStride >> 3);
pTargetBase += iTargetStride;
}
}
__WEAK
void __ARM_2D_FUNC(draw_pattern_bg_comp)( uint8_t *__RESTRICT pchSourceBase,
int32_t iOffset,
int16_t iSourceStride,
__API_INT_TYPE *__RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptCopySize,
__API_INT_TYPE BackColour)
{
//! get in byte offset
iOffset &= 0x07;
iSourceStride = (iSourceStride + 7) & ~0x07;
for (int_fast16_t y = 0; y < ptCopySize->iHeight; y++) {
uint8_t *__RESTRICT pchSrc = pchSourceBase;
__API_INT_TYPE * __RESTRICT pTarget = pTargetBase;
uint8_t chBitMask = _BV(iOffset);
for (int_fast16_t x = 0; x < ptCopySize->iWidth; x++) {
if ((*pchSrc) & chBitMask) {
*pTarget = ~(*pTarget);
} else {
*pTarget = BackColour;
}
pTarget++;
chBitMask <<= 1;
if (!chBitMask) {
chBitMask = 1;
pchSrc++;
}
}
chBitMask = 1;
pchSourceBase += (iSourceStride >> 3);
pTargetBase += iTargetStride;
}
}
__WEAK
void __ARM_2D_FUNC(draw_pattern)( uint8_t *__RESTRICT pchSourceBase,
int32_t iOffset,
int16_t iSourceStride,
__API_INT_TYPE *__RESTRICT pTargetBase,
int16_t iTargetStride,
arm_2d_size_t *__RESTRICT ptCopySize,
uint8_t chMode,
__API_INT_TYPE ForeColour,
__API_INT_TYPE BackColour)
{
switch (chMode & (ARM_2D_DRW_PATN_MODE_NO_FG_COLOR |
ARM_2D_DRW_PATH_MODE_COMP_FG_COLOUR |
ARM_2D_DRW_PATN_MODE_WITH_BG_COLOR)) {
case 0:
//! foreground only
__ARM_2D_FUNC(draw_pattern_fg_only)(pchSourceBase,
iOffset,
iSourceStride,
pTargetBase,
iTargetStride,
ptCopySize,
ForeColour);
break;
case ARM_2D_DRW_PATN_MODE_WITH_BG_COLOR:
//! background + foreground
__ARM_2D_FUNC(draw_pattern_bg_fg)( pchSourceBase,
iOffset,
iSourceStride,
pTargetBase,
iTargetStride,
ptCopySize,
ForeColour,
BackColour);
break;
case ARM_2D_DRW_PATN_MODE_NO_FG_COLOR:
//! no foreground, no background, nothing to do
break;
case ARM_2D_DRW_PATN_MODE_NO_FG_COLOR |
ARM_2D_DRW_PATN_MODE_WITH_BG_COLOR :
//! background only
__ARM_2D_FUNC(draw_pattern_bg_only)(pchSourceBase,
iOffset,
iSourceStride,
pTargetBase,
iTargetStride,
ptCopySize,
BackColour);
break;
case ARM_2D_DRW_PATH_MODE_COMP_FG_COLOUR:
case ARM_2D_DRW_PATH_MODE_COMP_FG_COLOUR |
ARM_2D_DRW_PATN_MODE_NO_FG_COLOR :
//! no background, use complement colour as foreground
__ARM_2D_FUNC(draw_pattern_no_bg_comp)( pchSourceBase,
iOffset,
iSourceStride,
pTargetBase,
iTargetStride,
ptCopySize);
break;
case ARM_2D_DRW_PATN_MODE_NO_FG_COLOR |
ARM_2D_DRW_PATH_MODE_COMP_FG_COLOUR |
ARM_2D_DRW_PATN_MODE_WITH_BG_COLOR :
//! background, use complement colour as foreground
__ARM_2D_FUNC(draw_pattern_bg_comp)(pchSourceBase,
iOffset,
iSourceStride,
pTargetBase,
iTargetStride,
ptCopySize,
BackColour);
break;
}
}
#undef ____ARM_2D_FUNC
#undef ___ARM_2D_FUNC
#undef __ARM_2D_FUNC
#undef __API_COLOUR
#undef __API_INT_TYPE