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

📄 graphics.cpp

📁 在手机操作系统symbina上使用的一个脚本扩展语言的代码实现,可以参考用于自己的开发
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	}

void COplDrawable::SetTextMode(TOplDrawMode aTextMode)
	{
//	SetGcMode(aTextMode);
	iCurrentTextMode = aTextMode;
	}

void COplDrawable::SetGcMode(TOplDrawMode aMode)
// Functions relying on the gGMode, gTMode settings call this before drawing in case GC
// has been changed directly.
// Just returns if still the same valid setting.
	{
#if defined(_DEBUG)
	_LIT(KInvalidGCMode,"Invalid Opl GC mode");
#endif
	__ASSERT_DEBUG(aMode!=EOplGcModeInvalid,User::Panic(KInvalidGCMode,1)); // user should have call equivalent SetGcModeInvalid() instead
	if (iCurrentGcMode==aMode)
		return;
	iCurrentGcMode=aMode;
	TRgb foreGround = iForegroundColor;
	TRgb backGround = iBackgroundColor;
	iDrawableGc->SetPenStyle(CGraphicsContext::ESolidPen);
	CGraphicsContext::TBrushStyle brushStyle = CGraphicsContext::ENullBrush;
	CGraphicsContext::TDrawMode drawMode = CGraphicsContext::EDrawModePEN;
	switch(aMode)
		{
	case EModeClear :
		foreGround = iBackgroundColor;
		break;
	case EModeInvert :
		drawMode = CGraphicsContext::EDrawModeNOTSCREEN;
		break;
	case EModeReplace :
		brushStyle = CGraphicsContext::ESolidBrush;
		break;
	case EModeInverseStyle :
		backGround = iForegroundColor;
		foreGround = iBackgroundColor;
		brushStyle = CGraphicsContext::ESolidBrush;
		break;
	case EModeSet :
    default:
		break;
		}
	iDrawableGc->SetPenColor(foreGround);
	iDrawableGc->SetBrushColor(backGround);
	iDrawableGc->SetBrushStyle(brushStyle);
	iDrawableGc->SetDrawMode(drawMode);
	}

void COplDrawable::SetPattern(COplDrawable* aSource, TSize& aSize)
	{
	TRect rect(iCursorPosition,aSize);
	CFbsBitmap* backup=NULL;
	SetGcModeInvalid();	// GC set below directly
	if (aSource->DrawableFlag() == EIsOplBitmap)
		iDrawableGc->UseBrushPattern(&((COplBitmap*)aSource)->FbsBitmap());
	else
		{
        backup = new(ELeave) CFbsBitmap();
		CleanupStack::PushL(backup);
		((COplWindow*)aSource)->BackupBmpHandleL(*backup);
		iDrawableGc->UseBrushPattern(backup);
		}
	iDrawableGc->SetBrushStyle(CGraphicsContext::EPatternedBrush);		
	iDrawableGc->DrawRect(rect);
	if (backup)
		CleanupStack::PopAndDestroy();
	}

void COplDrawable::DoScrollClear(const TPoint& aOffset,const TRect& aArea)
	{
	SetGcMode(EModeReplace); // does not affect current draw and text modes
	TInt absDX=Abs(aOffset.iX);
	TInt absDY=Abs(aOffset.iY);
	if (absDX>aArea.Size().iWidth||absDY>aArea.Size().iHeight)
		iDrawableGc->Clear(aArea); // no overlap
	else
		{
		TSize size(absDX,aArea.Size().iHeight);
		if (aOffset.iX>0)
			iDrawableGc->Clear(TRect(aArea.iTl,size));
		else if (aOffset.iX<0)
			iDrawableGc->Clear(TRect(TPoint(aArea.iBr.iX+aOffset.iX,aArea.iTl.iY),size));
		size.SetSize(aArea.Size().iWidth,absDY);
		if (aOffset.iY>0)
			iDrawableGc->Clear(TRect(aArea.iTl,size));
		else if (aOffset.iY<0)
			iDrawableGc->Clear(TRect(TPoint(aArea.iTl.iX,aArea.iBr.iY+aOffset.iY),size));
		}
	}

void COplDrawable::DrawLine(TPoint& aEndPoint,TBool aLineBy)
	{
	SetGcMode(CurrentDrawMode());
	TPoint startPoint = CursorPosition();
	if (aLineBy)
		aEndPoint+=startPoint;
	if (startPoint == aEndPoint)
		iDrawableGc->Plot(aEndPoint);
	else
		{
		SetCursorPosition(aEndPoint);
		iDrawableGc->DrawLine(startPoint,aEndPoint);
		}
	}

