From 883213696ffee371289e949b7e4e988d69521764 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Mon, 16 May 2016 11:04:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E9=AB=98=E7=AA=97=E5=8F=A3=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E9=80=9F=E5=BA=A6=EF=BC=882=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 26_day/bootpack.c | 8 ++++---- 26_day/console.c | 2 +- 26_day/sheet.c | 28 +++++++++++++++++++++------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/26_day/bootpack.c b/26_day/bootpack.c index d2aa307..591cf5e 100644 --- a/26_day/bootpack.c +++ b/26_day/bootpack.c @@ -43,7 +43,7 @@ void HariMain(void) 0, 0, 0, '_', 0, 0, 0, 0, 0, 0, 0, 0, 0, '|', 0, 0 }; int key_shift = 0, key_leds = (binfo->leds >> 4) & 7, keycmd_wait = -1; - int j, x, y, mmx = -1, mmy = -1; + int j, x, y, mmx = -1, mmy = -1, mmx2 = 0; struct SHEET *sht = 0, *key_win; init_gdtidt(); @@ -252,6 +252,7 @@ void HariMain(void) if (3 <= x && x < sht->bxsize - 3 && 3 <= y && y < 21) { mmx = mx; /*进入窗口移动模式*/ mmy = my; + mmx2 = sht->vx0; } if (sht->bxsize - 21 <= x && x < sht->bxsize - 5 && 5 <= y && y < 19) { /*点击“×”按钮*/ @@ -272,9 +273,8 @@ void HariMain(void) /*如果处于窗口移动模式*/ x = mx - mmx; /*计算鼠标的移动距离*/ y = my - mmy; - sheet_slide(sht, sht->vx0 + x, sht->vy0 + y); - mmx = mx; /*更新为移动后的坐标*/ - mmy = my; + sheet_slide(sht, (mmx2 + x + 2) & ~3, sht->vy0 + y); + mmy = my; /*更新到移动后的坐标*/ } } else { /*没有按下左键*/ diff --git a/26_day/console.c b/26_day/console.c index 7df9bea..1b39bc1 100644 --- a/26_day/console.c +++ b/26_day/console.c @@ -347,7 +347,7 @@ int *hrb_api(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int sht->flags |= 0x10; sheet_setbuf(sht, (char *) ebx + ds_base, esi, edi, eax); make_window8((char *) ebx + ds_base, esi, edi, (char *) ecx + ds_base, 0); - sheet_slide(sht, (shtctl->xsize - esi) / 2, (shtctl->ysize - edi) / 2); + sheet_slide(sht, ((shtctl->xsize - esi) / 2) & ~3, (shtctl->ysize - edi) / 2); sheet_updown(sht, shtctl->top); /*将窗口图层高度指定为当前鼠标所在图层的高度,鼠标移到上层*/ reg[7] = (int) sht; } else if (edx == 6) { diff --git a/26_day/sheet.c b/26_day/sheet.c index eb2a10b..8c822e0 100644 --- a/26_day/sheet.c +++ b/26_day/sheet.c @@ -56,7 +56,7 @@ void sheet_setbuf(struct SHEET *sht, unsigned char *buf, int xsize, int ysize, i void sheet_refreshmap(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0) { - int h, bx, by, vx, vy, bx0, by0, bx1, by1; + int h, bx, by, vx, vy, bx0, by0, bx1, by1, sid4, *p;; unsigned char *buf, sid, *map = ctl->map; struct SHEET *sht; if (vx0 < 0) { vx0 = 0; } @@ -76,12 +76,26 @@ void sheet_refreshmap(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, in if (bx1 > sht->bxsize) { bx1 = sht->bxsize; } if (by1 > sht->bysize) { by1 = sht->bysize; } if (sht->col_inv == -1) { - /*无透明色图层专用的高速版*/ - for (by = by0; by < by1; by++) { - vy = sht->vy0 + by; - for (bx = bx0; bx < bx1; bx++) { - vx = sht->vx0 + bx; - map[vy * ctl->xsize + vx] = sid; + if ((sht->vx0 & 3) == 0 && (bx0 & 3) == 0 && (bx1 & 3) == 0) { + /*无透明色图层专用的高速版(4字节型)*/ + bx1 = (bx1 - bx0) / 4; /* MOV次数*/ + sid4 = sid | sid << 8 | sid << 16 | sid << 24; + for (by = by0; by < by1; by++) { + vy = sht->vy0 + by; + vx = sht->vx0 + bx0; + p = (int *) &map[vy * ctl->xsize + vx]; + for (bx = 0; bx < bx1; bx++) { + p[bx] = sid4; + } + } + } else { + /*无透明色图层专用的高速版(1字节型)*/ + for (by = by0; by < by1; by++) { + vy = sht->vy0 + by; + for (bx = bx0; bx < bx1; bx++) { + vx = sht->vx0 + bx; + map[vy * ctl->xsize + vx] = sid; + } } } } else {