#include "precomp.h" // // values that the WIA/TWAIN data source provides for capability negotation // TW_UINT16 g_VideoUnits[] = {TWUN_PIXELS}; TW_UINT16 g_VideoBitOrder[] = {TWBO_MSBFIRST}; TW_UINT16 g_VideoXferMech[] = {TWSX_NATIVE, TWSX_FILE, TWSX_MEMORY}; TW_UINT16 g_VideoPixelFlavor[] = {TWPF_CHOCOLATE}; TW_UINT16 g_VideoPlanarChunky[] = {TWPC_CHUNKY}; const TW_UINT32 NUM_VIDEOCAPDATA = 23; CAPDATA VIDEO_CAPDATA[NUM_VIDEOCAPDATA] = { // // Every source must support all five DG_CONTROL / DAT_CAPABILITY operations on: // {CAP_XFERCOUNT, TWTY_INT16, TWON_ONEVALUE, sizeof(TW_INT16), 0, 0, 0, 32767, 1, NULL, NULL }, // // Every source must support DG_CONTROL / DAT_CAPABILITY, MSG_GET on: // {CAP_SUPPORTEDCAPS, TWTY_UINT16, TWON_ARRAY, sizeof(TW_UINT16), 0, 0, 0, 0, 0, NULL, NULL }, {CAP_UICONTROLLABLE, TWTY_BOOL, TWON_ONEVALUE, sizeof(TW_BOOL), FALSE, FALSE, FALSE, FALSE, 0, NULL, NULL }, // // Sources that supply image information must support DG_CONTROL / DAT_CAPABILITY / // MSG_GET, MSG_GETCURRENT, and MSG_GETDEFAULT on: // {ICAP_COMPRESSION, TWTY_UINT16, TWON_ENUMERATION, sizeof(TW_UINT16), 0, 0, 0, 0, 0, NULL, NULL }, {ICAP_PLANARCHUNKY, TWTY_UINT16, TWON_ENUMERATION, sizeof(TW_UINT16), 0, 0, 0, 0, 0, g_VideoPlanarChunky, NULL }, {ICAP_PHYSICALHEIGHT, TWTY_UINT32, TWON_ONEVALUE, sizeof(TW_UINT32), 1024, 1024, 1024, 1024, 0, NULL, NULL }, {ICAP_PHYSICALWIDTH, TWTY_UINT32, TWON_ONEVALUE, sizeof(TW_UINT32), 1536, 1536, 1536, 1536, 0, NULL, NULL }, {ICAP_PIXELFLAVOR, TWTY_UINT16, TWON_ENUMERATION, sizeof(TW_UINT16), 0, 0, 0, 0, 0, g_VideoPixelFlavor, NULL }, // // Sources that supply image information must support DG_CONTROL / DAT_CAPABILITY / // MSG_GET, MSG_GETCURRENT, MSG_GETDEFAULT, MSG_RESET, and MSG_SET on: // {ICAP_BITDEPTH, TWTY_UINT16, TWON_ENUMERATION, sizeof(TW_UINT16), 0, 0, 0, 0, 0, NULL, NULL }, {ICAP_BITORDER, TWTY_UINT16, TWON_ENUMERATION, sizeof(TW_UINT16), 0, 0, 0, 0, 0, g_VideoBitOrder, NULL }, {ICAP_PIXELTYPE, TWTY_UINT16, TWON_ENUMERATION, sizeof(TW_UINT16), 0, 0, 0, 0, 0, NULL, NULL }, {ICAP_UNITS, TWTY_UINT16, TWON_ENUMERATION, sizeof(TW_UINT16), 0, 0, 0, 0, 0, g_VideoUnits, NULL }, {ICAP_XFERMECH, TWTY_UINT16, TWON_ENUMERATION, sizeof(TW_UINT16), 0, 0, 0, 2, 0, g_VideoXferMech, NULL }, {ICAP_XRESOLUTION, TWTY_FIX32, TWON_ONEVALUE, sizeof(TW_FIX32), 75, 75, 75, 75, 0, NULL, NULL }, {ICAP_YRESOLUTION, TWTY_FIX32, TWON_ONEVALUE, sizeof(TW_FIX32), 75, 75, 75, 75, 0, NULL, NULL }, // // The following capabilities are camera specific capabilities // {CAP_THUMBNAILSENABLED, TWTY_BOOL, TWON_ONEVALUE, sizeof(TW_BOOL), FALSE, FALSE, FALSE, FALSE, 0, NULL, NULL }, {CAP_CAMERAPREVIEWUI, TWTY_BOOL, TWON_ONEVALUE, sizeof(TW_BOOL), TRUE, TRUE, TRUE, TRUE, 0, NULL, NULL }, {ICAP_IMAGEDATASET, TWTY_UINT32, TWON_RANGE, sizeof(TW_UINT32), 1, 1, 1, 50, 1, NULL, NULL }, // // The following capabilities are provided for application compatiblity only. // {ICAP_IMAGEFILEFORMAT, TWTY_UINT16, TWON_ENUMERATION, sizeof(TW_UINT16), 0, 0, 0, 0, 0, NULL, NULL }, {CAP_INDICATORS, TWTY_BOOL, TWON_ONEVALUE, sizeof(TW_BOOL), TRUE, TRUE, TRUE, TRUE, 0, NULL, NULL }, {CAP_ENABLEDSUIONLY, TWTY_BOOL, TWON_ONEVALUE, sizeof(TW_BOOL), FALSE, FALSE, FALSE, FALSE, 0, NULL, NULL }, {CAP_DEVICEONLINE, TWTY_BOOL, TWON_ONEVALUE, sizeof(TW_BOOL), TRUE, TRUE, TRUE, TRUE, 0, NULL, NULL }, {CAP_SUPPORTEDCAPSEXT, TWTY_BOOL, TWON_ONEVALUE, sizeof(TW_BOOL), FALSE, FALSE, FALSE, FALSE, 0, NULL, NULL }, }; TW_UINT16 CWiaVideoDS::OpenDS(PTWAIN_MSG ptwMsg) { TW_UINT16 twRc = TWRC_SUCCESS; TW_UINT16 twCc = TWCC_SUCCESS; m_bArrayModeAcquisition = FALSE; m_pulImageIndexes = NULL; m_lNumValidIndexes = 0; m_lCurrentArrayIndex = 0; m_bRangeModeAcquisition = FALSE; memset(&m_twImageRange,0,sizeof(TW_RANGE)); // // create capability list // twCc = CreateCapList(NUM_VIDEOCAPDATA, VIDEO_CAPDATA); if (TWCC_SUCCESS != twCc) { m_twStatus.ConditionCode = twCc; return TWRC_FAILURE; } twRc = CWiaDataSrc::OpenDS(ptwMsg); if (TWRC_SUCCESS == twRc) { HRESULT hr = m_pDevice->AcquireImages(NULL, FALSE); if (SUCCEEDED(hr)) { // // get number of pictures taken, for IMAGEDATASET query // LONG lNumImages = 0; m_pDevice->GetNumAcquiredImages(&lNumImages); CCap *pCap = NULL; pCap = FindCap(ICAP_IMAGEDATASET); if (pCap) { pCap->Set((TW_UINT32)lNumImages,(TW_UINT32)lNumImages,(TW_UINT32)lNumImages,(TW_UINT32)lNumImages,1); } hr = m_pDevice->EnumAcquiredImage(0, &m_pCurrentIWiaItem); if (SUCCEEDED(hr)) { twRc = GetCommonSettings(); } else { // // Video capture devices, can be in a state that there are no still images // to transfer // twRc = GetCommonDefaultSettings(); } } } return twRc; } TW_UINT16 CWiaVideoDS::CloseDS(PTWAIN_MSG ptwMsg) { DestroyCapList(); return CWiaDataSrc::CloseDS(ptwMsg); } TW_UINT16 CWiaVideoDS::SetCapability(CCap *pCap,TW_CAPABILITY *ptwCap) { TW_UINT16 twRc = TWRC_SUCCESS; if (ptwCap->Cap == ICAP_IMAGEDATASET) { switch(ptwCap->ConType){ case TWON_ONEVALUE: DBG_TRC(("CWiaVideoDS::SetCapability(), setting ICAP_IMAGEDATASET to a TWON_ONEVALUE")); // // implied contiguous image transfer, from 1 to the specified TW_ONEVALUE // twRc = CWiaDataSrc::SetCapability(pCap, ptwCap); break; case TWON_RANGE: DBG_TRC(("CWiaVideoDS::SetCapability(), setting ICAP_IMAGEDATASET to a TW_RANGE")); // // contiguous image transfer, from MinValue to MaxValue TW_RANGE (using StepSize? or increment by 1?) // twRc = SetRangeOfImageIndexes(ptwCap); break; case TWON_ARRAY: DBG_TRC(("CWiaVideoDS::SetCapability(), setting ICAP_IMAGEDATASET to a TW_ARRAY")); // // image transfer with specified indexes supplied by the TWAIN application (user) // twRc = SetArrayOfImageIndexes(ptwCap); break; default: DBG_WRN(("CWiaVideoDS::SetCapability(), setting ICAP_IMAGEDATASET unknown container type (%d)",ptwCap->ConType)); break; } } else { twRc = CWiaDataSrc::SetCapability(pCap, ptwCap); if(TWRC_SUCCESS == twRc){ if(m_pCurrentIWiaItem){ twRc = CWiaDataSrc::SetCommonSettings(pCap); } } } return twRc; } TW_UINT16 CWiaVideoDS::SetArrayOfImageIndexes(TW_CAPABILITY *ptwCap) { TW_UINT16 twRc = TWRC_FAILURE; switch (ptwCap->ConType) { case TWON_ARRAY: twRc = TWRC_SUCCESS; break; default: DBG_ERR(("CWiaVideoDS::SetArrayOfImageIndexes(), invalid image index container was sent to data source.")); break; } if (TWRC_SUCCESS == twRc) { TW_ARRAY *pArray = (TW_ARRAY*)GlobalLock(ptwCap->hContainer); if (pArray) { TW_UINT32 *pUINT32Array = NULL; pUINT32Array = (TW_UINT32*)pArray->ItemList; if(pUINT32Array){ if (m_pulImageIndexes) { delete [] m_pulImageIndexes; m_pulImageIndexes = NULL; } m_lNumValidIndexes = pArray->NumItems; m_pulImageIndexes = new LONG[m_lNumValidIndexes]; if (m_pulImageIndexes) { DBG_TRC(("CWiaVideoDS::SetArrayOfImageIndexes(), number of selected images to transfer = %d",m_lNumValidIndexes)); for (int i = 0; i < m_lNumValidIndexes; i++) { // // subtract 1 from the supplied index in the application index array, because TWAIN's image index // array starts at 1 and goes to n. WIA (image) item array is zero-based. This will sync // up the indexes here, to avoid any strange calculations later on. // m_pulImageIndexes[i] = (pUINT32Array[i] - 1); DBG_TRC(("CWiaVideoDS::SetArrayOfImageIndexes(), image index copied into index array = %d",m_pulImageIndexes[i])); } } else { DBG_ERR(("CWiaVideoDS::SetArrayOfImageIndexes(), could not allocate image index array")); twRc = TWRC_FAILURE; } } else { DBG_ERR(("CWiaVideoDS::SetArrayOfImageIndexes(), could not assign TW_ARRAY pointer to TW_UINT32 pointer")); twRc = TWRC_FAILURE; } GlobalUnlock(ptwCap->hContainer); } else { DBG_ERR(("CWiaVideoDS::SetArrayOfImageIndexes(), could not LOCK the array container for write access")); twRc = TWRC_FAILURE; } } if(TWRC_SUCCESS == twRc){ m_bArrayModeAcquisition = TRUE; m_bRangeModeAcquisition = FALSE; } return twRc; } TW_UINT16 CWiaVideoDS::SetRangeOfImageIndexes(TW_CAPABILITY *ptwCap) { TW_UINT16 twRc = TWRC_FAILURE; switch (ptwCap->ConType) { case TWON_RANGE: twRc = TWRC_SUCCESS; break; default: DBG_ERR(("CWiaVideoDS::SetRangeOfImageIndexes(), invalid image index container was sent to data source.")); break; } if (TWRC_SUCCESS == twRc) { TW_RANGE *pRange = (TW_RANGE*)GlobalLock(ptwCap->hContainer); if (pRange) { m_bRangeModeAcquisition = TRUE; memcpy(&m_twImageRange,pRange,sizeof(TW_RANGE)); // // adjust values to be zero-based to match our stored item list // m_twImageRange.CurrentValue -=1; m_twImageRange.DefaultValue -=1; m_twImageRange.MaxValue-=1; m_twImageRange.MinValue-=1; DBG_TRC(("CWiaVideoDS::SetRangeOfImageIndexes(), Set to the following Range Values")); DBG_TRC(("m_twImageRange.ItemType = %d",m_twImageRange.ItemType)); DBG_TRC(("m_twImageRange.CurrentValue = %d",m_twImageRange.CurrentValue)); DBG_TRC(("m_twImageRange.DefaultValue = %d",m_twImageRange.DefaultValue)); DBG_TRC(("m_twImageRange.MaxValue = %d",m_twImageRange.MaxValue)); DBG_TRC(("m_twImageRange.MinValue = %d",m_twImageRange.MinValue)); DBG_TRC(("m_twImageRange.StepSize = %d",m_twImageRange.StepSize)); } else { DBG_ERR(("CWiaVideoDS::SetRangeOfImageIndexes(), could not assign TW_RANGE pointer to TW_RANGE pointer")); twRc = TWRC_FAILURE; } GlobalUnlock(ptwCap->hContainer); } else { DBG_ERR(("CWiaVideoDS::SetRangeOfImageIndexes(), could not LOCK the range container for read access")); twRc = TWRC_FAILURE; } if(TWRC_SUCCESS == twRc){ m_bRangeModeAcquisition = TRUE; m_bArrayModeAcquisition = FALSE; } return twRc; } TW_UINT16 CWiaVideoDS::EnableDS(TW_USERINTERFACE *pUI) { TW_UINT16 twRc = TWRC_FAILURE; if (DS_STATE_4 == GetTWAINState()) { HRESULT hr = S_OK; if (pUI->ShowUI) { // // since we were told to show UI, ignore the UI-LESS settings, and // get a new image item list from the WIA UI. // DBG_TRC(("CWiaVideoDS::EnableDS(), TWAIN UI MODE")); m_pDevice->FreeAcquiredImages(); } else { DBG_TRC(("CWiaVideoDS::EnableDS(), TWAIN UI-LESS MODE")); DBG_TRC(("CWiaVideoDS::EnableDS(), TWAIN UI MODE (FORCING UI MODE TO ON)")); pUI->ShowUI = TRUE; // force UI mode m_pDevice->FreeAcquiredImages(); } hr = m_pDevice->AcquireImages(HWND (pUI->ShowUI ? pUI->hParent : NULL), pUI->ShowUI); if (S_OK == hr) { twRc = TWRC_SUCCESS; LONG lNumImages = 0; m_pDevice->GetNumAcquiredImages(&lNumImages); if (lNumImages) { m_NumIWiaItems = (TW_UINT32)lNumImages; m_pIWiaItems = new (IWiaItem *[m_NumIWiaItems]); if (m_pIWiaItems) { hr = m_pDevice->GetAcquiredImageList(lNumImages, m_pIWiaItems, NULL); if (FAILED(hr)) { delete [] m_pIWiaItems; m_pIWiaItems = NULL; m_NumIWiaItems = 0; m_NextIWiaItemIndex = 0; m_twStatus.ConditionCode = TWCC_BUMMER; twRc = TWRC_FAILURE; } } else { m_NumIWiaItems = 0; m_twStatus.ConditionCode = TWCC_LOWMEMORY; twRc = TWRC_FAILURE; } } } else if(S_FALSE == hr) { return TWRC_CANCEL; } else { m_twStatus.ConditionCode = TWCC_OPERATIONERROR; twRc = TWRC_FAILURE; } if (TWRC_SUCCESS == twRc) { // // set current item pointer // if(m_bRangeModeAcquisition){ DBG_TRC(("CWiaVideoDS::EnableDS(), RANGE MODE")); m_pCurrentIWiaItem = m_pIWiaItems[m_twImageRange.MinValue]; m_NextIWiaItemIndex = m_twImageRange.MinValue + 1; // use Step value??? } else if(m_bArrayModeAcquisition){ DBG_TRC(("CWiaVideoDS::EnableDS(), ARRAY MODE")); m_lCurrentArrayIndex = 0; m_pCurrentIWiaItem = m_pIWiaItems[m_pulImageIndexes[m_lCurrentArrayIndex]]; if(m_lNumValidIndexes > 1){ m_NextIWiaItemIndex = m_pulImageIndexes[m_lCurrentArrayIndex + 1]; // the next index value } else { m_NextIWiaItemIndex = m_lCurrentArrayIndex; } } else { m_pCurrentIWiaItem = m_pIWiaItems[0]; m_NextIWiaItemIndex = 1; } // // set total image count // CCap *pcapXferCount = NULL; TW_UINT32 NumImages = 0; pcapXferCount = FindCap(CAP_XFERCOUNT); if (pcapXferCount) { if(m_bRangeModeAcquisition){ // only images in the specified range (zero-based) twRc = pcapXferCount->SetCurrent((m_twImageRange.MaxValue - m_twImageRange.MinValue) + 1); } else if(m_bArrayModeAcquisition){ // only selected images (zero-based) twRc = pcapXferCount->SetCurrent(m_lNumValidIndexes); } else { // all images (zero-based) twRc = pcapXferCount->SetCurrent(m_NumIWiaItems); } NumImages = pcapXferCount->GetCurrent(); } else { DBG_ERR(("CWiaVideoDS::EnableDS(), could not find CAP_XFERCOUNT in supported CAP list")); twRc = TWRC_FAILURE; } if (TWRC_SUCCESS == twRc) { // // set thumbnail count // CCap *pDataSet = NULL; pDataSet = FindCap(ICAP_IMAGEDATASET); if(pDataSet){ pDataSet->Set((TW_UINT32)NumImages,(TW_UINT32)NumImages,(TW_UINT32)NumImages,(TW_UINT32)NumImages,1); } if (m_NumIWiaItems) { // // transition to STATE_5, XferReady will transition to STATE_6 // SetTWAINState(DS_STATE_5); NotifyXferReady(); } else { NotifyCloseReq(); // // transition to STATE_5 // SetTWAINState(DS_STATE_5); } } } } return twRc; } TW_UINT16 CWiaVideoDS::OnPendingXfersMsg(PTWAIN_MSG ptwMsg) { TW_UINT16 twRc = TWRC_SUCCESS; CCap *pXferCount; pXferCount = FindCap(CAP_XFERCOUNT); if (!pXferCount) { m_twStatus.ConditionCode = TWCC_BUMMER; return TWRC_FAILURE; } twRc = TWRC_SUCCESS; switch (ptwMsg->MSG) { case MSG_GET: switch (GetTWAINState()) { case DS_STATE_4: case DS_STATE_5: case DS_STATE_6: case DS_STATE_7: ((TW_PENDINGXFERS *)ptwMsg->pData)->Count = (TW_INT16)pXferCount->GetCurrent(); DBG_TRC(("CWiaVideoDS::OnPendingXfersMsg(), MSG_GET returning %d",((TW_PENDINGXFERS *)ptwMsg->pData)->Count)); break; default: twRc = TWRC_FAILURE; m_twStatus.ConditionCode = TWCC_SEQERROR; DSError(); break; } break; case MSG_ENDXFER: if (DS_STATE_6 == GetTWAINState() || DS_STATE_7 == GetTWAINState()) { ResetMemXfer(); TW_INT32 Count = 0; Count = pXferCount->GetCurrent(); Count--; if (Count <= 0) { Count = 0; DBG_TRC(("CWiaVideoDS::OnPendingXfersMsg(), MSG_ENDXFER, 0 (no more images left to transfer)")); ((TW_PENDINGXFERS *)ptwMsg->pData)->Count = (TW_UINT16)0; // // update count now, so NotifyCoseReq can be prepared for reentry by a TWAIN application // pXferCount->SetCurrent((TW_UINT32)0); // // Transition to STATE_5 // SetTWAINState(DS_STATE_5); NotifyCloseReq(); } else { DBG_TRC(("CWiaVideoDS::OnPendingXfersMsg(), MSG_ENDXFER, %d (more images may be ready to transfer)",Count)); // // Advance to next image // if (m_bRangeModeAcquisition) { m_NextIWiaItemIndex+=1; // use Step value??? if(m_NextIWiaItemIndex <= (LONG)m_twImageRange.MaxValue){ m_pCurrentIWiaItem = m_pIWiaItems[m_NextIWiaItemIndex]; } else { DBG_ERR(("CWiaVideoDS::OnPendingXfersMsg(), MSG_ENDXFER, we are over our allowed RANGE index")); } } else if (m_bArrayModeAcquisition) { m_lCurrentArrayIndex++; // advance to next image index DBG_TRC(("CWiaVideoDS::OnPendingXfersMsg(), MSG_ENDXFER, next image index to acquire = %d",m_pulImageIndexes[m_lCurrentArrayIndex])); m_NextIWiaItemIndex = m_pulImageIndexes[m_lCurrentArrayIndex]; if(m_NextIWiaItemIndex <= m_lNumValidIndexes){ m_pCurrentIWiaItem = m_pIWiaItems[m_NextIWiaItemIndex]; } else { DBG_ERR(("CWiaVideoDS::OnPendingXfersMsg(), MSG_ENDXFER, we are over our allowed ARRAY index")); } } else { m_pCurrentIWiaItem = m_pIWiaItems[m_NextIWiaItemIndex++]; } // // Transition to STATE_6 // SetTWAINState(DS_STATE_6); ((TW_PENDINGXFERS *)ptwMsg->pData)->Count = (TW_UINT16)Count; } // // update count // pXferCount->SetCurrent((TW_UINT32)Count); } else { twRc = TWRC_FAILURE; m_twStatus.ConditionCode = TWCC_SEQERROR; DSError(); } break; case MSG_RESET: if (DS_STATE_6 == GetTWAINState()) { ((TW_PENDINGXFERS*)ptwMsg->pData)->Count = 0; pXferCount->SetCurrent((TW_UINT32)0); ResetMemXfer(); // // Transition to STATE_5 // SetTWAINState(DS_STATE_5); } else { twRc = TWRC_FAILURE; m_twStatus.ConditionCode = TWCC_SEQERROR; DSError(); } break; default: twRc = TWRC_FAILURE; m_twStatus.ConditionCode = TWCC_BADPROTOCOL; DSError(); break; } return twRc; } TW_UINT16 CWiaVideoDS::OnImageInfoMsg(PTWAIN_MSG ptwMsg) { TW_UINT16 twRc = TWRC_FAILURE; BOOL bThumbailMode = FALSE; CCap *pCap = NULL; pCap = FindCap(CAP_THUMBNAILSENABLED); if (pCap) { if (pCap->GetCurrent()) { bThumbailMode = TRUE; } } else { DBG_ERR(("CWiaVideoDS::OnImageInfoMsg(), could not get CAP_THUMBNAILSENABLED capabilty settings")); } if (bThumbailMode) { DBG_TRC(("CWiaVideoDS::OnImageInfoMsg(), Reporting Thumbnail image information")); TW_IMAGEINFO *ptwImageInfo = NULL; if (DS_STATE_6 == GetTWAINState()) { if (MSG_GET == ptwMsg->MSG) { ptwImageInfo = (TW_IMAGEINFO *)ptwMsg->pData; HRESULT hr = S_OK; hr = m_pDevice->GetThumbnailImageInfo(m_pCurrentIWiaItem, &m_MemoryTransferInfo); if (SUCCEEDED(hr)) { ptwImageInfo->ImageWidth = (TW_INT32)m_MemoryTransferInfo.mtiWidthPixels; ptwImageInfo->ImageLength = (TW_INT32)m_MemoryTransferInfo.mtiHeightPixels; ptwImageInfo->BitsPerPixel = (TW_INT16)m_MemoryTransferInfo.mtiBitsPerPixel; ptwImageInfo->SamplesPerPixel = (TW_INT16)m_MemoryTransferInfo.mtiNumChannels; ptwImageInfo->Planar = (TW_BOOL)m_MemoryTransferInfo.mtiPlanar; // // set PixelType to corresponding TWAIN pixel type // switch (m_MemoryTransferInfo.mtiDataType) { case WIA_DATA_THRESHOLD: ptwImageInfo->PixelType = TWPT_BW; break; case WIA_DATA_GRAYSCALE: ptwImageInfo->PixelType = TWPT_GRAY; break; case WIA_DATA_COLOR: default: ptwImageInfo->PixelType = TWPT_RGB; break; } // // set compression to NONE // ptwImageInfo->Compression = TWCP_NONE; // // Unit conversion....... // ptwImageInfo->XResolution = FloatToFix32((float)m_MemoryTransferInfo.mtiXResolution); ptwImageInfo->YResolution = FloatToFix32((float)m_MemoryTransferInfo.mtiYResolution); twRc = TWRC_SUCCESS; } else { m_twStatus.ConditionCode = TWCC_OPERATIONERROR; twRc = TWRC_FAILURE; } if (TWRC_SUCCESS == twRc) { DBG_TRC(("CWiaVideoDS::OnImageInfoMsg(), Reported Image Information from data source")); DBG_TRC(("XResolution = %d.%d",ptwImageInfo->XResolution.Whole,ptwImageInfo->XResolution.Frac)); DBG_TRC(("YResolution = %d.%d",ptwImageInfo->YResolution.Whole,ptwImageInfo->YResolution.Frac)); DBG_TRC(("ImageWidth = %d",ptwImageInfo->ImageWidth)); DBG_TRC(("ImageLength = %d",ptwImageInfo->ImageLength)); DBG_TRC(("SamplesPerPixel = %d",ptwImageInfo->SamplesPerPixel)); memset(ptwImageInfo->BitsPerSample,0,sizeof(ptwImageInfo->BitsPerSample)); if (ptwImageInfo->BitsPerPixel < 24) { ptwImageInfo->BitsPerSample[0] = ptwImageInfo->BitsPerPixel; } else { for (int i = 0; i < ptwImageInfo->SamplesPerPixel; i++) { ptwImageInfo->BitsPerSample[i] = (ptwImageInfo->BitsPerPixel/ptwImageInfo->SamplesPerPixel); } } // (bpp / spp) = bps DBG_TRC(("BitsPerSample = [%d],[%d],[%d],[%d],[%d],[%d],[%d],[%d]",ptwImageInfo->BitsPerSample[0], ptwImageInfo->BitsPerSample[1], ptwImageInfo->BitsPerSample[2], ptwImageInfo->BitsPerSample[3], ptwImageInfo->BitsPerSample[4], ptwImageInfo->BitsPerSample[5], ptwImageInfo->BitsPerSample[6], ptwImageInfo->BitsPerSample[7])); DBG_TRC(("BitsPerPixel = %d",ptwImageInfo->BitsPerPixel)); DBG_TRC(("Planar = %d",ptwImageInfo->Planar)); DBG_TRC(("PixelType = %d",ptwImageInfo->PixelType)); DBG_TRC(("Compression = %d",ptwImageInfo->Compression)); } } else { m_twStatus.ConditionCode = TWCC_BADPROTOCOL; twRc = TWRC_FAILURE; } } else { m_twStatus.ConditionCode = TWCC_SEQERROR; twRc = TWRC_FAILURE; } if (TWRC_SUCCESS != twRc) { DSError(); } } else { twRc = CWiaDataSrc::OnImageInfoMsg(ptwMsg); } return twRc; } TW_UINT16 CWiaVideoDS::TransferToDIB(HGLOBAL *phDIB) { TW_UINT16 twRc = TWRC_FAILURE; BOOL bThumbailMode = FALSE; CCap *pCap = NULL; pCap = FindCap(CAP_THUMBNAILSENABLED); if (pCap) { bThumbailMode = pCap->GetCurrent(); } if(bThumbailMode){ twRc = CWiaDataSrc::TransferToThumbnail(phDIB); } else { twRc = CWiaDataSrc::TransferToDIB(phDIB); } return twRc; }