void COplDrawable::DrawGXBorderShadow(TSize& aSize, TInt aCorner, TBool aShadow)
	{
	TInt w = aSize.iWidth;
	TInt h = aSize.iHeight;
	SetGcModeInvalid();	// setting GC directly
	if (aShadow)
		iDrawableGc->SetPenColor(TRgb::Gray16(0));
	else
		iDrawableGc->SetPenColor(TRgb::Gray16(15));
	
	iDrawableGc->DrawLine(iCursorPosition+TPoint(w-3,2),iCursorPosition+TPoint(w-3,h-3)); // right
	iDrawableGc->DrawLine(iCursorPosition+TPoint(w-5,h-3),iCursorPosition+TPoint(w-3,h-5));	 // bottom
	iDrawableGc->DrawLine(iCursorPosition+TPoint(w-6,h-3),iCursorPosition+TPoint(w-3,h-6));	 // right corner
	iDrawableGc->DrawLine(iCursorPosition+TPoint(w-3,h-3),iCursorPosition+TPoint(1,h-3)); // bottom
	
	if (aCorner)
		{
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-7,h-3),iCursorPosition+TPoint(w-3,h-7));	// bottom right corner
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-2,3),iCursorPosition+TPoint(w-2,h-3)); // right
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-4,3),iCursorPosition+TPoint(w-4,6));	 // right
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-5,4),iCursorPosition+TPoint(w-4,4));	 // right
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-4,h-2),iCursorPosition+TPoint(2,h-2)); // bottom
		iDrawableGc->DrawLine(iCursorPosition+TPoint(3,h-4),iCursorPosition+TPoint(6,h-4));	// bottom left corner
		iDrawableGc->DrawLine(iCursorPosition+TPoint(4,h-5),iCursorPosition+TPoint(4,h-4));	// bottom left corner
		}
	else 
		{
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-2,2),iCursorPosition+TPoint(w-2,h-2));  // right
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-4,3),iCursorPosition+TPoint(w-4,5));	  // top right corner
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-3,h-2),iCursorPosition+TPoint(1,h-2)); // bottom   
		iDrawableGc->DrawLine(iCursorPosition+TPoint(3,h-4),iCursorPosition+TPoint(5,h-4));	 // bottom left corner
		}

	if (aShadow)
		iDrawableGc->SetPenColor(TRgb::Gray16(10));

	iDrawableGc->DrawLine(iCursorPosition+TPoint(4,2),iCursorPosition+TPoint(2,4));	 // top left corner
	iDrawableGc->DrawLine(iCursorPosition+TPoint(5,2),iCursorPosition+TPoint(2,5));	  // top left corner
	iDrawableGc->DrawLine(iCursorPosition+TPoint(2,2),iCursorPosition+TPoint(2,h-3)); // left
	if (aCorner)
		{
		iDrawableGc->DrawLine(iCursorPosition+TPoint(3,1),iCursorPosition+TPoint(w-3,1)); // top
		iDrawableGc->DrawLine(iCursorPosition+TPoint(3,2),iCursorPosition+TPoint(w-3,2));  // top
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-5,3),iCursorPosition+TPoint(w-7,3));	// top right corner
		iDrawableGc->DrawLine(iCursorPosition+TPoint(6,2),iCursorPosition+TPoint(2,6));	 // top left corner
		iDrawableGc->DrawLine(iCursorPosition+TPoint(1,3),iCursorPosition+TPoint(1,h-3));	// left
		iDrawableGc->DrawLine(iCursorPosition+TPoint(3,h-5),iCursorPosition+TPoint(3,h-7));	// left
		}
	else
		{
		iDrawableGc->DrawLine(iCursorPosition+TPoint(2,1),iCursorPosition+TPoint(w-2,1));  // top
		iDrawableGc->DrawLine(iCursorPosition+TPoint(2,2),iCursorPosition+TPoint(w-3,2));  // top
		iDrawableGc->DrawLine(iCursorPosition+TPoint(w-5,3),iCursorPosition+TPoint(w-6,3));	// top right corner
		iDrawableGc->DrawLine(iCursorPosition+TPoint(1,2),iCursorPosition+TPoint(1,h-2));	// left
		iDrawableGc->DrawLine(iCursorPosition+TPoint(3,h-5),iCursorPosition+TPoint(2,h-5));	// left
		}
	}

