<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>Konstantine Voytenko&#039;s Forum Nokia Blog</title> 
<subtitle type="html">A Forum Nokia Blog</subtitle>
 
<updated>2008-07-04T13:34:23+03:00</updated> 
<id>http://www.lifetype.net,1.2/</id>
<link rel="alternate" type="text/html"  hreflang="en" href="http://blogs.forum.nokia.com/blog/konstantine-voytenkos-forum-nokia-blog" />
 
<rights>Copyright (c) Carbider</rights>
<generator uri="http://www.lifetype.net/" version="1.2">LifeType at Forum Nokia</generator> 
 
<entry> 
<title>GUI application with the BitmapBuffer</title>
<link rel="alternate" type="text/html" href="http://blogs.forum.nokia.com/blog/konstantine-voytenkos-forum-nokia-blog/2008/07/04/gui-application-with-the-bitmapbuffer" /> 
<id>tag:blogs.forum.nokia.com,2008-07-04:1622</id>
 
<updated>2008-07-04T13:34:23+03:00</updated> 
<published>2008-07-04T13:34:23+03:00</published> 
<summary type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp; In the previous post we&#039;ve developed the  RBitmapBuffer  buffer class that holds a bitmap buffer (sources are available at the end of this post). 
 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Now ...</summary> 
<author> 
 
