数码相框——显示图片(缩放功能)

 BMP基本 知识参考:

http://redwolf.blog.51cto.com/427621/229096

一、 bmp.c

#if 1
#include <pic_operation.h>
#include <stdlib.h>
#include <string.h>
#include <config.h>

/*对于结构体一定注意自己对齐*/
#pragma pack(push) /*±£´æ¶ÔÆë״̬ */
#pragma pack(1)	/*É趨Ϊ4×Ö½Ú¶ÔÆë*/ 

/*¶¨ÒåÎļþÐÅϢͷ½á¹¹Ìå*/
typedef struct _tagBITMAPFILEHEADER { /* bmfh */
	unsigned short 	 	bfType; 
	unsigned long 		bfSize;
	unsigned short 		bfReserved1;
	unsigned short 		bfReserved2;
	unsigned long 		bfOffBits;
} BITMAPFILEHEADER;

/*¶¨ÒåλͼÐÅϢͷ*/
typedef struct _tagBITMAPINFOHEADER { /* bmih */
	unsigned long	  biSize;
	unsigned long	  biWidth;
	unsigned long	 biHeight;
	unsigned short	 biPlanes;
	unsigned short	 biBitCount;
	unsigned long	 biCompression;
	unsigned long 	 biSizeImage;
	unsigned long     biXPelsPerMeter;
	unsigned long     biYPelsPerMeter;
	unsigned long 	 biClrUsed;
	unsigned long	 biClrImportant;
} BITMAPINFOHEADER;

#pragma pack(pop)	/*»Ö¸´¶ÔÆë×´*/
static int  isSupportBMP(unsigned char * pucFileHead);
static int GetPixelDatasFrmBMP(unsigned char* pucFileHead, PT_PixelDatas ptPixelDatas);
static int  FreePixelDatasForBMP( PT_PixelDatas ptPixelDatas);
	
T_PicFileParese g_tBMPPicFileParese = {
	.name = "bmp",
	.isSupport = isSupportBMP,
	.GetPixelDatas = GetPixelDatasFrmBMP,
	.FreePixelDatas = FreePixelDatasForBMP,
};

static int  isSupportBMP(unsigned char * pucFileHead)
{
	if (pucFileHead[0] != 0x42 || pucFileHead[1] != 0x4d)
		return -1;
	else
		return 0;
}
static int ConvertOneLineFrmBMP(int iWidth, int iSrcBpp, int iDestBpp, unsigned char* pucSrcDatas, unsigned char* pucDestDatas)
{
	unsigned int dwRed;
	unsigned int dwGreen;
	unsigned int dwBlue;
	unsigned int dwColor;
	int iPos = 0;
        int i;
	unsigned short*  pwDestDatas16Bpp = (unsigned short*)pucDestDatas;
	unsigned int*      pdwDestDatas32Bpp = (unsigned int *)pucDestDatas;
	 /* 在这里只处理24Bpp的BMP图片*/
	 if(iSrcBpp != 24)
	 {
		return -1;
	 }
	 if(iDestBpp == 24)
	 {
		memcpy(pucDestDatas, pucSrcDatas, iWidth*3);
		return 0;
	 }
	 else
	 {
	 /*Öð¸öÏñËØת»»*/
		for(i = 0; i <  iWidth ; i++)
		{
			dwBlue= pucSrcDatas[iPos++];
			dwGreen = pucSrcDatas[iPos++];
			dwRed = pucSrcDatas[iPos++];
                        if(iDestBpp == 32)   /*iDestBpp 就是Framebuffer 中Fb中bpp为32 */
			{
				dwColor = (dwRed << 16) | (dwGreen <<8)|(dwBlue);
				*pdwDestDatas32Bpp = dwColor;
				pdwDestDatas32Bpp++;
			}
			else if(iDestBpp == 16)
			{
				/*565*/
				dwRed = (dwRed >> 3) && 0xff;
				dwGreen = (dwGreen>>2) && 0xff;
				dwBlue = (dwBlue>>3) && 0xff;
				dwColor = (dwRed <<11)|(dwGreen<<5)|(dwBlue);
				*pwDestDatas16Bpp = dwColor;
				pwDestDatas16Bpp++;
				
			}
			
		}
		
	 }
	 return 0;
}