void COplDrawable::DrawS3Border(TInt aFlags,TRect aRect)
	{
	if (aFlags&0x100) // one pixel gap
		aRect.Shrink(1,1);
	TSize cornerSize(KNormalCornerSize,KNormalCornerSize);
	if (aFlags&0x200)
			cornerSize.SetSize(KMoreRoundedCornerSize,KMoreRoundedCornerSize);
	TInt pixelCount=((aFlags&0x7)+1)/2;
	aRect.iBr-=TSize(pixelCount,pixelCount);
	SetGcMode(CurrentDrawMode());           //hp: otherwise gGMode 2: gBorder has no effect
	SetGcModeInvalid();	// setting GC directly
	iDrawableGc->SetBrushStyle(CGraphicsContext::ENullBrush);
	iDrawableGc->SetPenColor(TRgb::Gray16(0));
	iDrawableGc->DrawRoundRect(aRect,cornerSize);
	if (!(aFlags&0x1)) // must clear shadow area if not wanted
		iDrawableGc->SetPenColor(TRgb::Gray16(15));
	// draw shadow here
	for (;pixelCount--;)
		{
		aRect.Move(1,1);
		TRect cornerRect(aRect.iBr-cornerSize-cornerSize,cornerSize+cornerSize);
		TPoint start(aRect.iBr-TSize(cornerSize.iWidth,0));
		TPoint end(aRect.iBr-TSize(0,cornerSize.iHeight));
		iDrawableGc->DrawArc(cornerRect,start,end);
		if (cornerSize.iHeight==KMoreRoundedCornerSize)
			{
			iDrawableGc->DrawLine(aRect.iBr-TSize(4,2),aRect.iBr-TSize(1,5));
			//iDrawableGc->Plot(aRect.iBr-TSize(2,4));
			//iDrawableGc->Plot(aRect.iBr-TSize(3,3));
			}
		else
			{
			iDrawableGc->Plot(aRect.iBr-TSize(3,2));
			iDrawableGc->Plot(aRect.iBr-TSize(2,3));
			}
		start-=TSize(1,1);
		end-=TSize(1,1);
		iDrawableGc->DrawLine(start,start-TSize(aRect.Size().iWidth-3*(cornerSize.iWidth/2),0));
		// cornerSize.iXxx/2 ok as cornerSize is always divisible by 2
		iDrawableGc->DrawLine(end,end-TSize(0,aRect.Size().iHeight-3*(cornerSize.iHeight/2)));
		}
	}


void COplDrawable::DrawS3ButtonL(TInt aState,TInt aWidth,TInt aHeight,const TDesC& aText)
	{
	SetGcModeInvalid();	// setting GC below directly
	iDrawableGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
	iDrawableGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
	TPoint tl=iCursorPosition;
	TPoint br=iCursorPosition+TSize(aWidth-1,aHeight-1);
	iDrawableGc->SetPenColor(TRgb::Gray16(15)); // white
	iDrawableGc->SetBrushColor(TRgb::Gray16(15)); // white
	// clear the corners
	iDrawableGc->Plot(tl+TSize(aWidth-1,0));
	iDrawableGc->Plot(tl+TSize(aWidth-1,1));
	iDrawableGc->Plot(tl+TSize(0,aHeight-1));
	iDrawableGc->Plot(tl+TSize(1,aHeight-1));
	if (aState!=0)
		{
		iDrawableGc->DrawLine(tl,tl+TSize(aWidth,0));
		iDrawableGc->DrawLine(tl,tl+TSize(0,aHeight));
		tl+=(TSize(1,1));
		}
	else
		{
		TPoint p=br-TSize(1,1);
		iDrawableGc->DrawLine(p,p-TSize(aWidth-1,0));
		iDrawableGc->DrawLine(p,p-TSize(0,aHeight-1));
		}
	iDrawableGc->SetPenColor(TRgb::Gray16(0)); // black
	TInt descent=((aHeight-4)-iFont->HeightInPixels())/2+iFont->AscentInPixels();
	iDrawableGc->DrawText(aText,TRect(tl+TSize(1,1),TSize(aWidth-4,aHeight-4)),descent,CGraphicsContext::ECenter);
	iDrawableGc->SetBrushStyle(CGraphicsContext::ENullBrush);
	iDrawableGc->DrawRect(TRect(tl,	TSize(aWidth-2,aHeight-2)));
	iDrawableGc->Plot(br-TSize(aWidth-2,1));
	iDrawableGc->Plot(br-TSize(1,aHeight-2));
	iDrawableGc->DrawLine(br-TSize(aWidth-3,0),br);
	iDrawableGc->DrawLine(br,br-TSize(0,aHeight-2));
	}

