summaryrefslogtreecommitdiff
path: root/atari/caret.c
diff options
context:
space:
mode:
Diffstat (limited to 'atari/caret.c')
-rw-r--r--atari/caret.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/atari/caret.c b/atari/caret.c
new file mode 100644
index 000000000..42a35a452
--- /dev/null
+++ b/atari/caret.c
@@ -0,0 +1,129 @@
+#include <stdbool.h>
+
+#include "desktop/plot_style.h"
+#include "atari/plot/plot.h"
+#include "atari/caret.h"
+
+extern struct s_vdi_sysinfo vdi_sysinfo;
+
+static void caret_restore_background(struct s_caret *c, VdiHdl vh, GRECT *clip);
+
+void caret_show(struct s_caret *caret, VdiHdl vh, GRECT *dimensions, GRECT *clip)
+{
+ GRECT visible, old_dim;
+ MFDB screen;
+ short pxy[8];
+
+ struct rect old_clip;
+
+ return;
+
+
+
+ plot_get_clip(&old_clip);
+ plot_get_dimensions(&old_dim);
+
+
+ // store background:
+ visible = *dimensions;
+ visible.g_x += clip->g_x;
+ visible.g_y += clip->g_y;
+
+ if(!rc_intersect(clip, &visible)){
+ printf("no isect...\n");
+ return;
+ }
+
+
+ // TODO: do not alloc / free on each move...
+ if (caret->background.fd_addr != NULL) {
+ //caret_restore_background(caret, vh, clip);
+ }
+
+ plot_lock();
+ plot_set_dimensions(clip->g_x, clip->g_y, clip->g_w, clip->g_h);
+
+ caret->dimensions.g_x = dimensions->g_x;
+ caret->dimensions.g_y = dimensions->g_y;
+ caret->dimensions.g_w = visible.g_w;
+ caret->dimensions.g_h = visible.g_h;
+
+ dbg_grect("clip", clip);
+ dbg_grect("visible", &visible);
+ // TODO: do not alloc / free on every redraw...
+ init_mfdb(vdi_sysinfo.scr_bpp, visible.g_w, visible.g_h, 0,
+ &caret->background);
+ init_mfdb(0, visible.g_w, visible.g_h, 0, &screen);
+ pxy[0] = visible.g_x;
+ pxy[1] = visible.g_y;
+ pxy[2] = visible.g_x + visible.g_w;
+ pxy[3] = visible.g_y + visible.g_h;
+ pxy[4] = 0;
+ pxy[5] = 0;
+ pxy[6] = visible.g_w;
+ pxy[7] = visible.g_h;
+ vro_cpyfm (vh, S_ONLY, pxy, &screen, &caret->background);
+
+ plot_line(dimensions->g_x, dimensions->g_y, dimensions->g_x,
+ dimensions->g_y + dimensions->g_h, plot_style_caret);
+
+ plot_set_dimensions(old_clip.x0, old_clip.y0, old_clip.x1, old_clip.y1);
+ plot_clip(&old_clip);
+
+ plot_unlock();
+ caret->visible = true;
+}
+
+void caret_hide(struct s_caret *caret, VdiHdl vh, GRECT *clip)
+{
+ struct rect old_clip;
+ GRECT old_dim;
+
+ plot_lock();
+ plot_get_clip(&old_clip);
+ plot_get_dimensions(&old_dim);
+ plot_set_dimensions(clip->g_x, clip->g_y, clip->g_w, clip->g_h);
+ caret_restore_background(caret, vh, clip);
+ plot_set_dimensions(old_clip.x0, old_clip.y0, old_clip.x1, old_clip.y1);
+ plot_clip(&old_clip);
+ plot_unlock();
+ caret->visible = false;
+}
+
+static void caret_restore_background(struct s_caret *caret, VdiHdl vh, GRECT *clip)
+{
+ MFDB screen;
+ GRECT visible;
+ short pxy[8];
+
+ visible = caret->dimensions;
+ visible.g_x += clip->g_x;
+ visible.g_y += clip->g_y;
+
+ dbg_grect("restore ", &visible);
+
+ if(!rc_intersect(clip, &visible)){
+ goto exit;
+ }
+
+ // TODO: check isect
+
+ // restore mfdb
+
+ init_mfdb(0, caret->dimensions.g_w, caret->dimensions.g_h, 0, &screen);
+ pxy[0] = 0;
+ pxy[1] = 0;
+ pxy[2] = caret->dimensions.g_w;
+ pxy[3] = caret->dimensions.g_h;
+ pxy[4] = clip->g_x + caret->dimensions.g_x;
+ pxy[5] = clip->g_y + caret->dimensions.g_y;
+ pxy[6] = pxy[2];
+ pxy[7] = pxy[3];
+ vro_cpyfm(vh, S_ONLY, pxy, &caret->background, &screen);
+ // exit:
+ // TODO: do not alloc / free on every redraw...
+
+exit:
+ free(caret->background.fd_addr);
+ caret->background.fd_addr = NULL;
+}