199 lines
6.1 KiB
C
199 lines
6.1 KiB
C
|
/****************************************************************************
|
|||
|
WRITE.C
|
|||
|
|
|||
|
$Log: S:\products\wangview\oiwh\display\write.c_v $
|
|||
|
*
|
|||
|
* Rev 1.6 22 Apr 1996 10:31:34 BEG06016
|
|||
|
* Cleaned up error checking.
|
|||
|
*
|
|||
|
* Rev 1.5 02 Jan 1996 09:57:54 BLJ
|
|||
|
* Changed alot of UINTs to ints.
|
|||
|
* Changed IMG structure to include the image data.
|
|||
|
* Changed lp prefix to p.
|
|||
|
*
|
|||
|
* Rev 1.4 07 Aug 1995 08:15:48 BLJ
|
|||
|
* Changed bArchive to have different bits indicating how the image was changed.
|
|||
|
*
|
|||
|
* Rev 1.3 05 Jul 1995 09:09:26 BLJ
|
|||
|
* Added critical mutex to prevent multiprocessing problems.
|
|||
|
*
|
|||
|
* Rev 1.2 12 Apr 1995 13:46:10 BLJ
|
|||
|
* Jason's changes for 32 bit.
|
|||
|
*
|
|||
|
* Rev 1.1 06 Apr 1995 15:09:10 BLJ
|
|||
|
* Intermediate checkin.
|
|||
|
*
|
|||
|
* Rev 1.0 17 Mar 1995 13:58:06 BLJ
|
|||
|
* Initial entry
|
|||
|
*
|
|||
|
* Rev 1.3 08 Dec 1994 15:01:14 BLJ
|
|||
|
* Fixed delay during selection caused by an nnneeded repaint.
|
|||
|
*
|
|||
|
* Rev 1.2 20 Oct 1994 14:39:44 BLJ
|
|||
|
* Fixed a problem with writing small amounts of data.
|
|||
|
*
|
|||
|
* Rev 1.1 01 Aug 1994 09:35:20 BLJ
|
|||
|
* Switched to system based cache.
|
|||
|
*
|
|||
|
* Rev 1.0 27 May 1994 13:58:28 ADMIN
|
|||
|
* Initial revision.
|
|||
|
*
|
|||
|
****************************************************************************/
|
|||
|
|
|||
|
#include "privdisp.h"
|
|||
|
|
|||
|
/****************************************************************************
|
|||
|
|
|||
|
FUNCTION: IMGWriteDisplay
|
|||
|
|
|||
|
PURPOSE: Receives the next buffer of image data, stores it for refresh
|
|||
|
and scrolling, and displays it. The image data must be in the
|
|||
|
format specified in the IMGOpenDisplay call.
|
|||
|
|
|||
|
*****************************************************************************/
|
|||
|
|
|||
|
int WINAPI IMGWriteDisplay(HWND hWnd, PSTR pBuffer, PUINT puCount){
|
|||
|
|
|||
|
int nStatus;
|
|||
|
PWINDOW pWindow;
|
|||
|
PANO_IMAGE pAnoImage;
|
|||
|
PIMAGE pImage;
|
|||
|
|
|||
|
PARM_SCROLL_STRUCT Scroll;
|
|||
|
LRECT lrInvalidDisplayRect;
|
|||
|
int nByteWidth;
|
|||
|
long nlCount=0;
|
|||
|
|
|||
|
|
|||
|
CheckError2( Init(hWnd, &pWindow, &pAnoImage, FALSE, TRUE));
|
|||
|
pImage = pAnoImage->pBaseImage;
|
|||
|
|
|||
|
lrInvalidDisplayRect.left = 0;
|
|||
|
lrInvalidDisplayRect.right = pImage->nWidth;
|
|||
|
|
|||
|
switch (pImage->pImg->nType){
|
|||
|
case ITYPE_BI_LEVEL:
|
|||
|
lrInvalidDisplayRect.top = (pImage->nlRWOffset / ((pImage->nWidth + 7) / 8));
|
|||
|
lrInvalidDisplayRect.bottom = (((pImage->nlRWOffset + *puCount)
|
|||
|
/ ((pImage->nWidth + 7) / 8)) + 1);
|
|||
|
break;
|
|||
|
case ITYPE_GRAY4:
|
|||
|
case ITYPE_PAL4:
|
|||
|
lrInvalidDisplayRect.top = (pImage->nlRWOffset / ((pImage->nWidth + 3) / 4));
|
|||
|
lrInvalidDisplayRect.bottom = (((pImage->nlRWOffset + *puCount)
|
|||
|
/ ((pImage->nWidth + 3) / 4)) + 1);
|
|||
|
break;
|
|||
|
case ITYPE_GRAY8:
|
|||
|
case ITYPE_PAL8:
|
|||
|
case ITYPE_COMPAL8:
|
|||
|
case ITYPE_CUSPAL8:
|
|||
|
lrInvalidDisplayRect.top = (pImage->nlRWOffset / pImage->nWidth);
|
|||
|
lrInvalidDisplayRect.bottom = (((pImage->nlRWOffset + *puCount) / pImage->nWidth) + 1);
|
|||
|
break;
|
|||
|
case ITYPE_GRAY12:
|
|||
|
case ITYPE_GRAY16:
|
|||
|
case ITYPE_RGB24:
|
|||
|
case ITYPE_BGR24:
|
|||
|
case ITYPE_NONE:
|
|||
|
default:
|
|||
|
lrInvalidDisplayRect.top = (pImage->nlRWOffset / (pImage->nWidth * 3));
|
|||
|
lrInvalidDisplayRect.bottom = (((pImage->nlRWOffset + *puCount)
|
|||
|
/ (pImage->nWidth * 3)) + 1);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (puCount == 0 || pBuffer == 0){
|
|||
|
// Nothing to do, so return an error. ????
|
|||
|
nStatus = Error(DISPLAY_INVALID_OPTIONS);
|
|||
|
goto Exit;
|
|||
|
}
|
|||
|
|
|||
|
if (pImage->nlRWOffset + *puCount > pImage->nlMaxRWOffset){
|
|||
|
*puCount = (pImage->nlMaxRWOffset - pImage->nlRWOffset);
|
|||
|
if (*puCount == 0){
|
|||
|
nStatus = Error(DISPLAY_EOF);
|
|||
|
goto Exit;
|
|||
|
}
|
|||
|
}
|
|||
|
// write the data.
|
|||
|
nlCount = (ulong)*puCount;
|
|||
|
CheckError2( WriteDataToBuffer(pImage->pImg, &pImage->nlRWOffset, (BYTE huge *) pBuffer, &nlCount));
|
|||
|
*puCount = nlCount;
|
|||
|
|
|||
|
switch (pImage->pImg->nType){
|
|||
|
case ITYPE_BI_LEVEL:
|
|||
|
nByteWidth = (pImage->nWidth + 7) / 8;
|
|||
|
break;
|
|||
|
case ITYPE_GRAY4:
|
|||
|
case ITYPE_PAL4:
|
|||
|
nByteWidth = (pImage->nWidth + 1) / 2;
|
|||
|
break;
|
|||
|
case ITYPE_GRAY12:
|
|||
|
case ITYPE_GRAY16:
|
|||
|
nByteWidth = pImage->nWidth * 2;
|
|||
|
break;
|
|||
|
case ITYPE_GRAY8:
|
|||
|
case ITYPE_PAL8:
|
|||
|
case ITYPE_COMPAL8:
|
|||
|
case ITYPE_CUSPAL8:
|
|||
|
nByteWidth = pImage->nWidth;
|
|||
|
break;
|
|||
|
case ITYPE_RGB24:
|
|||
|
case ITYPE_BGR24:
|
|||
|
nByteWidth = pImage->nWidth * 3;
|
|||
|
break;
|
|||
|
nByteWidth = pImage->nWidth * 3;
|
|||
|
break;
|
|||
|
case ITYPE_NONE:
|
|||
|
default:
|
|||
|
nStatus = Error(DISPLAY_INTERNALDATAERROR);
|
|||
|
goto Exit;
|
|||
|
}
|
|||
|
|
|||
|
pImage->nLinesRead = max(pImage->nLinesRead, ((int) pImage->nlRWOffset / nByteWidth));
|
|||
|
|
|||
|
|
|||
|
pImage->bArchive |= ARCHIVE_PASTED_INTO_IMAGE;
|
|||
|
CheckError2( InvalidateAllDisplayRects(pWindow, pImage, &lrInvalidDisplayRect, TRUE));
|
|||
|
|
|||
|
if (pWindow->dwFlags & OI_DISP_SCROLL){
|
|||
|
Scroll.lHorz = -1;
|
|||
|
Scroll.lVert = 99;
|
|||
|
CheckError2( IMGSetParmsCgbw(hWnd, PARM_SCROLL, &Scroll,
|
|||
|
PARM_ABSOLUTE | PARM_PERCENT | PARM_FULLSIZE | PARM_REPAINT));
|
|||
|
}else if (!(pWindow->dwFlags & OI_DISP_NO)
|
|||
|
&& !(pWindow->dwFlags & OI_DONT_REPAINT)){
|
|||
|
CheckError2( IMGRepaintDisplay(hWnd, NULL));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Exit:
|
|||
|
DeInit(FALSE, TRUE);
|
|||
|
return(nStatus);
|
|||
|
}
|
|||
|
//
|
|||
|
/****************************************************************************
|
|||
|
|
|||
|
FUNCTION: WriteDataToBuffer
|
|||
|
|
|||
|
PURPOSE: Writes a buffer of data to an image at the current offset.
|
|||
|
|
|||
|
*****************************************************************************/
|
|||
|
|
|||
|
int WINAPI WriteDataToBuffer(PIMG pImg, PULONG pulOffset,
|
|||
|
BYTE huge *pBuffer, PULONG pulCount){
|
|||
|
|
|||
|
int nStatus = 0;
|
|||
|
|
|||
|
int nBytes;
|
|||
|
PSTR pAddress;
|
|||
|
|
|||
|
|
|||
|
pAddress = &pImg->bImageData[0] + *pulOffset;
|
|||
|
nBytes = min(*pulCount, (pImg->nHeight * pImg->nBytesPerLine) - *pulOffset);
|
|||
|
memcpy(pAddress, pBuffer, nBytes);
|
|||
|
*pulOffset += nBytes;
|
|||
|
|
|||
|
return(nStatus);
|
|||
|
}
|