//////////////////////////////////////
//////// PROTECTED FUNCTIONS /////////
//////////////////////////////////////


void COplDrawable::SwapPoints(TPoint& aPoint1, TPoint& aPoint2)
	{
	TPoint temp;
	temp = aPoint1;
	aPoint1 = aPoint2;	
	aPoint2 = temp;			
	}

#if defined(__SERIES60__)||defined(__UIQ__)
CFbsFont* COplDrawable::GetDefaultFontL(CBitmapDevice& aDevice)
	{
	CFont* font;
	TAlgStyle style;
	style.SetWidthFactor(1);
	style.SetHeightFactor(1);
	// Load a decent system font...
// NB. If this isn't a standard font, set the iIsFontToBeReleased flag True.
	_LIT(KMonoFont,"LatinPlain12"); //CourierNew
	TPtrC fontName(KMonoFont);
	TFontSpec fontSpec(fontName,200); // Ignoring any style info for now.... !!TODO 
	if (iDrawableFlag == EIsOplBitmap)
		{
//		User::LeaveIfError(((CFbsBitmapDevice&)aDevice).GetFontById(font,TUid::Uid(KScreenFontUidArialNormal15),style));
		User::LeaveIfError(((CFbsBitmapDevice&)aDevice).GetNearestFontInTwips(font,fontSpec));
		}
	else
		{
		User::LeaveIfError(((CWsScreenDevice&)aDevice).GetNearestFontInTwips(font,fontSpec));
		}
	iFontId = 0x9a; // default font id
	iIsFontToBeReleased=EFalse; // Don't release standard fonts.
	return((CFbsFont*)font);
	}
#else
CFbsFont* COplDrawable::GetDefaultFontL(CBitmapDevice& aDevice)
	{
	CFont* font;
	TAlgStyle style;
	style.SetWidthFactor(1);
	style.SetHeightFactor(1);
	if (iDrawableFlag == EIsOplBitmap)
		User::LeaveIfError(((CFbsBitmapDevice&)aDevice).GetFontById(font,TUid::Uid(KScreenFontUidArialNormal15),style));
	else
		User::LeaveIfError(((CWsScreenDevice&)aDevice).GetFontById(font,TUid::Uid(KScreenFontUidArialNormal15),style));
	iFontId = 0x9a; // default font id
	return((CFbsFont*)font);
	}
#endif

TDisplayMode COplDrawable::DisplayMode(TInt aValue)
	{
	switch (aValue)
		{
	case 0 :
		return EGray2;
	case 1 :
		return EGray4;
	case 2 :
		return EGray16;
	case 3 :
		return EGray256;
	case 4 :
		return EColor16;
	case 5 :
		return EColor256;
	case 6 :
		return EColor64K;
	case 7 :
		return EColor16M;
	case 8 :
		return ERgb;
	case 9 :
		return EColor4K;
	default :
		return EGray16;
		}
	}

TInt COplDrawable::DisplayMode(TDisplayMode aMode)
	{
	switch (aMode)
		{
	case EGray2:
		return 0;
	case EGray4:
		return 1;
	case EGray256:
		return 3;
	case EColor16:
		return 4;
	case EColor256:
		return 5;
	case EColor64K:
		return 6;
	case EColor16M:
		return 7;
	case ERgb:
		return 8;
	case EColor4K:
		return 9;
	case EGray16:
	default :
		return 2;
		}
	}

