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(const TSize
& aSize
) {}
17 //////////////////////////////////////////////////////////////////////
19 class CDsaBase
: public CDsa
, public MDirectScreenAccess
22 CDsaBase(RWsSession
& aSession
) : CDsa(aSession
), iBmp( NULL
) { m_updateWholeScreen
= false; }
26 void ConstructL(RWindow
& aWindow
, CWsScreenDevice
& aDevice
);
29 CDirectScreenAccess
* iDsa
;
32 void AbortNow(RDirectScreenAccess::TTerminationReasons aReason
);
33 void Restart(RDirectScreenAccess::TTerminationReasons aReason
);
38 TUint8
* LockSurface();
39 void UnlockHwSurface();
40 void CreateSurfaceL(const TSize
& aSize
);
45 void CDsaBase::ConstructL(RWindow
& aWindow
, CWsScreenDevice
& aDevice
)
47 CDsa::ConstructL(aWindow
, aDevice
);
55 iDsa
= CDirectScreenAccess::NewL(Session(), aDevice
, aWindow
, *this);
68 void CDsaBase::RestartL()
71 iDsa
->Gc()->SetClippingRegion(iDsa
->DrawingRegion());
82 TUint8
* CDsaBase::LockSurface()
85 return (TUint8
*)iBmp
->DataAddress();
88 void CDsaBase::UnlockHwSurface()
91 iDsa
->Gc()->BitBlt(TPoint(0, 0), iBmp
);
92 iDsa
->ScreenDevice()->Update();
95 void CDsaBase::CreateSurfaceL(const TSize
& aSize
)
98 iBmp
= new CFbsBitmap();
99 User::LeaveIfError(iBmp
->Create(aSize
, EColor64K
));
102 void CDsaBase::AbortNow(RDirectScreenAccess::TTerminationReasons
/*aReason*/)
107 void CDsaBase::Restart(RDirectScreenAccess::TTerminationReasons
/*aReason*/)
109 TRAPD(err
, RestartL());
110 if(err
== KLeaveExit
)
120 void CDsaBase::Stop()
126 ///////////////////////////////////////////////////////////////////////
128 void ClipCopy1(const CDsa
& iDsa
, TUint8
* aTarget
,
129 const TUint8
* aSource
,
130 const TRect
& aUpdateRect
,
131 const TRect
& aSourceRect
)
133 const TUint8
* source
= (const TUint8
*)aSource
;
134 const int lineWidth
= aSourceRect
.Width();
136 source
+= (aUpdateRect
.iTl
.iY
* lineWidth
);
137 const int sourceStartOffset
= aUpdateRect
.iTl
.iX
;
138 source
+= sourceStartOffset
;
140 TUint16
* targetPtr
= (TUint16
*)aTarget
;
142 int scanLineWidth
= aSourceRect
.iBr
.iX
;
144 targetPtr
+= aUpdateRect
.iTl
.iY
* scanLineWidth
;
145 const int targetStartOffset
= aUpdateRect
.iTl
.iX
;
147 targetPtr
+= targetStartOffset
;
149 const int height
= aUpdateRect
.Height();
151 const int copyLen
= aUpdateRect
.Width();
152 const int lineMove
= lineWidth
- copyLen
;
153 scanLineWidth
-= copyLen
;
155 for(int i
= 0; i
< height
; i
++) //source is always smaller
160 *targetPtr
++ = iDsa
.iLut256
[*source
++];
165 targetPtr
+= scanLineWidth
;
169 void ClipCopy2(const CDsa
& iDsa
, TUint8
* aTarget
,
170 const TUint8
* aSource
,
171 const TRect
& aUpdateRect
,
172 const TRect
& aSourceRect
)
174 const TUint16
* source
= (const TUint16
*)aSource
;
175 const int lineWidth
= aSourceRect
.Width();
177 source
+= (aUpdateRect
.iTl
.iY
* lineWidth
);
178 const int sourceStartOffset
= aUpdateRect
.iTl
.iX
;
179 source
+= sourceStartOffset
;
181 TUint16
* targetPtr
= (TUint16
*)aTarget
;
183 const int scanLineWidth
= aSourceRect
.iBr
.iX
;
185 targetPtr
+= aUpdateRect
.iTl
.iY
* scanLineWidth
;
186 const int targetStartOffset
= aUpdateRect
.iTl
.iX
;
188 targetPtr
+= targetStartOffset
;
190 const int height
= aUpdateRect
.Height();
192 const int lineMove
= lineWidth
;
193 const int copyLen
= aUpdateRect
.Width() * 2;
195 for(int i
= 0; i
< height
; i
++) //source is always smaller
197 memcpy( targetPtr
, source
, copyLen
);
199 targetPtr
+= scanLineWidth
;
203 void ClipCopy4(const CDsa
& iDsa
, TUint8
* aTarget
,
204 const TUint8
* aSource
,
205 const TRect
& aUpdateRect
,
206 const TRect
& aSourceRect
)
208 const TUint32
* source
= (const TUint32
*)aSource
;
209 const int lineWidth
= aSourceRect
.Width();
211 source
+= (aUpdateRect
.iTl
.iY
* lineWidth
);
212 const int sourceStartOffset
= aUpdateRect
.iTl
.iX
;
213 source
+= sourceStartOffset
;
215 TUint16
* targetPtr
= (TUint16
*)aTarget
;
217 int scanLineWidth
= aSourceRect
.iBr
.iX
;
219 targetPtr
+= aUpdateRect
.iTl
.iY
* scanLineWidth
;
220 const int targetStartOffset
= aUpdateRect
.iTl
.iX
;
222 targetPtr
+= targetStartOffset
;
224 const int height
= aUpdateRect
.Height();
226 const int copyLen
= aUpdateRect
.Width();
227 const int lineMove
= lineWidth
- copyLen
;
228 scanLineWidth
-= copyLen
;
230 for(int i
= 0; i
< height
; i
++) //source is always smaller
236 ( ( *source
& 0xF80000 ) >> 8 ) |
237 ( ( *source
& 0x00FC00 ) >> 5 ) |
238 ( ( *source
& 0x0000F8 ) >> 3 );
244 targetPtr
+= scanLineWidth
;
248 /////////////////////////////////////////////////////////////////////////////////////////////////////
250 CDsa
* CDsa::CreateL(RWsSession
& aSession
)
252 return new CDsaBase(aSession
);
264 void CDsa::ConstructL(RWindow
& aWindow
, CWsScreenDevice
& /*aDevice*/)
267 iLut256
= new TUint32
[256];
271 int CDsa::SetPalette(int aFirst
, int aCount
, TUint32
* aPalette
)
275 for(int i
= aFirst
; i
< aFirst
+ aCount
; i
++)
277 iLut256
[i
] = aPalette
[i
];
282 CDsa::CDsa(RWsSession
& aSession
) :
289 RWsSession
& CDsa::Session()
294 int CDsa::AllocSurface(const TSize
& aSize
, int bpp
)
298 TRAPD(err
, CreateSurfaceL(aSize
));
305 void CDsa::ClipCopy(TUint8
* aTarget
,
306 const TUint8
* aSource
,
307 const TRect
& aUpdateRect
,
308 const TRect
& aSourceRect
) const
313 ::ClipCopy1(*this, aTarget
, aSource
, aUpdateRect
, aSourceRect
);
316 ::ClipCopy2(*this, aTarget
, aSource
, aUpdateRect
, aSourceRect
);
319 ::ClipCopy4(*this, aTarget
, aSource
, aUpdateRect
, aSourceRect
);
324 bool CDsa::AddUpdateRect(const TUint8
* aBits
, const TRect
& aUpdateRect
, const TRect
& aRect
)
326 if(iTargetAddr
== NULL
)
328 iTargetAddr
= LockSurface();
331 TUint8
* target
= iTargetAddr
;
335 TRect sourceRect
= aRect
;
336 TRect updateRect
= aUpdateRect
;
338 ClipCopy(target
, aBits
, aUpdateRect
, aRect
);
343 void CDsa::UpdateSwSurface()
359 RWindow
* CDsa::Window()
364 CDsa
* CDsa::CreateGlesDsaL()
366 CDsa
* dsa
= new CDsaGles(Session());
367 CWsScreenDevice
* dummy
= NULL
;
368 dsa
->ConstructL(*Window(), *dummy
);
374 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
376 void CDsa::CopyMem(const CDsa
& /*aDsa*/, TUint32
* aTarget
, const TUint8
* aSource
, int aBytes
)
378 memcpy(aTarget
, aSource
, aBytes
<< 2);