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

📄 drawcontainer.cpp

📁 一个基于symbian OS的多位图显示程序例子
💻 CPP
字号:
/*
* ============================================================================
*  Name     : CDrawContainer from DrawContainer.h
*  Part of  : Draw
*  Created  : 22.04.2005 by 
*  Implementation notes:
*     Initial content was generated by Series 60 Application Wizard.
*  Version  :
*  Copyright: 
* ============================================================================
*/

// INCLUDE FILES
#include "DrawContainer.h"
#include <coecntrl.h>

#include <eiklabel.h>  // for example label control
//add by wwx
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define Clip1(a)            ((a)>255?255:((a)<0?0:(a)))
#define Clip3(min,max,val) (((val)<(min))?(min):(((val)>(max))?(max):(val)))
FILE *p_yuv;
unsigned char imgY[144][176],imgU[144][176],imgV[144][176];
unsigned char ER[144][176],EG[144][176],EB[144][176];
TUint8 *pData;



// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// CDrawContainer::ConstructL(const TRect& aRect)
// EPOC two phased constructor
// ---------------------------------------------------------
//
void CDrawContainer::ConstructL(const TRect& aRect)
    {
    CreateWindowL();

	/*
    iLabel = new (ELeave) CEikLabel;
    iLabel->SetContainerWindowL( *this );
    iLabel->SetTextL( _L("Example View") );

    iToDoLabel = new (ELeave) CEikLabel;
    iToDoLabel->SetContainerWindowL( *this );
    iToDoLabel->SetTextL( _L("Add Your controls\n here") );
	*/
	iOffScrnBmp = new (ELeave) CFbsBitmap; 
	User::LeaveIfError(iOffScrnBmp->Create(aRect.Size(), EColor16M)); 
	iOffScrnBmpDevice = CFbsBitmapDevice::NewL(iOffScrnBmp); 
	User::LeaveIfError(iOffScrnBmpDevice->CreateContext(iOffScrnContext)); 	

	//R=(byte**)calloc(rows,        sizeof(byte*));

    SetRect(aRect);
    ActivateL();
	color=0;



    }

// Destructor
CDrawContainer::~CDrawContainer()
    {
    //delete iLabel;
    //delete iToDoLabel;
	//add by wwx
	delete iOffScrnBmp; 
	delete iOffScrnBmpDevice; 
	delete iOffScrnContext;
	//end
    }

// ---------------------------------------------------------
// CDrawContainer::SizeChanged()
// Called by framework when the view size is changed
// ---------------------------------------------------------
//
/*
void CDrawContainer::SizeChanged()
    {
    // TODO: Add here control resize code etc.
    iLabel->SetExtent( TPoint(10,10), iLabel->MinimumSize() );
    iToDoLabel->SetExtent( TPoint(10,100), iToDoLabel->MinimumSize() );
    }

// ---------------------------------------------------------
// CDrawContainer::CountComponentControls() const
// ---------------------------------------------------------
//
TInt CDrawContainer::CountComponentControls() const
    {
    return 2; // return nbr of controls inside this container
    }

// ---------------------------------------------------------
// CDrawContainer::ComponentControl(TInt aIndex) const
// ---------------------------------------------------------
//
CCoeControl* CDrawContainer::ComponentControl(TInt aIndex) const
    {
    switch ( aIndex )
        {
        case 0:
            return iLabel;
        case 1:
            return iToDoLabel;
        default:
            return NULL;
        }
    }
*/
// ---------------------------------------------------------
// CDrawContainer::Draw(const TRect& aRect) const
// ---------------------------------------------------------
//
TRect rect;//
void CDrawContainer::Draw(const TRect& aRect) const
//void CDrawContainer::Draw(char **R,char **G,char **B) 
    {
 rect=Rect();
//	Drawmap(255);

    //CWindowGc& gc = SystemGc();
    // TODO: Add your drawing code here
    // example code...
	/*
    gc.SetPenStyle( CGraphicsContext::ENullPen );
    gc.SetBrushColor( KRgbGray );
    gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
    gc.DrawRect( aRect );
	*/
	TRect rect = Rect(); 
	//iOffScrnContext->Clear(rect);
	TInt x,y;
	int flag = color;
	
	//for (int i=0; i<100; i+=2) 
	  // { 
		//	iOffScrnContext->DrawRect(TRect(TPoint(i,i), TSize(50,50))); 
		//} 

	/*TBitmapUtil bitmapUtil(iOffScrnBmp);
	if(iOffScrnBmp->IsLargeBitmap())
	{

		bitmapUtil.Begin(TPoint(0,0));
	}*/
	//TUint8 *
	pData = (TUint8*)iOffScrnBmp->DataAddress(); 
	for(x=0;x<144;x++)
		for(y=0;y<176;y++)
		{
			if(flag)
			{
			*pData++ = EB[x][y];
			*pData++ = EG[x][y];
			*pData++ = ER[x][y];
			/*pData++ = flag;
			*pData++ = 0;
			*pData++ = 0;*/
			}
			else
			{
			*pData++ = 0;
			*pData++ = 0;
			*pData++ = 0;
			}
		}

//	if(iOffScrnBmp->IsLargeBitmap()) bitmapUtil.End();

	CWindowGc& gc = SystemGc();
	//ActivateGc(); 
	//Window().Invalidate( rect );
	//Window().BeginRedraw( rect ); 
	
	gc.BitBlt(TPoint(0,0), iOffScrnBmp); 
	//gc.DrawBitmap(TPoint(0,0), iOffScrnBmp); 
	//Window().EndRedraw(); 
	//DeactivateGc(); 
	//gc.DrawRect( aRect );

    }