void COplDrawable::DoStoreBitmapL(COplRuntime& aRuntime, const TDesC& aFileName, TSize& aSize,const CFbsBitmap& aBitmap) const
	{
	
	RFile file;
    User::LeaveIfError(file.Replace(aRuntime.ConEnv()->FsSession(),aFileName,EFileRead|EFileWrite));
	CDirectFileStore* filestore=CDirectFileStore::NewLC(file);
	TUidType uids(KDirectFileStoreLayoutUid,KUidExternalOplFile); //default to no doc
	if (aRuntime.CurrentDocumentName().CompareF(aFileName)==0)
		uids=TUidType(KDirectFileStoreLayoutUid,KUidOplDoc,aRuntime.CommandLine().AppUid());
	filestore->SetTypeL(uids);
	RStoreWriteStream bmpstream;
	TStreamId bmpstreamid=bmpstream.CreateLC(*filestore);
	if ((aSize.iWidth != NULL) || (aSize.iHeight != NULL))
		aBitmap.ExternalizeRectangleL(bmpstream, TRect(CursorPosition(),aSize));
	else
		aBitmap.ExternalizeL(bmpstream);	
	bmpstream.Close();
	RStoreWriteStream headstream;
	TStreamId headstreamid=headstream.CreateLC(*filestore);
	headstream.WriteInt32L(1); // number of bitmaps
	bmpstreamid.ExternalizeL(headstream); // stream id of bitmap
	headstream.Close();
	filestore->SetRootL(headstreamid);
	CleanupStack::PopAndDestroy(3);
	}

	

	
/*******************************
class COplWindow
*******************************/


COplWindow::COplWindow() 
	{
	}


void COplWindow::ConstructL(COplRuntime& aRuntime, TInt aHandle, const TPoint& aPosition, const TSize& aWinSize, TInt aVisible, TInt aGray)	
	{ 
    CEikonEnv* eikonEnv = (CEikonEnv*)aRuntime.ConEnv();
	iWindow = RBackedUpWindow(eikonEnv->WsSession());
	iDisplayMode=DisplayMode(aGray & KOplWindowDisplayModeMask);
	User::LeaveIfError(iWindow.Construct((RWindowTreeNode&)eikonEnv->RootWin(),iDisplayMode,(TUint32)aHandle));
//	User::LeaveIfError(iWindow.SetRequiredDisplayMode(DisplayMode(aGray)));
	User::LeaveIfError(iWindow.SetCornerType(EWindowCornerSquare));	// by default
	iWindow.SetPosition(aPosition);
    if (aGray & KOplWindowShadowOnMask)
        {
        iWindow.SetShadowDisabled(EFalse);  // enable shadow
        if	(aGray & KOplWindowShadowMask)
	        iWindow.SetShadowHeight(((aGray&KOplWindowShadowMask)>>8) * KOplShadowHeight); 
        }
    else
        iWindow.SetShadowDisabled(ETrue);  // disable shadow
    iWindow.PointerFilter(EPointerFilterDrag|EPointerFilterMove|EPointerFilterEnterExit,0);
	if (!aVisible)
		iWindow.SetVisible(EFalse);
	TRgb color=TRgb::Gray16(15);
	SetBackgroundColor(color); // white
	SetSizeL(aWinSize); 
	SetDrawableFlag(EIsOplWindow);
	SetAttributesL(*eikonEnv);
	iWindow.Activate();
	}

void COplWindow::ConstructL(COplRuntime& aRuntime, RBackedUpWindow& aWin,TDisplayMode aDisplayMode)
	{
	iWindow = aWin;
	iDisplayMode=aDisplayMode;
	User::LeaveIfError(iWindow.SetCornerType(EWindowCornerSquare));	// by default
	SetSizeL(aWin.Size());
	SetDrawableFlag(EIsOplConsole);
	SetAttributesL(*aRuntime.ConEnv());
	iWindow.PointerFilter(EPointerFilterDrag|EPointerFilterMove|EPointerFilterEnterExit,0);
	}

COplWindow::~COplWindow()		
	{
	DeleteClock();
	ReleaseFont();
	if (iDrawableGc)
		DeactivateGc();
	if (iDrawableFlag != EIsOplConsole)
		iWindow.Close();
	}

#if defined(__SERIES60__)
void COplWindow::ReleaseFont()
	{
	if (iScreenDevice&&iFont)
		if (iIsFontToBeReleased!=EFalse)
			iScreenDevice->ReleaseFont(iFont);
	}
#else
void COplWindow::ReleaseFont()
	{
	if (iScreenDevice&&iFont)
		iScreenDevice->ReleaseFont(iFont);
	}
#endif

void COplWindow::StoreBitmapL(COplRuntime& aRuntime, const TDesC& aFileName, TSize& aSize)
	{
	CFbsBitmap* bitmap=new(ELeave) CFbsBitmap;
	CleanupStack::PushL(bitmap);
	BackupBmpHandleL(*bitmap);
	DoStoreBitmapL(aRuntime,aFileName,aSize,*bitmap);
	CleanupStack::PopAndDestroy();
	}

void COplWindow::SetSizeL(const TSize& aSize)
	{

⌨️ 快捷键说明

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