www.pudn.com > BloodVessel.rar > ximalpha.cpp


// xImalpha.cpp : Alpha channel functions 
/* 07/08/2001 v1.00 - Davide Pizzolato - www.xdp.it 
 * CxImage version 5.99c 17/Oct/2004 
 */ 
 
#include "ximage.h" 
 
#if CXIMAGE_SUPPORT_ALPHA 
 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * \sa AlphaSetMax 
 */ 
BYTE CxImage::AlphaGetMax() const 
{ 
	return info.nAlphaMax; 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * Sets global Alpha (opacity) value applied to the whole image, 
 * valid only for painting functions. 
 * \param nAlphaMax: can be from 0 to 255 
 */ 
void CxImage::AlphaSetMax(BYTE nAlphaMax) 
{ 
	info.nAlphaMax=nAlphaMax; 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * Checks if the image has a valid alpha channel. 
 */ 
bool CxImage::AlphaIsValid() 
{ 
	return pAlpha!=0; 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * Enables the alpha palette, so the Draw() function changes its behavior. 
 */ 
void CxImage::AlphaPaletteEnable(bool enable) 
{ 
	info.bAlphaPaletteEnabled=enable; 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * True if the alpha palette is enabled for painting. 
 */ 
bool CxImage::AlphaPaletteIsEnabled() 
{ 
	return info.bAlphaPaletteEnabled; 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * Inverts the alpha channel. 
 */ 
void CxImage::AlphaClear() 
{ 
	if (pAlpha)	memset(pAlpha,0,head.biWidth * head.biHeight); 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * Sets the alpha level for the whole image  
 */ 
void CxImage::AlphaSet(BYTE level) 
{ 
	if (pAlpha)	memset(pAlpha,level,head.biWidth * head.biHeight); 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * Allocates an empty (opaque) alpha channel. 
 */ 
void CxImage::AlphaCreate() 
{ 
	if (pAlpha==NULL) { 
		pAlpha = (BYTE*)malloc(head.biWidth * head.biHeight); 
		if (pAlpha) memset(pAlpha,255,head.biWidth * head.biHeight); 
	} 
} 
//////////////////////////////////////////////////////////////////////////////// 
void CxImage::AlphaDelete() 
{ 
	if (pAlpha) { free(pAlpha); pAlpha=0; } 
} 
//////////////////////////////////////////////////////////////////////////////// 
void CxImage::AlphaInvert() 
{ 
	if (pAlpha) { 
		BYTE *iSrc=pAlpha; 
		long n=head.biHeight*head.biWidth; 
		for(long i=0; i < n; i++){ 
			*iSrc=(BYTE)~(*(iSrc)); 
			iSrc++; 
		} 
	} 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * Imports an existing alpa channel from another image with the same width and height. 
 */ 
bool CxImage::AlphaCopy(CxImage &from) 
{ 
	if (from.pAlpha == NULL || head.biWidth != from.head.biWidth || head.biHeight != from.head.biHeight) return false; 
	if (pAlpha==NULL) pAlpha = (BYTE*)malloc(head.biWidth * head.biHeight); 
	if (pAlpha==NULL) return false; 
	memcpy(pAlpha,from.pAlpha,head.biWidth * head.biHeight); 
	info.nAlphaMax=from.info.nAlphaMax; 
	return true; 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * Creates the alpha channel from a gray scale image. 
 */ 
bool CxImage::AlphaSet(CxImage &from) 
{ 
	if (!from.IsGrayScale() || head.biWidth != from.head.biWidth || head.biHeight != from.head.biHeight) return false; 
	if (pAlpha==NULL) pAlpha = (BYTE*)malloc(head.biWidth * head.biHeight); 
	BYTE* src = from.info.pImage; 
	BYTE* dst = pAlpha; 
	if (src==NULL || dst==NULL) return false; 
	for (long y=0; yTransfer(tmp); 
 
	return true; 
} 
//////////////////////////////////////////////////////////////////////////////// 
/** 
 * Exports the alpha palette channel in a 8bpp grayscale image.  
 */ 
bool CxImage::AlphaPaletteSplit(CxImage *dest) 
{ 
	if (!AlphaPaletteIsValid() || !dest) return false; 
 
	CxImage tmp(head.biWidth,head.biHeight,8); 
	if (!tmp.IsValid()) return false; 
 
	for(long y=0; yTransfer(tmp); 
 
	return true; 
} 
//////////////////////////////////////////////////////////////////////////////// 
#endif //CXIMAGE_SUPPORT_ALPHA