#include "pmfile.h"
#include "harness/trace.h"
#include "CORE/FW/datafile.h"
#include "CORE/FW/diag.h"
#include "CORE/FW/genfile.h"
#include "CORE/FW/resource.h"
#include "CORE/PIXELMAP/pmmem.h"
#include "CORE/PIXELMAP/pmdsptch.h"
#include "CORE/V1DB/chunkids.h"
#include "CORE/V1DB/stackids.h"
#include <stddef.h>
#include <string.h>
br_file_enum_member pixelmap_type_FM[15] = {
{ BR_PMT_INDEX_1, "BR_PMT_INDEX_1", },
{ BR_PMT_INDEX_2, "BR_PMT_INDEX_2", },
{ BR_PMT_INDEX_4, "BR_PMT_INDEX_4", },
{ BR_PMT_INDEX_8, "BR_PMT_INDEX_8", },
{ BR_PMT_RGB_555, "BR_PMT_RGB_555", },
{ BR_PMT_RGB_565, "BR_PMT_RGB_565", },
{ BR_PMT_RGB_888, "BR_PMT_RGB_888", },
{ BR_PMT_RGBX_888, "BR_PMT_RGBX_888", },
{ BR_PMT_RGBA_8888, "BR_PMT_RGBA_8888", },
{ BR_PMT_YUYV_8888, "BR_PMT_YUYV_8888", },
{ BR_PMT_YUV_888, "BR_PMT_YUV_888", },
{ BR_PMT_DEPTH_16, "BR_PMT_DEPTH_16", },
{ BR_PMT_DEPTH_32, "BR_PMT_DEPTH_32", },
{ BR_PMT_ALPHA_8, "BR_PMT_ALPHA_8", },
{ BR_PMT_INDEXA_88, "BR_PMT_INDEXA_88", },
};
br_file_enum pixelmap_type_F = { BR_ASIZE(pixelmap_type_FM), pixelmap_type_FM };
br_file_struct_member br_old_pixelmap_FM[7] = {
{ DF_TYPE_ENUM_8
, offsetof(br_pixelmap
, type
), "type", &pixelmap_type_F
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, row_bytes
), "row_bytes", NULL
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, width
), "width", NULL
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, height
), "height", NULL
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, origin_x
), "origin_x", NULL
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, origin_y
), "origin_y", NULL
},
{ DF_TYPE_ASCIZ
, offsetof(br_pixelmap
, identifier
), "identifier", NULL
},
};
br_file_struct_member br_pixelmap_FM[8] = {
{ DF_TYPE_ENUM_8
, offsetof(br_pixelmap
, type
), "type", &pixelmap_type_F
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, row_bytes
), "row_bytes", NULL
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, width
), "width", NULL
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, height
), "height", NULL
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, origin_x
), "origin_x", NULL
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, origin_y
), "origin_y", NULL
},
{ DF_TYPE_BR_UINT_16
, offsetof(br_pixelmap
, mip_offset
), "mip_offset", NULL
},
{ DF_TYPE_ASCIZ
, offsetof(br_pixelmap
, identifier
), "identifier", NULL
},
};
br_file_struct br_pixelmap_F = { "br_pixelmap", BR_ASIZE(br_pixelmap_FM), br_pixelmap_FM, sizeof(br_pixelmap) };
br_file_struct br_old_pixelmap_F = { "br_old_pixelmap", BR_ASIZE(br_old_pixelmap_FM), br_old_pixelmap_FM, sizeof(br_pixelmap) };
br_chunks_table_entry PixelmapLoadEntries[5] = {
{ CHUNKID_END, 0u, FopRead_END },
{ CHUNKID_PIXELMAP, 0u, FopRead_PIXELMAP },
{ CHUNKID_PIXELMAP_PIXELS, 0u, FopRead_PIXELS },
{ CHUNKID_PIXELMAP_ADD_MAP, 0u, FopRead_ADD_MAP },
{ CHUNKID_OLD_PIXELMAP, 0u, FopRead_OLD_PIXELMAP },
};
br_chunks_table PixelmapLoadTable = { BR_ASIZE(PixelmapLoadEntries), PixelmapLoadEntries };
// IDA: int __usercall FopWrite_PIXELMAP@<EAX>(br_datafile *df@<EAX>, br_pixelmap *pixelmap@<EDX>)
int FopWrite_PIXELMAP(br_datafile* df, br_pixelmap* pixelmap) {
br_pixelmap pmap;
LOG_TRACE("(%p, %p)", df, pixelmap);
memcpy(&pmap
, pixelmap
, sizeof(br_pixelmap
));
pmap.row_bytes = (pmTypeInfo[pmap.type].bits >> 3) * pmap.width;
df->prims->chunk_write(df, CHUNKID_PIXELMAP, df->prims->struct_size(df, &br_pixelmap_F, &pmap));
df->prims->struct_write(df, &br_pixelmap_F, &pmap);
return 0;
}
// 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>)
int FopRead_OLD_PIXELMAP(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
br_pixelmap* pp;
LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
pp = (br_pixelmap*)DevicePixelmapMemAllocate(BR_PMAF_NO_PIXELS | BR_PMAF_INVERTED, 0, 0, 0, 2);
df->res = pp;
df->prims->struct_read(df, &br_old_pixelmap_F, pp);
df->res = NULL;
#if !defined(BRENDER_FIX_BUGS)
pp->row_bytes = (pmTypeInfo[pp->type].bits >> 3) * pp->width;
#endif
DfPush(DF_PIXELMAP, pp, 1);
return 0;
}
// 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>)
int FopRead_PIXELMAP(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
br_pixelmap* pp;
LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
pp = (br_pixelmap*)DevicePixelmapMemAllocate(BR_PMAF_NO_PIXELS | BR_PMAF_INVERTED, 0, 0, 0, 2);
df->res = pp;
df->prims->struct_read(df, &br_pixelmap_F, pp);
df->res = NULL;
#if !defined(BRENDER_FIX_BUGS)
pp->row_bytes = (pmTypeInfo[pp->type].bits >> 3) * pp->width;
#endif
DfPush(DF_PIXELMAP, pp, 1);
return 0;
}
// IDA: int __usercall FopWrite_PIXELS@<EAX>(br_datafile *df@<EAX>, br_pixelmap *pixelmap@<EDX>)
int FopWrite_PIXELS(br_datafile* df, br_pixelmap* pixelmap) {
int size;
int bytes;
int block_count;
char* pixels;
LOG_TRACE("(%p, %p)", df, pixelmap);
pixels = (char*)pixelmap->pixels + pixelmap->base_x * pixelmap->width + pixelmap->base_y;
if (pixelmap->mip_offset == 0) {
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);
df->prims->chunk_write(df, CHUNKID_PIXELMAP_PIXELS, bytes);
bytes = (pmTypeInfo[pixelmap->type].bits >> 3) * pixelmap->width / pmTypeInfo[pixelmap->type].file_size;
size = pixelmap->row_bytes / pmTypeInfo[pixelmap->type].file_size;
block_count = pixelmap->height;
} else {
size = 0;
for (bytes = pixelmap->width; bytes != 0; bytes = bytes >> 1) {
size += bytes * bytes * (pmTypeInfo[pixelmap->type].bits >> 3);
}
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));
bytes = size;
block_count = 1;
}
df->prims->block_write(df, pixels, bytes, size, block_count, pmTypeInfo[pixelmap->type].file_size);
return 0;
}
// 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>)
int FopRead_PIXELS(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
int icount = 0;
br_pixelmap* pp;
int size;
LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
pp = DfTop(DF_PIXELMAP, NULL);
size = pmTypeInfo[pp->type].file_size;
df->res = pp;
pp->pixels = df->prims->block_read(df, NULL, &icount, size, BR_MEMORY_PIXELS);
pp->flags |= BR_PMF_LINEAR;
df->res = NULL;
return 0;
}
// IDA: int __usercall FopWrite_ADD_MAP@<EAX>(br_datafile *df@<EAX>)
int FopWrite_ADD_MAP(br_datafile* df) {
LOG_TRACE("(%p)", df);
df->prims->chunk_write(df, CHUNKID_PIXELMAP_ADD_MAP, 0);
return 0;
}
// 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>)
int FopRead_ADD_MAP(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
br_pixelmap* pp;
br_pixelmap* map;
LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
map = DfPop(DF_PIXELMAP, 0);
pp = DfTop(DF_PIXELMAP, 0);
pp->map = map;
BrResAdd(pp, map);
return 0;
}
// IDA: br_uint_32 __cdecl BrPixelmapLoadMany(char *filename, br_pixelmap **pixelmaps, br_uint_16 num)
br_uint_32 BrPixelmapLoadMany(char* filename, br_pixelmap** pixelmaps, br_uint_16 num) {
br_datafile* df;
int count;
int r;
LOG_TRACE("(\"%s\", %p, %d)", filename, pixelmaps, num);
df = DfOpen(filename, 0, BRT_FIXED);
if (df == NULL) {
return 0;
}
count = 0;
do {
if (count >= num) {
break;
}
r = DfChunksInterpret(df, &PixelmapLoadTable);
if (DfTopType() == DF_PIXELMAP) {
pixelmaps[count] = DfPop(DF_PIXELMAP, 0);
count++;
}
} while (r != 0);
DfClose(df);
return count;
}
// IDA: int __usercall WritePixelmap@<EAX>(br_pixelmap *pp@<EAX>, br_datafile *df@<EDX>)
int WritePixelmap(br_pixelmap* pp, br_datafile* df) {
LOG_TRACE("(%p, %p)", pp, df);
BrPixelmapDirectLock(pp, 1);
if (pp->pixels == NULL) {
_BrAssert("pp->pixels", "pmfile.c", 291);
}
FopWrite_PIXELMAP(df, pp);
if (pp->map != NULL) {
WritePixelmap(pp->map, df);
FopWrite_ADD_MAP(df);
}
FopWrite_PIXELS(df, pp);
BrPixelmapDirectUnlock(pp);
return 0;
}
// IDA: br_uint_32 __cdecl BrPixelmapSaveMany(char *filename, br_pixelmap **pixelmaps, br_uint_16 num)
br_uint_32 BrPixelmapSaveMany(char* filename, br_pixelmap** pixelmaps, br_uint_16 num) {
br_datafile* df;
int i;
LOG_TRACE("(\"%s\", %p, %d)", filename, pixelmaps, num);
if (filename == NULL) {
_BrAssert("filename != NULL", "pmfile.c", 324);
}
if (pixelmaps == NULL) {
_BrAssert("pixelmaps != NULL", "pmfile.c", 325);
}
df = DfOpen(filename, 1, BRT_FIXED);
if (df == NULL) {
return 0;
}
FopWrite_FILE_INFO(df, 2);
for (i = 0; i < num; i++) {
WritePixelmap(pixelmaps[i], df);
FopWrite_END(df);
}
DfClose(df);
return num;
}
// IDA: br_pixelmap* __cdecl BrPixelmapLoad(char *filename)
br_pixelmap* BrPixelmapLoad(char* filename) {
br_pixelmap* ptr;
if (BrPixelmapLoadMany(filename, &ptr, 1) == 1) {
return ptr;
}
return NULL;
}
// IDA: br_uint_32 __cdecl BrPixelmapSave(char *filename, br_pixelmap *ptr)
br_uint_32 BrPixelmapSave(char* filename, br_pixelmap* ptr) {
LOG_TRACE("(\"%s\", %p)", filename, ptr);
return BrPixelmapSaveMany(filename, &ptr, 1);
}