Alien-FreeImage

 view release on metacpan or  search on metacpan

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

    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);

    Call(GetUShort(pWS, offPos, &uWmpID)); offPos += 2;
    FailIf(WMP_valWMPhotoID != (0x00FF & uWmpID), WMP_errUnsupportedFormat);

    // We accept version 00 and version 01 bitstreams - all others rejected
    bVersion = (0xFF00 & uWmpID) >> 8;
    FailIf(bVersion != 0 && bVersion != 1, WMP_errUnsupportedFormat);

    Call(GetULong(pWS, offPos, &offPFD)); offPos += 4;

    //================================
    // PFD
    offPos = (size_t)offPFD;
    Call(GetUShort(pWS, offPos, &cPFDEntry)); offPos += 2;
    FailIf(0 == cPFDEntry || USHRT_MAX == cPFDEntry, WMP_errUnsupportedFormat);
    Call(ParsePFD(pID, offPos, cPFDEntry));

    //================================
    Call(pWS->SetPos(pWS, pID->WMP.wmiDEMisc.uImageOffset));

Cleanup:
    return err;
}


//================================================
ERR PKImageDecode_Initialize_WMP(
    PKImageDecode* pID,
    struct WMPStream* pWS)
{
    ERR err = WMP_errSuccess;

    CWMImageInfo* pII = NULL;

    //================================
    Call(PKImageDecode_Initialize(pID, pWS));

    //================================
    Call(ReadContainer(pID));

    //================================
    pID->WMP.wmiSCP.pWStream = pWS;
    pID->WMP.DecoderCurrMBRow = 0;
    pID->WMP.cLinesDecoded = 0;
    pID->WMP.cLinesCropped = 0;
    pID->WMP.fFirstNonZeroDecode = FALSE;

    FailIf(ICERR_OK != ImageStrDecGetInfo(&pID->WMP.wmiI, &pID->WMP.wmiSCP), WMP_errFail);
    assert(Y_ONLY <= pID->WMP.wmiSCP.cfColorFormat && pID->WMP.wmiSCP.cfColorFormat < CFT_MAX);
    assert(BD_SHORT == pID->WMP.wmiSCP.bdBitDepth || BD_LONG == pID->WMP.wmiSCP.bdBitDepth);

    // If HD Photo container provided an orientation, this should override bitstream orientation
    // If container did NOT provide an orientation, force O_NONE. This is to be consistent with
    // Vista behaviour, which is to ignore bitstream orientation (only looks at container).
    if (pID->WMP.fOrientationFromContainer)
    {
        pID->WMP.wmiI.oOrientation = pID->WMP.oOrientationFromContainer;
    }
    else
    {
        // Force to O_NONE to match Vista decode behaviour
        pID->WMP.wmiI.oOrientation = O_NONE;
    }

    pII = &pID->WMP.wmiI;
    pID->uWidth = (U32)pII->cWidth;
    pID->uHeight = (U32)pII->cHeight;

Cleanup:
    return err;
}


ERR PKImageDecode_GetSize_WMP(
    PKImageDecode* pID,
    I32* piWidth,
    I32* piHeight)
{
    if (pID->WMP.wmiI.oOrientation >= O_RCW)
    {
        *piWidth = (I32)pID->uHeight;
        *piHeight = (I32)pID->uWidth;
    }
    else
    {
        *piWidth = (I32)pID->uWidth;
        *piHeight = (I32)pID->uHeight;
    }
    return WMP_errSuccess;
}


ERR PKImageDecode_GetRawStream_WMP(
    PKImageDecode* pID,
    struct WMPStream** ppWS)
{
    ERR err = WMP_errSuccess;
    struct WMPStream* pWS = pID->pStream;

    *ppWS = NULL;
    Call(pWS->SetPos(pWS, pID->WMP.wmiDEMisc.uImageOffset));
    *ppWS = pWS;

Cleanup:
    return err;
}

ERR PKImageDecode_Copy_WMP(
    PKImageDecode* pID,
    const PKRect* pRect,
    U8* pb,
    U32 cbStride)
{
    ERR err = WMP_errSuccess;



( run in 0.631 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )