bitmap.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 240 行
C
240 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: Covers for bitmap manipulation routines.
*
****************************************************************************/
#include <stdio.h>
#include <windows.h>
#include "stubs.h"
/*
* __CreateBitmap - cover for CreateBitmap, makes sure lpbits are ok
*/
HBITMAP FAR PASCAL __CreateBitmap(int height, int width, BYTE nplanes,
BYTE bitcount, DWORD lpbits )
{
DWORD alias,size;
HBITMAP rc;
size = (DWORD)nplanes * (DWORD)height * (DWORD)width * (DWORD)bitcount;
size = (size + 7) >> 3;
DPMIGetHugeAlias( (DWORD) lpbits, &alias, size );
rc = CreateBitmap( height, width, nplanes, bitcount, (LPVOID) alias );
DPMIFreeHugeAlias( alias, size );
return( rc );
} /* CreateBitmap */
/*
* __CreateBitmapIndirect - cover for CreateBitmapIndirect
*/
HBITMAP FAR PASCAL __CreateBitmapIndirect( LPBITMAP bm )
{
HBITMAP rc;
DWORD alias,size;
LPSTR old;
size = (DWORD) bm->bmHeight * (DWORD) bm->bmWidthBytes;
size *= (DWORD) bm->bmPlanes;
DPMIGetHugeAlias( (DWORD) bm->bmBits, &alias, size );
old = bm->bmBits;
bm->bmBits = (LPSTR) alias;
rc = CreateBitmapIndirect( bm );
DPMIFreeHugeAlias( alias, size );
bm->bmBits = old;
return( rc );
} /* __CreateBitmapIndirect */
/*
* __SetBitmapBits - make sure to get alias right for bits
*/
LONG FAR PASCAL __SetBitmapBits( HBITMAP bm, DWORD dw, LPSTR bits )
{
DWORD alias;
LONG rc;
DPMIGetHugeAlias( (DWORD) bits, &alias, dw );
rc = SetBitmapBits( bm, dw, (LPSTR) alias );
DPMIFreeHugeAlias( alias, dw );
return( rc );
} /* __SetBitmapBits */
/*
* __GetBitmapBits - make sure to get alias right for bits
*/
LONG FAR PASCAL __GetBitmapBits( HBITMAP bm, DWORD dw, LPSTR bits )
{
DWORD alias;
LONG rc;
DPMIGetHugeAlias( (DWORD) bits, &alias, dw );
rc = GetBitmapBits( bm, dw, (LPSTR) alias );
DPMIFreeHugeAlias( alias, dw );
return( rc );
} /* __GetBitmapBits */
/*
* getScanLineSize - get size of a scan line for a bitmap
*/
static DWORD getScanLineSize( LPBITMAPINFOHEADER bmh )
{
WORD size;
size = bmh->biWidth;
switch( bmh->biBitCount ) {
case 1:
size = (size + 7) >> 3;
break;
case 4:
size = (size + 1) >> 1;
break;
case 24:
size *= 3;
break;
}
size = (size+3) & ~3;
return( (DWORD) size );
} /* getScanLineSize */
/*
* __SetDIBits - make sure the right alias gets in for lpbits
*/
int FAR PASCAL __SetDIBits(HDC hdc,HANDLE hbitmap,WORD start,WORD num,
LPSTR lpbits ,LPBITMAPINFO bmi,WORD usage)
{
DWORD size;
DWORD alias;
int rc;
size = (DWORD) num * getScanLineSize( &bmi->bmiHeader );
DPMIGetHugeAlias( (DWORD) lpbits, &alias, size );
rc = SetDIBits( hdc, hbitmap, start, num, (LPSTR) alias, bmi, usage );
DPMIFreeHugeAlias( alias, size );
return( rc );
} /* __SetDIBits */
/*
* __GetDIBits - make sure the right alias gets in for lpbits
*/
int FAR PASCAL __GetDIBits(HDC hdc,HANDLE hbitmap,WORD start,WORD num,
LPSTR lpbits ,LPBITMAPINFO bmi,WORD usage)
{
DWORD size;
DWORD alias;
int rc;
size = (DWORD) num * getScanLineSize( &bmi->bmiHeader );
DPMIGetHugeAlias( (DWORD) lpbits, &alias, size );
rc = GetDIBits( hdc, hbitmap, start, num, (LPSTR) alias, bmi, usage );
DPMIFreeHugeAlias( alias, size );
return( rc );
} /* __GetDIBits */
/*
* __SetDIBitsToDevice - make sure the right alias gets in for lpbits
*/
int FAR PASCAL __SetDIBitsToDevice(HDC hdc,WORD destx,WORD desty,
WORD width,WORD height,
WORD srcx,WORD srcy,WORD start,
WORD num, LPSTR lpbits,
LPBITMAPINFO bmi,WORD usage )
{
DWORD size;
DWORD alias;
int rc;
size = (DWORD) num * getScanLineSize( &bmi->bmiHeader );
DPMIGetHugeAlias( (DWORD) lpbits, &alias, size );
rc = SetDIBitsToDevice( hdc, destx, desty, width, height, srcx, srcy,
start, num, (LPSTR) alias, bmi, usage );
DPMIFreeHugeAlias( alias, size );
return( rc );
} /* __SetDIBitsToDevice */
/*
* __CreateDIBitmap - make sure to get alias right for lpInitBits
*/
HBITMAP FAR PASCAL __CreateDIBitmap( HDC hDC, LPBITMAPINFOHEADER lpInfoHeader,
DWORD dwUsage,DWORD lpInitBits,
LPBITMAPINFO lpInitInfo, WORD wUsage )
{
DWORD size;
DWORD alias;
HBITMAP rc;
if( lpInitBits != 0L ) {
size = (DWORD) lpInitInfo->bmiHeader.biHeight *
getScanLineSize( &lpInitInfo->bmiHeader );
DPMIGetHugeAlias( (DWORD) lpInitBits, &alias, size );
} else {
alias = 0;
}
rc = CreateDIBitmap( hDC, lpInfoHeader, dwUsage,
(LPSTR) alias,
lpInitInfo, wUsage );
if( alias != 0 ) {
DPMIFreeHugeAlias( alias, size );
}
return( rc );
} /* __CreateDIBitmap */
/*
* __StretchDIBits
*/
int FAR PASCAL __StretchDIBits( HDC hdc, WORD destx, WORD desty,
WORD destwidth, WORD destheight, WORD srcx, WORD srcy,
WORD srcwidth, WORD srcheight, DWORD lpbits,
LPBITMAPINFO lpbitsinfo, WORD usage, DWORD rop )
{
DWORD size;
DWORD alias;
int rc;
// size = (DWORD) srcheight * getScanLineSize( &lpbitsinfo->bmiHeader );
size = (DWORD) lpbitsinfo->bmiHeader.biHeight * getScanLineSize( &lpbitsinfo->bmiHeader );
DPMIGetHugeAlias( (DWORD) lpbits, &alias, size );
rc = StretchDIBits( hdc, destx, desty, destwidth, destheight, srcx,
srcy, srcwidth, srcheight, (LPVOID) alias, lpbitsinfo, usage, rop );
DPMIFreeHugeAlias( alias, size );
return( rc );
} /* __StretchDIBits */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?