Alien-FreeImage

 view release on metacpan or  search on metacpan

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

            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,
                &pID->WMP.sDescMetadata.pvarHostComputer));
            assert(DPKVT_LPSTR == pID->WMP.sDescMetadata.pvarHostComputer.vt);
            break;

        default:
            fprintf(stderr, "Unrecognized WMPTag: %d(%#x), %d, %d, %#x" CRLF,
                (int)uTag, (int)uTag, (int)uType, (int)uCount, (int)uValue);
            break;
    }

Cleanup:
    return err;
}

ERR ParsePFD(
    PKImageDecode* pID,
    size_t offPos,
    U16 cEntry)
{
    ERR err = WMP_errSuccess;
    struct WMPStream* pWS = pID->pStream;
    U16 i = 0;

    for (i = 0; i < cEntry; ++i)
    {
        U16 uTag = 0;
        U16 uType = 0;
        U32 uCount = 0;
        U32 uValue = 0;

        Call(GetUShort(pWS, offPos, &uTag)); offPos += 2;
        Call(GetUShort(pWS, offPos, &uType)); offPos += 2;
        Call(GetULong(pWS, offPos, &uCount)); offPos += 4;
        Call(GetULong(pWS, offPos, &uValue)); offPos += 4;

        Call(ParsePFDEntry(pID, uTag, uType, uCount, uValue)); 
    }

    pID->WMP.bHasAlpha = ((pID->WMP.bHasAlpha) && (pID->WMP.wmiDEMisc.uAlphaOffset != 0) && (pID->WMP.wmiDEMisc.uAlphaByteCount != 0));//has planar alpha

Cleanup:
    return err;
}

ERR ReadContainer(
    PKImageDecode* pID)
{
    ERR err = WMP_errSuccess;

    struct WMPStream* pWS = pID->pStream;
    size_t offPos = 0;

    char szSig[2] = {0};
    U16 uWmpID = 0;
    U32 offPFD = 0;
    U16 cPFDEntry = 0;
    U8 bVersion;
    
    //================================
    Call(pWS->GetPos(pWS, &offPos));
    FailIf(0 != offPos, WMP_errUnsupportedFormat);

    //================================
    // Header
    Call(pWS->Read(pWS, szSig, sizeof(szSig))); offPos += 2;
    FailIf(szSig != strstr(szSig, "II"), WMP_errUnsupportedFormat);



( run in 0.665 second using v1.01-cache-2.11-cpan-63c85eba8c4 )