⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 haigdi.c

📁 HGui4.1.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
	case 16:
		for (i = 0; i < pBmpDst->height; i++)
		{
			_memcpy16to8(pDst, pSrc, pBmpSrc->width);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	case 24:
		for (i = 0; i < pBmpDst->height; i++)
		{
			_memcpy24to8(pDst, pSrc, pBmpSrc->width);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	default:
		return S_FALSE;
		break;
	}
	return S_TRUE;

}
static S_VOID _memcpy4to16(S_BYTE *pDst, S_BYTE *pSrc, S_WORD nPixel)
{
	S_WORD i;
	S_WORD odd = nPixel&0x1;
	S_COLOR c;

	nPixel &= 0xFFFE;
	for (i = 0; i < nPixel; i += 2)
	{
		c = gPalette4Bits[*pSrc>>4];
		*(S_WORD *)pDst = (S_WORD)(((c&0xF8)>>3)|((c&0xFC00)>>5)|((c&0xF80000)>>8));
		pDst += 2;

		c = gPalette4Bits[*pSrc&0xF];
		*(S_WORD *)pDst = (S_WORD)(((c&0xF8)>>3)|((c&0xFC00)>>5)|((c&0xF80000)>>8));
		pDst += 2;

		pSrc++;
	}
	if (odd)
	{
		c = gPalette4Bits[*pSrc>>4];
		*(S_WORD *)pDst = (S_WORD)(((c&0xF8)>>3)|((c&0xFC00)>>5)|((c&0xF80000)>>8));
		pDst += 2;
	}
}
static S_VOID _memcpy8to16(S_BYTE *pDst, S_BYTE *pSrc, S_WORD nPixel)
{
	S_WORD i;
	S_COLOR c;

	for (i = 0; i < nPixel; i++)
	{
		c = gPalette8Bits[*pSrc++];
		*(S_WORD *)pDst = (S_WORD)(((c&0xF8)>>3)|((c&0xFC00)>>5)|((c&0xF80000)>>8));
		pDst += 2;
	}
}
static S_VOID _memcpy24to16(S_BYTE *pDst, S_BYTE *pSrc, S_WORD nPixel)
{
	S_WORD i;
	S_WORD c;

	for (i = 0; i < nPixel; i++)
	{
		c = (*pSrc>>3)|((S_WORD)(*(pSrc+1)>>3)<<5)|((S_WORD)(*(pSrc+2)>>3)<<11);
		pSrc += 3;
		*(S_WORD *)pDst = c;
		pDst += 2;
	}
}
static S_BOOL _hai_ConverBitmapTo16Bits(_SP_BITMAP pBmpDst, _SP_BITMAP pBmpSrc)
{
	S_WORD i;
	S_BYTE * pSrc = (S_BYTE *)(pBmpSrc->lpImage);
	S_BYTE * pDst = (S_BYTE *)(pBmpDst->lpImage);
	S_WORD  WidthBytes = pBmpSrc->WidthBytes;

	if (pBmpDst->BitsPixel != 16)
		return S_FALSE;

	switch (pBmpSrc->BitsPixel)
	{
	case 4:
		for (i = 0; i < pBmpDst->height; i++)
		{
			_memcpy4to16(pDst, pSrc, pBmpSrc->width);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	case 8:
		for (i = 0; i < pBmpDst->height; i++)
		{
			_memcpy8to16(pDst, pSrc, pBmpSrc->width);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	case 16:
		for (i = 0; i < pBmpDst->height; i++)
		{
			memcpy(pDst, pSrc, WidthBytes);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	case 24:
		for (i = 0; i < pBmpDst->height; i++)
		{
			_memcpy24to16(pDst, pSrc, pBmpSrc->width);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	default:
		return S_FALSE;
		break;
	}
	return S_TRUE;

}

static S_VOID _memcpy4to24(S_BYTE *pDst, S_BYTE *pSrc, S_WORD nPixel)
{
	S_WORD i;
	S_WORD odd = nPixel&0x1;
	S_COLOR c;

	nPixel &= 0xFFFE;
	for (i = 0; i < nPixel; i += 2)
	{
		c = gPalette4Bits[*pSrc>>4];
		*pDst++ = (S_BYTE)c;
		*pDst++ = (S_BYTE)(c>>8);
		*pDst++ = (S_BYTE)(c>>16);

		c = gPalette4Bits[*pSrc&0xF];
		*pDst++ = (S_BYTE)c;
		*pDst++ = (S_BYTE)(c>>8);
		*pDst++ = (S_BYTE)(c>>16);

		pSrc++;
	}
	if (odd)
	{
		c = gPalette4Bits[*pSrc>>4];
		*pDst++ = (S_BYTE)c;
		*pDst++ = (S_BYTE)(c>>8);
		*pDst++ = (S_BYTE)(c>>16);
	}
}
static S_VOID _memcpy8to24(S_BYTE *pDst, S_BYTE *pSrc, S_WORD nPixel)
{
	S_WORD i;
	S_COLOR c;

	for (i = 0; i < nPixel; i++)
	{
		c = gPalette8Bits[*pSrc++];
		*pDst++ = (S_BYTE)c;
		*pDst++ = (S_BYTE)(c>>8);
		*pDst++ = (S_BYTE)(c>>16);
	}
}
static S_VOID _memcpy16to24(S_BYTE *pDst, S_BYTE *pSrc, S_WORD nPixel)
{
	S_WORD i;
	S_COLOR c;

	for (i = 0; i < nPixel; i++)
	{
		c = *(S_WORD *)pSrc;
		pSrc += 2;
		*pDst++ = (S_BYTE)(c<<3);
		*pDst++ = (S_BYTE)((c>>5)<<2);
		*pDst++ = (S_BYTE)((c>>11)<<3);
	}
}
static S_BOOL _hai_ConverBitmapTo24Bits(_SP_BITMAP pBmpDst, _SP_BITMAP pBmpSrc)
{
	S_WORD i;
	S_BYTE * pSrc = (S_BYTE *)(pBmpSrc->lpImage);
	S_BYTE * pDst = (S_BYTE *)(pBmpDst->lpImage);
	S_WORD  WidthBytes = pBmpSrc->WidthBytes;

	if (pBmpDst->BitsPixel != 24)
		return S_FALSE;

	switch (pBmpSrc->BitsPixel)
	{
	case 4:
		for (i = 0; i < pBmpDst->height; i++)
		{
			_memcpy4to24(pDst, pSrc, pBmpSrc->width);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	case 8:
		for (i = 0; i < pBmpDst->height; i++)
		{
			_memcpy8to24(pDst, pSrc, pBmpSrc->width);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	case 16:
		for (i = 0; i < pBmpDst->height; i++)
		{
			_memcpy16to24(pDst, pSrc, pBmpSrc->width);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	case 24:
		for (i = 0; i < pBmpDst->height; i++)
		{
			memcpy(pDst, pSrc, WidthBytes);
			pSrc += WidthBytes;
			pDst += pBmpDst->WidthBytes;
		}
		break;
	default:
		return S_FALSE;
		break;
	}
	return S_TRUE;

}

SH_BITMAP  hai_CreateFormatBitmap(SH_DC hDC, SH_BITMAP hBmp)
{
	S_WORD WidthBytes;
	_SP_BITMAP pBmp;
	_SP_BITMAP pBmpDst;
	_SP_BITMAP pBmpSrc = (_SP_BITMAP)hBmp;
	
	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return (SH_BITMAP )S_NULL;
	if (!hBmp || HAI_GETHDLTYPE(hBmp) != HT_BITMAP || pBmpSrc->lpImage == S_NULL)
		return (SH_BITMAP )S_NULL;
	pBmp = (_SP_BITMAP)(((SP_DC)hDC)->hBitmap);
	if (pBmp == S_NULL)
		return (SH_BITMAP)S_NULL;

	WidthBytes = BITMAP_WIDTHBYTES(pBmpSrc->width, pBmp->BitsPixel);
	pBmpDst = (_SP_BITMAP)hai_MemAlloc(sizeof(_S_BITMAP)+WidthBytes*pBmpSrc->height);
	if (!pBmpDst)
		return (SH_BITMAP)S_NULL;

	HAI_SETHDLTYPE(pBmpDst , HT_BITMAP);
	pBmpDst ->width = pBmpSrc->width;
	pBmpDst ->height = pBmpSrc->height;
	pBmpDst ->BitsPixel = pBmp->BitsPixel;
	pBmpDst ->WidthBytes = WidthBytes;
	pBmpDst ->lpImage = ((S_BYTE *)pBmpDst)+sizeof(_S_BITMAP);

	switch (pBmpDst->BitsPixel)
	{
	case 4:
		_hai_ConverBitmapTo4Bits(pBmpDst, pBmpSrc);
		break;
	case 8:
		_hai_ConverBitmapTo8Bits(pBmpDst, pBmpSrc);
		break;
	case 16:
		_hai_ConverBitmapTo16Bits(pBmpDst, pBmpSrc);
		break;
	case 24:
		_hai_ConverBitmapTo24Bits(pBmpDst, pBmpSrc);
		break;
	default:
		break;
	}
	
	return (SH_BITMAP)pBmpDst ;
}

SH_ICON hai_LoadIcon(S_BYTE *filename)
{
	S_DWORD size;
	S_BYTE  *pRes;
	_SP_ICON pIco = S_NULL;

	if ((S_DWORD)filename & BUILTIN_RESOURCE_FLAG)
	{
	}
	else
	{
		SH_FILE hFile = hai_fopen(filename, "rb");
		if (hFile) {
			hai_fseek(hFile, 0, SEEK_END);
			size = hai_ftell(hFile);
			pRes = hai_MemAlloc(size);
			if (pRes)
			{
				hai_fseek(hFile, 0, SEEK_SET);
				size = hai_fread(pRes, size, 1, hFile);
				if (HAI_MAKEWORD(pRes)==0&&(HAI_MAKEWORD(pRes+2)==1||HAI_MAKEWORD(pRes+2)==2))
					pIco = (_SP_ICON)hai_IcoDecode(pRes, 2);
				hai_MemFree(pRes);
			}
			hai_fclose(hFile);
		}
	}

	return (SH_ICON)pIco; 
}

SH_ICON hai_CreateFormatIcon(SH_DC hDC, SH_ICON hIcon)
{
	S_WORD WidthBytes;
	_SP_BITMAP pBmp;
	_SP_ICON picoDst;
	_SP_ICON picoSrc = (_SP_ICON)hIcon;
	
	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return (SH_ICON )S_NULL;
	if (!hIcon || HAI_GETHDLTYPE(hIcon) != HT_ICON || picoSrc->lpImage == S_NULL)
		return (SH_ICON )S_NULL;
	pBmp = (_SP_BITMAP)(((SP_DC)hDC)->hBitmap);
	if (pBmp == S_NULL)
		return (SH_ICON)S_NULL;

	WidthBytes = BITMAP_WIDTHBYTES(picoSrc->width, pBmp->BitsPixel);
	picoDst = (_SP_ICON)hai_MemAlloc(sizeof(*picoDst)+WidthBytes*picoSrc->height+MASKWIDTH(picoSrc->width)*picoSrc->height+4);
	if (!picoDst)
		return (SH_ICON)S_NULL;

	HAI_SETHDLTYPE(picoDst , HT_ICON);
	picoDst ->width = picoSrc->width;
	picoDst ->height = picoSrc->height;
	picoDst ->BitsPixel = pBmp->BitsPixel;
	picoDst ->WidthBytes = WidthBytes;
	picoDst ->lpImage = ((S_BYTE *)picoDst)+sizeof(*picoDst);
	picoDst->lpMask = ((S_BYTE *)picoDst)+sizeof(*picoDst)+WidthBytes*picoDst->height;

	switch (picoDst->BitsPixel)
	{
	case 4:
		_hai_ConverBitmapTo4Bits((_SP_BITMAP)picoDst, (_SP_BITMAP)picoSrc);
		break;
	case 8:
		_hai_ConverBitmapTo8Bits((_SP_BITMAP)picoDst, (_SP_BITMAP)picoSrc);
		break;
	case 16:
		_hai_ConverBitmapTo16Bits((_SP_BITMAP)picoDst, (_SP_BITMAP)picoSrc);
		break;
	case 24:
		_hai_ConverBitmapTo24Bits((_SP_BITMAP)picoDst, (_SP_BITMAP)picoSrc);
		break;
	default:
		memset(picoDst->lpImage, 0x00, WidthBytes*picoDst->height);
		break;
	}
	if (picoSrc->lpMask)
		memcpy(picoDst->lpMask, picoSrc->lpMask, MASKWIDTH(picoSrc->width)*picoSrc->height);
	else
		memset(picoDst->lpMask, 0x00, MASKWIDTH(picoSrc->width)*picoSrc->height);
	
	return (SH_ICON)picoDst ;
}

S_BOOL hai_DrawIcon(SH_DC hDC, S_SHORT x, S_SHORT y, SH_ICON hIcon)
{
	S_BOOL ret;

	if (!hDC || !hIcon || HAI_GETHDLTYPE(hDC) != HT_DC)
		return S_FALSE;
	if (x >= ((SP_DC)hDC)->cx || y >= ((SP_DC)hDC)->cy)
		return S_FALSE;
	if (!((SP_DC)hDC)->lpImage || !((SP_DC)hDC)->hBitmap)
		return S_FALSE;

	if (HAI_GETHDLTYPE(hIcon) == HT_BITMAP)
	{
		SH_DC hdcMem;
		_SP_BITMAP pBitmap = (_SP_BITMAP)hIcon;
		
		hdcMem = hai_CreateCompatibleDC(hDC);
		hai_SelectObject(hdcMem, (SH_GDIOBJ)pBitmap);
		ret = hai_BitBlt(hDC, x, y, pBitmap->width, pBitmap->height, hdcMem, 0, 0, SRCCOPY);		
		hai_DeleteDC(hdcMem);
	}
	else if (HAI_GETHDLTYPE(hIcon) == HT_ICON)
	{
		S_BYTE mask[] = {0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};
		S_WORD i, j, w, h, ix=0, iy=0;
		S_BYTE *pdst, *psrc, *pmsk;
		_SP_ICON picon = (_SP_ICON)hIcon;
		_SP_BITMAP pbmp = (_SP_BITMAP)((SP_DC)hDC)->hBitmap;
		if (picon->BitsPixel != pbmp->BitsPixel)
			return S_FALSE;
		if (!picon->lpImage || !picon->lpMask)
			return S_FALSE;
		if (x < 0) {ix = -x; x = 0;}
		if (y < 0) {iy = -y; y = 0;}
		if (ix >= picon->width || iy >= picon->height)
			return S_FALSE;
		w = picon->width - ix;
		h = picon->height - iy;
		if (w > ((SP_DC)hDC)->cx-x) w = ((SP_DC)hDC)->cx-x;
		if (h > ((SP_DC)hDC)->cy-y) h = ((SP_DC)hDC)->cy-y;
		x += ((SP_DC)hDC)->x;//convert absolute address
		y += ((SP_DC)hDC)->y;

		pdst = (S_BYTE *)((SP_DC)hDC)->lpImage;
		psrc = (S_BYTE *)picon->lpImage;
		switch (pbmp->BitsPixel)
		{
		case 4:
			x &= ~0x1, ix &= ~0x1, w &= ~0x1;
			pdst += y * pbmp->WidthBytes + (x>>1);
			psrc += iy * picon->WidthBytes + (ix>>1);
			for (j = 0; j < h; j++) {
				pmsk = (S_BYTE *)picon->lpMask + (iy+j) * MASKWIDTH(picon->width);
				for (i = 0; i < w; i += 2) {
					if (!(pmsk[(ix+i)>>3] & mask[(ix+i)&0x7]))
						*pdst = (*pdst&0x0F)|(*psrc&0xF0);
					if (!(pmsk[(ix+i+1)>>3] & mask[(ix+i+1)&0x7]))
						*pdst = (*pdst&0xF0)|(*psrc&0x0F);
					pdst++, psrc++;
				}
				pdst += pbmp->WidthBytes - (w>>1);
				psrc += picon->WidthBytes - (w>>1);
			}
			break;
		case 8:
			pdst += y * pbmp->WidthBytes + x;
			psrc += iy * picon->WidthBytes + ix;
			for (j = 0; j < h; j++) {
				pmsk = (S_BYTE *)picon->lpMask + (iy+j) * MASKWIDTH(picon->width);
				for (i = 0; i < w; i++) {
					if (pmsk[(ix+i)>>3] & mask[(ix+i)&0x7])
						pdst++, psrc++;
					else
						*pdst++ = *psrc++;
				}
				pdst += pbmp->WidthBytes - w;
				psrc += picon->WidthBytes - w;
			}
			break;
		case 16:
			pdst += y * pbmp->WidthBytes + (x<<1);
			psrc += iy * picon->WidthBytes + (ix<<1);
			for (j = 0; j < h; j++) {
				pmsk = (S_BYTE *)picon->lpMask + (iy+j) * MASKWIDTH(picon->width);
				for (i = 0; i < w; i++) {
					if (!(pmsk[(ix+i)>>3] & mask[(ix+i)&0x7]))
						*(S_WORD*)pdst = *(S_WORD*)psrc;
					pdst += 2, psrc += 2;
				}
				pdst += pbmp->WidthBytes - (w<<1);
				psrc += picon->WidthBytes - (w<<1);
			}
			break;
		case 24:
			pdst += y * pbmp->WidthBytes + (x*3);
			psrc += iy * picon->WidthBytes + (ix*3);
			for (j = 0; j < h; j++) {
				pmsk = (S_BYTE *)picon->lpMask + (iy+j) * MASKWIDTH(picon->width);
				for (i = 0; i < w; i++) {
					if (pmsk[(ix+i)>>3] & mask[(ix+i)&0x7])
						pdst += 3, psrc += 3;
					else
						*pdst++ = *psrc++, *pdst++ = *psrc++, *pdst++ = *psrc++;
				}
				pdst += pbmp->WidthBytes - (w*3);
				psrc += picon->WidthBytes - (w*3);
			}
			break;
		}
		ret = S_TRUE;
	}
	else
		return S_FALSE;
	
	return ret;
}

static S_BOOL __BitBlt2_Blackness(S_BYTE *pImage, S_WORD BitsPixel, S_WORD WidthBytes, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h)
{
	S_BYTE c8;
	S_SHORT wbak = w;
	
	switch (BitsPixel)
	{
	case 4:
		c8 = (S_BYTE)COLOR_GRAY00<<4 | (S_BYTE)COLOR_GRAY00;
		pImage += y * WidthBytes + (x>>1);
		while (h--)
		{
			w = wbak;
			if (w && x&0x1)
			{
				*pImage = (*pImage&0xF0) | COLOR_GRAY00;
				pImage++;
				w--;
			}
			for (;w > 1; w -= 2)
			{
				*pImage++ = c8;		
			}
			if (w == 1)
			{
				*pImage = (S_BYTE)((*pImage&0x0F) | COLOR_GRAY00<<4);
				pImage++;
			}
			pImage += WidthBytes - ((wbak+1)>>1);
			if (x&0x1 && !(wbak&0x1))
				pImage -= 1;
		}
		return S_TRUE;
	case 8:
		pImage += y * WidthBytes + x;
		while (h--)
		{
			w = (wbak+7)>>3;
			switch (wbak%8)
			{
			case 0:do{*pImage++ = COLOR_BLACK_8;
			case 7:   *pImage++ = COLOR_BLACK_8;
			case 6:   *pImage++ = COLOR_BLACK_8;
			case 5:   *pImage++ = COLOR_BLACK_8;
			case 4:   *pImage++ = COLOR_BLACK_8;
			case 3:   *pImage++ = COLOR_BLACK_8;
			case 2:   *pImage++ = COLOR_BLACK_8;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -