mmserv/thumbnailengine/ImaamiSrc/DCDigitalZoom.cpp
branchRCL_3
changeset 7 709f89d8c047
parent 0 71ca22bcf22a
equal deleted inserted replaced
3:4f62049db6ac 7:709f89d8c047
   205 									 TInt aOriSizeX, TInt aOriSizeY,
   205 									 TInt aOriSizeX, TInt aOriSizeY,
   206 									 TReal aZoomX, TReal aZoomY,
   206 									 TReal aZoomX, TReal aZoomY,
   207 									 TInt allShiftX, TInt allShiftY,
   207 									 TInt allShiftX, TInt allShiftY,
   208 									 TInt newShiftX, TInt newShiftY)
   208 									 TInt newShiftX, TInt newShiftY)
   209 {
   209 {
       
   210 	// We don't waste time if request ZOOM 1x without Pan
       
   211     if(aZoomX==1 && aZoomY==1)
       
   212     {
       
   213 		if(allShiftX==0 && allShiftY==0 && newShiftX ==0 && newShiftX == 0)
       
   214   	  	{
       
   215   	  		TInt handle = aOriPtr->Handle();
       
   216   	  	        aOutPtr->Duplicate(handle);
       
   217   	  	        return;
       
   218   	  	}
       
   219   	}
   210 	TInt32
   220 	TInt32
   211 		divider,
   221 		divider,
   212 		xPos, yPos, tmpline,
   222 		xPos, yPos, tmpline,
   213 		xAver, yAver,
   223 		xAver, yAver,
   214 		xStep, yStep,
   224 		xStep, yStep,
   569 			tmpEnd = (TInt)(yRem + yAver + HALF_PIX + HALF_WEI);
   579 			tmpEnd = (TInt)(yRem + yAver + HALF_PIX + HALF_WEI);
   570 			yEndInt = (TInt32)((tmpEnd >> PIX_BITS) + yInt);
   580 			yEndInt = (TInt32)((tmpEnd >> PIX_BITS) + yInt);
   571 			yEndRem = (TUint32)(tmpEnd & REMAINDER);
   581 			yEndRem = (TUint32)(tmpEnd & REMAINDER);
   572 
   582 
   573 			//Read a new line from the source image if needed
   583 			//Read a new line from the source image if needed
   574 			while (yEndInt > LastLine && LastLine < aOriSizeY-1)
   584 			while (yEndInt > LastLine && LastLine < aOriSizeY)
   575 			{
   585 			{
   576 				LastLine++;
   586 				LastLine++;
   577 				tmpline = lines[0];
   587 				tmpline = lines[0];
   578 				lines[0] = lines[1];
   588 				lines[0] = lines[1];
   579 				lines[1] = lines[2];
   589 				lines[1] = lines[2];
   694 				// Accumulate first line
   704 				// Accumulate first line
   695 				if(yStaWei != 0)
   705 				if(yStaWei != 0)
   696 				{
   706 				{
   697 					// Line number
   707 					// Line number
   698 					if(yStaInt < 0)		   		 outFlag = 1;
   708 					if(yStaInt < 0)		   		 outFlag = 1;
   699 					else if(yStaInt >= aOriSizeY) outFlag = 1;
   709 					else if(yStaInt > aOriSizeY) outFlag = 1;
   700 					else
   710 					else
   701 					{
   711 					{
   702 						// Initialise line result
   712 						// Initialise line result
   703 						tmpB = 0;
   713 						tmpB = 0;
   704 						tmpG = 0;
   714 						tmpG = 0;
   733 								tmpR = (TInt)(tmpR + ((*(linePtrs[lines[LineNum]] + 3 * i + 2)) << WEI_BITS));
   743 								tmpR = (TInt)(tmpR + ((*(linePtrs[lines[LineNum]] + 3 * i + 2)) << WEI_BITS));
   734 							}
   744 							}
   735 						}
   745 						}
   736 
   746 
   737 						// Last pixel in first line
   747 						// Last pixel in first line
   738 						if(xEndWei != 0)
   748 						if(xEndWei != 0 && xEndInt < aOriSizeX)
   739 						{
   749 						{
   740 							// Column number
   750 							// Column number
   741 							if(xEndInt < 0)				 outFlag = 1;
   751 							if(xEndInt < 0)				 outFlag = 1;
   742 							else if(xEndInt >= aOriSizeX) outFlag = 1;
       
   743 							else
   752 							else
   744 							{
   753 							{
   745 								// Pixel weighting to line result
   754 								// Pixel weighting to line result
   746 								tmpB = (TInt)(tmpB + (*(linePtrs[lines[LineNum]] + 3 * xEndInt    )) * xEndWei);
   755 								tmpB = (TInt)(tmpB + (*(linePtrs[lines[LineNum]] + 3 * xEndInt    )) * xEndWei);
   747 								tmpG = (TInt)(tmpG + (*(linePtrs[lines[LineNum]] + 3 * xEndInt + 1)) * xEndWei);
   756 								tmpG = (TInt)(tmpG + (*(linePtrs[lines[LineNum]] + 3 * xEndInt + 1)) * xEndWei);
   760 				// Accumulate middle lines
   769 				// Accumulate middle lines
   761 				for(j = (TInt32)(yStaInt + 1); j < yEndInt; j++)
   770 				for(j = (TInt32)(yStaInt + 1); j < yEndInt; j++)
   762 				{
   771 				{
   763 					// Line number 
   772 					// Line number 
   764 					if(j < 0)			   outFlag = 1;
   773 					if(j < 0)			   outFlag = 1;
   765 					else if(j >= aOriSizeY) outFlag = 1;
   774 					else if(j > aOriSizeY) outFlag = 1;
   766 					else
   775 					else
   767 					{
   776 					{
   768 						// Initialise line result
   777 						// Initialise line result
   769 						tmpB = 0;
   778 						tmpB = 0;
   770 						tmpG = 0;
   779 						tmpG = 0;
   799 								tmpR = (TInt)(tmpR + ((*(linePtrs[lines[LineNum]] + 3 * i + 2)) << WEI_BITS));
   808 								tmpR = (TInt)(tmpR + ((*(linePtrs[lines[LineNum]] + 3 * i + 2)) << WEI_BITS));
   800 							}
   809 							}
   801 						}
   810 						}
   802 
   811 
   803 						// Last pixel in middle lines
   812 						// Last pixel in middle lines
   804 						if(xEndWei != 0)
   813 						if(xEndWei != 0 && xEndInt < aOriSizeX)
   805 						{
   814 						{
   806 							// Column number
   815 							// Column number
   807 							if(xEndInt < 0)				 outFlag = 1;
   816 							if(xEndInt < 0)				 outFlag = 1;
   808 							else if(xEndInt >= aOriSizeX) outFlag = 1;
       
   809 							else
   817 							else
   810 							{
   818 							{
   811 								// Pixel weighting to line result
   819 								// Pixel weighting to line result
   812 								tmpB = (TInt)(tmpB + (*(linePtrs[lines[LineNum]] + 3 * xEndInt    )) * xEndWei);
   820 								tmpB = (TInt)(tmpB + (*(linePtrs[lines[LineNum]] + 3 * xEndInt    )) * xEndWei);
   813 								tmpG = (TInt)(tmpG + (*(linePtrs[lines[LineNum]] + 3 * xEndInt + 1)) * xEndWei);
   821 								tmpG = (TInt)(tmpG + (*(linePtrs[lines[LineNum]] + 3 * xEndInt + 1)) * xEndWei);
   827 				// Accumulate last line
   835 				// Accumulate last line
   828 				if(yEndWei != 0)
   836 				if(yEndWei != 0)
   829 				{
   837 				{
   830 					// Line number 
   838 					// Line number 
   831 					if(yEndInt < 0)				 outFlag = 1;
   839 					if(yEndInt < 0)				 outFlag = 1;
   832 					else if(yEndInt >= aOriSizeY) outFlag = 1;
   840 					else if(yEndInt > aOriSizeY) outFlag = 1;
   833 					else
   841 					else
   834 					{
   842 					{
   835 						// Initialise line result
   843 						// Initialise line result
   836 						tmpB = 0;
   844 						tmpB = 0;
   837 						tmpG = 0;
   845 						tmpG = 0;
   864 								tmpR = (TInt)(tmpR + ((*(linePtrs[lines[LineNum]] + 3 * i + 2)) << WEI_BITS));
   872 								tmpR = (TInt)(tmpR + ((*(linePtrs[lines[LineNum]] + 3 * i + 2)) << WEI_BITS));
   865 							}
   873 							}
   866 						}
   874 						}
   867 
   875 
   868 						// Last pixel in last line
   876 						// Last pixel in last line
   869 						if(xEndWei != 0)
   877 						if(xEndWei != 0 && xEndInt < aOriSizeX)
   870 						{
   878 						{
   871 							// Column number
   879 							// Column number
   872 							if(xEndInt < 0)				 outFlag = 1;
   880 							if(xEndInt < 0)				 outFlag = 1;
   873 							else if(xEndInt >= aOriSizeX) outFlag = 1;
       
   874 							else
   881 							else
   875 							{
   882 							{
   876 								tmpB = (TInt)(tmpB + (*(linePtrs[lines[LineNum]] + 3 * xEndInt    )) * xEndWei);
   883 								tmpB = (TInt)(tmpB + (*(linePtrs[lines[LineNum]] + 3 * xEndInt    )) * xEndWei);
   877 								tmpG = (TInt)(tmpG + (*(linePtrs[lines[LineNum]] + 3 * xEndInt + 1)) * xEndWei);
   884 								tmpG = (TInt)(tmpG + (*(linePtrs[lines[LineNum]] + 3 * xEndInt + 1)) * xEndWei);
   878 								tmpR = (TInt)(tmpR + (*(linePtrs[lines[LineNum]] + 3 * xEndInt + 2)) * xEndWei);
   885 								tmpR = (TInt)(tmpR + (*(linePtrs[lines[LineNum]] + 3 * xEndInt + 2)) * xEndWei);