Forum: Poser Technical


Subject: RSR to Png specs

jdebroy opened this issue on Nov 10, 2006 · 27 posts


kuroyume0161 posted Wed, 22 November 2006 at 1:30 PM

Oh yeah, baby! ;)

That worked!!  The image is a screencap from Poser 4 of the RSR created by my plugin in Cinema 4D. 8P

So, I used the RSR header/footer Byte arrays, but updated the Map offset and Data length to the PICT file size being embedded.  This code uses the SDK file access, but matching to other file accesses (C++ file stream, C file pointer, etc.) should be easily determined.  These are Dodger's template header/footer.

Quote -
// RSR Header (Resource Header, Reserved, and Resource Data header
UCHAR    RSRHeader[304] =
{
    // Resource Header (Constant - shouldn't need to be changed)
    // Rsrc Data Start
| Rsrc Map Start    | Rsrc Data Len     | Rsrc Map Len*
    0x00,0x00,0x01,0x00,0x00,0x00,0x26,0x16,0x00,0x00,0x25,0x16,0x00,0x00,0x00,0x3A,
    // - Reserved -
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    // Start of Resource Data
    0x00,0x00,0x25,0x12,0x25,0x12,0x00,0x00,0x00,0x00,0x00,0x5B,0x00,0x5B,0x00,0x11,
    0x02,0xFF,0x0C,0x00,0xFF,0xFE,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x5B,0x00,0x5B,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0A
};
// RSR Footer (Resource Map)
UCHAR    RSRFooter[58] =
{
    // Start of Resource Map
    0x00,0x00,0x01,0x00,0x00,0x00,0x21,0xAC,0x00,0x00,0x20,0xAC,0x00,0x00,0x00,0x3A,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x32,0x00,0x00,0x50,0x49,
    0x43,0x54,0x00,0x00,0x00,0x0A,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x07,0x70,0x72,0x65,0x76,0x69,0x65,0x77
};
// IPPSaver.ConvertPCTToRSR - Write to file
//---------------------------------------------------------------------------
BOOL IPPSaver::ConvertPCTToRSR()
//---------------------------------------------------------------------------
{
    AutoAlloc    pctFile;
    AutoAlloc    rsrFile;
    if (!(pctFile && rsrFile))    return FALSE;

    // Open PCT thumbnail and RSR files (Must be MOTOROLA for RSR file!)
    if (!(pctFile->Open(poseFilename, GE_READ, FILE_NODIALOG, GE_MOTOROLA)))    return FALSE;
    poseFilename.SetSuffix("rsr");
    if (!(rsrFile->Open(poseFilename, GE_WRITE, FILE_NODIALOG, GE_MOTOROLA)))    return FALSE;

    // - Skip to first 0A byte
    UCHAR    c;
    do
    {
        if (!pctFile->ReadUChar(&c))                return FALSE;
    } while (c != 0x0A);
    LONG        datasize =    pctFile->GetLength()-pctFile->GetPosition();
    // Resource Map Offset (from start of file)
    LONG        offset =    datasize+304;
    // Resource Data Length = Resource Map Start-256
    LONG        length =    offset-256;
    // Resource Map Offset
    RSRHeader[4] =    (offset & 0xFF000000L) >> 24;
    RSRHeader[5] =    (offset & 0x00FF0000L) >> 16;
    RSRHeader[6] =    (offset & 0x0000FF00L) >> 8;
    RSRHeader[7] =    (offset & 0x000000FFL);
    // Resource Data Length
    RSRHeader[8] =    (length & 0xFF000000L) >> 24;
    RSRHeader[9] =    (length & 0x00FF0000L) >> 16;
    RSRHeader[10] =    (length & 0x0000FF00L) >> 8;
    RSRHeader[11] =    (length & 0x000000FFL);
    // Copy of Resource Header in Resource Map
    // - Resource Map Offset
    RSRFooter[4] =    RSRHeader[4];
    RSRFooter[5] =    RSRHeader[5];
    RSRFooter[6] =    RSRHeader[6];
    RSRFooter[7] =    RSRHeader[7];
    // - Resource Data Length
    RSRFooter[8] =    RSRHeader[8];
    RSRFooter[9] =    RSRHeader[9];
    RSRFooter[10] =    RSRHeader[10];
    RSRFooter[11] =    RSRHeader[11];

    // Write RSR Header
    if (!rsrFile->WriteBytes(&RSRHeader[0], 304))    return FALSE;
    // Copy PICT data to RSR file
    // - Write PCT data to RSR file
    for (LONG size = 1024; datasize; datasize -= size)
    {
        if (size > datasize)                        size = datasize;
        size =                                        pctFile->ReadBytes(&strBuf[0], size, FALSE);
        if (!size)                                    return FALSE;
        if (!rsrFile->WriteBytes(&strBuf[0], size))    return FALSE;
    }
    // Write RSR Footer
    if (!rsrFile->WriteBytes(&RSRFooter[0], 58))    return FALSE;

    // Close PCT and RSR files
    rsrFile->Close();
    pctFile->Close();
    return TRUE;
}

Thank you all!
Robert

C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, you blow your whole leg off.

 -- Bjarne Stroustrup

Contact Me | Kuroyume's DevelopmentZone