Symbian FBS之CFbsBitmap介绍

FBS Server简介
    Font and Bitmap Server是Symbian OS比较重要的服务,它主要是用来管理字体和位图,使用高度优化的汇编代码编写的,可以提供良好快速的图形绘制能力,可以在系统中所有的线程之间共享,通过RFbsSession类来访问FBS。它是由window server生成的,通过CFbsFont和CFbsBitmap类来操作,CFbsBitmap和CFbsFont都是FBS的一个Client句柄,它们提供了管理字体和位图的方法,实际的数据是存放在FBS上,数据仅仅保留一份,而Client句柄可以有多个引用。
    位于ROM的Bitmap是可以直接使用,基于文件的Bitmap需要加载到RAM后才能使用,在RAM里面的Bitmap和Font都仅有一个实例,它通过引用计数器而被多个Client引用。对于大部分的应用程序来说Font and Bitmap Server是被隐藏在Window Server里面,Server默认已经完成了对FBS Server的初始化操作。对于Exe程序或者其他工作线程用户可以通过RFbsSession::Connect来连接server。
FBS Server访问介绍
    服务最常见的应用就是贴图,而贴图和画图等操作都是通过CFbsBitmap这个 FBS的Client对象来实现的,有点类似于Windows上的HBITMAP。一般都通过CFbsBitmap::DataAddress来获取内存地址,通过GetScanLine获取一个指定的scan line。位图也根据他们的大小以4kb为界限在FBS上分为两个不同的堆。位于LargeBitmap的heap可以进行自动的磁盘碎片整理(在某些特殊的系统事件发生时候其他线程可能会进行Heap的整理,从而导致数据错位),因此这个堆是需要被lock/unlock的,在低版本的S60 SDK中提供了TBitmapUtil来进行堆的锁定和解锁,有位图的内容被编辑时,我们需要锁定堆。高版本的SDK提供了LockHeap和UnlockHeap完成这个操作,CFbsBitmap的drawing和拷贝等内部操作都提供了自动锁定的功能。

低版本S60 提供的方法 0.9~1.2:
//LockHeap
TBitmapUtil bmpUtil1(iImage);
TBitmapUtil bmpUtil2(aBmp);
bmpUtil1.Begin(TPoint(0,0));
bmpUtil2.Begin(TPoint(0,0), bmpUtil1);

//GetAddress
TUint16* pData2 = (TUint16*)iImage->DataAddress(); // source image
TUint16* pData = (TUint16*)aBmp->DataAddress(); // target bmp

//Scanline
TInt nLineLen = aBmp->ScanLineLength(aBmp->SizeInPixels().iWidth, EColor4K) / 2;
TInt nLineLen2 = iImage->ScanLineLength(  // line length in 16bit word
   iImage->SizeInPixels().iWidth,
   EColor64M);

//Add your code here:
TUint16* p = pData;
TUint16* p2 = pData2;


//UnlockHeap
bmpUtil2.End();
bmpUtil1.End();

S60 2.0的方法:
//LockHeap
if(iImage->IsLargeBitmap())
    iImage->LockHeap();
//GetAddress
TUint16* pData = (TUint16*)iImage->DataAddress(); // source image

//Add your code here:
TUint16* p = pData + nOffsetY * aBmp->SizeInPixels().iWidth + nOffsetX;

//UnlockHeap
if(iImage->IsLargeBitmap())
    iImage->UnlockHeap();

在操作CFbsBitmap的注意事项:
1、    在读写bitmap数据块时没有加lock/unlock;
2、    对bitmap的Lock不能做2次(每次lock都是全局的FBS heap);
3、    小图不需要做lock(heap里已经对小图做了优化);
4、    Lock/Unlock配对的地方不允许出现其他的bitmap操作;
5、    Lock/Unlock必须严格配对,特别是在错误的情况下如没有做好配对,会导致系统Panic;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值