From e329b544fbe163cdf402276e4fdc2f4a402096b9 Mon Sep 17 00:00:00 2001 From: otya128 Date: Sun, 18 Dec 2016 10:49:14 +0900 Subject: [PATCH] Fix GPUTCHR clipping --- SMILEBASIC/graphic.d | 49 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/SMILEBASIC/graphic.d b/SMILEBASIC/graphic.d index 81d8286..46d2acf 100644 --- a/SMILEBASIC/graphic.d +++ b/SMILEBASIC/graphic.d @@ -1001,19 +1001,58 @@ class Graphic2 : Graphic { auto rect = petitcom.console.fontTable[c]; int[8 * 8] font; - int* grpfbuffer = cast(int*)petitcom.console.GRPF.surface.pixels; - for (int i = 0; i < 8; i ++) + auto wa = writeArea[petitcom.displaynum]; + int cx2 = wa.x + wa.w; + int cy2 = wa.y + wa.h; + int sx, sy, w = rect.w, h = rect.h; + //clipping + if (wa.x > x) { - for (int j = 0; j < 8; j++) + sx = wa.x - x; + w -= sx; + if (sx >= rect.w) + { + return; + } + } + if (wa.w + wa.x < x + sx + w) + { + w = w - ((x + sx + w) - (wa.w + wa.x)); + if (w < 1) + { + return; + } + } + if (wa.y > y) + { + sy = wa.y - y; + h -= sy; + if (sy >= rect.h) + { + return; + } + } + if (wa.h < h) + { + h = h - ((y + sy + h) - (wa.h + wa.y)); + if (h < 1) + { + return; + } + } + int* grpfbuffer = cast(int*)petitcom.console.GRPF.surface.pixels; + for (int i = sy; i < sy + h; i ++) + { + for (int j = sx; j < sx + w; j++) { font[i * 8 + j] = mulColor(grpfbuffer[rect.x + j + (rect.y + i) * GRPFWidth], color); } } if (scalex == 1 && scaley == 1) { - for (int iy = 0; iy < rect.h; iy++) + for (int iy = sy; iy < sy + h; iy++) { - for (int ix = 0; ix < rect.w; ix++) + for (int ix = sx; ix < sx + w; ix++) { if (font[iy * 8 + ix] >> 24/*is trans*/) {