/*
*	PT_PixelDatas->iBpp ΪÊäÈëµÄ£¬±íʾ´Ó BMP µÃµ½µÄÊý¾ÝҪת»¯µÄ¸ñʽ 
*/
#endif
#if 1
static int GetPixelDatasFrmBMP(unsigned char* pucFileHead, PT_PixelDatas ptPixelDatas)
{
/*ptPixelDatas->iBpp ÊÇÔõôÉ趨µÄÄØ*/
/*Õâ¸öiBPP À´×ÔÓÚfbµÄ¹Ì¶¨ÐÅÏ¢iBPP*/
	DBG_PRINTF("in GetPixelDatasFrmBMP\n");
	DBG_PRINTF("aFileHead 0x%X\n",pucFileHead);
	DBG_PRINTF("ptPixelDatas 0x%X\n",ptPixelDatas);
	BITMAPFILEHEADER *ptBITMAPFILEHEADER;
	BITMAPINFOHEADER *ptBITMAPINFOHEADER;
	int iWidth;
	int iHeight;
	int iBMPBpp;
	int y;

	unsigned char *pucSrc;
	unsigned char *pucDest;
	int iLineWidthAlign;
	int iLineWidthReal;
		
	ptBITMAPFILEHEADER = (BITMAPFILEHEADER *)pucFileHead;
	ptBITMAPINFOHEADER = (BITMAPINFOHEADER *)(pucFileHead + sizeof(BITMAPFILEHEADER));
		 iWidth = ptBITMAPINFOHEADER->biWidth;
		 iHeight = ptBITMAPINFOHEADER->biHeight;
		 iBMPBpp = ptBITMAPINFOHEADER->biBitCount;
	DBG_PRINTF("iWidth %d\n",iWidth);
	DBG_PRINTF("iHeight %d\n",iHeight);
	DBG_PRINTF("iBMPBpp %d\n",iBMPBpp);
		/*Ö»´¦Àí24λBMP*/
		 if(iBMPBpp != 24)
		 {
			DBG_PRINTF("iBMPBpp = %d\n",iBMPBpp);
			DBG_PRINTF("sizeof(BITMAPFILEHEADER) = %d\n", sizeof(BITMAPFILEHEADER));
			return -1;
		 }

		ptPixelDatas->iWidth	= iWidth;
		ptPixelDatas->iHeight 	= iHeight;


/*·ÖÅä´ÓBMP ת»»ºóµÄÊý¾ÝÏàÓ¦µÄÄÚ´æ¿Õ¼ä´óС*/
/*´ËʱÕâ¸ö ptPixelDatas->iBppÀ´×Ô´«½øÀ´µÄ ptDispOpr->iBpp*/ /*在这里犯下严重错误*/
	ptPixelDatas->pucPixelDatas = malloc(iWidth * iHeight * ptPixelDatas->iBpp / 8);
	ptPixelDatas->iLineBytes    = iWidth * ptPixelDatas->iBpp / 8;
	DBG_PRINTF("ptPixelDatas->iLineBytes %d\n",ptPixelDatas->iLineBytes);
	
		 /*´ËʱÕâ¸ö ptPixelDatas->iBppÀ´×Ô´«½øÀ´µÄ ptDispOpr->iBpp*/
		 ptPixelDatas->iLineBytes = iWidth * ptPixelDatas->iBpp/8; 
		 
/*°ÑͼÏñ´æ·Åµ½ÖØзÖÅäµÄÇøÓò*/
		 iLineWidthReal = iWidth*iBMPBpp/8;
		 iLineWidthAlign = (iLineWidthReal+3)&(~0x3);  /*¶ÁÈ¡°´4×Ö½ÚÈ¡Õû*/  /*除4取整*/
	DBG_PRINTF("iLineWidthReal %d\n",iLineWidthReal);
	DBG_PRINTF("iLineWidthAlign %d\n",iLineWidthAlign);
		 pucSrc = pucFileHead + ptBITMAPFILEHEADER->bfOffBits;
		 pucSrc = pucSrc + (iHeight -1) * iLineWidthAlign;

		 
		pucDest = ptPixelDatas->pucPixelDatas; 

		 for(y=0 ; y<iHeight ; y++)
		 {
			ConvertOneLineFrmBMP(iWidth, iBMPBpp, ptPixelDatas->iBpp, pucSrc, pucDest); /*注意图片数据存放的位置*/
			pucSrc  -= iLineWidthAlign;    
			pucDest += ptPixelDatas->iLineBytes;
		 }
		 return 0;
}

