2 #include "sdlepocapi.h"
6 class CDsaGles
: public CDsa
9 CDsaGles(RWsSession
& aSession
) : CDsa(aSession
) {}
12 TUint8
* LockSurface() { return NULL
; }
13 void UnlockHwSurface() {}
14 void CreateSurfaceL() {}
17 //////////////////////////////////////////////////////////////////////
19 class CDsaBase
: public CDsa
, public MDirectScreenAccess
22 CDsaBase(RWsSession
& aSession
) : CDsa(aSession
) { m_updateWholeScreen
= false; }
26 void ConstructL(RWindow
& aWindow
, CWsScreenDevice
& aDevice
);
29 void AbortNow(RDirectScreenAccess::TTerminationReasons aReason
);
30 void Restart(RDirectScreenAccess::TTerminationReasons aReason
);
35 TUint8
* LockSurface();
36 void UnlockHwSurface();
37 void CreateSurfaceL();
39 CDirectScreenAccess
* iDsa
;
42 void CDsaBase::ConstructL(RWindow
& aWindow
, CWsScreenDevice
& aDevice
)
44 CDsa::ConstructL(aWindow
, aDevice
);
52 iDsa
= CDirectScreenAccess::NewL(Session(), aDevice
, aWindow
, *this);
65 void CDsaBase::RestartL()
68 iDsa
->Gc()->SetClippingRegion(iDsa
->DrawingRegion());
79 TUint8
* CDsaBase::LockSurface()
82 return (TUint8
*)iBmp
->DataAddress();
85 void CDsaBase::UnlockHwSurface()
88 iDsa
->Gc()->BitBlt(TPoint(0, 0), iBmp
);
89 iDsa
->ScreenDevice()->Update();
92 void CDsaBase::CreateSurfaceL()
95 iBmp
= new CFbsBitmap();
96 User::LeaveIfError(iBmp
->Create(Window()->Size(), EColor64K
));
99 void CDsaBase::AbortNow(RDirectScreenAccess::TTerminationReasons
/*aReason*/)
104 void CDsaBase::Restart(RDirectScreenAccess::TTerminationReasons
/*aReason*/)
106 TRAPD(err
, RestartL());
107 if(err
== KLeaveExit
)
117 void CDsaBase::Stop()
124 CDsa
* CDsa::CreateL(RWsSession
& aSession
)
126 return new CDsaBase(aSession
);
138 void CDsa::ConstructL(RWindow
& aWindow
, CWsScreenDevice
& /*aDevice*/)
141 iLut256
= new TUint32
[256];
145 int CDsa::SetPalette(int aFirst
, int aCount
, TUint32
* aPalette
)
149 for(int i
= aFirst
; i
< aFirst
+ aCount
; i
++)
151 iLut256
[i
] = aPalette
[i
];
156 CDsa::CDsa(RWsSession
& aSession
) :
163 RWsSession
& CDsa::Session()
168 int CDsa::AllocSurface(int bpp
)
172 TRAPD(err
, CreateSurfaceL());
176 bool CDsa::Blit(const TUint8
* aBits
, const TSize
& aSize
)
178 TUint16
* target
= (TUint16
*)LockSurface();
182 TSize ss
= iBmp
->SizeInPixels();
186 memset( target
, 0, ss
.iWidth
* ss
.iHeight
* 2 );
189 if( aSize
.iWidth
<= ss
.iWidth
&& aSize
.iHeight
<= ss
.iHeight
)
191 TUint16
* dst
= target
192 + ( ( ss
.iHeight
- aSize
.iHeight
) / 2 ) * ss
.iWidth
193 + ( ss
.iWidth
- aSize
.iWidth
) / 2;
194 int skip
= ss
.iWidth
- aSize
.iWidth
;
196 unsigned int h
= aSize
.iHeight
;
202 TUint8
* src
= (TUint8
*)aBits
;
205 unsigned int w
= aSize
.iWidth
;
208 *dst
++ = iLut256
[*src
++];
219 TUint16
* src
= (TUint16
*)aBits
;
222 memcpy( dst
, src
, aSize
.iWidth
* 2 );
232 TUint32
* src
= (TUint32
*)aBits
;
235 unsigned int w
= aSize
.iWidth
;
239 ( ( *src
& 0xF80000 ) >> 8 ) |
240 ( ( *src
& 0x00FC00 ) >> 5 ) |
241 ( ( *src
& 0x0000F8 ) >> 3 );
257 TUint16
* dst
= target
258 + ( ( ss
.iHeight
- aSize
.iHeight
/ 2 ) / 2 ) * ss
.iWidth
259 + ( ss
.iWidth
- aSize
.iWidth
/ 2 ) / 2;
260 int skip
= ss
.iWidth
- aSize
.iWidth
/ 2;
262 unsigned int h
= aSize
.iHeight
/ 2;
268 TUint8
* src1
= (TUint8
*)aBits
;
269 TUint8
* src2
= (TUint8
*)aBits
+ aSize
.iWidth
;
272 unsigned int w
= aSize
.iWidth
/ 2;
275 TUint32 c1
= iLut256
[*src1
++];
276 TUint32 c2
= iLut256
[*src1
++];
277 TUint32 c3
= iLut256
[*src2
++];
278 TUint32 c4
= iLut256
[*src2
++];
280 c1
= ( c1
& 0xF81F ) | ( ( c1
& 0x07E0 ) << 16 );
281 c2
= ( c2
& 0xF81F ) | ( ( c2
& 0x07E0 ) << 16 );
282 c3
= ( c3
& 0xF81F ) | ( ( c3
& 0x07E0 ) << 16 );
283 c4
= ( c4
& 0xF81F ) | ( ( c4
& 0x07E0 ) << 16 );
285 TUint32 c
= ( c1
+ c2
+ c3
+ c4
) / 4;
286 *dst
++ = ( c
& 0xF81F ) | ( ( c
& 0x07E00000 ) >> 16 );
290 src1
+= aSize
.iWidth
;
291 src2
+= aSize
.iWidth
;
299 TUint16
* src1
= (TUint16
*)aBits
;
300 TUint16
* src2
= (TUint16
*)aBits
+ aSize
.iWidth
;
303 unsigned int w
= aSize
.iWidth
/ 2;
306 TUint32 c1
= ( *src1
& 0xF81F ) | ( ( *src1
& 0x07E0 ) << 16 );
308 TUint32 c2
= ( *src1
& 0xF81F ) | ( ( *src1
& 0x07E0 ) << 16 );
310 TUint32 c3
= ( *src2
& 0xF81F ) | ( ( *src2
& 0x07E0 ) << 16 );
312 TUint32 c4
= ( *src2
& 0xF81F ) | ( ( *src2
& 0x07E0 ) << 16 );
315 TUint32 c
= ( c1
+ c2
+ c3
+ c4
) / 4;
316 *dst
++ = ( c
& 0xF81F ) | ( ( c
& 0x07E00000 ) >> 16 );
320 src1
+= aSize
.iWidth
;
321 src2
+= aSize
.iWidth
;
329 TUint32
* src1
= (TUint32
*)aBits
;
330 TUint32
* src2
= (TUint32
*)aBits
+ aSize
.iWidth
;
333 unsigned int w
= aSize
.iWidth
/ 2;
336 TUint32 c1
= ( ( *src1
& 0xF80000 ) >> 8 ) |
337 ( ( *src1
& 0x00FC00 ) << 11 ) |
338 ( ( *src1
& 0x0000F8 ) >> 3 );
340 TUint32 c2
= ( ( *src1
& 0xF80000 ) >> 8 ) |
341 ( ( *src1
& 0x00FC00 ) << 11 ) |
342 ( ( *src1
& 0x0000F8 ) >> 3 );
344 TUint32 c3
= ( ( *src2
& 0xF80000 ) >> 8 ) |
345 ( ( *src2
& 0x00FC00 ) << 11 ) |
346 ( ( *src2
& 0x0000F8 ) >> 3 );
348 TUint32 c4
= ( ( *src2
& 0xF80000 ) >> 8 ) |
349 ( ( *src2
& 0x00FC00 ) << 11 ) |
350 ( ( *src2
& 0x0000F8 ) >> 3 );
353 TUint32 c
= ( c1
+ c2
+ c3
+ c4
) / 4;
354 *dst
++ = ( c
& 0xF81F ) | ( ( c
& 0x07E00000 ) >> 16 );
358 src1
+= aSize
.iWidth
;
359 src2
+= aSize
.iWidth
;
385 RWindow
* CDsa::Window()
390 CDsa
* CDsa::CreateGlesDsaL()
392 CDsa
* dsa
= new CDsaGles(Session());
393 CWsScreenDevice
* dummy
= NULL
;
394 dsa
->ConstructL(*Window(), *dummy
);