#include #include #include #include #include #include using namespace::std; struct D_point3Channel{ float data[3]; float z; }; int main(int argc, char *argv[]){ if (argc != 4 ) { fprintf(stderr, "ex: in1.tex in2.tex result.tex\n"); exit(1); } DtexCache *inCache1, *inCache2, *outCache, *tmpCache; inCache1 = DtexCreateCache(512, NULL); inCache2 = DtexCreateCache(512, NULL); outCache = DtexCreateCache(512, NULL); tmpCache = DtexCreateCache(512, NULL); char *inName1, *inName2, *outName, *tmpName; inName1 = argv[argc - 3]; inName2 = argv[argc - 2]; outName = argv[argc - 1]; tmpName = "DtexTmp.tex"; DtexFile *inFile1, *inFile2, *outFile, *tmpFile; DtexCreateFile(outName, outCache, &outFile); DtexCreateFile(tmpName, tmpCache, &tmpFile); DtexOpenFile(inName1,"rb",inCache1,&inFile1); DtexOpenFile(inName2,"rb",inCache2,&inFile2); DtexImage *inImage1, *inImage2, *outImage, *tmpImage; DtexGetImageByIndex(inFile1,0,&inImage1); DtexGetImageByIndex(inFile2,0,&inImage2); float out_NP[16], out_Nl[16], tmp_NP[16], tmp_Nl[16]; DtexNP(inImage1, out_NP); DtexNl(inImage1, out_Nl); DtexNP(inImage1, tmp_NP); DtexNl(inImage1, tmp_Nl); DtexAddImage(outFile, DtexImageName(inImage1), DtexNumChan(inImage1), DtexWidth(inImage1), DtexHeight(inImage1), DtexTileWidth(inImage1), DtexTileHeight(inImage1), out_NP, out_Nl, DtexGetCompression(inImage1), DtexGetDataType(inImage1), &outImage); DtexAddImage(tmpFile, DtexImageName(inImage1), DtexNumChan(inImage1), DtexWidth(inImage1), DtexHeight(inImage1), DtexTileWidth(inImage1), DtexTileHeight(inImage1), tmp_NP, tmp_Nl, DtexGetCompression(inImage1), DtexGetDataType(inImage1), &tmpImage); //setup invariants int width,height,nChannels; width = DtexWidth(inImage1); height = DtexHeight(inImage1); nChannels = DtexNumChan(inImage1); float *inData1, *inData2, *outData, *tmpData; inData1 = (float*) malloc(nChannels * 4 * sizeof(float)); inData2 = inData1 + nChannels; outData = inData1 + nChannels + nChannels; tmpData = inData1 + nChannels + nChannels + nChannels; DtexPixel *inPixel1,*inPixel2,*outPixel,*tmpPixel; inPixel1 = DtexMakePixel(nChannels); inPixel2 = DtexMakePixel(nChannels); outPixel = DtexMakePixel(nChannels); tmpPixel = DtexMakePixel(nChannels); int x,y; for(y = 0 ; y < height ; ++y){ for(x = 0 ; x < width ; ++x){ DtexClearPixel(outPixel, nChannels); DtexClearPixel(tmpPixel, nChannels); DtexGetPixel(inImage1,x,y,inPixel1); DtexGetPixel(inImage2,x,y,inPixel2); int nInPoints1 = DtexPixelGetNumPoints(inPixel1); int nInPoints2 = DtexPixelGetNumPoints(inPixel2); D_point3Channel *point1,*point2; point1 = (D_point3Channel *)malloc(sizeof(D_point3Channel)*nInPoints1); point2 = (D_point3Channel *)malloc(sizeof(D_point3Channel)*nInPoints2); int n1=0; int n2=0; while(n1 < nInPoints1){ float z1; DtexPixelGetPoint(inPixel1,n1,&z1,inData1); point1[n1].data[0] = inData1[0]; point1[n1].data[1] = inData1[1]; point1[n1].data[2] = inData1[2]; point1[n1].z = z1; n1++; } while(n2 < nInPoints2){ float z2; DtexPixelGetPoint(inPixel2,n2,&z2,inData2); point2[n2].data[0] = inData2[0]; point2[n2].data[1] = inData2[1]; point2[n2].data[2] = inData2[2]; point2[n2].z = z2; n2++; } int n = 0; float minDataR = 1; while(n < nInPoints1){ DtexAppendPixel(tmpPixel,point1[n].z, n, point1[n].data, 0); float tmpZ; if(point1[n].data[0] < minDataR){ minDataR = point1[n].data[0]; } n++; } if(minDataR > 0){ n = 0; while(n < nInPoints2){ point2[n].data[0] *= minDataR; point2[n].data[1] *= minDataR; point2[n].data[2] *= minDataR; DtexAppendPixel(tmpPixel,point2[n].z, n, point2[n].data, 0); n++; } } free(point1);free(point2); DtexFinishPixel(tmpPixel); DtexSetPixel(outImage,x,y,tmpPixel); } } DtexDestroyPixel(inPixel1); DtexDestroyPixel(inPixel2); DtexDestroyPixel(outPixel); DtexDestroyPixel(tmpPixel); DtexClose(inFile1); DtexClose(inFile2); DtexClose(outFile); DtexClose(tmpFile); cout << "****" << inName1 << " " << inName2 << " " << outName << endl ; cout<< "done"<