--- /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