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

📄 shadow_i.c

📁 汉字
💻 C
字号:



/***************************************************************
	字体阴影实现函数shadow,输入为存储文字的buffer,传入的接口
	为:char * in,点阵的长width,点阵的宽height,以及点阵每一行
	的字节数linebytes。

	数据类型:
	U32  :  unsigned int
	U8   :  unsigned char
***************************************************************/

#include "awf_Private.h"
#define SHADOW_SIZE   2

static void shadow_move(U32 * in, U32 * out, U32 xsize, U32 ysize);
static void shadow_smooth(U32 * in, U32 * out, U32 xsize, U32 ysize);

void shadow(U32 *pBuffer, U32 xsize, U32 ysize)
{	
	U32 	x;
	U32 	y;
	void 	*lptemp;
	void 	*lptemp1;
	U8  	*lpPtr;
	U8  	*lpTempPtr;

	if((lptemp = (void *)esMEMS_Malloc(0, (xsize+SHADOW_SIZE)*4*(ysize+SHADOW_SIZE)))==NULL)
	{
    	__inf("malloc lptemp fail\n");
	}
	if((lptemp1 = (void *)esMEMS_Malloc(0, (xsize+SHADOW_SIZE)*4*(ysize+SHADOW_SIZE)))==NULL)
	{
    	__inf("malloc lptemp1 fail\n");
    	
	}
	for(y=0; y<ysize+SHADOW_SIZE; y++)
	{
		for(x=0; x<xsize+SHADOW_SIZE; x++)
		{
			if((y>=ysize)||(x>=xsize))
			{
				lpTempPtr = (U8 *)lptemp + y*(xsize+SHADOW_SIZE)*4 + 4*x;
				*(U32 *)lpTempPtr = 0x00000000;
			}
			else
			{
				lpTempPtr = (U8 *)lptemp + y*(xsize+SHADOW_SIZE)*4 + 4*x;
				lpPtr = (U8 *)pBuffer + y*xsize*4 + 4*x;
				*(U32 *)lpTempPtr = *(U32 *)lpPtr;
			}
		}
	}

	
	xsize += SHADOW_SIZE;
	ysize += SHADOW_SIZE;
//	memcpy((U8 *)pBuffer,(U8 *)lptemp,xsize*ysize*4);
	memcpy((U8 *)lptemp1,(U8 *)lptemp,xsize*ysize*4);
	shadow_move((U32 *)lptemp, pBuffer, xsize, ysize);
	memcpy((U8 *)lptemp, (U8 *)pBuffer, xsize*ysize*4);
	memset((U8 *)pBuffer,0,xsize*ysize*4);
	shadow_smooth((U32 *)lptemp, pBuffer, xsize, ysize);	
	memcpy((U8 *)lptemp, (U8 *)pBuffer, xsize*ysize*4);
	memset((U8 *)pBuffer,0,xsize*ysize*4);
	shadow_smooth((U32 *)lptemp, pBuffer, xsize, ysize);
	
//原始图像反色处理	
	for(y=0; y<ysize; y++)
	{
	  for(x=0; x<xsize; x++)
	  {
	  	lpPtr = (U8 *)lptemp1 + y*xsize*4 + 4*x;		
		if(*(lpPtr+3) != 0)
		{
			lpTempPtr = (U8 *)pBuffer + y*xsize*4 + 4*x;
			*(int *)(lpTempPtr) = *(int *)lpPtr;
/*
				*(lpTempPtr) =(alpha0*(*(lpPtr))+(255-alpha0)*(*(lpTempPtr)))>>8;
				lpTempPtr++;
		        lpPtr++;
		        *(lpTempPtr) =(alpha0*(*(lpPtr))+(255-alpha0)*(*(lpTempPtr)))>>8;
				lpTempPtr++;
		        lpPtr++;
		        *(lpTempPtr) =(alpha0*(*(lpPtr))+(255-alpha0)*(*(lpTempPtr)))>>8;
				lpTempPtr++;
		        lpPtr++;
		        *(lpTempPtr) =(alpha0*(*(lpPtr))+(255-alpha0)*(*(lpTempPtr)))>>8;
*/
		}
	  }
	}
	
	esMEMS_Mfree(0, lptemp);
	esMEMS_Mfree(0, lptemp1);

}

