OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / sheet.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/sheet.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/sheet.c
new file mode 100644 (file)
index 0000000..67799eb
--- /dev/null
@@ -0,0 +1,429 @@
+\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