Alien-FreeImage

 view release on metacpan or  search on metacpan

src/Source/LibJXR/jxrgluelib/JXRGlueJxr.c  view on Meta::CPAN


void CalcMetadataSizeLPWSTR(const DPKPROPVARIANT var,
                            U16 *pcInactiveMetadata,
                            U32 *pcbOffsetSize,
                            U32 *pcbCount)
{
    if (DPKVT_EMPTY != var.vt)
    {
        U32 uiCBWithNull = sizeof(U16) * ((U32)wcslen((wchar_t *) var.VT.pwszVal) + 1); // +1 for NULL term;
        assert(DPKVT_LPWSTR == var.vt);

        // We only use offset if size > 4
        if (uiCBWithNull > 4)
            *pcbOffsetSize += uiCBWithNull;

        if (pcbCount)
            *pcbCount = uiCBWithNull;
    }
    else
        *pcInactiveMetadata += 1;
}

void CalcMetadataSizeUI2(const DPKPROPVARIANT var,
                         U16 *pcInactiveMetadata,
                         U32 *pcbMetadataSize)
{
    UNREFERENCED_PARAMETER( pcbMetadataSize );
    if (DPKVT_EMPTY != var.vt)
    {
        assert(DPKVT_UI2 == var.vt);
        // This is a single UI2, so it will not be written via offset, but rather as value
    }
    else
        *pcInactiveMetadata += 1;
}

void CalcMetadataSizeUI4(const DPKPROPVARIANT var,
                         U16 *pcInactiveMetadata,
                         U32 *pcbContainer)
{
    UNREFERENCED_PARAMETER( pcbContainer );
    if (DPKVT_EMPTY != var.vt)
    {
        assert(DPKVT_UI4 == var.vt);
        // This is a single UI4, so it will not be written via offset, but rather as value
    }
    else
        *pcInactiveMetadata += 1;
}

ERR CalcMetadataOffsetSize(PKImageEncode* pIE,
                           U16 *pcInactiveMetadata,
                           U32 *pcbMetadataSize)
{
    ERR err = WMP_errSuccess;

    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarImageDescription, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarCameraMake, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarCameraModel, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarSoftware, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarDateTime, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarArtist, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarCopyright, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeUI2(pIE->sDescMetadata.pvarRatingStars, pcInactiveMetadata, pcbMetadataSize);
    CalcMetadataSizeUI2(pIE->sDescMetadata.pvarRatingValue, pcInactiveMetadata, pcbMetadataSize);
    CalcMetadataSizeLPWSTR(pIE->sDescMetadata.pvarCaption, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarDocumentName, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarPageName, pcInactiveMetadata, pcbMetadataSize, NULL);
    CalcMetadataSizeUI4(pIE->sDescMetadata.pvarPageNumber, pcInactiveMetadata, pcbMetadataSize);
    CalcMetadataSizeLPSTR(pIE->sDescMetadata.pvarHostComputer, pcInactiveMetadata, pcbMetadataSize, NULL);

    return err;
}


ERR CopyDescMetadata(DPKPROPVARIANT *pvarDst,
                     const DPKPROPVARIANT varSrc)
{
    ERR err = WMP_errSuccess;
    size_t  uiSize;

    pvarDst->vt = varSrc.vt;
    switch (varSrc.vt)
    {
        case DPKVT_LPSTR:
            pvarDst->vt = DPKVT_LPSTR;
            uiSize = strlen(varSrc.VT.pszVal) + 1;
            Call(PKAlloc((void **) &pvarDst->VT.pszVal, uiSize));
            memcpy(pvarDst->VT.pszVal, varSrc.VT.pszVal, uiSize);
            break;
            
        case DPKVT_LPWSTR:
            pvarDst->vt = DPKVT_LPWSTR;
            uiSize = sizeof(U16) * (wcslen((wchar_t *) varSrc.VT.pwszVal) + 1); // +1 for NULL term
            Call(PKAlloc((void **) &pvarDst->VT.pszVal, uiSize));
            memcpy(pvarDst->VT.pwszVal, varSrc.VT.pwszVal, uiSize);
            break;

        case DPKVT_UI2:
            pvarDst->VT.uiVal = varSrc.VT.uiVal;
            break;

        case DPKVT_UI4:
            pvarDst->VT.ulVal = varSrc.VT.ulVal;
            break;

        default:
            assert(FALSE); // This case is not handled
            FailIf(TRUE, WMP_errNotYetImplemented);

            // *** FALL THROUGH ***

        case DPKVT_EMPTY:
            memset(pvarDst, 0, sizeof(*pvarDst));
            assert(DPKVT_EMPTY == pvarDst->vt);
            break;
    }

Cleanup:
    return err;
}

