Exemple #1
0
/*
=======================================
    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);
}
Exemple #2
0
/*
=======================================
    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);
}
Exemple #3
0
/*
=======================================
    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);
}