#include PerspectiveWarp::PerspectiveWarp(WORD width,WORD height,UHUGE *hpImageInvert,double wRow,double wCol) : mWidth(width), mHeight(height),mwRow(wRow), mwCol(wCol), mhpImageInvert(hpImageInvert), mWarpType(None), mIsInThread(TRUE) { } PerspectiveWarp::PerspectiveWarp(WORD width,WORD height,double wRow,double wCol,Operation colOp,double colIncr,Operation rowOp,double rowIncr,UHUGE *hpImageInvert) : mWidth(width), mHeight(height), mwRow(wRow), mwCol(wCol), mColOp(colOp), mColIncr(colIncr), mRowOp(rowOp), mRowIncr(rowIncr), mhpImageInvert(hpImageInvert), mWarpType(Incremental), mIsInThread(TRUE) { } PerspectiveWarp::~PerspectiveWarp() { } HGLOBAL PerspectiveWarp::performPerspectiveWarp(void) { if(Incremental==mWarpType)return incrementalWarp(); return nonIncrementalWarp(); } HGLOBAL PerspectiveWarp::incrementalWarp(void) { int maxCol, maxRow; double newRow, newCol, tempColFactor, tempRowFactor; LONG rowMult, colMult, row, col; HGLOBAL hGlobal, hGlobalTemp, hGlobalSource; UHUGE *ptr; UHUGE *ptrSource; maxCol=maxRow=0L; hGlobalSource=Main::upsideDown(mWidth,mHeight,mhpImageInvert); ptrSource=(UHUGE*)::GlobalLock(hGlobalSource); hGlobal=::GlobalAlloc(GMEM_FIXED,(LONG)mHeight*(LONG)mWidth); ptr=(UHUGE*)::GlobalLock(hGlobal); Main::hmemset(ptr,0,(LONG)mHeight*(LONG)mWidth); tempRowFactor=mwRow; for(row=0;rowmaxRow)maxRow=(int)newRow; if(newCol>maxCol)maxCol=(int)newCol; if(Add==mColOp)mwCol+=mColIncr; else if(Subtract==mColOp)mwCol=(mwCol-mColIncr<0?0:mwCol-mColIncr); else if(Multiply==mColOp)mwCol*=mColIncr; else mwCol/=(mColIncr?mColIncr:1); if(!yieldTask())return (HGLOBAL)emergencyCleanup(hGlobalSource,hGlobal); } mwCol=tempColFactor; if(Add==mRowOp)mwRow+=mRowIncr; else if(Subtract==mRowOp)mwRow=(mwRow-mRowIncr<0?0:mwRow-mRowIncr); else if(Multiply==mRowOp)mwRow*=mRowIncr; else mwRow/=(mRowIncr?mRowIncr:1); } rowMult=(mHeight/(maxRow?maxRow:1)); colMult=(mWidth/(maxCol?maxCol:1)); mwRow=tempRowFactor; for(row=0;row=(LONG)mWidth*(LONG)mHeight) continue; *(ptr+((LONG)newRow*(LONG)mWidth)+(LONG)newCol)= *(ptrSource+(row*(LONG)mWidth)+col); if(Add==mColOp)mwCol+=mColIncr; else if(Subtract==mColOp)mwCol=(mwCol-mColIncr<0?0:mwCol-mColIncr); else if(Multiply==mColOp)mwCol*=mColIncr; else mwCol/=(mColIncr?mColIncr:1); if(!yieldTask())return (HGLOBAL)emergencyCleanup(hGlobalSource,hGlobal); } mwCol=tempColFactor; if(Add==mRowOp)mwRow+=mRowIncr; else if(Subtract==mRowOp)mwRow=(mwRow-mRowIncr<0?0:mwRow-mRowIncr); else if(Multiply==mRowOp)mwRow*=mRowIncr; else mwRow/=(mRowIncr?mRowIncr:1); } ::GlobalUnlock(hGlobalSource); ::GlobalFree(hGlobalSource); hGlobalTemp=Main::upsideDown(mWidth,mHeight,ptr); ::GlobalUnlock(hGlobal); ::GlobalFree(hGlobal); return hGlobalTemp; } HGLOBAL PerspectiveWarp::nonIncrementalWarp(void) { int maxCol, maxRow; double newRow, newCol; LONG rowMult, colMult, row, col; HGLOBAL hGlobal, hGlobalTemp, hGlobalSource; UHUGE *ptr; UHUGE *ptrSource; maxCol=maxRow=0L; hGlobalSource=Main::upsideDown(mWidth,mHeight,mhpImageInvert); ptrSource=(UHUGE*)::GlobalLock(hGlobalSource); hGlobal=::GlobalAlloc(GMEM_FIXED,(LONG)mHeight*(LONG)mWidth); ptr=(UHUGE*)::GlobalLock(hGlobal); Main::hmemset(ptr,0,(LONG)mHeight*(LONG)mWidth); for(row=0;rowmaxRow)maxRow=(int)newRow; if(newCol>maxCol)maxCol=(int)newCol; if(!yieldTask())return (HGLOBAL)emergencyCleanup(hGlobalSource,hGlobal); } } rowMult=(mHeight/(maxRow?maxRow:1)); colMult=(mWidth/(maxCol?maxCol:1)); for(row=0;row=(LONG)mWidth*(LONG)mHeight) continue; *(ptr+((LONG)newRow*(LONG)mWidth)+(LONG)newCol)= *(ptrSource+(row*(LONG)mWidth)+col); if(!yieldTask())return (HGLOBAL)emergencyCleanup(hGlobalSource,hGlobal); } } ::GlobalUnlock(hGlobalSource); ::GlobalFree(hGlobalSource); hGlobalTemp=Main::upsideDown(mWidth,mHeight,ptr); ::GlobalUnlock(hGlobal); ::GlobalFree(hGlobal); return hGlobalTemp; } WORD PerspectiveWarp::yieldTask(void)const { MSG msg; while(::PeekMessage((MSG far *)&msg,0,0,0,PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } return mIsInThread; } WORD PerspectiveWarp::emergencyCleanup(HGLOBAL hGlobalSource,HGLOBAL hGlobal)const { ::GlobalUnlock(hGlobalSource); ::GlobalFree(hGlobalSource); ::GlobalUnlock(hGlobal); ::GlobalFree(hGlobal); return FALSE; }