225 lines
5.6 KiB
C
Raw Permalink Normal View History

2021-09-28 14:26:12 +08:00
//fxlib <20><><EFBFBD>ݲ㣬<DDB2><E3A3AC><EFBFBD>ڴ<EFBFBD> fx-9860 ƽ̨<C6BD><CCA8> STM32-Player <20><>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD>
#include "sys.h"
#include "systick.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "GameEngine.h"
#include "fxlib.h"
/**************************************** ˽<>к<EFBFBD><D0BA><EFBFBD> ****************************************/
void FX_Draw_Point(int16_t x, int16_t y, uint16_t color);
uint16_t FX_Draw_GetPoint(int16_t x, int16_t y);
void FX_Draw_Mono(
int16_t x,
int16_t y,
uint8_t draw_mode,
uint8_t pos_mode,
uint16_t mono_color,
uint16_t back_color,
const unsigned char *pic,
uint16_t width,
uint16_t height);
/*****************************************************************************************/
/***************************************** FxLib *****************************************/
void Sleep(int millisecond)
{
Delay_ms(millisecond);
}
void ML_clear_vram()
{
GE_Draw_ClrAll(WHITE);
}
void ML_clear_screen()
{
GE_Draw_ClrAll(WHITE);
GE_Draw_Disp();
}
void ML_display_vram()
{
GE_Draw_Disp();
}
void ML_bmp_or(const unsigned char *bmp, int x, int y, int width, int height)
{
FX_Draw_Mono(x, y, MONO_OR, UP_LEFT, BLACK, WHITE, bmp, width, height);
}
void ML_bmp_and(const unsigned char *bmp, int x, int y, int width, int height)
{
FX_Draw_Mono(x, y, MONO_AND, UP_LEFT, BLACK, WHITE, bmp, width, height);
}
void ML_bmp_xor(const unsigned char *bmp, int x, int y, int width, int height)
{
FX_Draw_Mono(x, y, MONO_XOR, UP_LEFT, BLACK, WHITE, bmp, width, height);
}
void ML_bmp_or_cl(const unsigned char *bmp, int x, int y, int width, int height)
{
FX_Draw_Mono(x, y, MONO_OR, UP_LEFT, BLACK, WHITE, bmp, width, height);
}
void ML_bmp_and_cl(const unsigned char *bmp, int x, int y, int width, int height)
{
FX_Draw_Mono(x, y, MONO_AND, UP_LEFT, BLACK, WHITE, bmp, width, height);
}
void ML_bmp_xor_cl(const unsigned char *bmp, int x, int y, int width, int height)
{
FX_Draw_Mono(x, y, MONO_XOR, UP_LEFT, BLACK, WHITE, bmp, width, height);
}
void ML_bmp_8_or(const unsigned char *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_OR, UP_LEFT, BLACK, WHITE, bmp, 8, 8);
}
void ML_bmp_8_and(const unsigned char *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_AND, UP_LEFT, BLACK, WHITE, bmp, 8, 8);
}
void ML_bmp_8_xor(const unsigned char *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_XOR, UP_LEFT, BLACK, WHITE, bmp, 8, 8);
}
void ML_bmp_8_or_cl(const unsigned char *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_OR, UP_LEFT, BLACK, WHITE, bmp, 8, 8);
}
void ML_bmp_8_and_cl(const unsigned char *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_AND, UP_LEFT, BLACK, WHITE, bmp, 8, 8);
}
void ML_bmp_8_xor_cl(const unsigned char *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_XOR, UP_LEFT, BLACK, WHITE, bmp, 8, 8);
}
void ML_bmp_16_or(const unsigned short *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_OR, UP_LEFT, BLACK, WHITE, bmp, 16, 16);
}
void ML_bmp_16_and(const unsigned short *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_AND, UP_LEFT, BLACK, WHITE, bmp, 16, 16);
}
void ML_bmp_16_xor(const unsigned short *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_XOR, UP_LEFT, BLACK, WHITE, bmp, 16, 16);
}
void ML_bmp_16_or_cl(const unsigned short *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_OR, UP_LEFT, BLACK, WHITE, bmp, 16, 16);
}
void ML_bmp_16_and_cl(const unsigned short *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_AND, UP_LEFT, BLACK, WHITE, bmp, 16, 16);
}
void ML_bmp_16_xor_cl(const unsigned short *bmp, int x, int y)
{
FX_Draw_Mono(x, y, MONO_XOR, UP_LEFT, BLACK, WHITE, bmp, 16, 16);
}
/*****************************************************************************************/
/**************************************** ˽<>к<EFBFBD><D0BA><EFBFBD> ****************************************/
void FX_Draw_Point(int16_t x, int16_t y, uint16_t color)
{
if (x < 0 || x > ML_SCREEN_WIDTH - 1 || y < 0 || y > ML_SCREEN_HEIGHT - 1)
return;
x = 2 * x + 33;
y = 2 * y + 57;
GE_Draw_Point(x, y, color);
GE_Draw_Point(x + 1, y, color);
GE_Draw_Point(x, y + 1, color);
GE_Draw_Point(x + 1, y + 1, color);
}
uint16_t FX_Draw_GetPoint(int16_t x, int16_t y)
{
if (x < 0 || x > ML_SCREEN_WIDTH - 1 || y < 0 || y > ML_SCREEN_HEIGHT - 1)
return WHITE;
return GE_Draw_GetPoint(2 * x + 33, 2 * y + 57);
}
void FX_Draw_Mono(
int16_t x,
int16_t y,
uint8_t draw_mode,
uint8_t pos_mode,
uint16_t mono_color,
uint16_t back_color,
const unsigned char *pic,
uint16_t width,
uint16_t height)
{
if (pos_mode == MID)
{
x = x - width / 2;
y = y - height / 2;
}
uint8_t temp8;
int16_t x0 = x, y0 = y;
for (uint16_t i = 0; y - y0 < height; i++)
{
temp8 = pic[i];
for (uint16_t j = 0; j < 8; j++)
{
if (temp8 & 0x80)
{
if (FX_Draw_GetPoint(x, y) == back_color && (draw_mode == MONO_OR || draw_mode == MONO_XOR || draw_mode == MONO_COVER))
FX_Draw_Point(x, y, mono_color);
else if (FX_Draw_GetPoint(x, y) == mono_color && draw_mode == MONO_XOR)
FX_Draw_Point(x, y, back_color);
}
else
{
if (FX_Draw_GetPoint(x, y) == mono_color && (draw_mode == MONO_AND || draw_mode == MONO_COVER))
FX_Draw_Point(x, y, back_color);
}
temp8 <<= 1;
x++;
if (x - x0 == width)
{
x = x0;
y++;
break;
}
}
}
}
/*****************************************************************************************/