/* ======================================= TGL IEL1 文件读取 ======================================= */ CR_API sFMT_DAT* load_tgl_iel1 ( __CR_IO__ iDATIN* datin, __CR_IN__ const sLOADER* param ) { leng_t pksz; leng_t unsz; void_t* data; void_t* temp; sFMT_DAT* rett; sIEL1_HDR head; /* 这个参数可能为空 */ if (datin == NULL) return (NULL); /* 读取 & 检查头部 */ if (!(CR_VCALL(datin)->geType(datin, &head, sIEL1_HDR))) return (NULL); if (head.magic != mk_tag4("IEL1")) return (NULL); /* 读取所有后续数据 */ temp = CR_VCALL(datin)->get(datin, &pksz, FALSE); if (temp == NULL) return (NULL); /* 分配目标数据缓冲 */ head.unsize = DWORD_LE(head.unsize); data = mem_malloc32(head.unsize); if (data == NULL) { mem_free(temp); return (NULL); } unsz = (leng_t)(head.unsize); pksz = uncompr_lzss(data, unsz, temp, pksz, 0); mem_free(temp); if (pksz != unsz) goto _failure; /* 返回读取的文件数据 */ rett = struct_new(sFMT_DAT); if (rett == NULL) goto _failure; CR_NOUSE(param); rett->type = CR_FMTZ_DEC; rett->unsz = unsz; rett->pksz = dati_get_size(datin); rett->data = data; rett->infor = "TGL LZSS Compressed file (IEL1)"; return (rett); _failure: mem_free(data); return (NULL); }
/* ======================================= SZ20 文件读取 ======================================= */ CR_API sFMT_DAT* load_ms_sz20 ( __CR_IO__ iDATIN* datin, __CR_IN__ const sLOADER* param ) { leng_t pksz; leng_t unsz; void_t* data; void_t* temp; sFMT_DAT* rett; sSZ20_HDR head; /* 这个参数可能为空 */ if (datin == NULL) return (NULL); /* 读取 & 检查头部 */ if (!(CR_VCALL(datin)->geType(datin, &head, sSZ20_HDR))) return (NULL); if (mem_cmp(head.tag, "SZ\x20\x88\xF0\x27\x33\xD1", 8) != 0) return (NULL); /* 读取所有后续数据 */ temp = CR_VCALL(datin)->get(datin, &pksz, FALSE); if (temp == NULL) return (NULL); /* 分配目标数据缓冲 */ head.unsize = DWORD_LE(head.unsize); data = mem_malloc32(head.unsize); if (data == NULL) { mem_free(temp); return (NULL); } unsz = (leng_t)(head.unsize); pksz = uncompr_lzss(data, unsz, temp, pksz, 0x20); mem_free(temp); if (pksz != unsz) goto _failure; /* 返回读取的文件数据 */ rett = struct_new(sFMT_DAT); if (rett == NULL) goto _failure; CR_NOUSE(param); rett->type = CR_FMTZ_DEC; rett->unsz = unsz; rett->pksz = dati_get_size(datin); rett->data = data; rett->infor = "Microsoft Compressed (SZ20) file"; return (rett); _failure: mem_free(data); return (NULL); }
/* ======================================= FALCOM AIA 文件读取 ======================================= */ CR_API sFMT_PRT* load_flc_aia ( __CR_IO__ iDATIN* datin, __CR_IN__ const sLOADER* param ) { leng_t back; leng_t size; byte_t* pals; byte_t* dats; uint_t ww, hh; int32u idx, cnt; /* ----------- */ fdist_t offs; sAIA_HDR head; sAIA_IDX* attr; sFMT_PRT* rett; iPIC_AIA* port; /* 这个参数可能为空 */ if (datin == NULL) return (NULL); /* 读取 & 检查头部 */ if (!(CR_VCALL(datin)->geType(datin, &head, sAIA_HDR))) return (NULL); if (head.magic != mk_tag4("AIA")) return (NULL); offs = DWORD_LE(head.idx_num); offs *= sizeof(int32u) * 4; if (head.version == CWORD_LE(0x140)) { offs += 32; pals = (byte_t*)(&head.img_size); dats = (byte_t*)(&head.scale1); mem_cpy(pals, dats, 4); pals = (byte_t*)(&head.ww2); mem_cpy(dats, pals, 4); head.ww2 = head.hh2 = 0; head.scale2 = 0.0f; } else if (head.version == CWORD_LE(0x150)) { offs += 40; } else { return (NULL); } /* 定位到已知数据区域 */ if (!CR_VCALL(datin)->seek(datin, offs, SEEK_SET)) return (NULL); /* 读取所有帧属性数据 */ head.img_num = DWORD_LE(head.img_num); attr = mem_talloc32(head.img_num, sAIA_IDX); if (attr == NULL) return (NULL); /* 准备好一些属性值 */ ww = WORD_LE(head.ww1); hh = WORD_LE(head.hh1); head.pal_num = DWORD_LE(head.pal_num); head.img_size = DWORD_LE(head.img_size); /* 逐个读入有效的帧属性 */ for (cnt = idx = 0; idx < head.img_num; idx++) { back = CR_VCALL(datin)->read(datin, &attr[cnt], sizeof(sAIA_IDX)); if (back != sizeof(sAIA_IDX)) goto _failure1; /* 跳过非法的废帧 */ attr[cnt].offset = DWORD_LE(attr[cnt].offset); if (attr[cnt].offset >= head.img_size) continue; attr[cnt].pal_idx = WORD_LE(attr[cnt].pal_idx); if ((int32u)attr[cnt].pal_idx >= head.pal_num) continue; /* 跳过废帧 (请自己定义帧序号) */ attr[cnt].x1 = WORD_LE(attr[cnt].x1); attr[cnt].y1 = WORD_LE(attr[cnt].y1); attr[cnt].x2 = WORD_LE(attr[cnt].x2); attr[cnt].y2 = WORD_LE(attr[cnt].y2); if ((uint_t)attr[cnt].x2 > ww || (uint_t)attr[cnt].y2 > hh || attr[cnt].x1 >= attr[cnt].x2 || attr[cnt].y1 >= attr[cnt].y2) continue; attr[cnt].x2 = attr[cnt].x2 - attr[cnt].x1; attr[cnt].y2 = attr[cnt].y2 - attr[cnt].y1; cnt += 1; } /* 空图片检查 */ if (cnt == 0) goto _failure1; /* 读取所有调色板数据 */ pals = (byte_t*)mem_calloc32(head.pal_num, 1024); if (pals == NULL) goto _failure1; size = (leng_t)head.pal_num; size *= 1024; if (CR_VCALL(datin)->read(datin, pals, size) != size) goto _failure2; for (back = 0; back < size; back += 4) pals[back + 3] = 0xFF; /* 读取所有图形数据 */ dats = (byte_t*)mem_malloc32(head.img_size); if (dats == NULL) goto _failure2; size = (leng_t)head.img_size; if (CR_VCALL(datin)->read(datin, dats, size) != size) goto _failure3; /* 生成多帧图片接口对象 */ port = struct_new(iPIC_AIA); if (port == NULL) goto _failure3; port->m_ww = ww; port->m_hh = hh; port->m_attr = attr; port->m_dats = dats; port->m_pals = (int32u*)pals; port->m_size = head.img_size; port->pics.__count__ = cnt; port->pics.__vptr__ = &s_pics_vtbl; /* 返回读取的文件数据 */ rett = struct_new(sFMT_PRT); if (rett == NULL) { iPIC_AIA_release((iPICTURE*)port); return (NULL); } CR_NOUSE(param); rett->type = CR_FMTZ_PRT; rett->port = (iPORT*)port; rett->more = "iPICTURE"; rett->infor = "FALCOM YS AIA Image File (*.AIA)"; return (rett); _failure3: mem_free(dats); _failure2: mem_free(pals); _failure1: mem_free(attr); return (NULL); }