Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 20 | pmbaty | 1 | #include "pmfile.h" |
| 2 | #include "harness/trace.h" |
||
| 3 | |||
| 4 | #include "CORE/FW/datafile.h" |
||
| 5 | #include "CORE/FW/diag.h" |
||
| 6 | #include "CORE/FW/genfile.h" |
||
| 7 | #include "CORE/FW/resource.h" |
||
| 8 | #include "CORE/PIXELMAP/pmmem.h" |
||
| 9 | #include "CORE/PIXELMAP/pmdsptch.h" |
||
| 10 | #include "CORE/V1DB/chunkids.h" |
||
| 11 | #include "CORE/V1DB/stackids.h" |
||
| 12 | |||
| 13 | #include <stddef.h> |
||
| 14 | #include <string.h> |
||
| 15 | |||
| 16 | br_file_enum_member pixelmap_type_FM[15] = { |
||
| 17 | { BR_PMT_INDEX_1, "BR_PMT_INDEX_1", }, |
||
| 18 | { BR_PMT_INDEX_2, "BR_PMT_INDEX_2", }, |
||
| 19 | { BR_PMT_INDEX_4, "BR_PMT_INDEX_4", }, |
||
| 20 | { BR_PMT_INDEX_8, "BR_PMT_INDEX_8", }, |
||
| 21 | { BR_PMT_RGB_555, "BR_PMT_RGB_555", }, |
||
| 22 | { BR_PMT_RGB_565, "BR_PMT_RGB_565", }, |
||
| 23 | { BR_PMT_RGB_888, "BR_PMT_RGB_888", }, |
||
| 24 | { BR_PMT_RGBX_888, "BR_PMT_RGBX_888", }, |
||
| 25 | { BR_PMT_RGBA_8888, "BR_PMT_RGBA_8888", }, |
||
| 26 | { BR_PMT_YUYV_8888, "BR_PMT_YUYV_8888", }, |
||
| 27 | { BR_PMT_YUV_888, "BR_PMT_YUV_888", }, |
||
| 28 | { BR_PMT_DEPTH_16, "BR_PMT_DEPTH_16", }, |
||
| 29 | { BR_PMT_DEPTH_32, "BR_PMT_DEPTH_32", }, |
||
| 30 | { BR_PMT_ALPHA_8, "BR_PMT_ALPHA_8", }, |
||
| 31 | { BR_PMT_INDEXA_88, "BR_PMT_INDEXA_88", }, |
||
| 32 | }; |
||
| 33 | br_file_enum pixelmap_type_F = { BR_ASIZE(pixelmap_type_FM), pixelmap_type_FM }; |
||
| 34 | |||
| 35 | br_file_struct_member br_old_pixelmap_FM[7] = { |
||
| 36 | { DF_TYPE_ENUM_8, offsetof(br_pixelmap, type), "type", &pixelmap_type_F }, |
||
| 37 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, row_bytes), "row_bytes", NULL }, |
||
| 38 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, width), "width", NULL }, |
||
| 39 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, height), "height", NULL }, |
||
| 40 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, origin_x), "origin_x", NULL }, |
||
| 41 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, origin_y), "origin_y", NULL }, |
||
| 42 | { DF_TYPE_ASCIZ, offsetof(br_pixelmap, identifier), "identifier", NULL }, |
||
| 43 | }; |
||
| 44 | |||
| 45 | br_file_struct_member br_pixelmap_FM[8] = { |
||
| 46 | { DF_TYPE_ENUM_8, offsetof(br_pixelmap, type), "type", &pixelmap_type_F }, |
||
| 47 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, row_bytes), "row_bytes", NULL }, |
||
| 48 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, width), "width", NULL }, |
||
| 49 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, height), "height", NULL }, |
||
| 50 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, origin_x), "origin_x", NULL }, |
||
| 51 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, origin_y), "origin_y", NULL }, |
||
| 52 | { DF_TYPE_BR_UINT_16, offsetof(br_pixelmap, mip_offset), "mip_offset", NULL }, |
||
| 53 | { DF_TYPE_ASCIZ, offsetof(br_pixelmap, identifier), "identifier", NULL }, |
||
| 54 | }; |
||
| 55 | |||
| 56 | br_file_struct br_pixelmap_F = { "br_pixelmap", BR_ASIZE(br_pixelmap_FM), br_pixelmap_FM, sizeof(br_pixelmap) }; |
||
| 57 | br_file_struct br_old_pixelmap_F = { "br_old_pixelmap", BR_ASIZE(br_old_pixelmap_FM), br_old_pixelmap_FM, sizeof(br_pixelmap) }; |
||
| 58 | |||
| 59 | br_chunks_table_entry PixelmapLoadEntries[5] = { |
||
| 60 | { CHUNKID_END, 0u, FopRead_END }, |
||
| 61 | { CHUNKID_PIXELMAP, 0u, FopRead_PIXELMAP }, |
||
| 62 | { CHUNKID_PIXELMAP_PIXELS, 0u, FopRead_PIXELS }, |
||
| 63 | { CHUNKID_PIXELMAP_ADD_MAP, 0u, FopRead_ADD_MAP }, |
||
| 64 | { CHUNKID_OLD_PIXELMAP, 0u, FopRead_OLD_PIXELMAP }, |
||
| 65 | }; |
||
| 66 | br_chunks_table PixelmapLoadTable = { BR_ASIZE(PixelmapLoadEntries), PixelmapLoadEntries }; |
||
| 67 | |||
| 68 | // IDA: int __usercall FopWrite_PIXELMAP@<EAX>(br_datafile *df@<EAX>, br_pixelmap *pixelmap@<EDX>) |
||
| 69 | int FopWrite_PIXELMAP(br_datafile* df, br_pixelmap* pixelmap) { |
||
| 70 | br_pixelmap pmap; |
||
| 71 | LOG_TRACE("(%p, %p)", df, pixelmap); |
||
| 72 | |||
| 73 | memcpy(&pmap, pixelmap, sizeof(br_pixelmap)); |
||
| 74 | pmap.row_bytes = (pmTypeInfo[pmap.type].bits >> 3) * pmap.width; |
||
| 75 | df->prims->chunk_write(df, CHUNKID_PIXELMAP, df->prims->struct_size(df, &br_pixelmap_F, &pmap)); |
||
| 76 | df->prims->struct_write(df, &br_pixelmap_F, &pmap); |
||
| 77 | return 0; |
||
| 78 | } |
||
| 79 | |||
| 80 | // IDA: int __usercall FopRead_OLD_PIXELMAP@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>) |
||
| 81 | int FopRead_OLD_PIXELMAP(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) { |
||
| 82 | br_pixelmap* pp; |
||
| 83 | LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count); |
||
| 84 | |||
| 85 | pp = (br_pixelmap*)DevicePixelmapMemAllocate(BR_PMAF_NO_PIXELS | BR_PMAF_INVERTED, 0, 0, 0, 2); |
||
| 86 | df->res = pp; |
||
| 87 | df->prims->struct_read(df, &br_old_pixelmap_F, pp); |
||
| 88 | df->res = NULL; |
||
| 89 | #if !defined(BRENDER_FIX_BUGS) |
||
| 90 | pp->row_bytes = (pmTypeInfo[pp->type].bits >> 3) * pp->width; |
||
| 91 | #endif |
||
| 92 | DfPush(DF_PIXELMAP, pp, 1); |
||
| 93 | return 0; |
||
| 94 | } |
||
| 95 | |||
| 96 | // IDA: int __usercall FopRead_PIXELMAP@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>) |
||
| 97 | int FopRead_PIXELMAP(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) { |
||
| 98 | br_pixelmap* pp; |
||
| 99 | LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count); |
||
| 100 | |||
| 101 | pp = (br_pixelmap*)DevicePixelmapMemAllocate(BR_PMAF_NO_PIXELS | BR_PMAF_INVERTED, 0, 0, 0, 2); |
||
| 102 | df->res = pp; |
||
| 103 | df->prims->struct_read(df, &br_pixelmap_F, pp); |
||
| 104 | df->res = NULL; |
||
| 105 | #if !defined(BRENDER_FIX_BUGS) |
||
| 106 | pp->row_bytes = (pmTypeInfo[pp->type].bits >> 3) * pp->width; |
||
| 107 | #endif |
||
| 108 | DfPush(DF_PIXELMAP, pp, 1); |
||
| 109 | return 0; |
||
| 110 | } |
||
| 111 | |||
| 112 | // IDA: int __usercall FopWrite_PIXELS@<EAX>(br_datafile *df@<EAX>, br_pixelmap *pixelmap@<EDX>) |
||
| 113 | int FopWrite_PIXELS(br_datafile* df, br_pixelmap* pixelmap) { |
||
| 114 | int size; |
||
| 115 | int bytes; |
||
| 116 | int block_count; |
||
| 117 | char* pixels; |
||
| 118 | LOG_TRACE("(%p, %p)", df, pixelmap); |
||
| 119 | |||
| 120 | pixels = (char*)pixelmap->pixels + pixelmap->base_x * pixelmap->width + pixelmap->base_y; |
||
| 121 | if (pixelmap->mip_offset == 0) { |
||
| 122 | bytes = df->prims->block_size(df, pixels, (pmTypeInfo[pixelmap->type].bits >> 3) * pixelmap->width / pmTypeInfo[pixelmap->type].file_size, pixelmap->row_bytes, pixelmap->height, pmTypeInfo[pixelmap->type].file_size); |
||
| 123 | df->prims->chunk_write(df, CHUNKID_PIXELMAP_PIXELS, bytes); |
||
| 124 | bytes = (pmTypeInfo[pixelmap->type].bits >> 3) * pixelmap->width / pmTypeInfo[pixelmap->type].file_size; |
||
| 125 | size = pixelmap->row_bytes / pmTypeInfo[pixelmap->type].file_size; |
||
| 126 | block_count = pixelmap->height; |
||
| 127 | } else { |
||
| 128 | size = 0; |
||
| 129 | for (bytes = pixelmap->width; bytes != 0; bytes = bytes >> 1) { |
||
| 130 | size += bytes * bytes * (pmTypeInfo[pixelmap->type].bits >> 3); |
||
| 131 | } |
||
| 132 | df->prims->chunk_write(df, CHUNKID_PIXELMAP_PIXELS, df-> prims->block_size(df, pixels, size / pmTypeInfo[pixelmap->type].file_size, size, 1, pmTypeInfo[pixelmap->type].file_size)); |
||
| 133 | bytes = size; |
||
| 134 | block_count = 1; |
||
| 135 | } |
||
| 136 | df->prims->block_write(df, pixels, bytes, size, block_count, pmTypeInfo[pixelmap->type].file_size); |
||
| 137 | return 0; |
||
| 138 | } |
||
| 139 | |||
| 140 | // IDA: int __usercall FopRead_PIXELS@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>) |
||
| 141 | int FopRead_PIXELS(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) { |
||
| 142 | int icount = 0; |
||
| 143 | br_pixelmap* pp; |
||
| 144 | int size; |
||
| 145 | LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count); |
||
| 146 | |||
| 147 | pp = DfTop(DF_PIXELMAP, NULL); |
||
| 148 | size = pmTypeInfo[pp->type].file_size; |
||
| 149 | df->res = pp; |
||
| 150 | pp->pixels = df->prims->block_read(df, NULL, &icount, size, BR_MEMORY_PIXELS); |
||
| 151 | pp->flags |= BR_PMF_LINEAR; |
||
| 152 | df->res = NULL; |
||
| 153 | return 0; |
||
| 154 | } |
||
| 155 | |||
| 156 | // IDA: int __usercall FopWrite_ADD_MAP@<EAX>(br_datafile *df@<EAX>) |
||
| 157 | int FopWrite_ADD_MAP(br_datafile* df) { |
||
| 158 | LOG_TRACE("(%p)", df); |
||
| 159 | |||
| 160 | df->prims->chunk_write(df, CHUNKID_PIXELMAP_ADD_MAP, 0); |
||
| 161 | return 0; |
||
| 162 | } |
||
| 163 | |||
| 164 | // IDA: int __usercall FopRead_ADD_MAP@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>) |
||
| 165 | int FopRead_ADD_MAP(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) { |
||
| 166 | br_pixelmap* pp; |
||
| 167 | br_pixelmap* map; |
||
| 168 | LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count); |
||
| 169 | |||
| 170 | map = DfPop(DF_PIXELMAP, 0); |
||
| 171 | pp = DfTop(DF_PIXELMAP, 0); |
||
| 172 | pp->map = map; |
||
| 173 | BrResAdd(pp, map); |
||
| 174 | return 0; |
||
| 175 | } |
||
| 176 | |||
| 177 | // IDA: br_uint_32 __cdecl BrPixelmapLoadMany(char *filename, br_pixelmap **pixelmaps, br_uint_16 num) |
||
| 178 | br_uint_32 BrPixelmapLoadMany(char* filename, br_pixelmap** pixelmaps, br_uint_16 num) { |
||
| 179 | br_datafile* df; |
||
| 180 | int count; |
||
| 181 | int r; |
||
| 182 | LOG_TRACE("(\"%s\", %p, %d)", filename, pixelmaps, num); |
||
| 183 | |||
| 184 | df = DfOpen(filename, 0, BRT_FIXED); |
||
| 185 | if (df == NULL) { |
||
| 186 | return 0; |
||
| 187 | } |
||
| 188 | count = 0; |
||
| 189 | do { |
||
| 190 | if (count >= num) { |
||
| 191 | break; |
||
| 192 | } |
||
| 193 | r = DfChunksInterpret(df, &PixelmapLoadTable); |
||
| 194 | if (DfTopType() == DF_PIXELMAP) { |
||
| 195 | pixelmaps[count] = DfPop(DF_PIXELMAP, 0); |
||
| 196 | count++; |
||
| 197 | } |
||
| 198 | } while (r != 0); |
||
| 199 | DfClose(df); |
||
| 200 | return count; |
||
| 201 | } |
||
| 202 | |||
| 203 | // IDA: int __usercall WritePixelmap@<EAX>(br_pixelmap *pp@<EAX>, br_datafile *df@<EDX>) |
||
| 204 | int WritePixelmap(br_pixelmap* pp, br_datafile* df) { |
||
| 205 | LOG_TRACE("(%p, %p)", pp, df); |
||
| 206 | |||
| 207 | BrPixelmapDirectLock(pp, 1); |
||
| 208 | if (pp->pixels == NULL) { |
||
| 209 | _BrAssert("pp->pixels", "pmfile.c", 291); |
||
| 210 | } |
||
| 211 | FopWrite_PIXELMAP(df, pp); |
||
| 212 | if (pp->map != NULL) { |
||
| 213 | WritePixelmap(pp->map, df); |
||
| 214 | FopWrite_ADD_MAP(df); |
||
| 215 | } |
||
| 216 | FopWrite_PIXELS(df, pp); |
||
| 217 | BrPixelmapDirectUnlock(pp); |
||
| 218 | return 0; |
||
| 219 | } |
||
| 220 | |||
| 221 | // IDA: br_uint_32 __cdecl BrPixelmapSaveMany(char *filename, br_pixelmap **pixelmaps, br_uint_16 num) |
||
| 222 | br_uint_32 BrPixelmapSaveMany(char* filename, br_pixelmap** pixelmaps, br_uint_16 num) { |
||
| 223 | br_datafile* df; |
||
| 224 | int i; |
||
| 225 | LOG_TRACE("(\"%s\", %p, %d)", filename, pixelmaps, num); |
||
| 226 | |||
| 227 | if (filename == NULL) { |
||
| 228 | _BrAssert("filename != NULL", "pmfile.c", 324); |
||
| 229 | } |
||
| 230 | if (pixelmaps == NULL) { |
||
| 231 | _BrAssert("pixelmaps != NULL", "pmfile.c", 325); |
||
| 232 | } |
||
| 233 | df = DfOpen(filename, 1, BRT_FIXED); |
||
| 234 | if (df == NULL) { |
||
| 235 | return 0; |
||
| 236 | } |
||
| 237 | FopWrite_FILE_INFO(df, 2); |
||
| 238 | for (i = 0; i < num; i++) { |
||
| 239 | WritePixelmap(pixelmaps[i], df); |
||
| 240 | FopWrite_END(df); |
||
| 241 | } |
||
| 242 | DfClose(df); |
||
| 243 | return num; |
||
| 244 | } |
||
| 245 | |||
| 246 | // IDA: br_pixelmap* __cdecl BrPixelmapLoad(char *filename) |
||
| 247 | br_pixelmap* BrPixelmapLoad(char* filename) { |
||
| 248 | br_pixelmap* ptr; |
||
| 249 | |||
| 250 | if (BrPixelmapLoadMany(filename, &ptr, 1) == 1) { |
||
| 251 | return ptr; |
||
| 252 | } |
||
| 253 | return NULL; |
||
| 254 | } |
||
| 255 | |||
| 256 | // IDA: br_uint_32 __cdecl BrPixelmapSave(char *filename, br_pixelmap *ptr) |
||
| 257 | br_uint_32 BrPixelmapSave(char* filename, br_pixelmap* ptr) { |
||
| 258 | LOG_TRACE("(\"%s\", %p)", filename, ptr); |
||
| 259 | |||
| 260 | return BrPixelmapSaveMany(filename, &ptr, 1); |
||
| 261 | } |