// ---------------------------------------------------------
// CDrawContainer::HandleControlEventL(
//     CCoeControl* aControl,TCoeEvent aEventType)
// ---------------------------------------------------------
//
void CDrawContainer::HandleControlEventL(
    CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
    {
    // TODO: Add your control event handler code here
    }


// End of File  

//add by wwx
//void CDrawContainer::Drawmap(const TRect& aRect) const
void CDrawContainer::Drawmap(int R) const //const TRect& aRect,
{
	
	Draw(rect);
	/*
	//for (int i=0; i<100; i+=2) 
	  // { 
		//	iOffScrnContext->DrawRect(TRect(TPoint(i,i), TSize(50,50))); 
		//} 

    rect=Rect();
		
	TUint8 *pData = (TUint8*)iOffScrnBmp->DataAddress(); 
	for(y=0;y<144;y++)
		for(x=0;x<176;x++)
		{
			
			
			*pData++ = R;
			*pData++ = 0;
			*pData++ = 0;
		}


	CWindowGc& gc = SystemGc();
	gc.BitBlt(TPoint(0,0), iOffScrnBmp); 
	*/
}

void CDrawContainer::SetData(int x)
{
	color=x;
	p_yuv=fopen("d:\\out.yuv","rb");

}



int CDrawContainer::Readyuv()
{
	int i,j;

	//p_yuv=fopen("d:\\out.yuv","rb");
	if(p_yuv == NULL) return 0;
	for(i=0;i<144;i++)
		for(j=0;j<176;j++)
			imgY[i][j]=fgetc(p_yuv);

	for (i=0;i<72;i++)
		for(j=0;j<88;j++)
			imgU[2*i][2*j]=fgetc(p_yuv);

	for (i=0;i<72;i++)
		for(j=0;j<88;j++)
			imgV[2*i][2*j]=fgetc(p_yuv);
	return 1;
}

void CDrawContainer::YuvToRgb()
{
	int C,D,E;
	int i,j;
  //return;
  //midy
//end midy

//midu

  for(i=0;i<72;i++)
    for(j=0;j<88;j++)
    {
		imgU[2*i][2*j+1]=Clip1((9*(imgU[2*i][2*j]+imgU[2*i][Clip3(0,2*87,2*j+2)])-(imgU[2*i][Clip3(0,2*87,2*j-2)]+imgU[2*i][Clip3(0,87,2*j+4)])+8)>>4);
		imgU[2*i+1][2*j]=Clip1((9*(imgU[2*i][2*j]+imgU[Clip3(0,2*71,2*i+2)][2*j])-(imgU[Clip3(0,2*71,2*i-2)][2*j]+imgU[Clip3(0,71,2*i+4)][2*j])+8)>>4);
    }

  for(i=0;i<72;i++)
    for(j=0;j<88;j++)
		imgU[2*i+1][2*j+1]=Clip1((9*(imgU[2*i+1][2*j]+imgU[2*i+1][Clip3(0,2*88-2,2*j+2)])-(imgU[2*i+1][Clip3(0,2*88-2,2*j-2)]+imgU[2*i+1][Clip3(0,2*88-2,2*j+4)])+8)>>4);


//end midu


//midv

  for(i=0;i<72;i++)
    for(j=0;j<88;j++)
    {
		imgV[2*i][2*j+1]=Clip1((9*(imgV[2*i][2*j]+imgV[2*i][Clip3(0,2*87,2*j+2)])-(imgV[2*i][Clip3(0,2*87,2*j-2)]+imgV[2*i][Clip3(0,87,2*j+4)])+8)>>4);
		imgV[2*i+1][2*j]=Clip1((9*(imgV[2*i][2*j]+imgV[Clip3(0,2*71,2*i+2)][2*j])-(imgV[Clip3(0,2*71,2*i-2)][2*j]+imgV[Clip3(0,71,2*i+4)][2*j])+8)>>4);
    }

  for(i=0;i<72;i++)
    for(j=0;j<88;j++)
		imgV[2*i+1][2*j+1]=Clip1((9*(imgV[2*i+1][2*j]+imgV[2*i+1][Clip3(0,2*88-2,2*j+2)])-(imgV[2*i+1][Clip3(0,2*88-2,2*j-2)]+imgV[2*i+1][Clip3(0,2*88-2,2*j+4)])+8)>>4);




//end midv


	//yuv to RGB
  for(i=0;i<144;i++)
    for(j=0;j<176;j++)
	{
		C=imgY[i][j]-16;
		D=imgU[i][j]-128;
		E=imgV[i][j]-128;
		ER[i][j]=Clip1(( 298 * C           + 409 * E + 128) >> 8);
		EG[i][j]=Clip1(( 298 * C - 100 * D - 208 * E + 128) >> 8);
		EB[i][j]=Clip1(( 298 * C + 516 * D           + 128) >> 8);
	}

}


void CDrawContainer::FreeYuv()
{
	fclose(p_yuv);
}

⌨️ 快捷键说明

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