static void shadow_move(U32 * in, U32 * out, U32 xsize, U32 ysize)
{
	U8 		*src;
	U8 		*dest;
	U32 	num;
	U32 	i;
	U32		j;
	U32		step;
	
	step = 2;
	for( i=0; i<ysize; i++)
	{
		for( j=0; j<xsize; j++)
		{
		
			dest =(U8 *) out+ xsize*4*i+4*j;
			*(U32 *)dest =0x00000000;
			}				
		}
	
	for( i = 0; i < ysize; i++)	// 行(除去边缘几行)
	{		
		for( j = 0; j < xsize ; j++)// 列(除去边缘几列)
		{			
			// 指向DIB第i行,第j 个象素的指针
			src = (U8 *)in + xsize*4*(i) + 4*j ;
			num = *(src + 3);
			if(num!=0)
			{
			// 指向新DIB第i行,第j个象素的指针
				dest =(U8 *) out+ xsize*4*((i+(step+1)))+4*(j+step);			
				*(unsigned char *)(dest+3) =(unsigned char) num;

			}
		}
	}
}

static void shadow_smooth(U32 * in, U32 * out, U32 xsize, U32 ysize)
{
	U8 		*src;
	U8 		*dest;
	U32 	Result;
	U32 	Tmp;
	U32 	i;
	U32		j;
	U32		k;
	U32		l;
		
	
/*	for(i = 1; i < ysize - 4 + 2 + 1; i++)	// 行(除去边缘几行)
	{		
//第一个数据点的处理
		Result=0;
		j = 1;
		// 指向新DIB第i行,第j个象素的指针
		dest = (U8 *)out + xsize*4*i + 4 * j;
		for (k = 0; k < 4 ; k++)
		{
			for (l = 0; l < 4 ; l++)
			{
				// 指向DIB第i - iTempMY + k行,第j - iTempMX + l个象素的指针
				src = (U8 *)in + xsize*4*(  i - 2 + k)+4*(j-2+l);	
				// 保存象素值
				Result += (* (src+3)) ;				
			}
		}
		
		Tmp = Result/20;					// 乘上系数	
		if(Tmp > 255)
		{
			* (dest+3) = (U8 )255;
		}
		
		else
		{
			* (dest+3) = (U8) (Tmp);
		}			
		
//之后的数据点的处理,利用模板平移,简化运算		
		for(j=j+1; j < xsize - 4 + 2 + 1; j++)// 列(除去边缘几列)
		{
			// 指向新DIB第i行,第j个象素的指针
			dest = (U8 *)out  + xsize*4*i +4 * j;

			// 指向源DIB第 i - 2 行,第j-3 个象素的指针
			src = (U8 *)in + xsize*4*( i - 2 )+4*(j-3);					
			Result -= *(src+3) ;
			// 指向源DIB第 i -1 行,第j-3 个象素的指针
			src += xsize*4;				
			Result -= *(src+3) ;
			// 指向源DIB第 i   行,第j-3 个象素的指针
			src += xsize*4;				
			Result -= *(src+3) ;
			// 指向源DIB第 i + 1   行,第j-3 个象素的指针
			src += xsize*4;				
			Result -= *(src+3) ;
			// 指向源DIB第 i + 1  行,第j + 1 个象素的指针
			src += 4*4;				
			Result += *(src+3) ;
			// 指向源DIB第 i  行,第j + 1 个象素的指针
			src -= xsize*4;				
			Result += *(src+3) ;
			// 指向源DIB第 i - 1 行,第j + 1 个象素的指针
			src -= xsize*4;				
			Result += *(src+3) ;
			// 指向源DIB第 i - 2 行,第j + 1 个象素的指针
			src -= xsize*4;				
			Result += *(src+3) ;			

			Tmp = Result/20;					// 乘上系数	
			if(Tmp > 255)
			{
				* (dest+3)= (U8 )255;
			}
			else
			{
				* (dest+3)= (U8) Tmp;
			}
			
		}
	}*/
	
	
	for( i = 2; i < (ysize - 4 + 2 + 1); i++)	// 行(除去边缘几行)
	{			
		for( j=2; j<(xsize - 4 + 2 + 1); j++)
		{
			Result=0;
			// 指向新DIB第i行,第j个象素的指针
			dest = (unsigned char *)out +  xsize*4* (i) + 4 * j;
			for ( k = 0; k < 4; k++)
			{
				for ( l = 0; l < 4; l++)
				{
					// 指向DIB第i - iTempMY + k行,第j - iTempMX + l个象素的指针
					src = (unsigned  char*)in + xsize*4 * ( 
						i - 2 + k) + 4 * ( j - 2 + l );
					
					// 保存象素值
					Result += (* (unsigned char *)(src+3));				
				}
			}			
			Tmp = Result / 20;					// 乘上系数	
			if(Tmp > 255)
			{
				* (unsigned char * )(dest+3) = (unsigned char)255;
			}			
			else
			{
				*(unsigned char *) (dest+3) = (unsigned char) (Tmp);
			}

		}

	}	
	

}

⌨️ 快捷键说明

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