src/Source/LibJXR/jxrgluelib/JXRGlueJxr.c  view on Meta::CPAN


        case DPKVT_UI2:
            CalcMetadataSizeUI2(var, &uiTemp, &uiMetadataOffsetSize);
            pwmpDE->uCount = 1;
            pwmpDE->uValueOrOffset = var.VT.uiVal;
            Call(WriteWmpDE(pWS, poffPos, pwmpDE, NULL, NULL));
            break;

        case DPKVT_UI4:
            CalcMetadataSizeUI4(var, &uiTemp, &uiMetadataOffsetSize);
            pwmpDE->uCount = 1;
            pwmpDE->uValueOrOffset = var.VT.ulVal;
            Call(WriteWmpDE(pWS, poffPos, pwmpDE, NULL, NULL));
            break;

        default:
            assert(FALSE); // This case is not handled
            FailIf(TRUE, WMP_errNotYetImplemented);
            break;
    }

    *puiCurrDescMetadataOffset += uiDataWrittenToOffset;

    // Sanity check after
    assert(*puiCurrDescMetadataOffset <= pDEMisc->uDescMetadataByteCount); // Can be equal

Cleanup:
    return err;
}



//================================================================
// PKImageEncode_WMP
//================================================================
ERR WriteContainerPre(
    PKImageEncode* pIE)
{
    ERR err = WMP_errSuccess;
    const U32 OFFSET_OF_PFD = 0x20;
    struct WMPStream* pWS = pIE->pStream;
    WmpDEMisc* pDEMisc = &pIE->WMP.wmiDEMisc;
    PKPixelInfo PI;
    size_t offPos = 0;

    U8 IIMM[2] = {'\x49', '\x49'};
    // const U32 cbWmpDEMisc = OFFSET_OF_PFD;
    U32 cbMetadataOffsetSize = 0;
    U16 cInactiveMetadata = 0;
    U32 uiCurrDescMetadataOffset = 0;

    static WmpDE wmpDEs[] =
    {
        {WMP_tagDocumentName, WMP_typASCII, 1, (U32) -1},     // Descriptive metadata
        {WMP_tagImageDescription, WMP_typASCII, 1, (U32) -1}, // Descriptive metadata
        {WMP_tagCameraMake, WMP_typASCII, 1, (U32) -1},       // Descriptive metadata
        {WMP_tagCameraModel, WMP_typASCII, 1, (U32) -1},      // Descriptive metadata
        {WMP_tagPageName, WMP_typASCII, 1, (U32) -1},         // Descriptive metadata
        {WMP_tagPageNumber, WMP_typSHORT, 2, (U32) -1},       // Descriptive metadata
        {WMP_tagSoftware, WMP_typASCII, 1, (U32) -1},         // Descriptive metadata
        {WMP_tagDateTime, WMP_typASCII, 1, (U32) -1},         // Descriptive metadata
        {WMP_tagArtist, WMP_typASCII, 1, (U32) -1},           // Descriptive metadata
        {WMP_tagHostComputer, WMP_typASCII, 1, (U32) -1},     // Descriptive metadata
        {WMP_tagRatingStars, WMP_typSHORT, 1, (U32) -1},      // Descriptive metadata
        {WMP_tagRatingValue, WMP_typSHORT, 1, (U32) -1},      // Descriptive metadata
        {WMP_tagCopyright, WMP_typASCII, 1, (U32) -1},        // Descriptive metadata
        {WMP_tagCaption, WMP_typBYTE, 1, (U32) -1},           // Descriptive metadata

        {WMP_tagXMPMetadata, WMP_typBYTE, 1, (U32) -1},
        {WMP_tagIPTCNAAMetadata, WMP_typBYTE, 1, (U32) -1},
        {WMP_tagPhotoshopMetadata, WMP_typBYTE, 1, (U32) -1},
        {WMP_tagEXIFMetadata, WMP_typLONG, 1, (U32) -1},
        {WMP_tagIccProfile, WMP_typUNDEFINED, 1, (U32) -1},
        {WMP_tagGPSInfoMetadata, WMP_typLONG, 1, (U32) -1},

        {WMP_tagPixelFormat, WMP_typBYTE, 16, (U32) -1},
        {WMP_tagTransformation, WMP_typLONG, 1, (U32) -1},
        {WMP_tagImageWidth, WMP_typLONG, 1, (U32) -1},
        {WMP_tagImageHeight, WMP_typLONG, 1, (U32) -1},
        {WMP_tagWidthResolution, WMP_typFLOAT, 1, (U32) -1},
        {WMP_tagHeightResolution, WMP_typFLOAT, 1, (U32) -1},
        {WMP_tagImageOffset, WMP_typLONG, 1, (U32) -1},
        {WMP_tagImageByteCount, WMP_typLONG, 1, (U32) -1},
        {WMP_tagAlphaOffset, WMP_typLONG, 1, (U32) -1},
        {WMP_tagAlphaByteCount, WMP_typLONG, 1, (U32) -1},
    };
    U16 cWmpDEs = sizeof(wmpDEs) / sizeof(wmpDEs[0]);
    WmpDE wmpDE = {0};
    size_t i = 0;

    U8* pbEXIFMetadata = NULL;
    U8* pbGPSInfoMetadata = NULL;

    // const unsigned char Zero[0x20] = { 0 };
    const unsigned char Zero[sizeof(struct IFDEntry) * sizeof(wmpDEs) / sizeof(wmpDEs[0]) + sizeof(U32)] = { 0 };
    assert(SizeofIFDEntry * sizeof(wmpDEs) / sizeof(wmpDEs[0]) + sizeof(U32) > 0x20);

    //================
    Call(pWS->GetPos(pWS, &offPos));
    FailIf(0 != offPos, WMP_errUnsupportedFormat);

    //================
    // Header (8 bytes)
    Call(pWS->Write(pWS, IIMM, sizeof(IIMM))); offPos += 2;
    Call(PutUShort(pWS, offPos, 0x01bc)); offPos += 2;
    Call(PutULong(pWS, offPos, (U32)OFFSET_OF_PFD)); offPos += 4;

    //================
    // Write overflow area
    pDEMisc->uOffPixelFormat = (U32)offPos;
    PI.pGUIDPixFmt = &pIE->guidPixFormat;
    PixelFormatLookup(&PI, LOOKUP_FORWARD);

    //Call(pWS->Write(pWS, PI.pGUIDPixFmt, sizeof(*PI.pGUIDPixFmt))); offPos += 16;
    /** following code is endian-agnostic **/
    {
        unsigned char *pGuid = (unsigned char *) &pIE->guidPixFormat;
        Call(PutULong(pWS, offPos, ((U32 *)pGuid)[0]));
        Call(PutUShort(pWS, offPos + 4, ((U16 *)(pGuid + 4))[0]));
        Call(PutUShort(pWS, offPos + 6, ((U16 *)(pGuid + 6))[0]));
        Call(pWS->Write(pWS, pGuid + 8, 8));

src/Source/LibJXR/jxrgluelib/JXRGlueJxr.c  view on Meta::CPAN

    if (pIE->cbEXIFMetadataByteCount > 0)
    {
        pDEMisc->uEXIFMetadataOffset = pDEMisc->uImageOffset;
        pDEMisc->uImageOffset += (pDEMisc->uImageOffset & 1);
        pDEMisc->uImageOffset += pIE->cbEXIFMetadataByteCount;
    }

    if (pIE->cbColorContext > 0)
    {
        pDEMisc->uColorProfileOffset = pDEMisc->uImageOffset;
        pDEMisc->uImageOffset += pIE->cbColorContext;
    }

    if (pIE->cbGPSInfoMetadataByteCount > 0)
    {
        pDEMisc->uGPSInfoMetadataOffset = pDEMisc->uImageOffset;
        pDEMisc->uImageOffset += (pDEMisc->uImageOffset & 1);
        pDEMisc->uImageOffset += pIE->cbGPSInfoMetadataByteCount;
    }

    Call(PutUShort(pWS, offPos, cWmpDEs)); offPos += 2;
    Call(pWS->Write(pWS, Zero, SizeofIFDEntry * cWmpDEs + sizeof(U32)));

    //================
    wmpDE = wmpDEs[i++];
    assert(WMP_tagDocumentName == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarDocumentName, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagImageDescription == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarImageDescription, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagCameraMake == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarCameraMake, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagCameraModel == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarCameraModel, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagPageName == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarPageName, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagPageNumber == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarPageNumber, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagSoftware == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarSoftware, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagDateTime == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarDateTime, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagArtist == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarArtist, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagHostComputer == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarHostComputer, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagRatingStars == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarRatingStars, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagRatingValue == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarRatingValue, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagCopyright == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarCopyright, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    wmpDE = wmpDEs[i++];
    assert(WMP_tagCaption == wmpDE.uTag);
    Call(WriteDescMetadata(pIE, pIE->sDescMetadata.pvarCaption, &wmpDE,
        &uiCurrDescMetadataOffset, &offPos));

    // XMP Metadata
    wmpDE = wmpDEs[i++];
    assert(WMP_tagXMPMetadata == wmpDE.uTag);
    if (pIE->cbXMPMetadataByteCount > 0)
    {
        U32 uiTemp;
        wmpDE.uCount = pIE->cbXMPMetadataByteCount;
        wmpDE.uValueOrOffset = pDEMisc->uXMPMetadataOffset;
        Call(WriteWmpDE(pWS, &offPos, &wmpDE, pIE->pbXMPMetadata, &uiTemp));
    }

    // IPTCNAA Metadata
    wmpDE = wmpDEs[i++];
    assert(WMP_tagIPTCNAAMetadata == wmpDE.uTag);
    if (pIE->cbIPTCNAAMetadataByteCount > 0)
    {
        U32 uiTemp;
        wmpDE.uCount = pIE->cbIPTCNAAMetadataByteCount;
        wmpDE.uValueOrOffset = pDEMisc->uIPTCNAAMetadataOffset;
        Call(WriteWmpDE(pWS, &offPos, &wmpDE, pIE->pbIPTCNAAMetadata, &uiTemp));
    }

    // Photoshop Metadata
    wmpDE = wmpDEs[i++];
    assert(WMP_tagPhotoshopMetadata == wmpDE.uTag);
    if (pIE->cbPhotoshopMetadataByteCount > 0)
    {
        U32 uiTemp;

src/Source/LibJXR/jxrgluelib/JXRGlueJxr.c  view on Meta::CPAN

    pIE->cbXMPMetadataByteCount = cbTemp;
    return ( err );

Cleanup:
    PKFree((void **) &pbTemp);
    pIE->cbXMPMetadataByteCount = 0;
    return err;
}



ERR PKImageEncode_SetEXIFMetadata_WMP(PKImageEncode *pIE, const U8 *pbEXIFMetadata, U32 cbEXIFMetadata)
{
    return SetMetadata(pIE, pbEXIFMetadata, cbEXIFMetadata,
        &pIE->pbEXIFMetadata, &pIE->cbEXIFMetadataByteCount);
}



ERR PKImageEncode_SetGPSInfoMetadata_WMP(PKImageEncode *pIE, const U8 *pbGPSInfoMetadata, U32 cbGPSInfoMetadata)
{
    return SetMetadata(pIE, pbGPSInfoMetadata, cbGPSInfoMetadata,
        &pIE->pbGPSInfoMetadata, &pIE->cbGPSInfoMetadataByteCount);
}



ERR PKImageEncode_SetIPTCNAAMetadata_WMP(PKImageEncode *pIE, const U8 *pbIPTCNAAMetadata, U32 cbIPTCNAAMetadata)
{
    return SetMetadata(pIE, pbIPTCNAAMetadata, cbIPTCNAAMetadata,
        &pIE->pbIPTCNAAMetadata, &pIE->cbIPTCNAAMetadataByteCount);
}



ERR PKImageEncode_SetPhotoshopMetadata_WMP(PKImageEncode *pIE, const U8 *pbPhotoshopMetadata, U32 cbPhotoshopMetadata)
{
    return SetMetadata(pIE, pbPhotoshopMetadata, cbPhotoshopMetadata,
        &pIE->pbPhotoshopMetadata, &pIE->cbPhotoshopMetadataByteCount);
}



ERR PKImageEncode_SetDescriptiveMetadata_WMP(PKImageEncode *pIE, const DESCRIPTIVEMETADATA *pSrcMeta)
{
    ERR                     err = WMP_errSuccess;
    DESCRIPTIVEMETADATA    *pDstMeta = &pIE->sDescMetadata;

    // Fail if the caller called us after we've already written the header out
    if (pIE->fHeaderDone)
    {
        assert(FALSE); // Message to programmer
        FailIf(TRUE, WMP_errOutOfSequence);
    }

    // Make a copy of the descriptive metadata
    Call(CopyDescMetadata(&pDstMeta->pvarImageDescription, pSrcMeta->pvarImageDescription));
    Call(CopyDescMetadata(&pDstMeta->pvarCameraMake, pSrcMeta->pvarCameraMake));
    Call(CopyDescMetadata(&pDstMeta->pvarCameraModel, pSrcMeta->pvarCameraModel));
    Call(CopyDescMetadata(&pDstMeta->pvarSoftware, pSrcMeta->pvarSoftware));
    Call(CopyDescMetadata(&pDstMeta->pvarDateTime, pSrcMeta->pvarDateTime));
    Call(CopyDescMetadata(&pDstMeta->pvarArtist, pSrcMeta->pvarArtist));
    Call(CopyDescMetadata(&pDstMeta->pvarCopyright, pSrcMeta->pvarCopyright));
    Call(CopyDescMetadata(&pDstMeta->pvarRatingStars, pSrcMeta->pvarRatingStars));
    Call(CopyDescMetadata(&pDstMeta->pvarRatingValue, pSrcMeta->pvarRatingValue));
    Call(CopyDescMetadata(&pDstMeta->pvarCaption, pSrcMeta->pvarCaption));
    Call(CopyDescMetadata(&pDstMeta->pvarDocumentName, pSrcMeta->pvarDocumentName));
    Call(CopyDescMetadata(&pDstMeta->pvarPageName, pSrcMeta->pvarPageName));
    Call(CopyDescMetadata(&pDstMeta->pvarPageNumber, pSrcMeta->pvarPageNumber));
    Call(CopyDescMetadata(&pDstMeta->pvarHostComputer, pSrcMeta->pvarHostComputer));

Cleanup:
    return err;
}



ERR PKImageEncode_WritePixels_WMP(
    PKImageEncode* pIE,
    U32 cLine,
    U8* pbPixels,
    U32 cbStride)
{
    ERR err = WMP_errSuccess;
    // U32 i = 0;
    PKPixelInfo PI;

    // Performing non-banded encode
    assert(BANDEDENCSTATE_UNINITIALIZED == pIE->WMP.eBandedEncState);
    pIE->WMP.eBandedEncState = BANDEDENCSTATE_NONBANDEDENCODE;

    PI.pGUIDPixFmt = &pIE->guidPixFormat;
    PixelFormatLookup(&PI, LOOKUP_FORWARD);
    pIE->WMP.bHasAlpha = !!(PI.grBit & PK_pixfmtHasAlpha);

    if (!pIE->fHeaderDone)
    {
        // write metadata
        Call(WriteContainerPre(pIE));

        pIE->fHeaderDone = !FALSE;
    }

/*    if (pIE->WMP.bHasAlpha && pIE->WMP.wmiSCP.uAlphaMode == 2){
        pIE->WMP.wmiSCP_Alpha = pIE->WMP.wmiSCP;
    }
*/
    Call(PKImageEncode_EncodeContent(pIE, PI, cLine, pbPixels, cbStride));
    if (pIE->WMP.bHasAlpha && pIE->WMP.wmiSCP.uAlphaMode == 2){//planar alpha
        Call(PKImageEncode_EncodeAlpha(pIE, PI, cLine, pbPixels, cbStride));
    }
    
    Call(WriteContainerPost(pIE));

Cleanup:
    return err;
}


ERR PKImageEncode_WritePixelsBandedBegin_WMP(PKImageEncode* pIE, struct WMPStream *pPATempFile)
{

src/Source/LibJXR/jxrgluelib/JXRGlueJxr.c  view on Meta::CPAN


        // Cue the stream to alpha block
        assert(pID->WMP.wmiDEMisc.uAlphaOffset > 0);
        Call(pWSDec->SetPos(pWSDec, pID->WMP.wmiDEMisc.uAlphaOffset));

        FailIf(ICERR_OK != WMPhotoTranscode(pWSDec, pWSEnc, &tcParamAlpha), WMP_errFail);
        Call(pIE->pStream->GetPos(pIE->pStream, &offPos));
        pIE->WMP.nCbAlpha = (Long)offPos - pIE->WMP.nOffAlpha;
    }

    // fixup matadata
    Call(WriteContainerPost(pIE));

Cleanup:
    return err;
}

ERR PKImageEncode_CreateNewFrame_WMP(
    PKImageEncode* pIE,
    void* pvParam,
    size_t cbParam)
{
    ERR err = WMP_errSuccess;

    UNREFERENCED_PARAMETER( pIE );
    UNREFERENCED_PARAMETER( pvParam );
    UNREFERENCED_PARAMETER( cbParam );

    Call(WMP_errNotYetImplemented);
    
Cleanup:
    return err;
}

ERR PKImageEncode_Release_WMP(
    PKImageEncode** ppIE)
{
    ERR err = WMP_errSuccess;

    PKImageEncode *pIE = *ppIE;
    pIE->pStream->Close(&pIE->pStream);

    PKFree((void **) &pIE->pbColorContext);
    pIE->cbColorContext = 0;
    PKFree((void **) &pIE->pbXMPMetadata);
    pIE->cbXMPMetadataByteCount = 0;
    PKFree((void **) &pIE->pbEXIFMetadata);
    pIE->cbEXIFMetadataByteCount = 0;
    PKFree((void **) &pIE->pbGPSInfoMetadata);
    pIE->cbGPSInfoMetadataByteCount = 0;
    PKFree((void **) &pIE->pbIPTCNAAMetadata);
    pIE->cbIPTCNAAMetadataByteCount = 0;
    PKFree((void **) &pIE->pbPhotoshopMetadata);
    pIE->cbPhotoshopMetadataByteCount = 0;

    // Free descriptive metadata
    FreeDescMetadata(&pIE->sDescMetadata.pvarImageDescription);
    FreeDescMetadata(&pIE->sDescMetadata.pvarCameraMake);
    FreeDescMetadata(&pIE->sDescMetadata.pvarCameraModel);
    FreeDescMetadata(&pIE->sDescMetadata.pvarSoftware);
    FreeDescMetadata(&pIE->sDescMetadata.pvarDateTime);
    FreeDescMetadata(&pIE->sDescMetadata.pvarArtist);
    FreeDescMetadata(&pIE->sDescMetadata.pvarCopyright);
    FreeDescMetadata(&pIE->sDescMetadata.pvarRatingStars);
    FreeDescMetadata(&pIE->sDescMetadata.pvarRatingValue);
    FreeDescMetadata(&pIE->sDescMetadata.pvarCaption);
    FreeDescMetadata(&pIE->sDescMetadata.pvarDocumentName);
    FreeDescMetadata(&pIE->sDescMetadata.pvarPageName);
    FreeDescMetadata(&pIE->sDescMetadata.pvarPageNumber);
    FreeDescMetadata(&pIE->sDescMetadata.pvarHostComputer);

    Call(PKFree((void **) ppIE));

Cleanup:
    return err;
}

//----------------------------------------------------------------
ERR PKImageEncode_Create_WMP(PKImageEncode** ppIE)
{
    ERR err = WMP_errSuccess;

    PKImageEncode* pIE = NULL;

    Call(PKImageEncode_Create(ppIE));

    pIE = *ppIE;
    pIE->Initialize = PKImageEncode_Initialize_WMP;
    pIE->Terminate = PKImageEncode_Terminate_WMP;
    pIE->SetColorContext = PKImageEncode_SetColorContext_WMP;
    pIE->SetDescriptiveMetadata = PKImageEncode_SetDescriptiveMetadata_WMP;
    pIE->WritePixels = PKImageEncode_WritePixels_WMP;

    pIE->WritePixelsBandedBegin = PKImageEncode_WritePixelsBandedBegin_WMP;
    pIE->WritePixelsBanded = PKImageEncode_WritePixelsBanded_WMP;
    pIE->WritePixelsBandedEnd = PKImageEncode_WritePixelsBandedEnd_WMP;

    pIE->Transcode = PKImageEncode_Transcode_WMP;
    pIE->CreateNewFrame = PKImageEncode_CreateNewFrame_WMP;
    pIE->Release = PKImageEncode_Release_WMP;
	pIE->bWMP = TRUE; 

Cleanup:
    return err;
}


//================================================================
// PKImageDecode_WMP
//================================================================
ERR ParsePFDEntry(
    PKImageDecode* pID,
    U16 uTag,
    U16 uType,
    U32 uCount,
    U32 uValue)
{
    ERR err = WMP_errSuccess;
    ERR errTmp = WMP_errSuccess;
    PKPixelInfo PI;
    struct WMPStream* pWS = pID->pStream;

src/Source/LibJXR/jxrgluelib/JXRGlueJxr.c  view on Meta::CPAN

            pID->WMP.wmiDEMisc.uColorProfileByteCount = uCount;
            pID->WMP.wmiDEMisc.uColorProfileOffset = uValue;
            break;

        case WMP_tagXMPMetadata:
            pID->WMP.wmiDEMisc.uXMPMetadataByteCount = uCount;
            pID->WMP.wmiDEMisc.uXMPMetadataOffset = uValue;
            break;

        case WMP_tagEXIFMetadata:
            pID->WMP.wmiDEMisc.uEXIFMetadataOffset = uValue;
            CallIgnoreError(errTmp, StreamCalcIFDSize(pWS, uValue, &pID->WMP.wmiDEMisc.uEXIFMetadataByteCount));
            break;

        case WMP_tagGPSInfoMetadata:
            pID->WMP.wmiDEMisc.uGPSInfoMetadataOffset = uValue;
            CallIgnoreError(errTmp, StreamCalcIFDSize(pWS, uValue, &pID->WMP.wmiDEMisc.uGPSInfoMetadataByteCount));
            break;

        case WMP_tagIPTCNAAMetadata:
            pID->WMP.wmiDEMisc.uIPTCNAAMetadataByteCount = uCount;
            pID->WMP.wmiDEMisc.uIPTCNAAMetadataOffset = uValue;
            break;

        case WMP_tagPhotoshopMetadata:
            pID->WMP.wmiDEMisc.uPhotoshopMetadataByteCount = uCount;
            pID->WMP.wmiDEMisc.uPhotoshopMetadataOffset = uValue;
            break;

        case WMP_tagCompression:
        case WMP_tagImageType:
        case WMP_tagImageDataDiscard:
        case WMP_tagAlphaDataDiscard:
            break;

        // Descriptive Metadata
        case WMP_tagImageDescription:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarImageDescription));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarImageDescription.vt);
            break;

        case WMP_tagCameraMake:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarCameraMake));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarCameraMake.vt);
            break;

        case WMP_tagCameraModel:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarCameraModel));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarCameraModel.vt);
            break;

        case WMP_tagSoftware:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarSoftware));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarSoftware.vt);
            break;

        case WMP_tagDateTime:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarDateTime));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarDateTime.vt);
            break;

        case WMP_tagArtist:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarArtist));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarArtist.vt);
            break;

        case WMP_tagCopyright:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarCopyright));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarCopyright.vt);
            break;

        case WMP_tagRatingStars:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarRatingStars));
            assert(DPKVT_UI2 == pID->WMP.sDescMetadata.pvarRatingStars.vt);
            break;

        case WMP_tagRatingValue:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarRatingValue));
            assert(DPKVT_UI2 == pID->WMP.sDescMetadata.pvarRatingValue.vt);
            break;

        case WMP_tagCaption:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarCaption));
            assert((DPKVT_BYREF | DPKVT_UI1) == pID->WMP.sDescMetadata.pvarCaption.vt);

            // Change type from C-style byte array to LPWSTR
            assert((U8*)pID->WMP.sDescMetadata.pvarCaption.VT.pwszVal ==
                pID->WMP.sDescMetadata.pvarCaption.VT.pbVal);
            assert(0 == pID->WMP.sDescMetadata.pvarCaption.VT.pwszVal[uCount/sizeof(U16) - 1]); // Confirm null-term
            //  make sure null term (ReadPropvar allocated enough space for this)
            pID->WMP.sDescMetadata.pvarCaption.VT.pwszVal[uCount/sizeof(U16)] = 0;
            pID->WMP.sDescMetadata.pvarCaption.vt = DPKVT_LPWSTR;
            break;

        case WMP_tagDocumentName:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarDocumentName));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarDocumentName.vt);
            break;

        case WMP_tagPageName:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarPageName));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarPageName.vt);
            break;

        case WMP_tagPageNumber:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,
                &pID->WMP.sDescMetadata.pvarPageNumber));
            assert(DPKVT_UI4 == pID->WMP.sDescMetadata.pvarPageNumber.vt);
            break;

        case WMP_tagHostComputer:
            CallIgnoreError(errTmp, ReadPropvar(pWS, uType, uCount, uValue,

src/Source/LibJXR/jxrgluelib/JXRGlueJxr.c  view on Meta::CPAN



ERR PKImageDecode_GetMetadata_WMP(PKImageDecode *pID, U32 uOffset, U32 uByteCount, U8 *pbGot, U32 *pcbGot)
{
    ERR err = WMP_errSuccess;

    if (pbGot && uOffset)
    {
        struct WMPStream* pWS = pID->pStream;
        size_t iCurrPos;

        FailIf(*pcbGot < uByteCount, WMP_errBufferOverflow);
        Call(pWS->GetPos(pWS, &iCurrPos));
        Call(pWS->SetPos(pWS, uOffset));
        Call(pWS->Read(pWS, pbGot, uByteCount));
        Call(pWS->SetPos(pWS, iCurrPos));
    }

Cleanup:
    if (Failed(err))
        *pcbGot = 0;
    else
        *pcbGot = uByteCount;

    return err;
}



ERR PKImageDecode_GetColorContext_WMP(PKImageDecode *pID, U8 *pbColorContext, U32 *pcbColorContext)
{
    return PKImageDecode_GetMetadata_WMP(pID, pID->WMP.wmiDEMisc.uColorProfileOffset,
        pID->WMP.wmiDEMisc.uColorProfileByteCount, pbColorContext, pcbColorContext);
}



ERR PKImageDecode_GetDescriptiveMetadata_WMP(PKImageDecode *pID, DESCRIPTIVEMETADATA *pDescMetadata)
{
    ERR err = WMP_errSuccess;
    *pDescMetadata = pID->WMP.sDescMetadata;
    return err;
}


ERR PKImageDecode_Release_WMP(PKImageDecode** ppID)
{
    ERR             err = WMP_errSuccess;
    PKImageDecode  *pID;

    if (NULL == ppID)
        goto Cleanup;

    pID = *ppID;

    // Free descriptive metadata
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarImageDescription);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarCameraMake);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarCameraModel);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarSoftware);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarDateTime);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarArtist);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarCopyright);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarRatingStars);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarRatingValue);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarCaption);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarDocumentName);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarPageName);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarPageNumber);
    FreeDescMetadata(&pID->WMP.sDescMetadata.pvarHostComputer);

    // Release base class
    Call(PKImageDecode_Release(ppID));

Cleanup:
    return err;
}



ERR PKImageDecode_Create_WMP(PKImageDecode** ppID)
{
    ERR err = WMP_errSuccess;
    PKImageDecode* pID = NULL;

    Call(PKImageDecode_Create(ppID));

    pID = *ppID;
    pID->Initialize = PKImageDecode_Initialize_WMP;
    pID->GetSize = PKImageDecode_GetSize_WMP;
    pID->GetRawStream = PKImageDecode_GetRawStream_WMP;
    pID->Copy = PKImageDecode_Copy_WMP;
    pID->GetColorContext = PKImageDecode_GetColorContext_WMP;
    pID->GetDescriptiveMetadata = PKImageDecode_GetDescriptiveMetadata_WMP;
    pID->Release = PKImageDecode_Release_WMP;

Cleanup:
    return err;
}



( run in 0.357 second using v1.01-cache-2.11-cpan-5623c5533a1 )