static int  FreePixelDatasForBMP( PT_PixelDatas ptPixelDatas)
{
	free(ptPixelDatas->pucPixelDatas);
	return 0;
}
#endif

#if 0
#include <config.h>
#include <pic_operation.h>
#include <stdlib.h>
#include <string.h>

#pragma pack(push) /* ½«µ±Ç°packÉèÖÃѹջ±£´æ */
#pragma pack(1)    /* ±ØÐëÔڽṹÌ嶨Òå֮ǰʹÓà */

typedef struct tagBITMAPFILEHEADER { /* bmfh */
	unsigned short bfType; 
	unsigned long  bfSize;
	unsigned short bfReserved1;
	unsigned short bfReserved2;
	unsigned long  bfOffBits;
} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER { /* bmih */
	unsigned long  biSize;
	unsigned long  biWidth;
	unsigned long  biHeight;
	unsigned short biPlanes;
	unsigned short biBitCount;
	unsigned long  biCompression;
	unsigned long  biSizeImage;
	unsigned long  biXPelsPerMeter;
	unsigned long  biYPelsPerMeter;
	unsigned long  biClrUsed;
	unsigned long  biClrImportant;
} BITMAPINFOHEADER;

#pragma pack(pop) /* »Ö¸´ÏÈÇ°µÄpackÉèÖà */

static int isBMPFormat(unsigned char *aFileHead);
static int GetPixelDatasFrmBMP(unsigned char *aFileHead, PT_PixelDatas ptPixelDatas);
static int FreePixelDatasForBMP(PT_PixelDatas ptPixelDatas);

T_PicFileParese g_tBMPPicFileParese = {
	.name           = "bmp",
	.isSupport      = isBMPFormat,
	.GetPixelDatas  = GetPixelDatasFrmBMP,
	.FreePixelDatas = FreePixelDatasForBMP,	
};

static int isBMPFormat(unsigned char *aFileHead)
{
	if (aFileHead[0] != 0x42 || aFileHead[1] != 0x4d)
		return -1;
	else
		return 0;
}

static int CovertOneLine(int iWidth, int iSrcBpp, int iDstBpp, unsigned char *pudSrcDatas, unsigned char *pudDstDatas)
{
	unsigned int dwRed;
	unsigned int dwGreen;
	unsigned int dwBlue;
	unsigned int dwColor;

	unsigned short *pwDstDatas16bpp = (unsigned short *)pudDstDatas;
	unsigned int   *pwDstDatas32bpp = (unsigned int *)pudDstDatas;

	int i;
	int pos = 0;

	if (iSrcBpp != 24)
	{
		return -1;
	}

	if (iDstBpp == 24)
	{
		memcpy(pudDstDatas, pudSrcDatas, iWidth*3);
	}
	else
	{
		for (i = 0; i < iWidth; i++)
		{
			dwBlue  = pudSrcDatas[pos++];
			dwGreen = pudSrcDatas[pos++];
			dwRed   = pudSrcDatas[pos++];
			if (iDstBpp == 32)
			{
				dwColor = (dwRed << 16) | (dwGreen << 8) | dwBlue;
				*pwDstDatas32bpp = dwColor;
				pwDstDatas32bpp++;
			}
			else if (iDstBpp == 16)
			{
				/* 565 */
				dwRed   = dwRed >> 3;
				dwGreen = dwGreen >> 2;
				dwBlue  = dwBlue >> 3;
				dwColor = (dwRed << 11) | (dwGreen << 5) | (dwBlue);
				*pwDstDatas16bpp = dwColor;
				pwDstDatas16bpp++;
			}
		}
	}
	return 0;
}

/*
 * ptPixelDatas->iBpp ÊÇÊäÈëµÄ²ÎÊý, Ëü¾ö¶¨´ÓBMPµÃµ½µÄÊý¾ÝҪת»»Îª¸Ã¸ñʽ
 */
 #endif
 #if 0
