475 lines
25 KiB
C
475 lines
25 KiB
C
|
#include "privdisp.h"
|
|||
|
#include <math.h>
|
|||
|
|
|||
|
//
|
|||
|
/*****************************************************************************
|
|||
|
|
|||
|
FUNCTION: DeSkew
|
|||
|
|
|||
|
PURPOSE: This function rotates an image by the angle specified
|
|||
|
|
|||
|
|
|||
|
*****************************************************************************/
|
|||
|
|
|||
|
int WINAPI DeSkew(PIMAGE pImage, int nAngle){
|
|||
|
|
|||
|
int nStatus = 0 ;
|
|||
|
|
|||
|
double dCosAngle;
|
|||
|
double dSinAngle;
|
|||
|
int nCenterCol;
|
|||
|
int nCenterRow;
|
|||
|
int nImageRow;
|
|||
|
int nImageCol;
|
|||
|
double dPixelRelativeRowNum;
|
|||
|
double dPixelRelativeColNum;
|
|||
|
double dPixelColAddr;
|
|||
|
double dPixelRowAddr;
|
|||
|
int nPixelColNum;
|
|||
|
int nPixelRowNum;
|
|||
|
double dColDelta;
|
|||
|
double dRowDelta;
|
|||
|
double dRad ;
|
|||
|
BYTE bA=255, bB=255, bC=255, bD=255, bE=255;
|
|||
|
double dAandB, dCandD ;
|
|||
|
int nBWByte;
|
|||
|
int nBWShift ;
|
|||
|
BYTE bBWMask;
|
|||
|
BOOL bAndMask = FALSE ;
|
|||
|
BOOL bOrMask = FALSE ;
|
|||
|
int nHorizDPI ;
|
|||
|
int nVertDPI ;
|
|||
|
PIMG pSourceImg ;
|
|||
|
PIMG pDestImg ;
|
|||
|
BYTE bDest ;
|
|||
|
RGBTRIPLE RGBa, RGBb, RGBc, RGBd, RGBe ;
|
|||
|
int nCurrentByte ;
|
|||
|
|
|||
|
if (nAngle < 0) {
|
|||
|
nAngle = 3600 + nAngle ;
|
|||
|
}
|
|||
|
if (nAngle < 0 || nAngle > 3600) {
|
|||
|
Error(nStatus = DISPLAY_INVALID_OPTIONS);
|
|||
|
goto Exit;
|
|||
|
}
|
|||
|
// convert angle to radians
|
|||
|
dRad = (((double)nAngle * 3.14159) / 1800) ;
|
|||
|
|
|||
|
dCosAngle = cos (dRad) ;
|
|||
|
dSinAngle = sin (dRad) ;
|
|||
|
|
|||
|
nHorizDPI = pImage->nHRes ;
|
|||
|
nVertDPI = pImage->nVRes ;
|
|||
|
|
|||
|
pSourceImg = pImage->pImg ;
|
|||
|
if (nStatus = CreateAnyImgBuf(&pDestImg, pImage->nWidth,
|
|||
|
pImage->nHeight, pSourceImg->nType)){
|
|||
|
goto Exit;
|
|||
|
}
|
|||
|
|
|||
|
nCenterCol = pSourceImg->nWidth/2 ;
|
|||
|
nCenterRow = pSourceImg->nHeight/2 ;
|
|||
|
|
|||
|
for (nImageRow = 0; nImageRow < pDestImg->nHeight; nImageRow++) {
|
|||
|
dPixelRelativeRowNum = (double)(nImageRow - nCenterRow) ;
|
|||
|
dPixelRelativeRowNum = dPixelRelativeRowNum / nVertDPI ;
|
|||
|
for (nImageCol = 0; nImageCol < pDestImg->nWidth; nImageCol++) {
|
|||
|
dPixelRelativeColNum = (double)(nImageCol - nCenterCol);
|
|||
|
dPixelRelativeColNum = dPixelRelativeColNum / nHorizDPI ;
|
|||
|
dPixelColAddr = (dPixelRelativeColNum * dCosAngle -
|
|||
|
dPixelRelativeRowNum * dSinAngle) ;
|
|||
|
dPixelRowAddr = (dPixelRelativeColNum * dSinAngle +
|
|||
|
dPixelRelativeRowNum * dCosAngle) ;
|
|||
|
|
|||
|
dPixelColAddr = dPixelColAddr * (double)nHorizDPI ;
|
|||
|
dPixelColAddr += nCenterCol ;
|
|||
|
dPixelRowAddr = dPixelRowAddr * (double)nVertDPI ;
|
|||
|
dPixelRowAddr += nCenterRow ;
|
|||
|
nPixelColNum = (int)dPixelColAddr ;
|
|||
|
nPixelRowNum = (int)dPixelRowAddr;
|
|||
|
dColDelta = dPixelColAddr - nPixelColNum;
|
|||
|
dRowDelta = dPixelRowAddr - nPixelRowNum;
|
|||
|
|
|||
|
switch (pSourceImg->nType){
|
|||
|
case ITYPE_BI_LEVEL:
|
|||
|
if ((nPixelRowNum + 1) < pSourceImg->nHeight &&
|
|||
|
(nPixelColNum + 1) < pSourceImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
|
|||
|
nBWByte = nPixelColNum/8 ;
|
|||
|
nBWShift = nPixelColNum - (nBWByte * 8) ;
|
|||
|
bA = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nBWByte) ;
|
|||
|
if (nBWShift) {
|
|||
|
bA = bA << (nBWShift - 1) ;
|
|||
|
bA = bA >> 7 ;
|
|||
|
} else {
|
|||
|
bA = bA >> 7;
|
|||
|
}
|
|||
|
}else{
|
|||
|
bA = 1 ;
|
|||
|
}
|
|||
|
|
|||
|
if (nPixelRowNum < pSourceImg->nHeight &&
|
|||
|
nPixelColNum < pSourceImg->nWidth &&
|
|||
|
nImageRow < pDestImg->nHeight &&
|
|||
|
nImageCol < pDestImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
nBWByte = nImageCol/8 ;
|
|||
|
nBWShift = nImageCol - (nBWByte * 8) ;
|
|||
|
|
|||
|
if (bA == 1) {
|
|||
|
bOrMask = TRUE ;
|
|||
|
bAndMask = FALSE ;
|
|||
|
switch (nBWShift) {
|
|||
|
case 0: bBWMask = 128; break ;
|
|||
|
case 1: bBWMask = 64; break ;
|
|||
|
case 2: bBWMask = 32; break ;
|
|||
|
case 3: bBWMask = 16; break ;
|
|||
|
case 4: bBWMask = 8; break ;
|
|||
|
case 5: bBWMask = 4; break ;
|
|||
|
case 6: bBWMask = 2; break ;
|
|||
|
case 7: bBWMask = 1; break ;
|
|||
|
default: nStatus = Error (DISPLAY_DATACORRUPTED);
|
|||
|
goto Exit;
|
|||
|
}
|
|||
|
}else{
|
|||
|
bAndMask = TRUE ;
|
|||
|
bOrMask = FALSE ;
|
|||
|
switch (nBWShift) {
|
|||
|
case 0: bBWMask = 127; break ;
|
|||
|
case 1: bBWMask = 191; break ;
|
|||
|
case 2: bBWMask = 223; break ;
|
|||
|
case 3: bBWMask = 239; break ;
|
|||
|
case 4: bBWMask = 247; break ;
|
|||
|
case 5: bBWMask = 251; break ;
|
|||
|
case 6: bBWMask = 253; break ;
|
|||
|
case 7: bBWMask = 254; break ;
|
|||
|
default: nStatus = Error (DISPLAY_DATACORRUPTED);
|
|||
|
goto Exit;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (bOrMask) {
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nBWByte) |=
|
|||
|
bBWMask;
|
|||
|
} else if (bAndMask) {
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nBWByte) &=
|
|||
|
bBWMask;
|
|||
|
}
|
|||
|
}else{
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + (nImageCol/8)) = 255;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ITYPE_PAL4:
|
|||
|
if ((nPixelRowNum + 2) < pSourceImg->nHeight &&
|
|||
|
(nPixelColNum + 2) < pSourceImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
|
|||
|
if (nPixelColNum % 2 == 0) {
|
|||
|
bA = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + (nPixelColNum/2)) ;
|
|||
|
bA = bA << 4 ;
|
|||
|
bA = bA >> 4 ;
|
|||
|
}else {
|
|||
|
bA = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + ((nPixelColNum + 1)/2)) ;
|
|||
|
bA = bA >> 4 ;
|
|||
|
}
|
|||
|
}else{
|
|||
|
bA = 255 ;
|
|||
|
}
|
|||
|
|
|||
|
if (nPixelRowNum < pSourceImg->nHeight &&
|
|||
|
nPixelColNum < pSourceImg->nWidth &&
|
|||
|
nImageRow < pDestImg->nHeight &&
|
|||
|
nImageCol < pDestImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
if (nImageCol % 2 == 0) { // Second 4 bits in byte
|
|||
|
bDest = *(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine)
|
|||
|
+ (nImageCol/2)) ;
|
|||
|
// throw out the last 4 bits
|
|||
|
bDest = bDest >> 4 ;
|
|||
|
bDest = bDest << 4 ;
|
|||
|
bDest = bDest | bA ;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine)
|
|||
|
+ (nImageCol/2)) = bDest ;
|
|||
|
} else { // first 4 bits
|
|||
|
bDest = *(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine)
|
|||
|
+ ((nImageCol + 1)/2)) ;
|
|||
|
bDest = bDest << 4 ;
|
|||
|
bDest = bDest >> 4 ;
|
|||
|
bA = bA << 4 ;
|
|||
|
bDest = bDest | bA ;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine)
|
|||
|
+ ((nImageCol + 1)/2)) = bDest ;
|
|||
|
}
|
|||
|
}else{
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nImageCol) = 255;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ITYPE_GRAY4:
|
|||
|
if ((nPixelRowNum + 2) < pSourceImg->nHeight &&
|
|||
|
(nPixelColNum + 2) < pSourceImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
|
|||
|
if (nPixelColNum % 2 == 0) {
|
|||
|
bA = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + (nPixelColNum/2)) ;
|
|||
|
bA = bA << 4 ;
|
|||
|
bA = bA >> 4 ;
|
|||
|
}else {
|
|||
|
bA = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + ((nPixelColNum + 1)/2)) ;
|
|||
|
bA = bA >> 4 ;
|
|||
|
}
|
|||
|
if (nPixelColNum % 2 == 0) {
|
|||
|
bB = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + ((nPixelColNum + 1)/2)) ;
|
|||
|
bB = bB << 4 ;
|
|||
|
bB = bB >> 4 ;
|
|||
|
}else {
|
|||
|
bB = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + ((nPixelColNum + 2)/2)) ;
|
|||
|
bB = bB >> 4 ;
|
|||
|
}
|
|||
|
if (nPixelColNum % 2 == 0) {
|
|||
|
bC = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + (nPixelColNum/2)) ;
|
|||
|
bC = bC << 4 ;
|
|||
|
bC = bC >> 4 ;
|
|||
|
}else {
|
|||
|
bC = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + ((nPixelColNum + 1)/2)) ;
|
|||
|
bC = bC >> 4 ;
|
|||
|
}
|
|||
|
if (nPixelColNum % 2 == 0) {
|
|||
|
bD = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + ((nPixelColNum + 1)/2)) ;
|
|||
|
bD = bD << 4 ;
|
|||
|
bD = bD >> 4 ;
|
|||
|
}else {
|
|||
|
bD = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + ((nPixelColNum + 2)/2)) ;
|
|||
|
bD = bD >> 4 ;
|
|||
|
}
|
|||
|
dAandB = dColDelta * ((double)bB - bA) + bA;
|
|||
|
dCandD = dColDelta * ((double)bD - bC) + bC;
|
|||
|
bE = (BYTE)(0.5 + dAandB + (dCandD - dAandB) * dRowDelta);
|
|||
|
}else{
|
|||
|
bE = 255 ;
|
|||
|
}
|
|||
|
|
|||
|
if (nPixelRowNum < pSourceImg->nHeight &&
|
|||
|
nPixelColNum < pSourceImg->nWidth &&
|
|||
|
nImageRow < pDestImg->nHeight &&
|
|||
|
nImageCol < pDestImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
if (nImageCol % 2 == 0) { // Second 4 bits in byte
|
|||
|
bDest = *(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine)
|
|||
|
+ (nImageCol/2)) ;
|
|||
|
// throw out the last 4 bits
|
|||
|
bDest = bDest >> 4 ;
|
|||
|
bDest = bDest << 4 ;
|
|||
|
bDest = bDest | bE ;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine)
|
|||
|
+ (nImageCol/2)) = bDest ;
|
|||
|
} else { // first 4 bits
|
|||
|
bDest = *(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine)
|
|||
|
+ ((nImageCol + 1)/2)) ;
|
|||
|
bDest = bDest << 4 ;
|
|||
|
bDest = bDest >> 4 ;
|
|||
|
bE = bE << 4 ;
|
|||
|
bDest = bDest | bE ;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine)
|
|||
|
+ ((nImageCol + 1)/2)) = bDest ;
|
|||
|
}
|
|||
|
}else{
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nImageCol) = 255;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ITYPE_GRAY7:
|
|||
|
break;
|
|||
|
|
|||
|
// do not interpolate for palletized images
|
|||
|
case ITYPE_PAL8:
|
|||
|
case ITYPE_COMPAL8:
|
|||
|
case ITYPE_CUSPAL8:
|
|||
|
if ((nPixelRowNum + 1) < pSourceImg->nHeight &&
|
|||
|
(nPixelColNum + 1) < pSourceImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
|
|||
|
bA = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nPixelColNum) ;
|
|||
|
}else{
|
|||
|
bA = 255 ;
|
|||
|
}
|
|||
|
|
|||
|
if (nPixelRowNum < pSourceImg->nHeight &&
|
|||
|
nPixelColNum < pSourceImg->nWidth &&
|
|||
|
nImageRow < pDestImg->nHeight &&
|
|||
|
nImageCol < pDestImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nImageCol) =
|
|||
|
bA;
|
|||
|
}else{
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nImageCol) = 255;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ITYPE_GRAY8:
|
|||
|
if ((nPixelRowNum + 1) < pSourceImg->nHeight &&
|
|||
|
(nPixelColNum + 1) < pSourceImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
|
|||
|
bA = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nPixelColNum) ;
|
|||
|
bB = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nPixelColNum + 1) ;
|
|||
|
bC = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nPixelColNum) ;
|
|||
|
bD = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nPixelColNum + 1) ;
|
|||
|
dAandB = dColDelta * ((double)bB - bA) + bA;
|
|||
|
dCandD = dColDelta * ((double)bD - bC) + bC;
|
|||
|
bE = (BYTE)(0.5 + dAandB + (dCandD - dAandB) * dRowDelta);
|
|||
|
}else{
|
|||
|
bE = 255 ;
|
|||
|
}
|
|||
|
|
|||
|
if (nPixelRowNum < pSourceImg->nHeight &&
|
|||
|
nPixelColNum < pSourceImg->nWidth &&
|
|||
|
nImageRow < pDestImg->nHeight &&
|
|||
|
nImageCol < pDestImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nImageCol) =
|
|||
|
bE;
|
|||
|
}else{
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nImageCol) = 255;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ITYPE_RGB24:
|
|||
|
if ((nPixelRowNum + 1) < pSourceImg->nHeight &&
|
|||
|
(nPixelColNum + 1) < pSourceImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
nCurrentByte = nPixelColNum * 3;
|
|||
|
|
|||
|
RGBa.rgbtRed = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte) ;
|
|||
|
RGBa.rgbtGreen = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 1) ;
|
|||
|
RGBa.rgbtBlue = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 2) ;
|
|||
|
RGBb.rgbtRed = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 3) ;
|
|||
|
RGBb.rgbtGreen = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 4) ;
|
|||
|
RGBb.rgbtBlue = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 5) ;
|
|||
|
RGBc.rgbtRed = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte) ;
|
|||
|
RGBc.rgbtGreen = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 1) ;
|
|||
|
RGBc.rgbtBlue = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 2) ;
|
|||
|
RGBd.rgbtRed = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 3) ;
|
|||
|
RGBd.rgbtGreen = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 4) ;
|
|||
|
RGBd.rgbtBlue = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 5) ;
|
|||
|
|
|||
|
dAandB = dColDelta * ((double)RGBb.rgbtRed - RGBa.rgbtRed) + RGBa.rgbtRed;
|
|||
|
dCandD = dColDelta * ((double)RGBd.rgbtRed - RGBc.rgbtRed) + RGBc.rgbtRed;
|
|||
|
RGBe.rgbtRed = (BYTE)(0.5 + dAandB + (dCandD - dAandB) * dRowDelta);
|
|||
|
dAandB = dColDelta * ((double)RGBb.rgbtGreen - RGBa.rgbtGreen) + RGBa.rgbtGreen;
|
|||
|
dCandD = dColDelta * ((double)RGBd.rgbtGreen - RGBc.rgbtGreen) + RGBc.rgbtGreen;
|
|||
|
RGBe.rgbtGreen = (BYTE)(0.5 + dAandB + (dCandD - dAandB) * dRowDelta);
|
|||
|
dAandB = dColDelta * ((double)RGBb.rgbtBlue - RGBa.rgbtBlue) + RGBa.rgbtBlue;
|
|||
|
dCandD = dColDelta * ((double)RGBd.rgbtBlue - RGBc.rgbtBlue) + RGBc.rgbtBlue;
|
|||
|
RGBe.rgbtBlue = (BYTE)(0.5 + dAandB + (dCandD - dAandB) * dRowDelta);
|
|||
|
}else{
|
|||
|
RGBe.rgbtRed = 255 ;
|
|||
|
RGBe.rgbtGreen = 255 ;
|
|||
|
RGBe.rgbtBlue = 255 ;
|
|||
|
}
|
|||
|
|
|||
|
if (nPixelRowNum < pSourceImg->nHeight &&
|
|||
|
nPixelColNum < pSourceImg->nWidth &&
|
|||
|
nImageRow < pDestImg->nHeight &&
|
|||
|
nImageCol < pDestImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
nCurrentByte = nImageCol * 3;
|
|||
|
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte) =
|
|||
|
RGBe.rgbtRed;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte + 1) =
|
|||
|
RGBe.rgbtGreen;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte + 2) =
|
|||
|
RGBe.rgbtBlue;
|
|||
|
}else{
|
|||
|
nCurrentByte = nImageCol * 3;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte) = 255;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte + 1) = 255;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte + 2) = 255;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ITYPE_BGR24:
|
|||
|
if ((nPixelRowNum + 1) < pSourceImg->nHeight &&
|
|||
|
(nPixelColNum + 1) < pSourceImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
nCurrentByte = nPixelColNum * 3;
|
|||
|
|
|||
|
RGBa.rgbtBlue = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte) ;
|
|||
|
RGBa.rgbtGreen = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 1) ;
|
|||
|
RGBa.rgbtRed = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 2) ;
|
|||
|
RGBb.rgbtBlue = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 3) ;
|
|||
|
RGBb.rgbtGreen = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 4) ;
|
|||
|
RGBb.rgbtRed = *(&pSourceImg->bImageData[0] + (nPixelRowNum * pSourceImg->nBytesPerLine) + nCurrentByte + 5) ;
|
|||
|
RGBc.rgbtBlue = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte) ;
|
|||
|
RGBc.rgbtGreen = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 1) ;
|
|||
|
RGBc.rgbtRed = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 2) ;
|
|||
|
RGBd.rgbtBlue = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 3) ;
|
|||
|
RGBd.rgbtGreen = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 4) ;
|
|||
|
RGBd.rgbtRed = *(&pSourceImg->bImageData[0] + ((nPixelRowNum + 1) * pSourceImg->nBytesPerLine) + nCurrentByte + 5) ;
|
|||
|
|
|||
|
dAandB = dColDelta * ((double)RGBb.rgbtRed - RGBa.rgbtRed) + RGBa.rgbtRed;
|
|||
|
dCandD = dColDelta * ((double)RGBd.rgbtRed - RGBc.rgbtRed) + RGBc.rgbtRed;
|
|||
|
RGBe.rgbtRed = (BYTE)(0.5 + dAandB + (dCandD - dAandB) * dRowDelta);
|
|||
|
dAandB = dColDelta * ((double)RGBb.rgbtGreen - RGBa.rgbtGreen) + RGBa.rgbtGreen;
|
|||
|
dCandD = dColDelta * ((double)RGBd.rgbtGreen - RGBc.rgbtGreen) + RGBc.rgbtGreen;
|
|||
|
RGBe.rgbtGreen = (BYTE)(0.5 + dAandB + (dCandD - dAandB) * dRowDelta);
|
|||
|
dAandB = dColDelta * ((double)RGBb.rgbtBlue - RGBa.rgbtBlue) + RGBa.rgbtBlue;
|
|||
|
dCandD = dColDelta * ((double)RGBd.rgbtBlue - RGBc.rgbtBlue) + RGBc.rgbtBlue;
|
|||
|
RGBe.rgbtBlue = (BYTE)(0.5 + dAandB + (dCandD - dAandB) * dRowDelta);
|
|||
|
}else{
|
|||
|
RGBe.rgbtRed = 255 ;
|
|||
|
RGBe.rgbtGreen = 255 ;
|
|||
|
RGBe.rgbtBlue = 255 ;
|
|||
|
}
|
|||
|
|
|||
|
if (nPixelRowNum < pSourceImg->nHeight &&
|
|||
|
nPixelColNum < pSourceImg->nWidth &&
|
|||
|
nImageRow < pDestImg->nHeight &&
|
|||
|
nImageCol < pDestImg->nWidth &&
|
|||
|
nPixelRowNum > 0 &&
|
|||
|
nPixelColNum > 0) {
|
|||
|
nCurrentByte = nImageCol * 3;
|
|||
|
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte) =
|
|||
|
RGBe.rgbtBlue;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte + 1) =
|
|||
|
RGBe.rgbtGreen;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte + 2) =
|
|||
|
RGBe.rgbtRed;
|
|||
|
}else{
|
|||
|
nCurrentByte = nImageCol * 3;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte) = 255;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte + 1) = 255;
|
|||
|
*(&pDestImg->bImageData[0] + (nImageRow * pSourceImg->nBytesPerLine) + nCurrentByte + 2) = 255;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
nStatus = Error (DISPLAY_IMAGETYPENOTSUPPORTED) ;
|
|||
|
goto Exit;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
FreeImgBuf(&pImage->pImg);
|
|||
|
MoveImage(&pDestImg, &pImage->pImg);
|
|||
|
|
|||
|
Exit:
|
|||
|
return nStatus ;
|
|||
|
}
|