mirror of
https://git.planet-casio.com/Lephenixnoir/gint.git
synced 2024-12-28 04:23:36 +01:00
Fixed area functions (rectangles completely outside the screen).
This commit is contained in:
parent
a39cc09001
commit
0205c39f21
14 changed files with 30 additions and 13 deletions
2
Makefile
2
Makefile
|
@ -173,7 +173,7 @@ mrproper: clean
|
|||
distclean: mrproper
|
||||
|
||||
install:
|
||||
usb-connector SEND $(target-g1a) $(target-g1a) fls0
|
||||
CasioUsbUploader -f $(target-g1a) -w -l 1
|
||||
|
||||
|
||||
.PHONY: all clean mrproper distclean
|
||||
|
|
4
TODO
4
TODO
|
@ -9,10 +9,12 @@
|
|||
~ needs investigation
|
||||
|
||||
|
||||
@ possibility of vram overflow with text
|
||||
@ possibility of vram left-overflow with text
|
||||
@ garbage displayed as year in the clock, possibly during edition (could not
|
||||
reproduce)
|
||||
@ a few key hits ignored after leaving the application
|
||||
|
||||
+ rect functions
|
||||
+ bitmap blending modes
|
||||
+ minimize use of 7705.h and 7305.h; use local structures instead
|
||||
+ partial transparency
|
||||
|
|
|
@ -41,8 +41,9 @@ extern int *vram;
|
|||
- x1 < x2
|
||||
- y1 < y2
|
||||
which is needed when working with screen rectangles.
|
||||
Returns non-zero if the rectangle is outside the screen.
|
||||
*/
|
||||
void adjustRectangle(int *x1, int *y1, int *x2, int *y2);
|
||||
int adjustRectangle(int *x1, int *y1, int *x2, int *y2);
|
||||
|
||||
/*
|
||||
getMasks()
|
||||
|
|
|
@ -192,7 +192,7 @@ int getkey_opt(enum GetkeyOpt options, int max_cycles);
|
|||
|
||||
Listens the keyboard for simultaneous key hits. This functions fills
|
||||
array `keys` with `count` keycodes, adding KEY_NONE at the end if
|
||||
more than `count` keys are pressed.
|
||||
less than `count` keys are pressed.
|
||||
If `max_cycles` is non-zero and nothing happens after `max_cycles`
|
||||
cycles, this function returns an array of KEY_NONE.
|
||||
|
||||
|
|
|
@ -101,8 +101,16 @@ void free(void *ptr);
|
|||
//---
|
||||
|
||||
/*
|
||||
int rand(void)
|
||||
rand()
|
||||
Returns a pseudo-random number.
|
||||
*/
|
||||
int rand(void);
|
||||
|
||||
/*
|
||||
srand()
|
||||
Changes the seed used by rand().
|
||||
*/
|
||||
void srand(unsigned int seed);
|
||||
|
||||
//---
|
||||
// Integer arithmetic.
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
*/
|
||||
void dimage(int x, int y, struct Image *img)
|
||||
{
|
||||
if(img->magic != 0xb7) return;
|
||||
if(!img || img->magic != 0xb7) return;
|
||||
|
||||
struct Structure s;
|
||||
struct Command command;
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
void dimage_part(int x, int y, struct Image *img, int left, int top,
|
||||
int width, int height)
|
||||
{
|
||||
if(img->magic != 0xb7) return;
|
||||
if(!img || img->magic != 0xb7) return;
|
||||
|
||||
struct Structure s;
|
||||
struct Command command;
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*/
|
||||
void gimage(int x, int y, struct Image *img)
|
||||
{
|
||||
if(img->magic != 0xb7) return;
|
||||
if(!img || img->magic != 0xb7) return;
|
||||
|
||||
struct Structure s;
|
||||
struct Command command;
|
||||
|
|
|
@ -30,7 +30,7 @@ struct Rect intersect(struct Rect r1, struct Rect r2)
|
|||
void gimage_part(int x, int y, struct Image *img, int left, int top,
|
||||
int width, int height)
|
||||
{
|
||||
if(img->magic != 0xb7) return;
|
||||
if(!img || img->magic != 0xb7) return;
|
||||
|
||||
struct Structure s;
|
||||
struct Command command;
|
||||
|
|
|
@ -7,8 +7,9 @@
|
|||
- x1 < x2
|
||||
- y1 < y2
|
||||
which is needed when working with screen rectangles.
|
||||
Returns non-zero if the rectangle is outside the screen.
|
||||
*/
|
||||
void adjustRectangle(int *x1, int *y1, int *x2, int *y2)
|
||||
int adjustRectangle(int *x1, int *y1, int *x2, int *y2)
|
||||
{
|
||||
#define swap(a, b) tmp = a, a = b, b = tmp
|
||||
int tmp;
|
||||
|
@ -16,9 +17,13 @@ void adjustRectangle(int *x1, int *y1, int *x2, int *y2)
|
|||
if(*x2 < *x1) swap(*x1, *x2);
|
||||
if(*y2 < *y1) swap(*y1, *y2);
|
||||
|
||||
if(*x1 > 127 || *y1 > 63 || *x2 < 0 || *y2 < 0) return 1;
|
||||
|
||||
if(*x1 < 0) *x1 = 0;
|
||||
if(*y1 < 0) *y1 = 0;
|
||||
if(*x2 > 127) *x2 = 127;
|
||||
if(*y2 > 63) *y2 = 63;
|
||||
|
||||
return 0;
|
||||
#undef swap
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
void dclear_area(int x1, int y1, int x2, int y2)
|
||||
{
|
||||
uint32_t masks[4];
|
||||
adjustRectangle(&x1, &y1, &x2, &y2);
|
||||
if(adjustRectangle(&x1, &y1, &x2, &y2)) return;
|
||||
getMasks(x1, x2, masks);
|
||||
|
||||
int begin = y1 << 2;
|
||||
|
|
|
@ -67,7 +67,7 @@ static void dvline(int y1, int y2, int x, enum Color color)
|
|||
|
||||
void dline(int x1, int y1, int x2, int y2, enum Color color)
|
||||
{
|
||||
adjustRectangle(&x1, &y1, &x2, &y2);
|
||||
if(adjustRectangle(&x1, &y1, &x2, &y2)) return;
|
||||
|
||||
// Possible optimizations.
|
||||
if(y1 == y2)
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
void dreverse_area(int x1, int y1, int x2, int y2)
|
||||
{
|
||||
uint32_t masks[4];
|
||||
adjustRectangle(&x1, &y1, &x2, &y2);
|
||||
if(adjustRectangle(&x1, &y1, &x2, &y2)) return;
|
||||
getMasks(x1, x2, masks);
|
||||
|
||||
int begin = y1 << 2;
|
||||
|
|
|
@ -262,6 +262,7 @@ void render(int x, int y, const char *str, void (*op)(OPERATE_ARGS))
|
|||
// Allocating data. There will be one operator for each line.
|
||||
height = font->data_height;
|
||||
if(x > 127 || y > 63 || y <= -height) return;
|
||||
if(y + height > 64) height = 64 - y;
|
||||
|
||||
operators = alloca(height * sizeof(uint32_t));
|
||||
for(i = 0; i < height; i++) operators[i] = 0;
|
||||
|
|
Loading…
Reference in a new issue