static int GetPixelDatasFrmBMP(unsigned char *aFileHead, PT_PixelDatas ptPixelDatas)
{
	DBG_PRINTF("in GetPixelDatasFrmBMP\n");
	DBG_PRINTF("aFileHead 0x%X\n",aFileHead);
	DBG_PRINTF("ptPixelDatas 0x%X\n",ptPixelDatas);
	BITMAPFILEHEADER *ptBITMAPFILEHEADER;
	BITMAPINFOHEADER *ptBITMAPINFOHEADER;

	int iWidth;
	int iHeight;
	int iBMPBpp;
	int y;

	unsigned char *pucSrc;
	unsigned char *pucDest;
	int iLineWidthAlign;
	int iLineWidthReal;
	

	ptBITMAPFILEHEADER = (BITMAPFILEHEADER *)aFileHead;
	ptBITMAPINFOHEADER = (BITMAPINFOHEADER *)(aFileHead + sizeof(BITMAPFILEHEADER));

	iWidth = ptBITMAPINFOHEADER->biWidth;
	iHeight = ptBITMAPINFOHEADER->biHeight;
	iBMPBpp = ptBITMAPINFOHEADER->biBitCount;
	DBG_PRINTF("iWidth %d\n",iWidth);
	DBG_PRINTF("iHeight %d\n",iHeight);
	DBG_PRINTF("iBMPBpp %d\n",iBMPBpp);
	if (iBMPBpp != 24)
	{
		DBG_PRINTF("iBMPBpp = %d\n", iBMPBpp);
		DBG_PRINTF("sizeof(BITMAPFILEHEADER) = %d\n", sizeof(BITMAPFILEHEADER));
		return -1;
	}

	ptPixelDatas->iWidth  = iWidth;
	ptPixelDatas->iHeight = iHeight;
	//ptPixelDatas->iBpp    = iBpp;
	ptPixelDatas->pucPixelDatas = malloc(iWidth * iHeight * ptPixelDatas->iBpp / 8);
	ptPixelDatas->iLineBytes    = iWidth * ptPixelDatas->iBpp / 8;
	DBG_PRINTF("ptPixelDatas->iLineBytes %d\n",ptPixelDatas->iLineBytes);

	if (NULL == ptPixelDatas->pucPixelDatas)
	{
		return -1;
	}
	DBG_PRINTF("iLineWidthReal %d\n",iLineWidthReal);
	DBG_PRINTF("iLineWidthAlign %d\n",iLineWidthAlign);

	iLineWidthReal = iWidth * iBMPBpp / 8;
	iLineWidthAlign = (iLineWidthReal + 3) & ~0x3;   /* Ïò4È¡Õû */

	DBG_PRINTF("iLineWidthReal %d\n",iLineWidthReal);
	DBG_PRINTF("iLineWidthAlign %d\n",iLineWidthAlign);
	
	pucSrc = aFileHead + ptBITMAPFILEHEADER->bfOffBits;
	pucSrc = pucSrc + (iHeight - 1) * iLineWidthAlign;

	pucDest = ptPixelDatas->pucPixelDatas;
	
	DBG_PRINTF("pucSrc 0x%X\n",pucSrc);
	DBG_PRINTF("pucDest 0x%X\n",pucDest);
	DBG_PRINTF("iLineWidthAlign %d\n",iLineWidthAlign);
	DBG_PRINTF("iLineWidthAlign %d\n",iLineWidthAlign);
	DBG_PRINTF("iWidth %d\n",iWidth);
	DBG_PRINTF("iBMPBpp %d\n",iBMPBpp);
	DBG_PRINTF(" ptPixelDatas->iBpp %d\n", ptPixelDatas->iBpp);	



	for (y = 0; y < iHeight; y++)
	{		
		//memcpy(pucDest, pucSrc, iLineWidthReal);
		ConvertOneLineFrmBMP(iWidth, iBMPBpp, ptPixelDatas->iBpp, pucSrc, pucDest);
		pucSrc  -= iLineWidthAlign;
		pucDest += ptPixelDatas->iLineBytes;
	}
	return 0;	
}

static int FreePixelDatasForBMP(PT_PixelDatas ptPixelDatas)
{
	free(ptPixelDatas->pucPixelDatas);
	return 0;
}
#endif
二、pic_operation.h

#ifndef _PIC_OPERATION_H_
#define _PIC_OPERATION_H_

