#include #include #include #include #include MeshWarp::MeshWarp(HPALETTE hPalette,UHUGE *hpImage,WORD width,WORD height) : mhPalette(hPalette), mhpImage(hpImage), mWidth(width), mHeight(height), mhGlobalIntermediate(0), mhpIntermediate(0), mhGlobalImage(0), mhpGlobalImage(0), mhGlobalSource(0), mDstWidth(0), mDstHeight(0) { loadPaletteEntries(); } MeshWarp::~MeshWarp() { } HGLOBAL MeshWarp::performWarp(Vector &sourceMesh,Vector &destMesh,int meshColRows,int &newWidth,int &newHeight) { size_t size; if((size=(int)sourceMesh.size())!=destMesh.size())return (HGLOBAL)0; mSrcPairs.size(sourceMesh.size()); mDstPairs.size(destMesh.size()); for(int i=0;i &sourceMesh,Vector &destMesh,int meshColRows,int &newWidth,int &newHeight) { if(sourceMesh.size()!=destMesh.size())return (HGLOBAL)0; mSrcPairs=sourceMesh; mDstPairs=destMesh; return performWarp(newWidth,newHeight,meshColRows); } HGLOBAL MeshWarp::performWarp(int &newWidth,int &newHeight,int meshColRows) { initializeSplineColumns(mVerticalSplineSrcData,meshColRows); initializeSplineColumns(mVerticalSplineDstData,meshColRows); initializeSplineColumns(mHorizontalSplineSrcData,meshColRows); initializeSplineColumns(mHorizontalSplineDstData,meshColRows); assert(0!=(mhGlobalSource=Main::upsideDown(mWidth,mHeight,mhpImage))); mhpImage=(UHUGE *)::GlobalLock(mhGlobalSource); firstPassPhaseOne(meshColRows); firstPassPhaseTwo(); secondPassPhaseOne(meshColRows); secondPassPhaseTwo(); newWidth=(mVerticalSplineSrcData[mVerticalSplineSrcData.size()-1])[mVerticalSplineSrcData[0].size()-1].column(); newHeight=(mVerticalSplineSrcData[0])[mVerticalSplineSrcData[0].size()-1].row(); return mhGlobalImage; } void MeshWarp::firstPassPhaseOne(int columnData) { Vector resampleSrcPairs; Vector resampleDstPairs; Vector tempSrcPairs; Vector tempDstPairs; CatmullRom catmullRom; size_t resampleSize; for(int i=0;i resamplePairs; Vector tempPairs; size_t meshRows((int)mVerticalSplineSrcData[0].size()); size_t meshCols((int)mVerticalSplineSrcData.size()); UHUGE *hpSrcScanline=0; UHUGE *hpDstScanline=0; CatmullRom catmullRom; mDstWidth=(mVerticalSplineSrcData[meshCols-1])[meshRows-1].column(); mDstHeight=(mVerticalSplineSrcData[0])[meshRows-1].row(); assert(0!=(mhGlobalIntermediate=::GlobalAlloc(GMEM_FIXED,(LONG)mDstWidth*(LONG)mDstHeight))); mhpIntermediate=(UHUGE*)::GlobalLock(mhGlobalIntermediate); resamplePairs.size(mDstWidth); tempPairs.size(meshCols); for(int j=0;j resampleSrcPairs; Vector resampleDstPairs; Vector tempSrcPairs; Vector tempDstPairs; size_t resampleSize(mDstPairs[mDstPairs.size()-1].column()); CatmullRom catmullRom; resampleDstPairs.size(resampleSrcPairs.size(resampleSize)); for(int j=0;j tempPairs; Vector resamplePairs; HGLOBAL hGlobalTempOutput; HGLOBAL hGlobalTempIntermediate; HGLOBAL hGlobalOutput; UHUGE *hpOutputImage; UHUGE *hpSrcScanline; UHUGE *hpDstScanline; CatmullRom catmullRom; assert(0!=(hGlobalOutput=::GlobalAlloc(GMEM_FIXED,(LONG)mDstWidth*(LONG)mDstHeight))); hpOutputImage=(UHUGE*)::GlobalLock(hGlobalOutput); hGlobalTempOutput=Main::rotateLeft(hpOutputImage,mDstWidth,mDstHeight); ::GlobalUnlock(hGlobalOutput); ::GlobalFree(hGlobalOutput); hGlobalOutput=hGlobalTempOutput; hpOutputImage=(UHUGE*)::GlobalLock(hGlobalOutput); hGlobalTempIntermediate=Main::rotateLeft(mhpIntermediate,mDstWidth,mDstHeight); ::GlobalUnlock(mhGlobalIntermediate); ::GlobalFree(mhGlobalIntermediate); mhGlobalIntermediate=hGlobalTempIntermediate; mhpIntermediate=(UHUGE*)::GlobalLock(mhGlobalIntermediate); resamplePairs.size(mDstHeight); tempPairs.size(meshRows); for(int i=0;i &mappingPoints,UHUGE *lpSrcScanline,UHUGE *lpDstScanline,int outLen) { int u,x; float redAccumulator(0); float greenAccumulator(0); float blueAccumulator(0); float redIntensity; float greenIntensity; float blueIntensity; float inverseFactor; float inSegment; float outSegment; float inputPos[MaxLineWidth+1]; // precompute input index for each output pixel ::memset(inputPos,0,sizeof(inputPos)); for(u=x=0;x=outLen)u--; inputPos[x]=u+(double)(x-mappingPoints[u].row())/ (mappingPoints[u+1].row()-mappingPoints[u].row()); } inSegment=1.0; outSegment=inputPos[1]; inverseFactor=outSegment; for(x=u=0;x &splineData,int columnData) { splineData.size(columnData); } void MeshWarp::dumpMesh(Vector &sourceMesh,Vector &destMesh,String &fileName) { FILE *fp; size_t size; size=(int)sourceMesh.size(); fp=::fopen(fileName,"wb"); for(int i=0;i