<name>Carbider</name> 
<uri>http://blogs.forum.nokia.com/blog/konstantine-voytenkos-forum-nokia-blog</uri> 
</author> 
<dc:subject>
S60 
Symbian C++ 
</dc:subject> 
<content type="text/html" xml:lang="en" xml:base="http://blogs.forum.nokia.com/blog/konstantine-voytenkos-forum-nokia-blog"> 
&amp;nbsp;&amp;nbsp;&amp;nbsp; In the previous post we&#039;ve developed the &lt;span style=&quot;color: blue&quot;&gt;RBitmapBuffer&lt;/span&gt; buffer class that holds a bitmap buffer (sources are available at the end of this post).&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Now we&#039;ll use this class in a simple Symbian UI application.&lt;br /&gt;
It can be tied to the Symbian applications in a many ways but we&#039;ll see the one that goes for &amp;quot;Hello World&amp;quot; sample provided with Carbide.c++ IDE.&lt;br /&gt;
&lt;br /&gt;
So start the Carbide.c++ (I use the version 1.3). Create new project (&lt;em&gt;File -&amp;gt; New -&amp;gt; Symbian OS C++ Project&lt;/em&gt;). Select the &amp;quot;&lt;em&gt;3-rd Feature Ed. GUI Application&lt;/em&gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The IDE will create the project with a list of items. The file of interest for us is a &amp;quot;&lt;strong&gt;..AppView.cpp&lt;/strong&gt;&amp;quot; because it defines the behavior of &lt;span style=&quot;color: blue&quot;&gt;..AppView&lt;/span&gt; class that has an access to the screen.&lt;br /&gt;
Besides that file we, of course, need some others that establish the connections inside the program logic.&lt;br /&gt;
&lt;br /&gt;
The full list is:&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black; margin-left: 20px&quot;&gt;
Listing 1.
&lt;/div&gt;
&lt;div style=&quot;border: 1px solid #9ebbff; margin-left: 20px; background-color: #f7fcff&quot;&gt;
sources:&lt;br /&gt;
src/..AppUi.cpp&lt;br /&gt;
src/..AppView.cpp&lt;br /&gt;
src/BitmapBuffer.cpp&lt;br /&gt;
src/BufferRenderer.cpp&lt;br /&gt;
&lt;br /&gt;
headers:&lt;br /&gt;
inc/..AppUi.h&lt;br /&gt;
inc/..AppView.h&lt;br /&gt;
inc/BitmapBuffer.h&lt;br /&gt;
inc/BufferRenderer.h&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;&lt;strong&gt;BitmapBuffer&lt;/strong&gt;&amp;quot; and &amp;quot;&lt;strong&gt;BufferRenderer&lt;/strong&gt;&amp;quot; sources are available at the end of this post.&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
The &amp;quot;&lt;strong&gt;&lt;big&gt;..&lt;/big&gt;&lt;/strong&gt;&amp;quot; is the name of your project.&lt;br /&gt;
&lt;br /&gt;
First let&#039;s go to the &amp;quot;&lt;strong&gt;..AppView.h&lt;/strong&gt;&amp;quot; file.&lt;br /&gt;
We will add a new property to the &lt;span style=&quot;color: blue&quot;&gt;..AppView&lt;/span&gt; class. This property would be: &lt;br /&gt;
&lt;span style=&quot;color: blue&quot;&gt;CBufferRenderer&lt;/span&gt;*&amp;nbsp; &lt;span style=&quot;color: gray&quot;&gt;&lt;strong&gt;iBufferRenderer;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
It would store the image buffer and will be able to render it (draw on it).&lt;br /&gt;
To simplify the code we will make &lt;span style=&quot;color: gray&quot;&gt;&lt;strong&gt;iBufferRenderer&lt;/strong&gt;&lt;/span&gt; as public, for anyone can access it and draw something on it.&lt;br /&gt;
&lt;br /&gt;
We&#039;ll also add one new method to the &lt;span style=&quot;color: blue&quot;&gt;..AppView&lt;/span&gt; class to output the buffer.
&lt;br /&gt;
That is shown below (the file: &amp;quot;&lt;strong&gt;..AppView.cpp&lt;/strong&gt;&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black; margin-left: 20px&quot;&gt;
Listing 2.
&lt;/div&gt;
&lt;div style=&quot;border: 1px solid #9ebbff; margin-left: 20px; background-color: #f7fcff&quot;&gt;
/**&lt;br /&gt;
&amp;nbsp;* Function will draw the image&lt;br /&gt;
&amp;nbsp;* &lt;br /&gt;
&amp;nbsp;*/&lt;br /&gt;
void ..AppView::DrawImage(CWindowGc&amp;amp; aGc) const&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CFbsBitmap* bitmap = iBufferRenderer-&amp;gt;getBitmapBuffer()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TSize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ( bitmap-&amp;gt;SizeInPixels() )&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; aGc.BitBlt( TPoint(0,0), bitmap, TRect( TPoint(0,0), size ) ); // Draw&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
} // function&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Also, we will append some code to the &lt;span style=&quot;color: blue&quot;&gt;..AppView&lt;/span&gt;&#039;s constructor, destructor and &lt;span style=&quot;color: gray&quot;&gt;&lt;strong&gt;Draw()&lt;/strong&gt;&lt;/span&gt; methods:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black; margin-left: 20px&quot;&gt;
Listing 3.
&lt;/div&gt;
&lt;div style=&quot;border: 1px solid #9ebbff; margin-left: 20px; background-color: #f7fcff&quot;&gt;
// ------------- Constructor&lt;br /&gt;
&lt;br /&gt;
void ..AppView::ConstructL(const TRect&amp;amp; aRect)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateWindowL();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SetRect(aRect);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ActivateL();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // - - - - - - - &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Appended code :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get system metrics&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TInt&amp;nbsp; color, gray&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TRect screenSize&amp;nbsp; (Rect());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TDisplayMode displayMode = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CCoeEnv::Static()-&amp;gt;WsSession().GetDefModeMaxNumColors( color, gray );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Main - instantiate the Buffer Renderer object&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; iBufferRenderer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;span style=&quot;color: blue&quot;&gt;CBufferRenderer&lt;/span&gt;::NewL(displayMode, screenSize);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
} // function&lt;br /&gt;
&lt;br /&gt;
// ------------- Destructor&lt;br /&gt;
&lt;br /&gt;
..AppView::~CBBufferEx_AppView()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // - - - - - - - &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Appended code :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Dealocate the memory for the Buffer Renderer object&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; delete iBufferRenderer;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
} // function&lt;br /&gt;
&lt;br /&gt;
// ------------- AppView&#039;s Draw() method&lt;br /&gt;
&lt;br /&gt;
void ..AppView::Draw(const TRect&amp;amp; /*aRect*/) const&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CWindowGc&amp;amp; gc = SystemGc();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TRect drawRect(Rect());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; gc.Clear(drawRect);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // - - - - - - - &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Appended code :&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Put the buffer on the screen&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DrawImage(gc); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
} // function&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Now, let&#039;s draw the rectangle on the phone screen when the user selects the &#039;&lt;em&gt;Message&lt;/em&gt;&#039; button from the &lt;em&gt;options&lt;/em&gt; menu.&lt;br /&gt;
To do that, we will go to the &amp;quot;&lt;strong&gt;..AppUi.cpp&lt;/strong&gt;&amp;quot; file and append the &lt;span style=&quot;color: gray&quot;&gt;&lt;strong&gt;HandleCommandL()&lt;/strong&gt;&lt;/span&gt; method with the code below:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black; margin-left: 20px&quot;&gt;
Listing 4.
&lt;/div&gt;
&lt;div style=&quot;border: 1px solid #9ebbff; margin-left: 20px; background-color: #f7fcff&quot;&gt;
void ..AppUi::HandleCommandL(TInt aCommand)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (aCommand)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&amp;nbsp; ommited for clarity&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case ECommand1:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // - - - - - - - &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Appended code :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Force to draw the rectangle&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; iAppView-&amp;gt;iBufferRenderer-&amp;gt;drawRect(TRect(10, 10, 100, 100));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } // switch&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
} // function&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Don&#039;t forget to include the (&lt;em&gt;#include &amp;quot;BufferRenderer.h&amp;quot;&lt;/em&gt;) BufferRenderer to the &amp;quot;&lt;strong&gt;..AppView.h&lt;/strong&gt;&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
You also need to include this list of libraries to your mmp file:&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black; margin-left: 20px&quot;&gt;
Listing 5.
&lt;/div&gt;
&lt;div style=&quot;border: 1px solid #9ebbff; margin-left: 20px; background-color: #f7fcff&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fbscli.lib&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; bitgdi.lib&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ws32.lib
&lt;/div&gt;
&lt;br /&gt;
The sources of &amp;quot;BitmapBuffer&amp;quot; and &amp;quot;BufferRenderer&amp;quot; classes are available in this zip file:
&lt;a id=&quot;res_1731&quot; href=&quot;http://blogs.forum.nokia.com/data/blogs/resources/300061/p0002_BitmapBufferClassExample_v1.zip&quot;&gt;..BitmapBufferClassExample..zip&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: white&quot;&gt;end&lt;/span&gt; 
</content> 
</entry> 
 