typedef struct PixelDatas {
	int iWidth;
	int iHeight;
	int iBpp;
	int iLineBytes;
	unsigned char* pucPixelDatas;
}T_PixelDatas, *PT_PixelDatas;


typedef struct PicFileParse{
	char *name;
	int  (*isSupport)(unsigned char * pucFileHead);
	int (*GetPixelDatas)(unsigned char* pucFileHead, PT_PixelDatas ptPixelDatas);
	int (*FreePixelDatas)( PT_PixelDatas ptPixelDatas);
}T_PicFileParese, *PT_PicFileParese;
#endif  /*_PIC_OPERATION_H_*/
三、merge.c

#include <pic_operation.h>
 #include <string.h>
 #include <config.h>
/*°ÑСͼºÏ²¢µ½´óͼÖÐ*/
int PicMerge(int iX, int iY, PT_PixelDatas ptSmallPic, PT_PixelDatas ptBigPic)
{
	int i;
	unsigned char* pucSrc;
	unsigned char* pucDest;
	DBG_PRINTF("in PicMerge\n");
	DBG_PRINTF("ptSmallPic 0x%X\n",ptSmallPic);
	DBG_PRINTF("ptBigPic 0x%X\n",ptBigPic);
	DBG_PRINTF("ptSmallPic->iWidth %d\n",ptSmallPic->iWidth);
	DBG_PRINTF("ptBigPic->iWidth %d\n", ptBigPic->iWidth);
	DBG_PRINTF("ptSmallPic->iHeight %d\n",ptSmallPic->iHeight);
	DBG_PRINTF("ptBigPic->iHeight %d\n", ptBigPic->iHeight);
	DBG_PRINTF("ptSmallPic->iBpp %d\n", ptSmallPic->iBpp);
	DBG_PRINTF(" ptBigPic->iBpp %d\n",  ptBigPic->iBpp);
	DBG_PRINTF("ptSmallPic->pucPixelDatas 0x%X\n",ptSmallPic->pucPixelDatas);
	DBG_PRINTF("ptBigPic->pucPixelDatas 0x%X\n",ptBigPic->pucPixelDatas);



/*ºÏ·¨ÐÔ¼ì²â*/
	if((ptSmallPic->iWidth > ptBigPic->iWidth) ||
	    (ptSmallPic->iHeight>ptBigPic->iHeight) ||
	    (ptSmallPic->iBpp != ptBigPic->iBpp))
	{
		return -1;
	}
	DBG_PRINTF("ptSmallPic 0x%X\n",ptSmallPic);
	DBG_PRINTF("ptBigPic 0x%X\n",ptBigPic);

	pucSrc = ptSmallPic->pucPixelDatas;
	DBG_PRINTF("ptSmallPic 0x%X\n",ptSmallPic);

	pucDest = ptBigPic->pucPixelDatas + iY*ptBigPic->iLineBytes + iX*ptBigPic->iBpp/8;
	
	DBG_PRINTF("pucSrc 0x%X\n",pucSrc);
	DBG_PRINTF("pucDest 0x%X\n",pucDest);
	for(i=0; i< ptSmallPic->iHeight; i++)
	{
		memcpy(pucDest, pucSrc, ptSmallPic->iLineBytes);
		pucSrc +=ptSmallPic->iLineBytes;
		pucDest +=ptBigPic->iLineBytes;
	}
	DBG_PRINTF("emd PicMerge\n");
	return 0;
}
四、修改fb_demo的bug

#include <config.h>
#include <disp_manager.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <string.h>

/*¹¹Ôì¡¢ÉèÖá¢×¢²á½á¹¹Ìå²ÉÓÃÃæÏò¶ÔÏóµÄ˼Ïë*/
#if 0
typedef struct DispOpr {
	char* name;
	int	 iXres;
	int 	 iYres;
	int 	 iBpp;
	int	 (*ShowPixel)(int iPenX, int iPenY, unsigned int dwColor);
	int 	 (*CleanScreen)(unsigned int dwBackColor);
	int 	 (*DeviceInit)(void);
	struct DispOpr *ptNext;
}T_DispOpr, *PT_DispOpr;

