2020-09-30 17:12:29 +02:00

201 lines
6.2 KiB
C

/****************************************************************************
* (c) Copyright Wang Laboratories, Inc. 1993. All rights reserved.
*
* $Log: S:\oiwh\display\iadisp.c_v $
*
* Rev 1.5 02 Jan 1996 10:34:18 BLJ
* Changed alot of UINTs to ints.
* Changed IMG structure to include the image data.
* Changed lp prefix to p.
*
* Rev 1.4 05 Jul 1995 09:11:36 BLJ
* Added critical mutex to prevent multiprocessing problems.
*
* Rev 1.3 19 May 1995 13:50:10 BLJ
* Fixed Clipboard paste.
* Fixed SelectByPointOrRect initial fudge before move.
* Fixed GlobalAlloc/FreeMemory conflicts.
* Deleted FAR, far, and huge.
*
*
*****************************************************************************
*
* All rotuines are to be nsed to support Cornerstone Image Accel Board.
*
* Rev 1.0 14 Sep 1993 14:02:00 ICF
* Initial revision.
* Rev 1.1 Oct 25, 1993 ICF
* Removed byte aligned code for Cornstone Relase 1.04
*
*
*****************************************************************************/
#include "privdisp.h"
//#Define IADEBUG
#define DISP_CANTLOADIADLL 0X34C /* can not load winiaext.dll */
#define DISP_CANTDISPIAIMG 0X34D /* failed at ScaleIADATATODEVICE */
static struct
{
int nRatio;
BYTE cNumerator;
BYTE cDenominator;
} scaletable [] = /* nRatio is in thousanths */
{
16000, 16, 1, /* 16X */
8000, 8, 1,
4000, 4, 1,
2000, 2, 1,
1000, 1, 1,
800, 4, 5,
750, 3, 4, /* 75 % */
666, 2, 3,
600, 3, 5,
500, 1, 2,
400, 2, 5,
333, 1, 3,
250, 1, 4,
200, 1, 5,
125, 1, 8,
62, 1, 16, /* 1/16 */
31, 1, 31,
};
/****************************************************************************
FUNCTION: IPIADisplay
PURPOSE: Display images nses Cornerstone ImageAccel board and driver.
INPUT: IPIMAGES *simgptr Image data pointer.
IPWINDS *vwid Window info.
IPRECTS drect display rect.
IPTRANSFER *contprt image attributes.
IPFNIDS *findptr image function id.
return 0 for success, non zero for errors.
****************************************************************************/
int WINAPI IADisplay(PIMG pImg){
//int WINAPI IADisplay(PIMG pImg, IPWINDS *vwid, IPRECTS drect,
// IPTRANSFER *contptr, IPFNIDS *findptr){
int nStatus = 0;
#ifdef ThisNeedsToBeFixed
int nStartLine;
ulong lNumLines;
int nIAError; // error return value from ia driver
int nXScaleNum;
int nYScaleNum;
int nXScaleDen;
int nYScaleDen;
IP2DIMAGES *pIP2DImgs;
UCHAR *pData;
LONG lDTop;
LONG lDBottom;
WORD SrcX;
int nLoop;
int nLines;
/* load winiaext.dll 16 bits Window's dll. This dlll must be in the serarch path */
if (!hIADLL || !pScaleIADataToDevice){
nStatus = Error(DISP_CANTLOADIADLL);
goto Exit;
}
#ifdef IADEBUG
OutputDebugString("\n\rIADisplay is called");
#endif
pIP2DImgs = pImg->pIP->img.twod;
#ifdef IADEBUG
if (pIP2DImgs->rowbytes % 2){ // check odd byte aligned images
char buffer[128];
wsprintf(buffer, "\r\nImage data not WORD aligned. The rowbytes = %d ", pIP2DImgs->rowbytes);
OutputDebugString(buffer);
}
#endif
lDTop = pImg->pIP->oprect.top; // image area to display
nStartLine = 0;
SrcX = (WORD) pImg->pIP->oprect.left;
nXScaleNum = contptr->xnum;
nXScaleDen = contptr->xden;
nYScaleNum = contptr->ynum;
nYScaleDen = contptr->yden;
/* convert the scale factor to call display driver. from 16000/1000
to 16:1, from 500/1000 to 1:2 , N:M .... etc */
for (nLoop = 0; nLoop + 1 < sizeof(scaletable) / sizeof (scaletable[0]); nLoop++){
if (nXScaleNum >= scaletable[nLoop].nRatio){
break;
}
}
nXScaleNum = nYScaleNum = scaletable[nLoop].cNumerator;
nXScaleDen = nYScaleDen = scaletable[nLoop].cDenominator;
// valid range checking
lDBottom = min(pImg->pIP->oprect.bottom, pIP2DImgs->bounds.bottom);
while(lDTop < lDBottom){
/* get image data */
pData = &pImg->bImageData[0] + (lDTop * pImg->nBytesPerLine);
if (nStatus = GetAddressCached(pImg, lDTop, &pData, &nLines, FALSE)){
goto Exit;
}
nLines = (pImg->nHeight - lDTop);
lNumLines = min(lDBottom - lDTop, (LONG)nLines);
/* display the image */
if ((nIAError = (*pScaleIADataToDevice)(
vwid->window,
vwid->dc,
(WORD)drect.left, // display screen cord
(WORD)drect.top,
(WORD)(drect.right - drect.left),
(WORD)(drect.bottom - drect.top),
SrcX,
nStartLine, /* starting scan line number */
(WORD)lNumLines, /* total scan lines in pData */
(PWORD) pData, /* image data buffer */
(WORD) pIP2DImgs->bounds.right, /* image width in bits */
nXScaleNum, // contptr->xnum,
nXScaleDen, // contptr->xden,
nYScaleNum, // contptr->ynum,
nYScaleDen, // contptr->yden,
IA_ROTATE_0, /* no rotation */
NULL, /* no transformation table */
IA_BITS, /* nses nncompressed data */
IA_ONLY_BAND) ) < 0){
#ifdef IADEBUG
char buffer[128];
wsprintf(buffer, "\r\nFailed on ScaleIADataToDevice error = %d ", nIAError);
OutputDebugString(buffer);
#endif
nStatus = Error(DISP_CANTDISPIAIMG);
goto Exit;
}else{
#ifdef IADEBUG
/* debug purpose */
if (nIAError == 0){ /* display ok, but thorough non Cornstone output device */
OutputDebugString("\n\rIADisplay for Windows driver. Not Cornserstone");
}
#endif
nStartLine += (WORD)lNumLines;
lDTop += lNumLines;
}
}
Exit:
#endif
return(nStatus);
}