summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO3
-rw-r--r--draw.c48
-rw-r--r--gramscii.c4
-rw-r--r--gramscii.h23
-rw-r--r--screen.c2
5 files changed, 68 insertions, 12 deletions
diff --git a/TODO b/TODO
index ecd2a35..3ffa3f5 100644
--- a/TODO
+++ b/TODO
@@ -1,7 +1,6 @@
+ optimize redraws (redraw only the modified rectangle)
- add screen geometry option (-g 25x80?)
-- (?)maybe move "text" mode to "t"
-- implement trapezium
++ implement trapezium
- implement ellipse
- (?) filled box (B)
- (?) manage filled box character (as for other styles)
diff --git a/draw.c b/draw.c
index e1ee63b..3e973b9 100644
--- a/draw.c
+++ b/draw.c
@@ -204,6 +204,54 @@ char flip_par_lean(char st){
}
void draw_trapezium(int x1, int y1, char st, char fix){
+ int xmin, ymin, xmax, ymax;
+ int dx, dy, ylong, yshort, xoff;
+ int xincr;
+ int i;
+ void (*f)(int, int, char);
+
+
+ xmin = MIN(x, x1);
+ xmax = MAX(x, x1);
+ ymin = MIN(y, y1);
+ ymax = MAX(y, y1);
+ dx = xmax - xmin;
+ dy = ymax - ymin;
+
+ if (fix == FIX){
+ f = set_xy;
+ copy_lines_to_ring(ymin, ymax, PRV_STATE);
+ }
+ else
+ f = draw_xy;
+
+ /* This is valid only for "upper" trapezoids */
+ if (st & BOX_TRAP_U){
+ ylong = ymax;
+ yshort = ymin;
+ xoff = dy;
+ xincr = -1;
+ }
+ for(i=xmin+1; i<=xmax; i++){
+ f(i, ylong, line_h);
+ }
+ for(i=xmin+xoff; i<=xmax-xoff; i++){
+ f(i, yshort, line_h);
+ }
+ f(xmin+xoff, yshort, corner);
+ f(xmin, ylong, corner);
+ f(xmax-xoff, yshort, corner);
+ f(xmax, ylong, corner);
+ xoff --;
+ for(i=ymin+1; i<ymax; i++, xoff += xincr){
+ f(xmin + xoff, i, '/');
+ f(xmax - xoff, i, '\\');
+ }
+
+
+ if (fix == FIX)
+ copy_lines_to_ring(ymin, ymax, NEW_STATE);
+ show_cursor();
}
diff --git a/gramscii.c b/gramscii.c
index 5c893fe..008adce 100644
--- a/gramscii.c
+++ b/gramscii.c
@@ -134,6 +134,10 @@ void commands(FILE *fc){
case 'r':
read_file_at(fc, x, y);
break;
+ case 't':
+ mode = TRP;
+ get_box(fc, BOX_TRAP_UC);
+ break;
case 'z':
mode = PAR;
get_box(fc, BOX_PARR);
diff --git a/gramscii.h b/gramscii.h
index b8c2161..f82185d 100644
--- a/gramscii.h
+++ b/gramscii.h
@@ -20,6 +20,7 @@
#define VIS 0x10
#define PAR 0x20
#define REM 0x40
+#define TRP 0x80
/**/
/* directions */
@@ -37,19 +38,21 @@
/* rectangular box */
#define BOX_RECT 0x00
/* parallelograms */
-#define BOX_PAR 0x04
+#define BOX_PAR 0x10
/* parallelogram (leaning right) */
-#define BOX_PARR 0x05
+#define BOX_PARR 0x11
/* parallelogram (leaning left) */
-#define BOX_PARL 0x06
+#define BOX_PARL 0x12
/* trapezium */
-#define BOX_TRAP 0x10
-#define BOX_TRAP_UR 0x11
-#define BOX_TRAP_UC 0x12
-#define BOX_TRAP_UL 0x13
-#define BOX_TRAP_DL 0x14
-#define BOX_TRAP_DC 0x15
-#define BOX_TRAP_DR 0x16
+#define BOX_TRAP 0x20
+#define BOX_TRAP_U 0x24
+#define BOX_TRAP_D 0x28
+#define BOX_TRAP_UR 0x25
+#define BOX_TRAP_UC 0x26
+#define BOX_TRAP_UL 0x27
+#define BOX_TRAP_DL 0x28
+#define BOX_TRAP_DC 0x29
+#define BOX_TRAP_DR 0x2a
/**/
#define NOFIX 0x0
diff --git a/screen.c b/screen.c
index 0ef1f69..cedd6f9 100644
--- a/screen.c
+++ b/screen.c
@@ -39,6 +39,8 @@ char* mode_str(){
return "par";
case REM:
return "rem";
+ case TRP:
+ return "trp";
default:
return "ERR";
}