int RegisterDispOpr(PT_DispOpr ptDispOpr);
void ShowDispOpr(void);
int 	DisplayInit(void);
int	FBInit(void);
#endif
static int FBDeviceInit(void);
static int FBShowPixel(int iX, int iY, unsigned int dwColor);
static int FBCleanScreen(unsigned int dwBackColor);


static T_DispOpr g_tFBOpr = {
	.name = "fb",
	.DeviceInit = FBDeviceInit,
	.ShowPixel = FBShowPixel,
	.CleanScreen = FBCleanScreen,
};

static int g_iFBFd;

static  struct fb_var_screeninfo  g_tFBVar;
static  struct fb_fix_screeninfo   g_tFBFix;

static unsigned int g_dwScreenSize;
static unsigned int g_dwLineWidth;
static unsigned int g_dwPixelWidth;
static unsigned char * g_pucFBMem;

static int FBDeviceInit(void)
{
	g_iFBFd = open(FB_DEVICE_NAME,O_RDWR);
	if(g_iFBFd < 0)
	{
		DBG_PRINTF("open /dev/fb0 failed\n");
		return -1;
	}
	
	if (ioctl(g_iFBFd, FBIOGET_VSCREENINFO, &g_tFBVar))
	{
		DBG_PRINTF("get var information failed\n");
		return -1;
	}
	if (ioctl(g_iFBFd, FBIOGET_FSCREENINFO, &g_tFBFix))
	{
		DBG_PRINTF("get fix information failed\n");
		return -1;
	}
	
	g_dwScreenSize =  g_tFBVar.xres * g_tFBVar.yres *  g_tFBVar.bits_per_pixel /8;
	g_pucFBMem      =  (unsigned char *)mmap(NULL , g_dwScreenSize, PROT_READ | PROT_WRITE, MAP_SHARED, g_iFBFd, 0);
	if(g_pucFBMem == (unsigned char *)-1)
	{
		DBG_PRINTF("g_pucFBMem mmap failed\n ");
		return -1;
	}
	g_tFBOpr.iXres =  g_tFBVar.xres; 
	g_tFBOpr.iYres =  g_tFBVar.yres;
	g_tFBOpr.iBpp  =  g_tFBVar.bits_per_pixel;
	g_tFBOpr.pucDispMem = g_pucFBMem;    /* 此处需要修改*/

	g_dwLineWidth   =  g_tFBVar.xres *  g_tFBVar.bits_per_pixel /8;
	g_dwPixelWidth  =  g_tFBVar.bits_per_pixel /8;
	return 0;
}
static int FBShowPixel(int iPenX, int iPenY, unsigned int dwColor)
{
	unsigned char *pucFB8pp = (unsigned char*)(g_pucFBMem+iPenY*g_dwLineWidth+iPenX*g_dwPixelWidth);
	unsigned short *pwFB16pp;
	unsigned int *pdwFB32pp;
	
	pwFB16pp = (unsigned short*)pucFB8pp;
	pdwFB32pp = (unsigned int*)pucFB8pp;
	
	unsigned char red,green,blue;

	/*0xRRGGBB*/
	switch( g_tFBVar.bits_per_pixel)
	{
		case 8:
			*pucFB8pp = dwColor;
			break;
		case 16:
			red 	   		=  (dwColor >>16)&0xff;
			green  		=  (dwColor>>8)&0xff;
			blue    		=  (dwColor>>0)&0xff;
			dwColor   	= ((red>>3)<<11)|((green>>2)<<5)|((blue>>3)<<0);
			*pwFB16pp	= dwColor;
			break;
		case 32:
			*pdwFB32pp 	= dwColor;
			break;
		default:
			DBG_PRINTF("Can' support  error\n");
			return -1;
	}
	return 0;
}

