Symbian 处理大位图操作与CFbsBitmap和CWsBitmap绘画简述 ZZ 略改

来源:互联网 发布:什么java视频教程好 编辑:程序博客网 时间:2024/05/18 14:45

 

2008-12-02 11:39

位图的管理由CFbsBitmap类来完成,这个类提供了用于创建(create())和装载(Load())位图的方法,并且定义它们的色深度(displaymode)和尺寸(size)。它使用RFbsSession类来访问FBS,因此用户是接触不到会话类的。CFbsBitmap还提供了直接访问位图图像数据的方法,可以使用DataAddress方法获得一个指向数据地址的指针,还可以使用GetScanLine方法访问一条指定的扫描线。

FBS会根据位图的尺寸把位图存放到FBS中的两个不同的堆里。小于4kB的位图被保存到一个堆里,大于4kB的位图保存到另一个堆里。进行这种分别存放是为了防止存储碎片,存储碎片是大的位图被创建和销毁的时候经常出现的--大位图的堆能自动整理碎片。由于碎片整理的原因,当操作大位图的内容时,堆需要被锁定。为了防止碎片整理和操作同步进行,TBitmapUtil类提供了锁定堆和解锁堆的操作。只有在一个位图的图像数据被直接编辑的时候才需要锁定堆--描画和复制方法提供了自动锁定功能。 下面的示例在位图是大的位图并且使用颜色填充位图的情况下锁定FBS。它假定位图的每个象素都使用16位。这适用于12位和16位位图。

 

// Lock the heap if a large bitmap

 

TBitmapUtil bitmapUtil( bitmap ); 

if ( bitmap->IsLargeBitmap() ) 

 bitmapUtil.Begin( TPoint(0,0) ); 

// Edit bitmap 

TSize bitmapSize = bitmap->SizeInPixels(); 

TUint16* bitmapData = (TUint16*)bitmap->DataAddress(); 

TUint16 colour = 0; 

for ( TInt y = 0; y < bitmapSize.iHeight; y++ ); 

 for ( TInt x = 0; x < bitmapSize.iWidth; x++ ) 

 { 

  *bitmapData++ = colour++; 

 } 

// Release the heap 

if ( bitmap->IsLargeBitmap() ) 

 BitmapUtil.End(); 

}

 

为了使描画位图比使用CFbsBitmaps还快,窗口服务器提供它自己的位图类CWsBitmap。它通过取得位图处理的句柄来除去窗口服务器和FBS之间多余的上下文转换。CWsBitmap从CFbsBitmap继承而来,并且实现了其所有相同的方法。如果你在开发应用程序的时候很重视描画速度,那么你应该使用CWsBitmap来替代它的基类。

 

画一个CWsBitmap比CFbsBitmaps快就在于少一个FBS和WS的context switch,因为对一个CWsBitmap而言,WS已经有它的handle了,而不需要从FBS传递过来,所以就没有了process context switch的overhead,所以就快了萨!

原创粉丝点击