예제 #1
0
    /* ==================================== */
    bool put (const T* data, bool grow = true)
    {
        T*      temp;
        size_t  ii, tl = m_tail + 1;

        if (tl >= m_size)
            tl = 0;
        if (tl == m_head) {
            if (grow) {
                temp = mem_talloc(m_size * 2, T);
                if (temp == NULL)
                    return (false);
                for (tl = 0, ii = m_head; tl < m_size - 1; tl++) {
                    mem_cpy(&temp[tl], &m_list[ii++], sizeof(T));
                    if (ii >= m_size)
                        ii = 0;
                }
                mem_free(m_list);
                m_list = temp;
                m_head = 0;
                m_tail = m_size - 1;
                m_size *= 2;
            }
            else {
                return (false);
            }
        }
        mem_cpy(&m_list[m_tail++], data, sizeof(T));
        if (m_tail >= m_size)
            m_tail = 0;
        return (true);
    }
예제 #2
0
 /* ================== */
 bool init (size_t count)
 {
     m_list = mem_talloc(count + 1, T);
     if (m_list == NULL)
         return (false);
     m_head = 0;
     m_tail = 0;
     m_size = count + 1;
     return (true);
 }
예제 #3
0
/*
---------------------------------------
    生成工作单元组
---------------------------------------
*/
static sQstWork*
qst_wrk_create (
  __CR_IN__ uint_t  count
    )
{
    sQstWork*   work;

    /* 工作编号要这里填入 */
    if (count > QST_MAX_CLIENT)
        return (NULL);
    work = mem_talloc(count, sQstWork);
    if (work == NULL)
        return (NULL);
    for (uint_t idx = 0; idx < count; idx++) {
        work[idx].id = idx;
        work[idx].cnt = count;
        work[idx].over = TRUE;
        work[idx].name = NULL;
        work[idx].netw = NULL;
        work[idx].self = work;
    }
    return (work);
}
예제 #4
0
/*
=======================================
    TGL IPAC 文件读取
=======================================
*/
CR_API sFMT_PRT*
load_tgl_ipac (
  __CR_IO__ iDATIN*         datin,
  __CR_IN__ const sLOADER*  param
    )
{
    int16u      idx;
    int16u      cnt;
    int32u      offs;
    int32u      size;
    sFMT_PRT*   rett;
    sIPAC_HDR   head;
    iPAK_IPAC*  port;
    sPAK_FILE*  list;
    ansi_t      str[17];

    /* 必须使用自己私有的读取接口 */
    datin = create_file_inX(param);
    if (datin == NULL)
        return (NULL);

    /* 读取 & 检查头部 */
    if (!(CR_VCALL(datin)->geType(datin, &head, sIPAC_HDR)))
        goto _failure1;
    if (head.magic != mk_tag4("IPAC"))
        goto _failure1;

    /* 分配子文件属性表 */
    cnt = WORD_LE(head.count);
    if (cnt != 0) {
        list = mem_talloc(cnt, sPAK_FILE);
        if (list == NULL)
            goto _failure1;
        str[16] = CR_AC(NIL);
        mem_tzero(list, cnt, sPAK_FILE);
    }
    else {
        list = NULL;    /* 支持空的包文件 */
    }

    /* 加载文件信息表 */
    for (idx = 0; idx < cnt; idx++)
    {
        /* 读取文件名不保证\0结尾 */
        if (CR_VCALL(datin)->read(datin, str, 16) != 16)
            goto _failure2;

        /* 文件的包内偏移和大小 */
        if (!CR_VCALL(datin)->getd_le(datin, &offs))
            goto _failure2;
        if (!CR_VCALL(datin)->getd_le(datin, &size))
            goto _failure2;

        /* 文件名统一使用 UTF-8 编码 */
        list[idx].name = local_to_utf8(param->page, str);
        if (list[idx].name == NULL)
            goto _failure2;

        /* 设置公用文件属性 */
        list[idx].skip = sizeof(sPAK_FILE);
        list[idx].attr = 0;
        list[idx].offs = offs;
        list[idx].pack = size;
        list[idx].size = size;
        list[idx].memo = "Store";
    }

    /* 生成读包接口对象 */
    port = struct_new(iPAK_IPAC);
    if (port == NULL)
        goto _failure2;
    port->m_cnt = cnt;
    port->m_file = datin;
    port->pack.__filelst__ = list;
    port->pack.__vptr__ = &s_pack_vtbl;
    if (!pack_init_list((iPACKAGE*)port, TRUE)) {
        mem_free(port);
        goto _failure2;
    }

    /* 返回读取的文件数据 */
    rett = struct_new(sFMT_PRT);
    if (rett == NULL) {
        iPAK_IPAC_release((iPACKAGE*)port);
        return (NULL);
    }
    rett->type = CR_FMTZ_PRT;
    rett->port = (iPORT*)port;
    rett->more = "iPACKAGE";
    rett->infor = "TGL IPAC Archive (IPAC)";
    return (rett);

_failure2:
    if (list != NULL) {
        for (cnt = 0; cnt < idx; cnt++) {
            TRY_FREE(list[cnt].find);
            mem_free(list[cnt].name);
        }
        mem_free(list);
    }
_failure1:
    CR_VCALL(datin)->release(datin);
    return (NULL);
}
예제 #5
0
/*
=======================================
    生成连接索引
=======================================
*/
CR_API uint_t
gen_interlock (
  __CR_OT__ int16u**    pibuf,
  __CR_OT__ leng_t*     inum,
  __CR_IO__ uint_t*     level,
  __CR_IN__ uint_t      tile_size
    )
{
    int16u* ti;
    uint_t  step, point, nibuf;
    uint_t  sz, xx, zz, ii, lv;

    /* 参数过滤 */
    if ((tile_size < 2) || (tile_size > 256))
        return (0);

    /* 计算最多的等级 */
    lv = 1;
    point = tile_size - 1;
    if (point % 2 == 0) {
        while (point % 2 == 0) {
            point /= 2;
            lv++;
        }
        if (level != NULL) {
            if (*level > lv || *level == 0)
                *level = lv;
            else
                lv = *level;
        }
    }
    else {
        if (level != NULL)
            *level = lv;
    }

    /* 计算索引缓冲的个数 */
    nibuf = (lv - 1) * 9 + 1;
    if (pibuf == NULL || inum == NULL)
        return (nibuf);
    point = 0;

    /* full detail */
    step = 1;
    for (ii = 0; ii < lv; ii++) {
        inum[point] = ((tile_size - 1) / step) *
                      ((tile_size - 1) / step) * 6;
        pibuf[point] = mem_talloc(inum[point], int16u);
        if (pibuf[point] == NULL)
            goto _failure;
        ti = pibuf[point];
        for (zz = 0; zz < tile_size - 1; zz += step)
        for (xx = 0; xx < tile_size - 1; xx += step) {
            ti[0] = (int16u)(zz * tile_size + xx);
            ti[1] = (int16u)((zz + step) * tile_size + xx);
            ti[2] = (int16u)((zz + step) * tile_size + xx + step);
            ti[3] = (int16u)(zz * tile_size + xx);
            ti[4] = (int16u)((zz + step) * tile_size + xx + step);
            ti[5] = (int16u)(zz * tile_size + xx + step);
            ti += 6;
        }
        point++;
        step *= 2;
    }

    if (lv == 1)
        return (nibuf);

    /* joint up */
    step = 1;
    for (ii = 1; ii < lv; ii++) {
        step *= 2;
        inum[point] = ((tile_size - 1) / step - 1) *
                      ((tile_size - 1) / step) * 6 +
                      ((tile_size - 1) / step) * 9;
        pibuf[point] = mem_talloc(inum[point], int16u);
        if (pibuf[point] == NULL)
            goto _failure;
        ti = pibuf[point];
        sz = tile_size - step - 1;
        for (xx = 0; xx < tile_size - 1; xx += step) {
            ti[0] = (int16u)(sz * tile_size + xx);
            ti[1] = (int16u)((sz + step) * tile_size + xx);
            ti[2] = (int16u)((sz + step) * tile_size + xx + step / 2);
            ti[3] = (int16u)(sz * tile_size + xx);
            ti[4] = (int16u)((sz + step) * tile_size + xx + step / 2);
            ti[5] = (int16u)((sz + step) * tile_size + xx + step);
            ti[6] = (int16u)(sz * tile_size + xx);
            ti[7] = (int16u)((sz + step) * tile_size + xx + step);
            ti[8] = (int16u)(sz * tile_size + xx + step);
            ti += 9;
        }
        for (zz = 0; zz < tile_size - step - 1; zz += step)
        for (xx = 0; xx < tile_size - 1;        xx += step) {
            ti[0] = (int16u)(zz * tile_size + xx);
            ti[1] = (int16u)((zz + step) * tile_size + xx);
            ti[2] = (int16u)((zz + step) * tile_size + xx + step);
            ti[3] = (int16u)(zz * tile_size + xx);
            ti[4] = (int16u)((zz + step) * tile_size + xx + step);
            ti[5] = (int16u)(zz * tile_size + xx + step);
            ti += 6;
        }
        point++;
    }

    /* joint down */
    step = 1;
    for (ii = 1; ii < lv; ii++) {
        step *= 2;
        inum[point] = ((tile_size - 1) / step - 1) *
                      ((tile_size - 1) / step) * 6 +
                      ((tile_size - 1) / step) * 9;
        pibuf[point] = mem_talloc(inum[point], int16u);
        if (pibuf[point] == NULL)
            goto _failure;
        ti = pibuf[point];
        for (xx = 0; xx < tile_size - 1; xx += step) {
            ti[0] = (int16u)(xx);
            ti[1] = (int16u)(step * tile_size + xx);
            ti[2] = (int16u)(step * tile_size + xx + step);
            ti[3] = (int16u)(xx);
            ti[4] = (int16u)(step * tile_size + xx + step);
            ti[5] = (int16u)(xx + step / 2);
            ti[6] = (int16u)(xx + step / 2);
            ti[7] = (int16u)(step * tile_size + xx + step);
            ti[8] = (int16u)(xx + step);
            ti += 9;
        }
        for (zz = step; zz < tile_size - 1; zz += step)
        for (xx = 0;    xx < tile_size - 1; xx += step) {
            ti[0] = (int16u)(zz * tile_size + xx);
            ti[1] = (int16u)((zz + step) * tile_size + xx);
            ti[2] = (int16u)((zz + step) * tile_size + xx + step);
            ti[3] = (int16u)(zz * tile_size + xx);
            ti[4] = (int16u)((zz + step) * tile_size + xx + step);
            ti[5] = (int16u)(zz * tile_size + xx + step);
            ti += 6;
        }
        point++;
    }

    /* joint left */
    step = 1;
    for (ii = 1; ii < lv; ii++) {
        step *= 2;
        inum[point] = ((tile_size - 1) / step - 1) *
                      ((tile_size - 1) / step) * 6 +
                      ((tile_size - 1) / step) * 9;
        pibuf[point] = mem_talloc(inum[point], int16u);
        if (pibuf[point] == NULL)
            goto _failure;
        ti = pibuf[point];
        sz = tile_size - step - 1;
        for (zz = 0; zz < tile_size - 1; zz += step) {
            ti[0] = (int16u)(zz * tile_size + sz);
            ti[1] = (int16u)((zz + step) * tile_size + sz);
            ti[2] = (int16u)((zz + step) * tile_size + sz + step);
            ti[3] = (int16u)(zz * tile_size + sz);
            ti[4] = (int16u)((zz + step) * tile_size + sz + step);
            ti[5] = (int16u)((zz + step / 2) * tile_size + sz + step);
            ti[6] = (int16u)(zz * tile_size + sz);
            ti[7] = (int16u)((zz + step / 2) * tile_size + sz + step);
            ti[8] = (int16u)(zz * tile_size + sz + step);
            ti += 9;
        }
        for (zz = 0; zz < tile_size - 1;        zz += step)
        for (xx = 0; xx < tile_size - step - 1; xx += step) {
            ti[0] = (int16u)(zz * tile_size + xx);
            ti[1] = (int16u)((zz + step) * tile_size + xx);
            ti[2] = (int16u)((zz + step) * tile_size + xx + step);
            ti[3] = (int16u)(zz * tile_size + xx);
            ti[4] = (int16u)((zz + step) * tile_size + xx + step);
            ti[5] = (int16u)(zz * tile_size + xx + step);
            ti += 6;
        }
        point++;
    }

    /* joint right */
    step = 1;
    for (ii = 1; ii < lv; ii++) {
        step *= 2;
        inum[point] = ((tile_size - 1) / step - 1) *
                      ((tile_size - 1) / step) * 6 +
                      ((tile_size - 1) / step) * 9;
        pibuf[point] = mem_talloc(inum[point], int16u);
        if (pibuf[point] == NULL)
            goto _failure;
        ti = pibuf[point];
        for (zz = 0; zz < tile_size - 1; zz += step) {
            ti[0] = (int16u)((zz + step) * tile_size + step);
            ti[1] = (int16u)((zz + step / 2) * tile_size);
            ti[2] = (int16u)((zz + step) * tile_size);
            ti[3] = (int16u)((zz + step) * tile_size + step);
            ti[4] = (int16u)(zz * tile_size);
            ti[5] = (int16u)((zz + step / 2) * tile_size);
            ti[6] = (int16u)((zz + step) * tile_size + step);
            ti[7] = (int16u)(zz * tile_size + step);
            ti[8] = (int16u)(zz * tile_size);
            ti += 9;
        }
        for (zz = 0;    zz < tile_size - 1; zz += step)
        for (xx = step; xx < tile_size - 1; xx += step) {
            ti[0] = (int16u)(zz * tile_size + xx);
            ti[1] = (int16u)((zz + step) * tile_size + xx);
            ti[2] = (int16u)((zz + step) * tile_size + xx + step);
            ti[3] = (int16u)(zz * tile_size + xx);
            ti[4] = (int16u)((zz + step) * tile_size + xx + step);
            ti[5] = (int16u)(zz * tile_size + xx + step);
            ti += 6;
        }
        point++;
    }

    /* joint up left */
    step = 1;
    for (ii = 1; ii < lv; ii++) {
        step *= 2;
        inum[point] = ((tile_size - 1) / step - 1) *
                      ((tile_size - 1) / step - 1) * 6 +
                      ((tile_size - 1) / step - 1) * 2 * 9 + 12;
        pibuf[point] = mem_talloc(inum[point], int16u);
        if (pibuf[point] == NULL)
            goto _failure;
        ti = pibuf[point];
        sz = tile_size - step - 1;
        for (xx = 0; xx < tile_size - step - 1; xx += step) {
            ti[0] = (int16u)(sz * tile_size + xx);
            ti[1] = (int16u)((sz + step) * tile_size + xx);
            ti[2] = (int16u)((sz + step) * tile_size + xx + step / 2);
            ti[3] = (int16u)(sz * tile_size + xx);
            ti[4] = (int16u)((sz + step) * tile_size + xx + step / 2);
            ti[5] = (int16u)((sz + step) * tile_size + xx + step);
            ti[6] = (int16u)(sz * tile_size + xx);
            ti[7] = (int16u)((sz + step) * tile_size + xx + step);
            ti[8] = (int16u)(sz * tile_size + xx + step);
            ti += 9;
        }
        for (zz = 0; zz < tile_size - step - 1; zz += step) {
            ti[0] = (int16u)(zz * tile_size + sz);
            ti[1] = (int16u)((zz + step) * tile_size + sz);
            ti[2] = (int16u)((zz + step) * tile_size + sz + step);
            ti[3] = (int16u)(zz * tile_size + sz);
            ti[4] = (int16u)((zz + step) * tile_size + sz + step);
            ti[5] = (int16u)((zz + step / 2) * tile_size + sz + step);
            ti[6] = (int16u)(zz * tile_size + sz);
            ti[7] = (int16u)((zz + step / 2) * tile_size + sz + step);
            ti[8] = (int16u)(zz * tile_size + sz + step);
            ti += 9;
        }
        ti[0]  = (int16u)(sz * tile_size + sz);
        ti[1]  = (int16u)((sz + step) * tile_size + sz);
        ti[2]  = (int16u)((sz + step) * tile_size + sz + step / 2);
        ti[3]  = (int16u)(sz * tile_size + sz);
        ti[4]  = (int16u)((sz + step) * tile_size + sz + step / 2);
        ti[5]  = (int16u)((sz + step) * tile_size + sz + step);
        ti[6]  = (int16u)(sz * tile_size + sz);
        ti[7]  = (int16u)((sz + step) * tile_size + sz + step);
        ti[8]  = (int16u)((sz + step / 2) * tile_size + sz + step);
        ti[9]  = (int16u)(sz * tile_size + sz);
        ti[10] = (int16u)((sz + step / 2) * tile_size + sz + step);
        ti[11] = (int16u)(sz * tile_size + sz + step);
        ti += 12;
        for (zz = 0; zz < tile_size - step - 1; zz += step)
        for (xx = 0; xx < tile_size - step - 1; xx += step) {
            ti[0] = (int16u)(zz * tile_size + xx);
            ti[1] = (int16u)((zz + step) * tile_size + xx);
            ti[2] = (int16u)((zz + step) * tile_size + xx + step);
            ti[3] = (int16u)(zz * tile_size + xx);
            ti[4] = (int16u)((zz + step) * tile_size + xx + step);
            ti[5] = (int16u)(zz * tile_size + xx + step);
            ti += 6;
        }
        point++;
    }

    /* joint up right */
    step = 1;
    for (ii = 1; ii < lv; ii++) {
        step *= 2;
        inum[point] = ((tile_size - 1) / step - 1) *
                      ((tile_size - 1) / step - 1) * 6 +
                      ((tile_size - 1) / step - 1) * 2 * 9 + 12;
        pibuf[point] = mem_talloc(inum[point], int16u);
        if (pibuf[point] == NULL)
            goto _failure;
        ti = pibuf[point];
        sz = tile_size - step - 1;
        for (xx = step; xx < tile_size - 1; xx += step) {
            ti[0] = (int16u)(sz * tile_size + xx);
            ti[1] = (int16u)((sz + step) * tile_size + xx);
            ti[2] = (int16u)((sz + step) * tile_size + xx + step / 2);
            ti[3] = (int16u)(sz * tile_size + xx);
            ti[4] = (int16u)((sz + step) * tile_size + xx + step / 2);
            ti[5] = (int16u)((sz + step) * tile_size + xx + step);
            ti[6] = (int16u)(sz * tile_size + xx);
            ti[7] = (int16u)((sz + step) * tile_size + xx + step);
            ti[8] = (int16u)(sz * tile_size + xx + step);
            ti += 9;
        }
        for (zz = 0; zz < tile_size - step - 1; zz += step) {
            ti[0] = (int16u)((zz + step) * tile_size + step);
            ti[1] = (int16u)((zz + step / 2) * tile_size);
            ti[2] = (int16u)((zz + step) * tile_size);
            ti[3] = (int16u)((zz + step) * tile_size + step);
            ti[4] = (int16u)(zz * tile_size);
            ti[5] = (int16u)((zz + step / 2) * tile_size);
            ti[6] = (int16u)((zz + step) * tile_size + step);
            ti[7] = (int16u)(zz * tile_size + step);
            ti[8] = (int16u)(zz * tile_size);
            ti += 9;
        }
        ti[0]  = (int16u)(sz * tile_size + step);
        ti[1]  = (int16u)(sz * tile_size);
        ti[2]  = (int16u)((sz + step / 2) * tile_size);
        ti[3]  = (int16u)(sz * tile_size + step);
        ti[4]  = (int16u)((sz + step / 2) * tile_size);
        ti[5]  = (int16u)((sz + step) * tile_size);
        ti[6]  = (int16u)(sz * tile_size + step);
        ti[7]  = (int16u)((sz + step) * tile_size);
        ti[8]  = (int16u)((sz + step) * tile_size + step / 2);
        ti[9]  = (int16u)(sz * tile_size + step);
        ti[10] = (int16u)((sz + step) * tile_size + step / 2);
        ti[11] = (int16u)((sz + step) * tile_size + step);
        ti += 12;
        for (zz = 0;    zz < tile_size - step - 1; zz += step)
        for (xx = step; xx < tile_size - 1;        xx += step) {
            ti[0] = (int16u)(zz * tile_size + xx);
            ti[1] = (int16u)((zz + step) * tile_size + xx);
            ti[2] = (int16u)((zz + step) * tile_size + xx + step);
            ti[3] = (int16u)(zz * tile_size + xx);
            ti[4] = (int16u)((zz + step) * tile_size + xx + step);
            ti[5] = (int16u)(zz * tile_size + xx + step);
            ti += 6;
        }
        point++;
    }

    /* joint down left */
    step = 1;
    for (ii = 1; ii < lv; ii++) {
        step *= 2;
        inum[point] = ((tile_size - 1) / step - 1) *
                      ((tile_size - 1) / step - 1) * 6 +
                      ((tile_size - 1) / step - 1) * 2 * 9 + 12;
        pibuf[point] = mem_talloc(inum[point], int16u);
        if (pibuf[point] == NULL)
            goto _failure;
        ti = pibuf[point];
        sz = tile_size - step - 1;
        for (xx = 0; xx < tile_size - step - 1; xx += step) {
            ti[0] = (int16u)(xx);
            ti[1] = (int16u)(step * tile_size + xx);
            ti[2] = (int16u)(step * tile_size + xx + step);
            ti[3] = (int16u)(xx);
            ti[4] = (int16u)(step * tile_size + xx + step);
            ti[5] = (int16u)(xx + step / 2);
            ti[6] = (int16u)(xx + step / 2);
            ti[7] = (int16u)(step * tile_size + xx + step);
            ti[8] = (int16u)(xx + step);
            ti += 9;
        }
        for (zz = step; zz < tile_size - 1; zz += step) {
            ti[0] = (int16u)(zz * tile_size + sz);
            ti[1] = (int16u)((zz + step) * tile_size + sz);
            ti[2] = (int16u)((zz + step) * tile_size + sz + step);
            ti[3] = (int16u)(zz * tile_size + sz);
            ti[4] = (int16u)((zz + step) * tile_size + sz + step);
            ti[5] = (int16u)((zz + step / 2) * tile_size + sz + step);
            ti[6] = (int16u)(zz * tile_size + sz);
            ti[7] = (int16u)((zz + step / 2) * tile_size + sz + step);
            ti[8] = (int16u)(zz * tile_size + sz + step);
            ti += 9;
        }
        ti[0]  = (int16u)(step * tile_size + sz);
        ti[1]  = (int16u)(sz + step / 2);
        ti[2]  = (int16u)(sz);
        ti[3]  = (int16u)(step * tile_size + sz);
        ti[4]  = (int16u)(sz + step);
        ti[5]  = (int16u)(sz + step / 2);
        ti[6]  = (int16u)(step * tile_size + sz);
        ti[7]  = (int16u)(step / 2 * tile_size + step + sz);
        ti[8]  = (int16u)(sz + step);
        ti[9]  = (int16u)(step * tile_size + sz);
        ti[10] = (int16u)(step * tile_size + step + sz);
        ti[11] = (int16u)(step / 2 * tile_size + step + sz);
        ti += 12;
        for (zz = step; zz < tile_size - 1;        zz += step)
        for (xx = 0;    xx < tile_size - step - 1; xx += step) {
            ti[0] = (int16u)(zz * tile_size + xx);
            ti[1] = (int16u)((zz + step) * tile_size + xx);
            ti[2] = (int16u)((zz + step) * tile_size + xx + step);
            ti[3] = (int16u)(zz * tile_size + xx);
            ti[4] = (int16u)((zz + step) * tile_size + xx + step);
            ti[5] = (int16u)(zz * tile_size + xx + step);
            ti += 6;
        }
        point++;
    }

    /* joint down right */
    step = 1;
    for (ii = 1; ii < lv; ii++) {
        step *= 2;
        inum[point] = ((tile_size - 1) / step - 1) *
                      ((tile_size - 1) / step - 1) * 6 +
                      ((tile_size - 1) / step - 1) * 2 * 9 + 12;
        pibuf[point] = mem_talloc(inum[point], int16u);
        if (pibuf[point] == NULL)
            goto _failure;
        ti = pibuf[point];
        for (xx = step; xx < tile_size - 1; xx += step) {
            ti[0] = (int16u)(xx);
            ti[1] = (int16u)(step * tile_size + xx);
            ti[2] = (int16u)(step * tile_size + xx + step);
            ti[3] = (int16u)(xx);
            ti[4] = (int16u)(step * tile_size + xx + step);
            ti[5] = (int16u)(xx + step / 2);
            ti[6] = (int16u)(xx + step / 2);
            ti[7] = (int16u)(step * tile_size + xx + step);
            ti[8] = (int16u)(xx + step);
            ti += 9;
        }
        for (zz = step; zz < tile_size - 1; zz += step) {
            ti[0] = (int16u)((zz + step) * tile_size + step);
            ti[1] = (int16u)((zz + step / 2) * tile_size);
            ti[2] = (int16u)((zz + step) * tile_size);
            ti[3] = (int16u)((zz + step) * tile_size + step);
            ti[4] = (int16u)(zz * tile_size);
            ti[5] = (int16u)((zz + step / 2) * tile_size);
            ti[6] = (int16u)((zz + step) * tile_size + step);
            ti[7] = (int16u)(zz * tile_size + step);
            ti[8] = (int16u)(zz * tile_size);
            ti += 9;
        }
        ti[0]  = (int16u)(step * tile_size + step);
        ti[1]  = (int16u)(step);
        ti[2]  = (int16u)(step / 2);
        ti[3]  = (int16u)(step * tile_size + step);
        ti[4]  = (int16u)(step / 2);
        ti[5]  = (int16u)(0);
        ti[6]  = (int16u)(step * tile_size + step);
        ti[7]  = (int16u)(0);
        ti[8]  = (int16u)(step / 2 * tile_size);
        ti[9]  = (int16u)(step * tile_size + step);
        ti[10] = (int16u)(step / 2 * tile_size);
        ti[11] = (int16u)(step * tile_size);
        ti += 12;
        for (zz = step; zz < tile_size - 1; zz += step)
        for (xx = step; xx < tile_size - 1; xx += step) {
            ti[0] = (int16u)(zz * tile_size + xx);
            ti[1] = (int16u)((zz + step) * tile_size + xx);
            ti[2] = (int16u)((zz + step) * tile_size + xx + step);
            ti[3] = (int16u)(zz * tile_size + xx);
            ti[4] = (int16u)((zz + step) * tile_size + xx + step);
            ti[5] = (int16u)(zz * tile_size + xx + step);
            ti += 6;
        }
        point++;
    }
    return (nibuf);

_failure:
    for (ii = 0; ii < point; ii++)
        mem_free(pibuf[ii]);
    return (0);
}