static int FBCleanScreen(unsigned int dwBackColor)
{
	unsigned char *pucFB8pp = (unsigned char*)(g_pucFBMem);
	unsigned short *pwFB16pp;
	unsigned int *pdwFB32pp;
	
	pwFB16pp = (unsigned short*)pucFB8pp;
	pdwFB32pp = (unsigned int*)pucFB8pp;
	
	unsigned char red,green,blue;
	int i = 0;
	/*0xRRGGBB*/
	switch(g_tFBVar.bits_per_pixel)
	{
		case 8:
			memset(g_pucFBMem, dwBackColor, g_dwScreenSize);
			break;
		case 16:
			red 	   		=  (dwBackColor >>16)&0xff;
			green  		=  (dwBackColor>>8)&0xff;
			blue    		=  (dwBackColor>>0)&0xff;
			dwBackColor   = ((red>>3)<<11)|((green>>2)<<5)|((blue>>3)<<0);
			while(i < g_dwScreenSize)
			{
				*pwFB16pp  = dwBackColor;
				pwFB16pp++;
				i +=2;
			}	
			break;
		case 32:
			while(i < g_dwScreenSize)
			{
				*pdwFB32pp  = dwBackColor;
				pdwFB32pp++;
				i += 4;

			}	
			break;
		default:
			DBG_PRINTF("Can' support  %d bpp\n",g_tFBOpr.iBpp);
			return -1;
	}
	return 0;	
}

int FBInit(void)
{
	return RegisterDispOpr(&g_tFBOpr);
}



五、测试程序

#include <stdio.h>
#include <encoding_manager.h>
#include <fonts_manager.h>
#include <disp_manager.h>
#include <input_manager.h>
#include <debug_manager.h>
#include <page_manager.h>
#include <pic_operation.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <render.h>
#include <config.h>

int main(int argc, char **argv)
{
	int iFdBmp;
	int iRet;
	unsigned char *pucBMPmem;
	struct stat tStatBMPbuf;
		
	PT_DispOpr ptDispOpr;

	extern T_PicFileParese g_tBMPPicFileParese;

	T_PixelDatas tPixelDatas;
	T_PixelDatas tPixelDatasSmall;

	T_PixelDatas tPixelDatasFB;

	if (argc != 2)
	{
		printf("%s <bmp_file>\n", argv[0]);
		return -1;
	}

	DebugInit();
	SelectAndInitChannel();

	DisplayInit();

	ptDispOpr = GetDispOpr("fb");
	ptDispOpr->DeviceInit();
	ptDispOpr->CleanScreen(0);
	
DBG_PRINTF("open!......................\n");
	/* ´ò¿ªBMPÎļþ */
	iFdBmp = open(argv[1], O_RDWR);
	if (iFdBmp == -1)
	{
		DBG_PRINTF("can't open %s\n", argv[1]);
	}

	fstat(iFdBmp, &tStatBMPbuf);
	DBG_PRINTF("ptStatBMPbuf->st_size %d\n",tStatBMPbuf.st_size);
	pucBMPmem = (unsigned char *)mmap(NULL ,tStatBMPbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, iFdBmp, 0);
	if (pucBMPmem == (unsigned char *)-1)
	{
		DBG_PRINTF("mmap error!\n");
		return -1;
	}
	DBG_PRINTF("pucBMPmem 0x%X\n",pucBMPmem);
	/* ÌáÈ¡BMPÎļþµÄRGBÊý¾Ý, Ëõ·Å, ÔÚLCDÉÏÏÔʾ³öÀ´ */
	iRet = g_tBMPPicFileParese.isSupport(pucBMPmem);
	if (iRet == -1)
	{
		DBG_PRINTF("%s is not bmp file\n", argv[1]);
		return -1;		
	}
	
	tPixelDatas.iBpp = ptDispOpr->iBpp;
	iRet = g_tBMPPicFileParese.GetPixelDatas(pucBMPmem, &tPixelDatas);
	if (iRet)
	{
		DBG_PRINTF("GetPixelDatas error!\n");
		return -1;		
	}

	DBG_PRINTF("ptDispOpr->name %s\n",ptDispOpr->name);
	DBG_PRINTF("ptDispOpr->iXres %d\n", ptDispOpr->iXres);
	DBG_PRINTF("ptDispOpr->iYres %d\n",ptDispOpr->iYres);
	DBG_PRINTF("ptDispOpr->iBpp %d\n",ptDispOpr->iBpp);
	DBG_PRINTF("tDispOpr->iXres * ptDispOpr->iBpp / 8 %d\n",ptDispOpr->iXres * ptDispOpr->iBpp / 8);
	tPixelDatasFB.iWidth        = ptDispOpr->iXres;
	tPixelDatasFB.iHeight       = ptDispOpr->iYres;
	tPixelDatasFB.iBpp          = ptDispOpr->iBpp;
	tPixelDatasFB.iLineBytes    = ptDispOpr->iXres * ptDispOpr->iBpp / 8; 
	tPixelDatasFB.pucPixelDatas = ptDispOpr->pucDispMem;
	
	DBG_PRINTF("&tPixelDatas 0x%X\n", &tPixelDatas);
	DBG_PRINTF("&tPixelDatasFB 0x%X\n",&tPixelDatasFB);
	
	
	DBG_PRINTF("tPixelDatas.pucPixelDatas 0x%X\n",tPixelDatas.pucPixelDatas);
	DBG_PRINTF("tPixelDatasFB.pucPixelDatas 0x%X\n",tPixelDatasFB.pucPixelDatas);	
	PicMerge(0, 0, &tPixelDatas, &tPixelDatasFB);

	tPixelDatasSmall.iWidth  = tPixelDatas.iWidth/2;
	tPixelDatasSmall.iHeight = tPixelDatas.iHeight/2;
	tPixelDatasSmall.iBpp    = tPixelDatas.iBpp;
	tPixelDatasSmall.iLineBytes = tPixelDatasSmall.iWidth * tPixelDatasSmall.iBpp / 8;
	tPixelDatasSmall.pucPixelDatas = malloc(tPixelDatasSmall.iLineBytes * tPixelDatasSmall.iHeight);
	
	PicZoom(&tPixelDatas, &tPixelDatasSmall);  /* 图片缩放*/
	PicMerge(128, 128, &tPixelDatasSmall, &tPixelDatasFB);
	return 0;
}


