try to emulate borders properly
[pcsx_rearmed.git] / frontend / plugin_lib.c
index 588f133..bdf09c7 100644 (file)
@@ -16,6 +16,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <pthread.h>
+#include <assert.h>
 
 #include "libpicofe/fonts.h"
 #include "libpicofe/input.h"
 
 #define HUD_HEIGHT 10
 
-int in_type1, in_type2;
-int in_a1[2] = { 127, 127 }, in_a2[2] = { 127, 127 };
+int in_type[8];
+int multitap1;
+int multitap2;
+int in_analog_left[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }};
+int in_analog_right[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }};
 int in_adev[2] = { -1, -1 }, in_adev_axis[2][2] = {{ 0, 1 }, { 0, 1 }};
 int in_adev_is_nublike[2];
-int in_keystate, in_state_gun;
+unsigned short in_keystate[8];
+int in_mouse[8][2];
+int in_state_gun;
 int in_enable_vibration;
 void *tsdev;
 void *pl_vout_buf;
@@ -113,9 +119,9 @@ static void print_fps(int h, int border)
                pl_rearmed_cbs.vsps_cur);
 }
 
-static void print_cpu_usage(int w, int h, int border)
+static void print_cpu_usage(int x, int h)
 {
-       hud_printf(pl_vout_buf, pl_vout_w, pl_vout_w - border - 28,
+       hud_printf(pl_vout_buf, pl_vout_w, x - 28,
                h - HUD_HEIGHT, "%3d", pl_rearmed_cbs.cpu_usage);
 }
 
@@ -149,13 +155,11 @@ static __attribute__((noinline)) void draw_active_chans(int vout_w, int vout_h)
        }
 }
 
-static void print_hud(int w, int h, int xborder)
+static void print_hud(int x, int w, int h)
 {
-       if (h < 16)
+       if (h < 192)
                return;
 
-       if (w < pl_vout_w)
-               xborder += (pl_vout_w - w) / 2;
        if (h > pl_vout_h)
                h = pl_vout_h;
 
@@ -163,12 +167,12 @@ static void print_hud(int w, int h, int xborder)
                draw_active_chans(w, h);
 
        if (hud_msg[0] != 0)
-               print_msg(h, xborder);
+               print_msg(h, x);
        else if (g_opts & OPT_SHOWFPS)
-               print_fps(h, xborder);
+               print_fps(h, x);
 
        if (g_opts & OPT_SHOWCPU)
-               print_cpu_usage(w, h, xborder);
+               print_cpu_usage(x + w, h);
 }
 
 /* update scaler target size according to user settings */
@@ -257,11 +261,7 @@ static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp)
        if (pl_rearmed_cbs.only_16bpp)
                vout_bpp = 16;
 
-       // don't use very low heights
-       if (vout_h < 192) {
-               buf_yoffset = (192 - vout_h) / 2;
-               vout_h = 192;
-       }
+       assert(vout_h >= 192);
 
        pl_vout_scale_w = pl_vout_scale_h = 1;
 #ifdef __ARM_NEON__
@@ -302,14 +302,15 @@ static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp)
        menu_notify_mode_change(pl_vout_w, pl_vout_h, pl_vout_bpp);
 }
 
-static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h)
+static void pl_vout_flip(const void *vram, int stride, int bgr24,
+       int x, int y, int w, int h, int dims_changed)
 {
-       static int doffs_old, clear_counter;
+       static int clear_counter;
        unsigned char *dest = pl_vout_buf;
        const unsigned short *src = vram;
        int dstride = pl_vout_w, h1 = h;
        int h_full = pl_vout_h - pl_vout_yoffset;
-       int doffs;
+       int xoffs = 0, doffs;
 
        pcnt_start(PCNT_BLIT);
 
@@ -323,12 +324,15 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h)
                goto out_hud;
        }
 
-       // borders
-       doffs = (dstride - w * pl_vout_scale_w) / 2 & ~1;
+       assert(x + w <= pl_vout_w);
+       assert(y + h <= pl_vout_h);
+
+       // offset
+       xoffs = x * pl_vout_scale_w;
+       doffs = xoffs + y * dstride;
 
-       if (doffs > doffs_old)
+       if (dims_changed)
                clear_counter = 2;
-       doffs_old = doffs;
 
        if (clear_counter > 0) {
                if (pl_plat_clear)
@@ -397,8 +401,6 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h)
 #endif
        else
        {
-               src = (void *)((uintptr_t)src & ~3); // align for the blitter
-
                for (; h1-- > 0; dest += dstride * 2, src += stride)
                {
                        bgr555_to_rgb565(dest, src, w * 2);
@@ -406,7 +408,7 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h)
        }
 
 out_hud:
-       print_hud(w * pl_vout_scale_w, h * pl_vout_scale_h, 0);
+       print_hud(xoffs, w * pl_vout_scale_w, (y + h) * pl_vout_scale_h);
 
 out:
        pcnt_end(PCNT_BLIT);
@@ -567,7 +569,7 @@ static void update_analog_nub_adjust(int *x_, int *y_)
 
 static void update_analogs(void)
 {
-       int *nubp[2] = { in_a1, in_a2 };
+       int *nubp[2] = { in_analog_left[0], in_analog_right[0] };
        int vals[2];
        int i, a, v, ret;
 
@@ -595,7 +597,6 @@ static void update_analogs(void)
                }
 
        }
-       //printf("%4d %4d %4d %4d\n", in_a1[0], in_a1[1], in_a2[0], in_a2[1]);
 }
 
 static void update_input(void)
@@ -604,7 +605,7 @@ static void update_input(void)
        unsigned int emu_act;
 
        in_update(actions);
-       if (in_type1 == PSE_PAD_TYPE_ANALOGPAD)
+       if (in_type[0] == PSE_PAD_TYPE_ANALOGJOY || in_type[0] == PSE_PAD_TYPE_ANALOGPAD)
                update_analogs();
        emu_act = actions[IN_BINDTYPE_EMU];
        in_state_gun = (emu_act & SACTION_GUN_MASK) >> SACTION_GUN_TRIGGER;
@@ -618,7 +619,7 @@ static void update_input(void)
        }
        emu_set_action(emu_act);
 
-       in_keystate = actions[IN_BINDTYPE_PLAYER12];
+       in_keystate[0] = actions[IN_BINDTYPE_PLAYER12];
 }
 #else /* MAEMO */
 extern void update_input(void);