Handle PNG thumbnails in XML codec (and Raw, just in case)

This commit is contained in:
baldurk
2018-12-07 18:19:50 +00:00
parent 76848d493b
commit bba5e6ee5e
+44 -12
View File
@@ -291,7 +291,15 @@ static ReplayStatus Structured2XML(const char *filename, const RDCFile &file, ui
{
xThumbnail.append_attribute("width") = th.width;
xThumbnail.append_attribute("height") = th.height;
xThumbnail.text() = "thumb.jpg";
if(th.format == FileType::JPG)
xThumbnail.text() = "thumb.jpg";
else if(th.format == FileType::PNG)
xThumbnail.text() = "thumb.png";
else if(th.format == FileType::Raw)
xThumbnail.text() = "thumb.raw";
else
RDCERR("Unexpected thumbnail format %s", ToStr(th.format).c_str());
}
}
@@ -498,7 +506,7 @@ static SDObject *XML2Obj(pugi::xml_node &obj)
return ret;
}
static ReplayStatus XML2Structured(const char *xml, const bytebuf &thumbBytes,
static ReplayStatus XML2Structured(const char *xml, FileType thumbFormat, const bytebuf &thumbBytes,
const StructuredBufferList &buffers, RDCFile *rdc,
uint64_t &version, StructuredChunkList &chunks,
RENDERDOC_ProgressCallback progress)
@@ -548,6 +556,7 @@ static ReplayStatus XML2Structured(const char *xml, const bytebuf &thumbBytes,
}
RDCThumb th;
th.format = thumbFormat;
th.width = (uint16_t)xThumbnail.attribute("width").as_uint();
th.height = (uint16_t)xThumbnail.attribute("height").as_uint();
@@ -742,7 +751,16 @@ static ReplayStatus Buffers2ZIP(const std::string &filename, const RDCFile &file
const RDCThumb &th = file.GetThumbnail();
if(th.pixels && th.len > 0 && th.width > 0 && th.height > 0)
mz_zip_writer_add_mem(&zip, "thumb.jpg", th.pixels, th.len, MZ_BEST_COMPRESSION);
{
if(th.format == FileType::JPG)
mz_zip_writer_add_mem(&zip, "thumb.jpg", th.pixels, th.len, MZ_BEST_COMPRESSION);
else if(th.format == FileType::PNG)
mz_zip_writer_add_mem(&zip, "thumb.png", th.pixels, th.len, MZ_BEST_COMPRESSION);
else if(th.format == FileType::Raw)
mz_zip_writer_add_mem(&zip, "thumb.raw", th.pixels, th.len, MZ_BEST_COMPRESSION);
else
RDCERR("Unexpected thumbnail format %s", ToStr(th.format).c_str());
}
mz_zip_writer_finalize_archive(&zip);
mz_zip_writer_end(&zip);
@@ -750,7 +768,7 @@ static ReplayStatus Buffers2ZIP(const std::string &filename, const RDCFile &file
return ReplayStatus::Succeeded;
}
static bool ZIP2Buffers(const std::string &filename, bytebuf &thumbBytes,
static bool ZIP2Buffers(const std::string &filename, FileType &thumbFormat, bytebuf &thumbBytes,
StructuredBufferList &buffers, RENDERDOC_ProgressCallback progress)
{
std::string zipFile = filename;
@@ -782,7 +800,25 @@ static bool ZIP2Buffers(const std::string &filename, bytebuf &thumbBytes,
byte *buf = (byte *)mz_zip_reader_extract_to_heap(&zip, i, &sz, 0);
if(strcmp(zstat.m_filename, "thumb.jpg"))
if(!strcmp(zstat.m_filename, "thumb.jpg"))
{
// we store the thumbnail separately
thumbFormat = FileType::JPG;
thumbBytes.assign(buf, sz);
}
else if(!strcmp(zstat.m_filename, "thumb.png"))
{
// we store the thumbnail separately
thumbFormat = FileType::PNG;
thumbBytes.assign(buf, sz);
}
else if(!strcmp(zstat.m_filename, "thumb.raw"))
{
// we store the thumbnail separately
thumbFormat = FileType::Raw;
thumbBytes.assign(buf, sz);
}
else
{
int bufname = atoi(zstat.m_filename);
@@ -792,11 +828,6 @@ static bool ZIP2Buffers(const std::string &filename, bytebuf &thumbBytes,
buffers[bufname]->assign(buf, sz);
}
}
else
{
// we store the thumbnail separately
thumbBytes.assign(buf, sz);
}
if(progress)
progress(BufferProgress(float(i) / float(numfiles)));
@@ -811,10 +842,11 @@ static bool ZIP2Buffers(const std::string &filename, bytebuf &thumbBytes,
ReplayStatus importXMLZ(const char *filename, StreamReader &reader, RDCFile *rdc,
SDFile &structData, RENDERDOC_ProgressCallback progress)
{
FileType thumbFormat = FileType::JPG;
bytebuf thumbBytes;
if(filename)
{
bool success = ZIP2Buffers(filename, thumbBytes, structData.buffers, progress);
bool success = ZIP2Buffers(filename, thumbFormat, thumbBytes, structData.buffers, progress);
if(!success)
{
RDCERR("Couldn't load zip to go with %s", filename);
@@ -827,7 +859,7 @@ ReplayStatus importXMLZ(const char *filename, StreamReader &reader, RDCFile *rdc
reader.Read(buf, (size_t)len);
buf[len] = 0;
return XML2Structured(buf, thumbBytes, structData.buffers, rdc, structData.version,
return XML2Structured(buf, thumbFormat, thumbBytes, structData.buffers, rdc, structData.version,
structData.chunks, progress);
}