调试信息:

/project1/14th_digital_photo_frame_origin # ./digitalpic 13.bmp 
open!......................
ptStatBMPbuf->st_size 230454    /*13.bmp 文件大小*/
pucBMPmem 0xB5C80000            /*BMP 内存映射地址*/
in GetPixelDatasFrmBMP
aFileHead 0xB5C80000               
ptPixelDatas 0xBEAE7CBC            /*ptPixelDatas 用来存放BMP的地址,可以理解为FB地址 */
iWidth 240                          /* BMP图片的大小*/
iHeight 320
iBMPBpp 24
ptPixelDatas->iLineBytes 960        /*ptPixelDatas 中成员的iLineBytes  一行的长度*/  
iLineWidthReal 720
iLineWidthAlign 720
ptDispOpr->name fb                   /*FrameBuffer  的一些信息*/
ptDispOpr->iXres 240
ptDispOpr->iYres 320
ptDispOpr->iBpp 32                      /*FrameBuffer  采用32bpp */
tDispOpr->iXres * ptDispOpr->iBpp / 8 960
&tPixelDatas 0xBEAE7CBC
&tPixelDatasFB 0xBEAE7C94
tPixelDatas.pucPixelDatas 0xB5C34008
tPixelDatasFB.pucPixelDatas 0xB5CB9000
in PicMerge
ptSmallPic 0xBEAE7CBC
ptBigPic 0xBEAE7C94
ptSmallPic->iWidth 240
ptBigPic->iWidth 240
ptSmallPic->iHeight 320
ptBigPic->iHeight 320
ptSmallPic->iBpp 32
 ptBigPic->iBpp 32
ptSmallPic->pucPixelDatas 0xB5C34008
ptBigPic->pucPixelDatas 0xB5CB9000
ptSmallPic 0xBEAE7CBC
ptBigPic 0xBEAE7C94
ptSmallPic 0xBEAE7CBC
pucSrc 0xB5C34008
pucDest 0xB5CB9000
emd PicMerge
in PicMerge
ptSmallPic 0xBEAE7CA8
ptBigPic 0xBEAE7C94
ptSmallPic->iWidth 120
ptBigPic->iWidth 240
ptSmallPic->iHeight 160
ptBigPic->iHeight 320
ptSmallPic->iBpp 32
 ptBigPic->iBpp 32
ptSmallPic->pucPixelDatas 0x19130
ptBigPic->pucPixelDatas 0xB5CB9000
ptSmallPic 0xBEAE7CA8
ptBigPic 0xBEAE7C94
ptSmallPic 0xBEAE7CA8
pucSrc 0x19130
pucDest 0xB5CD7200
emd PicMerge
/project1/14th_digital_photo_frame_origin # 


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值