mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-15 17:02:53 +08:00
337 lines
12 KiB
PHP
337 lines
12 KiB
PHP
|
|
||
|
/*
|
||
|
* 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
|