+++ /dev/null
-\r
-#include "core.h"\r
-\r
-UI_SheetControl *ctl;\r
-void (*sheet_refreshsub)(int vx0, int vy0, int vx1, int vy1, int h0, int h1);\r
-void (*sheet_refreshmap)(int vx0, int vy0, int vx1, int vy1, int h0);\r
-\r
-void init_sheets(void *vram, int xsize, int ysize, uchar bits)\r
-{\r
- int i;\r
-\r
- switch(bits){\r
- case 8:\r
- sheet_refreshsub = sheet_refreshsub8;\r
- sheet_refreshmap = sheet_refreshmap8;\r
- break;\r
- case 16:\r
- sheet_refreshsub = sheet_refreshsub16;\r
- sheet_refreshmap = sheet_refreshmap16;\r
- break;\r
- case 32:\r
- sheet_refreshsub = sheet_refreshsub32;\r
- sheet_refreshmap = sheet_refreshmap32;\r
- break;\r
- }\r
-\r
- ctl = &system.ui.draw.sht.ctrl;\r
- if(ctl == 0) goto err;\r
- ctl->map = (uint *)sys_memman_alloc(xsize * ysize * 4);\r
- if(ctl->map == 0){\r
- sys_memman_free(ctl, sizeof(UI_SheetControl));\r
- goto err;\r
- }\r
- ctl->vram = vram;\r
- ctl->xsize = xsize;\r
- ctl->ysize = ysize;\r
- ctl->top = -1;\r
- for(i = 0;i < MAX_SHEETS;i++){\r
- ctl->sheets0[i].flags = initialized;\r
- }\r
-err:\r
- return;\r
-}\r
-\r
-UI_Sheet *sheet_alloc(void)\r
-{\r
- UI_Sheet *sht;\r
- int i;\r
-\r
- for(i = 0;i < MAX_SHEETS;i++){\r
- if(ctl->sheets0[i].flags == initialized){\r
- sht = &ctl->sheets0[i];\r
- sht->flags = allocated;\r
- sht->height = -1;\r
- return sht;\r
- }\r
- }\r
- return 0;\r
-}\r
-\r
-void sheet_setbuf(UI_Sheet *sht, void *buf,int xsize, int ysize, uint col_inv)\r
-{\r
- sht->buf = buf;\r
- sht->bxsize = xsize;\r
- sht->bysize = ysize;\r
- sht->col_inv = col_inv;\r
- return;\r
-}\r
-/*\r
-void sheet_updown(UI_Sheet *sht, int height)\r
-{\r
- int h, old = sht->height;\r
-\r
- if(height > ctl->top + 1) height = ctl->top + 1;\r
- if (height < -1) height = -1;\r
- sht->height = height;\r
-\r
- if (old > height){\r
- if (height >= 0){\r
- for (h = old; h > height; h--){\r
- ctl->sheets[h] = ctl->sheets[h - 1];\r
- ctl->sheets[h]->height = h;\r
- }\r
- ctl->sheets[height] = sht;\r
- sheet_refreshmap(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height + 1);\r
- sheet_refreshsub(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height + 1, old);\r
- } else {\r
- if(ctl->top > old){\r
- for(h = old; h < ctl->top; h++){\r
- ctl->sheets[h] = ctl->sheets[h + 1];\r
- ctl->sheets[h]->height = h;\r
- }\r
- }\r
- ctl->top--;\r
- sheet_refreshmap(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0);\r
- sheet_refreshsub(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0, old - 1);\r
- }\r
- } else if(old < height) {\r
- if(old >= 0){\r
- for(h = old; h < height; h++){\r
- ctl->sheets[h] = ctl->sheets[h + 1];\r
- ctl->sheets[h]->height = h;\r
- }\r
- ctl->sheets[height]= sht;\r
- } else {\r
- for(h = ctl->top; h >= height; h--){\r
- ctl->sheets[h + 1] = ctl->sheets[h];\r
- ctl->sheets[h + 1]->height = h; \r
- }\r
- ctl->sheets[height] = sht;\r
- ctl->top++;\r
- }\r
- sheet_refreshmap(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height);\r
- sheet_refreshsub(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height, height);\r
- }\r
-\r
- return;\r
-}\r
-*/\r
-void sheet_updown(UI_Sheet *sht, int height)\r
-{\r
- int i, old = sht->height; //\95Ï\89»\82³\82¹\82é\83V\81[\83g\82Ì\8c³\82Ì\8d\82\82³\82ð\95Û\91¶\81B\r
-\r
- if(height > ctl->top + 1) height = ctl->top + 1; //\90Ý\92è\82µ\82æ\82¤\82Æ\82µ\82Ä\82¢\82é\8d\82\82³\82ð\81A\82à\82Á\82Æ\82à\8d\82\82¢\82à\82Ì\82Ì\88ê\82Â\8fã\82É\90§\8cÀ\81B\r
- if (height < -1) height = -1; //\94ñ\95\\8e¦\82Í\83}\83C\83i\83X1\82É\93\9d\88ê\81B\r
-\r
- if(old == -1 && height >= 0){ //\94ñ\95\\8e¦\82©\82ç\95\\8e¦\81B\8fã\82É\82¸\82ç\82·\81B\r
- for(i = ctl->top; i >= height; i--){\r
- ctl->sheets[i + 1] = ctl->sheets[i];\r
- ctl->sheets[i + 1]->height = i + 1;\r
- }\r
- ctl->sheets[height] = sht;\r
- ctl->sheets[height]->height = height;\r
- ctl->top++;\r
- sheet_refreshmap(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height);\r
- sheet_refreshsub(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height, height);\r
- } else if(old >= 0 && height == -1){ //\95\\8e¦\82©\82ç\94ñ\95\\8e¦\81B\89º\82É\82¸\82ç\82·\81B\r
- for(i = old; i <= (ctl->top - 1); i++){\r
- ctl->sheets[i] = ctl->sheets[i + 1];\r
- ctl->sheets[i]->height = i;\r
- }\r
- sht->height = -1;\r
- ctl->top--;\r
- sheet_refreshmap(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0);\r
- sheet_refreshsub(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, 0, old - 1);\r
- } else if(old < height){ //\95\\8e¦\92\86\82Ì\82ð\8fã\82É\82¸\82ç\82·\81B\8aÔ\82Í\89º\82É\82¸\82ç\82·\81B\r
- for(i = old; i < height; i++){\r
- ctl->sheets[i] = ctl->sheets[i + 1];\r
- ctl->sheets[i]->height = i;\r
- }\r
- ctl->sheets[height] = sht;\r
- ctl->sheets[height]->height = height;\r
- sheet_refreshmap(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height);\r
- sheet_refreshsub(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height, height);\r
- } else if(old > height){ //\95\\8e¦\92\86\82Ì\82ð\89º\82É\82¸\82ç\82·\81B\8aÔ\82Í\8fã\82É\82¸\82ç\82·\81B\r
- for(i = old; i > height; i--){\r
- ctl->sheets[i] = ctl->sheets[i - 1];\r
- ctl->sheets[i]->height = i;\r
- }\r
- ctl->sheets[height] = sht;\r
- ctl->sheets[height]->height = height;\r
- sheet_refreshmap(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, old);\r
- sheet_refreshsub(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, height, old);\r
- }\r
- return;\r
-}\r
-\r
-void sheet_refresh(UI_Sheet *sht, int bx0, int by0, int bx1, int by1)\r
-{\r
- if(sht->height >= 0){\r
- sheet_refreshsub(sht->vx0 + bx0, sht->vy0 + by0, sht->vx0 + bx1, sht->vy0 + by1 , sht->height, sht->height);\r
- }\r
-\r
- return;\r
-}\r
-\r
-void sheet_refresh_full_alpha(UI_Sheet *sht)\r
-{\r
- sheet_refreshmap(sht->vx0, sht->vy0, sht->vx0 + sht->bxsize, sht->vy0 + sht->bysize, sht->height);\r
- sheet_refresh_full(sht);\r
-\r
- return;\r
-}\r
-\r
-void sheet_refresh_full(UI_Sheet *sht)\r
-{\r
- sheet_refresh(sht, 0, 0, sht->bxsize, sht->bysize);\r
-\r
- return;\r
-}\r
-\r
-void sheet_slide(UI_Sheet *sht, int vx0, int vy0)\r
-{\r
- int old_vx0 = sht->vx0, old_vy0 = sht->vy0;\r
-\r
- sht->vx0 = vx0;\r
- sht->vy0 = vy0;\r
- if(sht->height >= 0) {\r
- sheet_refreshmap(old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize,0);\r
- sheet_refreshmap(vx0, vy0, vx0 + sht->bxsize, vy0 + sht->bysize,sht->height);\r
- sheet_refreshsub(old_vx0, old_vy0, old_vx0 + sht->bxsize, old_vy0 + sht->bysize,0,sht->height - 1);\r
- sheet_refreshsub(vx0, vy0, vx0 + sht->bxsize, vy0 + sht->bysize,sht->height, sht->height);\r
- }\r
-\r
- return;\r
-}\r
-\r
-void sheet_free(UI_Sheet *sht)\r
-{\r
- if(sht->height >= 0) sheet_updown(sht, -1);\r
- sht->flags = initialized;\r
-\r
- return;\r
-}\r
-\r
-void sheet_refreshsub32(int vx0, int vy0, int vx1, int vy1, int h0, int h1)\r
-{\r
- int h, bx, by, vx, vy, bx0, by0, bx1, by1;\r
- uint *map = ctl->map,sid;\r
- uint *buf, *vram = (uint *)ctl->vram;\r
- UI_Sheet *sht;\r
-\r
- if(vx0 < 0) vx0 = 0;\r
- if(vy0 < 0) vy0 = 0;\r
- if(vx1 > ctl->xsize) vx1 = ctl->xsize;\r
- if(vy1 > ctl->ysize) vy1 = ctl->ysize;\r
- for(h = 0; h <= ctl->top; h++){\r
- sht = ctl->sheets[h];\r
- buf = sht->buf;\r
- sid = sht - ctl->sheets0;\r
- bx0 = vx0 - sht->vx0;\r
- by0 = vy0 - sht->vy0;\r
- bx1 = vx1 - sht->vx0;\r
- by1 = vy1 - sht->vy0;\r
- if(bx0 < 0) bx0 = 0;\r
- if(by0 < 0) by0 = 0;\r
- if(bx1 > sht->bxsize) bx1 = sht->bxsize;\r
- if(by1 > sht->bysize) by1 = sht->bysize;\r
- for(by = by0; by < by1; by++){\r
- vy = sht->vy0 + by;\r
- for(bx = bx0; bx < bx1; bx++){\r
- vx = sht->vx0 + bx;\r
- if(map[vy * ctl->xsize + vx] == sid) vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx];\r
- }\r
- }\r
- }\r
-\r
- return;\r
-}\r
-\r
-void sheet_refreshsub16(int vx0, int vy0, int vx1, int vy1, int h0, int h1)\r
-{\r
- int h, bx, by, vx, vy, bx0, by0, bx1, by1;\r
- uint *map = ctl->map,sid;\r
- ushort *buf, *vram = (ushort *)ctl->vram;\r
- UI_Sheet *sht;\r
-\r
- if(vx0 < 0) vx0 = 0;\r
- if(vy0 < 0) vy0 = 0;\r
- if(vx1 > ctl->xsize) vx1 = ctl->xsize;\r
- if(vy1 > ctl->ysize) vy1 = ctl->ysize;\r
- for(h = 0; h <= ctl->top; h++){\r
- sht = ctl->sheets[h];\r
- buf = sht->buf;\r
- sid = sht - ctl->sheets0;\r
- bx0 = vx0 - sht->vx0;\r
- by0 = vy0 - sht->vy0;\r
- bx1 = vx1 - sht->vx0;\r
- by1 = vy1 - sht->vy0;\r
- if(bx0 < 0) bx0 = 0;\r
- if(by0 < 0) by0 = 0;\r
- if(bx1 > sht->bxsize) bx1 = sht->bxsize;\r
- if(by1 > sht->bysize) by1 = sht->bysize;\r
- for(by = by0; by < by1; by++){\r
- vy = sht->vy0 + by;\r
- for(bx = bx0; bx < bx1; bx++){\r
- vx = sht->vx0 + bx;\r
- if(map[vy * ctl->xsize + vx] == sid) vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx];\r
- }\r
- }\r
- }\r
-\r
- return;\r
-}\r
-\r
-void sheet_refreshsub8(int vx0, int vy0, int vx1, int vy1, int h0, int h1)\r
-{\r
- int h, bx, by, vx, vy, bx0, by0, bx1, by1;\r
- uint *map = ctl->map,sid;\r
- uchar *buf, *vram = (uchar *)ctl->vram;\r
- UI_Sheet *sht;\r
-\r
- if(vx0 < 0) vx0 = 0;\r
- if(vy0 < 0) vy0 = 0;\r
- if(vx1 > ctl->xsize) vx1 = ctl->xsize;\r
- if(vy1 > ctl->ysize) vy1 = ctl->ysize;\r
- for(h = 0; h <= ctl->top; h++){\r
- sht = ctl->sheets[h];\r
- buf = sht->buf;\r
- sid = sht - ctl->sheets0;\r
- bx0 = vx0 - sht->vx0;\r
- by0 = vy0 - sht->vy0;\r
- bx1 = vx1 - sht->vx0;\r
- by1 = vy1 - sht->vy0;\r
- if(bx0 < 0) bx0 = 0;\r
- if(by0 < 0) by0 = 0;\r
- if(bx1 > sht->bxsize) bx1 = sht->bxsize;\r
- if(by1 > sht->bysize) by1 = sht->bysize;\r
- for(by = by0; by < by1; by++){\r
- vy = sht->vy0 + by;\r
- for(bx = bx0; bx < bx1; bx++){\r
- vx = sht->vx0 + bx;\r
- if(map[vy * ctl->xsize + vx] == sid) vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx];\r
- }\r
- }\r
- }\r
-\r
- return;\r
-}\r
-\r
-void sheet_refreshmap32(int vx0, int vy0, int vx1, int vy1, int h0)\r
-{\r
- int h, bx, by, vx, vy, bx0, by0, bx1, by1;\r
- uint sid, *map = ctl->map;\r
- uint *buf;\r
- UI_Sheet *sht;\r
-\r
- if(vx0 < 0) vx0 = 0;\r
- if(vy0 < 0) vy0 = 0;\r
- if(vx1 > ctl->xsize) vx1 = ctl->xsize;\r
- if(vy1 > ctl->ysize) vy1 = ctl->ysize;\r
- for(h = 0; h <= ctl->top; h++){\r
- sht = ctl->sheets[h];\r
- sid = sht - ctl->sheets0;\r
- buf = sht->buf;\r
- bx0 = vx0 - sht->vx0;\r
- by0 = vy0 - sht->vy0;\r
- bx1 = vx1 - sht->vx0;\r
- by1 = vy1 - sht->vy0;\r
- if(bx0 < 0) bx0 = 0;\r
- if(by0 < 0) by0 = 0;\r
- if(bx1 > sht->bxsize) bx1 = sht->bxsize;\r
- if(by1 > sht->bysize) by1 = sht->bysize;\r
- for(by = by0; by < by1; by++){\r
- vy = sht->vy0 + by;\r
- for(bx = bx0; bx < bx1; bx++){\r
- vx = sht->vx0 + bx;\r
- if(buf[by * sht->bxsize + bx] != INV_COL32) map[vy * ctl->xsize + vx] = sid;\r
- }\r
- }\r
- }\r
-\r
- return;\r
-}\r
-\r
-void sheet_refreshmap16(int vx0, int vy0, int vx1, int vy1, int h0)\r
-{\r
- int h, bx, by, vx, vy, bx0, by0, bx1, by1;\r
- uint sid, *map = ctl->map;\r
- ushort *buf;\r
- UI_Sheet *sht;\r
-\r
- if(vx0 < 0) vx0 = 0;\r
- if(vy0 < 0) vy0 = 0;\r
- if(vx1 > ctl->xsize) vx1 = ctl->xsize;\r
- if(vy1 > ctl->ysize) vy1 = ctl->ysize;\r
- for(h = 0; h <= ctl->top; h++){\r
- sht = ctl->sheets[h];\r
- sid = sht - ctl->sheets0;\r
- buf = sht->buf;\r
- bx0 = vx0 - sht->vx0;\r
- by0 = vy0 - sht->vy0;\r
- bx1 = vx1 - sht->vx0;\r
- by1 = vy1 - sht->vy0;\r
- if(bx0 < 0) bx0 = 0;\r
- if(by0 < 0) by0 = 0;\r
- if(bx1 > sht->bxsize) bx1 = sht->bxsize;\r
- if(by1 > sht->bysize) by1 = sht->bysize;\r
- for(by = by0; by < by1; by++){\r
- vy = sht->vy0 + by;\r
- for(bx = bx0; bx < bx1; bx++){\r
- vx = sht->vx0 + bx;\r
- if(buf[by * sht->bxsize + bx] != INV_COL16) map[vy * ctl->xsize + vx] = sid;\r
- }\r
- }\r
- }\r
-\r
- return;\r
-}\r
-\r
-void sheet_refreshmap8(int vx0, int vy0, int vx1, int vy1, int h0)\r
-{\r
- int h, bx, by, vx, vy, bx0, by0, bx1, by1;\r
- uint sid, *map = ctl->map;\r
- uchar *buf;\r
- UI_Sheet *sht;\r
-\r
- if(vx0 < 0) vx0 = 0;\r
- if(vy0 < 0) vy0 = 0;\r
- if(vx1 > ctl->xsize) vx1 = ctl->xsize;\r
- if(vy1 > ctl->ysize) vy1 = ctl->ysize;\r
- for(h = 0; h <= ctl->top; h++){\r
- sht = ctl->sheets[h];\r
- sid = sht - ctl->sheets0;\r
- buf = sht->buf;\r
- bx0 = vx0 - sht->vx0;\r
- by0 = vy0 - sht->vy0;\r
- bx1 = vx1 - sht->vx0;\r
- by1 = vy1 - sht->vy0;\r
- if(bx0 < 0) bx0 = 0;\r
- if(by0 < 0) by0 = 0;\r
- if(bx1 > sht->bxsize) bx1 = sht->bxsize;\r
- if(by1 > sht->bysize) by1 = sht->bysize;\r
- for(by = by0; by < by1; by++){\r
- vy = sht->vy0 + by;\r
- for(bx = bx0; bx < bx1; bx++){\r
- vx = sht->vx0 + bx;\r
- if(buf[by * sht->bxsize + bx] != INV_COL8) map[vy * ctl->xsize + vx] = sid;\r
- }\r
- }\r
- }\r
-\r
- return;\r
-}\r
-\r
-int sheet_get_topheight(void)\r
-{\r
- return ctl->top - 1;\r
-}\r