<entry> 
<title>Bitmap manipulation: Image buffer</title>
<link rel="alternate" type="text/html" href="http://blogs.forum.nokia.com/blog/konstantine-voytenkos-forum-nokia-blog/2008/06/13/bitmap-manipulation-image-buffer" /> 
<id>tag:blogs.forum.nokia.com,2008-06-13:1584</id>
 
<updated>2008-06-13T10:16:55+03:00</updated> 
<published>2008-06-13T10:16:55+03:00</published> 
<summary type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp; Sometimes you need to draw some graphics (lines, rectangles, images) on top of the Symbian application. When this graphics refreshes often (like animation) you need create some ...</summary> 
<author> 
 
<name>Carbider</name> 
<uri>http://blogs.forum.nokia.com/blog/konstantine-voytenkos-forum-nokia-blog</uri> 
</author> 
<dc:subject>
S60 
Symbian C++ 
</dc:subject> 
<content type="text/html" xml:lang="en" xml:base="http://blogs.forum.nokia.com/blog/konstantine-voytenkos-forum-nokia-blog"> 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Sometimes you need to draw some graphics (lines, rectangles, images) on top of the Symbian application. When this graphics refreshes often (like animation) you need create some secondary bitmap buffer where the next frame would be drawn. &lt;br /&gt;
The primary and secondary buffers may then be switched.
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; This is important because if to draw different picture elements to the main buffer (which continuously is mapped onto the screen of phone), user will watch flicker image. The same would be if try erasing the main buffer and then draw new frame of animation on it.&lt;br /&gt;
&lt;br /&gt;
Use of the second bitmap can be attributed to the technology of &amp;quot;&lt;strong&gt;Dual buffering&lt;/strong&gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let&#039;s look how can we realize this technique in a Symbian GUI project.&lt;br /&gt;
First, I&#039;ll abstract from the whole application and will show the core of creating and manipulating the buffer.&lt;br /&gt;
&lt;br /&gt;
Secondary we will tie this to a simple &#039;Hello World!&#039; GUI project which is available in Carbide.c++ IDE.&lt;br /&gt;
&lt;br /&gt;
=== The Core ===&lt;br /&gt;
&lt;br /&gt;
Let us create a Symbian C++ class that will have necessary properties and methods to organize the buffer. And also to draw to the buffer. That would be the &lt;span style=&quot;color: blue&quot;&gt;RBitmapBuffer&lt;/span&gt; class.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black&quot;&gt;
Listing 1.
&lt;/div&gt;
&lt;div style=&quot;border: 1px solid black; font-size: 8pt&quot;&gt;
&lt;span style=&quot;color: blue&quot;&gt;class &lt;strong&gt;RBitmapBuffer&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Some constructors and cleanup stack operations omitted for clarity&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; The properties would be:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;span style=&quot;color: #b54800&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CFbsBitmap*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iBitmapBuffer&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; &lt;span style=&quot;color: gray&quot;&gt;// Contains the bitmap whis is our buffer&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CFbsBitGc *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iDrawer&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; &lt;span style=&quot;color: gray&quot;&gt;// CFbsBitGc - the class to draw on Bitmap device&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CFbsBitmapDevice*&amp;nbsp; iBmpDevice&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; &lt;span style=&quot;color: gray&quot;&gt;// BitmapDevice is a mediator between the drawer and the buffer.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TRect&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iSizeOfScreenRect;&amp;nbsp; &lt;span style=&quot;color: gray&quot;&gt;// The size of the screen&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TDisplayMode*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDisplayMode&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; &lt;span style=&quot;color: gray&quot;&gt;// The display mode of the buffer. In general this represents the color mode.&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; =============&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; The methods would be:
&lt;div style=&quot;font-size: 8pt; color: gray&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Two-phased constructor. */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; RBitmapBuffer* RBitmapBuffer::NewL(const TDisplayMode&amp;amp;, const TRect&amp;amp; )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //omitted for clarity &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  //call to ConstructL &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;color: gray&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Initialize renderer */&lt;br /&gt;
&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void &lt;strong&gt;RBitmapBuffer&lt;/strong&gt;::&lt;span style=&quot;color: blue&quot;&gt;ConstructL&lt;/span&gt;(&lt;span style=&quot;font-size: 7pt&quot;&gt;const TDisplayMode&amp;amp;&amp;nbsp; aDisplayMode, const TRect&amp;amp; aSizeOfScreenRect&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setSizeOfScreen(aSizeOfScreenRect);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setDisplayMode (aDisplayMode);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iBitmapBuffer&amp;nbsp; = new (ELeave) CFbsBitmap;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iBitmapBuffer -&amp;gt;Create(iSizeOfScreenRect.Size() , *pDisplayMode);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iDrawer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = CFbsBitGc::NewL();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iBmpDevice&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = CFbsBitmapDevice::NewL(iBitmapBuffer);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Activate virtual bitmap device&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iDrawer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; Activate(iBmpDevice);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iDrawer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; SetPenColor(KRgbBlack);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; See the description below &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */ &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } // function
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-size: 7pt&quot;&gt;
&lt;span style=&quot;color: gray&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Sets display mode of the buffer */&lt;br /&gt;
&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void &lt;strong&gt;RBitmapBuffer&lt;/strong&gt;::&lt;span style=&quot;color: blue&quot;&gt;setDisplayMode&lt;/span&gt;(const TDisplayMode&amp;amp;&amp;nbsp; aDisplayMode)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { pDisplayMode = (TDisplayMode*) &amp;amp;aDisplayMode; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;span style=&quot;color: gray&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Sets sizeOfScreeen property */&lt;br /&gt;
&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void &lt;strong&gt;RBitmapBuffer&lt;/strong&gt;::&lt;span style=&quot;color: blue&quot;&gt;setSizeOfScreen&lt;/span&gt;(const TRect&amp;amp; aSizeOfScreenRect)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { iSizeOfScreenRect = aSizeOfScreenRect; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;span style=&quot;color: gray&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Returns the buffer pointer so any other class can use it */&lt;br /&gt;
&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CFbsBitmap* &lt;strong&gt;RBitmapBuffer&lt;/strong&gt;::&lt;span style=&quot;color: blue&quot;&gt;getBitmapBuffer&lt;/span&gt;()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; { return iBitmapBuffer; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;/div&gt;
&lt;span style=&quot;color: gray&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Closes (deallocates) all the resources */&lt;br /&gt;
&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CFbsBitmap* &lt;strong&gt;RBitmapBuffer&lt;/strong&gt;::&lt;span style=&quot;color: blue&quot;&gt;Close&lt;/span&gt;()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iBitmapBuffer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; // Contains the bitmap whis is our buffer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iDrawer&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; // CFbsBitGc - the class to draw on Bitmap device&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iBmpDevice&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; // BitmapDevice is a mediator between the drawer and the buffer.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
} // class&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Let&#039;s look through the &lt;span style=&quot;color: blue&quot;&gt;ConstructL()&lt;/span&gt; method which prepares the bitmap buffer.&lt;br /&gt;
&lt;br /&gt;
1. Set screen size. &lt;br /&gt;
2. Set display mode. &lt;br /&gt;
3. Allocate the object of &lt;span style=&quot;color: #b54800&quot;&gt;CFbsBitmap&lt;/span&gt; class.&lt;br /&gt;
4. Initialize it by &lt;span style=&quot;color: blue&quot;&gt;Create()&lt;/span&gt; method as empty buffer.&lt;br /&gt;
5. Allocate the &lt;span style=&quot;color: #b54800&quot;&gt;CFbsBitGc&lt;/span&gt; and &lt;span style=&quot;color: #b54800&quot;&gt;CFbsBitmapDevice&lt;/span&gt; objects to allow drawing to the bitmap buffer.&lt;br /&gt;
6. Show the &lt;span style=&quot;color: #b54800&quot;&gt;iDrawer&lt;/span&gt; the device that it can draw. The device is &lt;span style=&quot;color: #b54800&quot;&gt;iBmpDevice&lt;/span&gt; which is initialized with &lt;span style=&quot;color: #b54800&quot;&gt;iBitmapBuffer&lt;/span&gt; object (the actual buffer).&lt;br /&gt;
7. Set the color of of drawer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we can inherit the RBitmapBuffer class to create a new &lt;span style=&quot;color: blue&quot;&gt;&lt;strong&gt;CBufferRenderer&lt;/strong&gt;&lt;/span&gt; class which will draw something to the buffer.&lt;br /&gt;
Let&#039;s see:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black&quot;&gt;
Listing 2.
&lt;/div&gt;
&lt;div style=&quot;border: 1px solid black&quot;&gt;
class &lt;span style=&quot;color: blue&quot;&gt;&lt;strong&gt;CBufferRenderer&lt;/strong&gt;&lt;/span&gt; : public CBase, public RBitmapBuffer&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; public:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; =============&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; The methods (except the constructors):&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void &lt;strong&gt;CBufferRenderer&lt;/strong&gt;::&lt;span style=&quot;color: blue&quot;&gt;drawRect&lt;/span&gt;(TRect *aRect) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Use parent&#039;s drawer mechanism
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iDrawer-&amp;gt;DrawRect&amp;nbsp; ( *aRect );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void &lt;strong&gt;CBufferRenderer&lt;/strong&gt;::&lt;span style=&quot;color: blue&quot;&gt;~CBufferRenderer&lt;/span&gt;() &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Close();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
} // class&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
After instantiating the &lt;span style=&quot;color: blue&quot;&gt;&lt;strong&gt;CBufferRenderer&lt;/strong&gt;&lt;/span&gt; class we can draw some rectangles on it (or lots of other picture elements and bitmaps) and then return the buffer to the main program that will substitute the old screen image with the new one. The code will look like below:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black&quot;&gt;
Listing 3.
&lt;/div&gt;
&lt;div style=&quot;border: 1px solid black&quot;&gt;
void &lt;span style=&quot;color: blue&quot;&gt;mainDrawer&lt;/span&gt;()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TDisplayMode displayMode&amp;nbsp; = iEikEnv-&amp;gt;WsSession().GetDefModeMaxNumColors( color, gray );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TRect screenSize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (10, 10, 20, 20);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TRect myRectangle&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (10, 10, 20, 20);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;CBufferRenderer&lt;/strong&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myBackBuffer;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; myBackBuffer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;strong&gt;CBufferRenderer&lt;/strong&gt;::NewL(screenSize, displayMode);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CleanupStack&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: PushL(myBackBuffer);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; myBackBuffer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; drawRect(&amp;amp;myRectangle);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; someMainProgramDrawer&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; (myBackBuffer-&amp;gt;getBitmapBuffer);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CleanupStack&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :: Pop(myBackBuffer);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; delete&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myBackBuffer;&lt;br /&gt;
} // function&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Today I&#039;ve shown the idea of the main core of the bitmap buffer. &lt;br /&gt;
This example has some &lt;em&gt;pseudo code&lt;/em&gt; (the main program is not defined).&lt;br /&gt;
&lt;br /&gt;
At the next post I&#039;ll show how to tie the RBitmapBuffer with the real Symbian GUI application.&lt;br /&gt;
&lt;br /&gt;
However here is a list of the headers and libraries you will need to include to the project to use the above graphics classes:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;border: 1px solid black&quot;&gt;
Listing 4.
&lt;/div&gt;
&lt;div style=&quot;border: 1px solid black&quot;&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fbscli.lib&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; bitgdi.lib&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ws32.lib
&lt;/div&gt; 
</content> 
</entry> 
 
</feed>