📄 graphics.cpp
字号:
}
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 + -