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 void AbortNow(RDirectScreenAccess::TTerminationReasons aReason
);
30 void Restart(RDirectScreenAccess::TTerminationReasons aReason
);
35 TUint8
* LockSurface();
36 void UnlockHwSurface();
37 void CreateSurfaceL(const TSize
& aSize
);
40 CDirectScreenAccess
* iDsa
;
43 void CDsaBase::ConstructL(RWindow
& aWindow
, CWsScreenDevice
& aDevice
)
45 CDsa::ConstructL(aWindow
, aDevice
);
53 iDsa
= CDirectScreenAccess::NewL(Session(), aDevice
, aWindow
, *this);
66 void CDsaBase::RestartL()
69 iDsa
->Gc()->SetClippingRegion(iDsa
->DrawingRegion());
80 TUint8
* CDsaBase::LockSurface()
83 return (TUint8
*)iBmp
->DataAddress();
86 void CDsaBase::UnlockHwSurface()
89 iDsa
->Gc()->BitBlt(TPoint(0, 0), iBmp
);
90 iDsa
->ScreenDevice()->Update();
93 void CDsaBase::CreateSurfaceL(const TSize
& aSize
)
96 iBmp
= new CFbsBitmap();
97 User::LeaveIfError(iBmp
->Create(aSize
, EColor64K
));
100 void CDsaBase::AbortNow(RDirectScreenAccess::TTerminationReasons
/*aReason*/)
105 void CDsaBase::Restart(RDirectScreenAccess::TTerminationReasons
/*aReason*/)
107 TRAPD(err
, RestartL());
108 if(err
== KLeaveExit
)
118 void CDsaBase::Stop()
124 ///////////////////////////////////////////////////////////////////////
126 void ClipCopy1(const CDsa
& iDsa
, TUint8
* aTarget
,
127 const TUint8
* aSource
,
128 const TRect
& aUpdateRect
,
129 const TRect
& aSourceRect
)
131 const TUint8
* source
= (const TUint8
*)aSource
;
132 const int lineWidth
= aSourceRect
.Width();
134 source
+= (aUpdateRect
.iTl
.iY
* lineWidth
);
135 const int sourceStartOffset
= aUpdateRect
.iTl
.iX
;
136 source
+= sourceStartOffset
;
138 TUint16
* targetPtr
= (TUint16
*)aTarget
;
140 int scanLineWidth
= aSourceRect
.iBr
.iX
;
142 targetPtr
+= aUpdateRect
.iTl
.iY
* scanLineWidth
;
143 const int targetStartOffset
= aUpdateRect
.iTl
.iX
;
145 targetPtr
+= targetStartOffset
;
147 const int height
= aUpdateRect
.Height();
149 const int copyLen
= aUpdateRect
.Width();
150 const int lineMove
= lineWidth
- copyLen
;
151 scanLineWidth
-= copyLen
;
153 for(int i
= 0; i
< height
; i
++) //source is always smaller
158 *targetPtr
++ = iDsa
.iLut256
[*source
++];
163 targetPtr
+= scanLineWidth
;
167 void ClipCopy2(const CDsa
& iDsa
, TUint8
* aTarget
,
168 const TUint8
* aSource
,
169 const TRect
& aUpdateRect
,
170 const TRect
& aSourceRect
)
172 const TUint16
* source
= (const TUint16
*)aSource
;
173 const int lineWidth
= aSourceRect
.Width();
175 source
+= (aUpdateRect
.iTl
.iY
* lineWidth
);
176 const int sourceStartOffset
= aUpdateRect
.iTl
.iX
;
177 source
+= sourceStartOffset
;
179 TUint16
* targetPtr
= (TUint16
*)aTarget
;
181 const int scanLineWidth
= aSourceRect
.iBr
.iX
;
183 targetPtr
+= aUpdateRect
.iTl
.iY
* scanLineWidth
;
184 const int targetStartOffset
= aUpdateRect
.iTl
.iX
;
186 targetPtr
+= targetStartOffset
;
188 const int height
= aUpdateRect
.Height();
190 const int lineMove
= lineWidth
;
191 const int copyLen
= aUpdateRect
.Width() * 2;
193 for(int i
= 0; i
< height
; i
++) //source is always smaller
195 memcpy( targetPtr
, source
, copyLen
);
197 targetPtr
+= scanLineWidth
;
201 void ClipCopy4(const CDsa
& iDsa
, TUint8
* aTarget
,
202 const TUint8
* aSource
,
203 const TRect
& aUpdateRect
,
204 const TRect
& aSourceRect
)
206 const TUint32
* source
= (const TUint32
*)aSource
;
207 const int lineWidth
= aSourceRect
.Width();
209 source
+= (aUpdateRect
.iTl
.iY
* lineWidth
);
210 const int sourceStartOffset
= aUpdateRect
.iTl
.iX
;
211 source
+= sourceStartOffset
;
213 TUint16
* targetPtr
= (TUint16
*)aTarget
;
215 int scanLineWidth
= aSourceRect
.iBr
.iX
;
217 targetPtr
+= aUpdateRect
.iTl
.iY
* scanLineWidth
;
218 const int targetStartOffset
= aUpdateRect
.iTl
.iX
;
220 targetPtr
+= targetStartOffset
;
222 const int height
= aUpdateRect
.Height();
224 const int copyLen
= aUpdateRect
.Width();
225 const int lineMove
= lineWidth
- copyLen
;
226 scanLineWidth
-= copyLen
;
228 for(int i
= 0; i
< height
; i
++) //source is always smaller
234 ( ( *source
& 0xF80000 ) >> 8 ) |
235 ( ( *source
& 0x00FC00 ) >> 5 ) |
236 ( ( *source
& 0x0000F8 ) >> 3 );
242 targetPtr
+= scanLineWidth
;
246 /////////////////////////////////////////////////////////////////////////////////////////////////////
248 CDsa
* CDsa::CreateL(RWsSession
& aSession
)
250 return new CDsaBase(aSession
);
262 void CDsa::ConstructL(RWindow
& aWindow
, CWsScreenDevice
& /*aDevice*/)
265 iLut256
= new TUint32
[256];
269 int CDsa::SetPalette(int aFirst
, int aCount
, TUint32
* aPalette
)
273 for(int i
= aFirst
; i
< aFirst
+ aCount
; i
++)
275 iLut256
[i
] = aPalette
[i
];
280 CDsa::CDsa(RWsSession
& aSession
) :
287 RWsSession
& CDsa::Session()
292 int CDsa::AllocSurface(const TSize
& aSize
, int bpp
)
296 TRAPD(err
, CreateSurfaceL(aSize
));
303 void CDsa::ClipCopy(TUint8
* aTarget
,
304 const TUint8
* aSource
,
305 const TRect
& aUpdateRect
,
306 const TRect
& aSourceRect
) const
311 ::ClipCopy1(*this, aTarget
, aSource
, aUpdateRect
, aSourceRect
);
314 ::ClipCopy2(*this, aTarget
, aSource
, aUpdateRect
, aSourceRect
);
317 ::ClipCopy4(*this, aTarget
, aSource
, aUpdateRect
, aSourceRect
);
322 bool CDsa::AddUpdateRect(const TUint8
* aBits
, const TRect
& aUpdateRect
, const TRect
& aRect
)
324 if(iTargetAddr
== NULL
)
326 iTargetAddr
= LockSurface();
329 TUint8
* target
= iTargetAddr
;
333 TRect sourceRect
= aRect
;
334 TRect updateRect
= aUpdateRect
;
336 ClipCopy(target
, aBits
, aUpdateRect
, aRect
);
341 void CDsa::UpdateSwSurface()
357 RWindow
* CDsa::Window()
362 CDsa
* CDsa::CreateGlesDsaL()
364 CDsa
* dsa
= new CDsaGles(Session());
365 CWsScreenDevice
* dummy
= NULL
;
366 dsa
->ConstructL(*Window(), *dummy
);
372 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
374 void CDsa::CopyMem(const CDsa
& /*aDsa*/, TUint32
* aTarget
, const TUint8
* aSource
, int aBytes
)
376 memcpy(aTarget
, aSource
, aBytes
<< 2);