/* ==================================== */ 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); }
/* ================== */ 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); }
/* --------------------------------------- 生成工作单元组 --------------------------------------- */ 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); }
/* ======================================= 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); }
/* ======================================= 生成连接索引 ======================================= */ 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); }