e14743d1 |
1 | #include "dsa.h" |
2 | #include "sdlepocapi.h" |
3 | #include <cdsb.h> |
4 | |
5 | |
6 | LOCAL_C TInt BytesPerPixel(TDisplayMode aMode) |
7 | { |
8 | return ((TDisplayModeUtils::NumDisplayModeBitsPerPixel(aMode) - 1) >> 3) + 1; |
9 | } |
10 | |
11 | |
12 | NONSHARABLE_CLASS(TDsa) |
13 | { |
14 | public: |
15 | inline TDsa(const CDsa& aDsa); |
16 | inline TBool IsFlip() const; |
17 | inline TBool IsTurn() const; |
18 | inline const TSize& SwSize() const; |
19 | inline void Copy(TUint32* aTarget, const TUint8* aSrc, TInt aBytes, TInt aHeight) const; |
20 | private: |
21 | const CDsa& iDsa; |
22 | }; |
23 | |
24 | |
25 | inline TDsa::TDsa(const CDsa& aDsa) : iDsa(aDsa) |
26 | { |
27 | } |
28 | |
29 | inline TBool TDsa::IsTurn() const |
30 | { |
31 | return iDsa.iStateFlags & CDsa::EOrientation90; |
32 | } |
33 | |
34 | inline TBool TDsa::IsFlip() const |
35 | { |
36 | return iDsa.iStateFlags & CDsa::EOrientation180; |
37 | } |
38 | |
39 | inline const TSize& TDsa::SwSize() const |
40 | { |
41 | return iDsa.SwSize(); |
42 | } |
43 | |
44 | inline void TDsa::Copy(TUint32* aTarget, const TUint8* aSrc, TInt aBytes, TInt aHeight) const |
45 | { |
46 | iDsa.iCopyFunction(iDsa, aTarget, aSrc, aBytes, aHeight); |
47 | } |
48 | |
49 | template<class T, class S> |
50 | void ClipCopy(const TDsa& iDsa, TUint8* aTarget, |
51 | const TUint8* aSource, |
52 | const TRect& aUpdateRect, |
53 | const TRect& aSourceRect) |
54 | { |
55 | const S* source = reinterpret_cast<const S*>(aSource); |
56 | const TInt lineWidth = aSourceRect.Width(); |
57 | |
58 | source += (aUpdateRect.iTl.iY * lineWidth); |
59 | const TInt sourceStartOffset = aUpdateRect.iTl.iX; |
60 | source += sourceStartOffset; |
61 | |
62 | T* targetPtr = reinterpret_cast<T*>(aTarget); |
63 | |
64 | const TInt scanLineWidth = iDsa.SwSize().iWidth; |
65 | |
66 | targetPtr += (aSourceRect.iTl.iY + aUpdateRect.iTl.iY ) * scanLineWidth; |
67 | const TInt targetStartOffset = (aUpdateRect.iTl.iX + aSourceRect.iTl.iX); |
68 | |
69 | targetPtr += targetStartOffset; |
70 | |
71 | |
72 | const TInt height = aUpdateRect.Height(); |
73 | |
74 | const TInt lineMove = iDsa.IsTurn() ? 1 : lineWidth; |
75 | const TInt copyLen = aUpdateRect.Width(); |
76 | |
77 | |
78 | if(iDsa.IsFlip()) |
79 | { |
80 | |
81 | targetPtr += scanLineWidth * (height - 1); |
82 | |
83 | for(TInt i = 0; i < height; i++) //source is always smaller |
84 | { |
85 | iDsa.Copy(reinterpret_cast<TUint32*>(targetPtr), reinterpret_cast<const TUint8*>(source), copyLen, height); |
86 | source += lineMove; |
87 | targetPtr -= scanLineWidth; |
88 | } |
89 | } |
90 | else |
91 | { |
92 | |
93 | |
94 | for(TInt i = 0; i < height; i++) //source is always smaller |
95 | { |
96 | iDsa.Copy(reinterpret_cast<TUint32*>(targetPtr), reinterpret_cast<const TUint8*>(source), copyLen, height); |
97 | source += lineMove; |
98 | targetPtr += scanLineWidth; // >> 2; |
99 | } |
100 | } |
101 | |
102 | } |
103 | |
104 | |
105 | |
106 | NONSHARABLE_CLASS(CDsaA) : public CDsa |
107 | { |
108 | public: |
109 | CDsaA(RWsSession& aSession); |
110 | private: |
111 | ~CDsaA(); |
112 | TUint8* LockSurface(); |
113 | void UnlockHWSurfaceRequestComplete(); |
114 | void UnlockHwSurface(); |
115 | void CreateSurfaceL(); |
116 | void Wipe(TInt aLength); |
117 | void Free(); |
118 | void Update(CFbsBitmap& aBmp); |
119 | void ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice); |
120 | TInt ExternalUpdate(); |
121 | // void ExternalUpdate(); |
122 | protected: |
123 | CFbsBitmap* iBmp; |
124 | CFbsBitmap* iCopyBmp; |
125 | }; |
126 | |
127 | |
128 | CDsaA::CDsaA(RWsSession& aSession) : CDsa(aSession) |
129 | { |
130 | } |
131 | |
132 | |
133 | void CDsaA::Free() |
134 | { |
135 | delete iBmp; |
136 | iBmp = NULL; |
137 | } |
138 | |
139 | CDsaA::~CDsaA() |
140 | { |
141 | __ASSERT_DEBUG(iBmp == NULL, PANIC(KErrNotReady)); |
142 | delete iCopyBmp; |
143 | } |
144 | |
145 | TUint8* CDsaA::LockSurface() |
146 | { |
147 | iBmp->LockHeap(); |
148 | return reinterpret_cast<TUint8*>(iBmp->DataAddress()); |
149 | } |
150 | |
151 | void CDsaA::UnlockHWSurfaceRequestComplete() |
152 | { |
153 | PANIC(KErrNotSupported); |
154 | } |
155 | |
156 | void CDsaA::UnlockHwSurface() |
157 | { |
158 | iBmp->UnlockHeap(); |
159 | SetUpdating(EFalse); |
160 | Update(*iBmp); |
161 | } |
162 | |
163 | void CDsaA::Update(CFbsBitmap& aBmp) |
164 | { |
165 | if(!Blitter(aBmp)) |
166 | { |
167 | if(SwSize() == HwRect().Size()) |
168 | Dsa().Gc()->BitBlt(HwRect().iTl, &aBmp); |
169 | else |
170 | Dsa().Gc()->DrawBitmap(HwRect(), &aBmp); |
171 | } |
172 | DrawOverlays(); |
173 | Dsa().ScreenDevice()->Update(); |
174 | } |
175 | void CDsaA::CreateSurfaceL() |
176 | { |
177 | delete iBmp; |
178 | iBmp = NULL; |
179 | iBmp = new (ELeave) CFbsBitmap(); |
180 | User::LeaveIfError(iBmp->Create(SwSize(), DisplayMode())); |
181 | } |
182 | |
183 | void CDsaA::Wipe(TInt aLength) //dont call in drawing |
184 | { |
185 | iBmp->LockHeap(); |
186 | Mem::FillZ(iBmp->DataAddress(), aLength); |
187 | iBmp->UnlockHeap(); |
188 | } |
189 | |
190 | |
191 | |
192 | TInt CDsaA::ExternalUpdate() |
193 | { |
194 | if(iCopyBmp->Handle() == 0) |
195 | { |
196 | const TInt err = iCopyBmp->Duplicate(iBmp->Handle()); |
197 | if(err != KErrNone) |
198 | return err; |
199 | } |
200 | Update(*iCopyBmp); |
201 | return KErrNone; |
202 | } |
203 | |
204 | void CDsaA::ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice) |
205 | { |
206 | iCopyBmp = new (ELeave) CFbsBitmap(); |
207 | CDsa::ConstructL(aWindow, aDevice); |
208 | } |
209 | |
210 | |
211 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
212 | |
213 | NONSHARABLE_CLASS(MDsbObs) |
214 | { |
215 | public: |
216 | virtual void SurfaceReady() = 0; |
217 | virtual CDirectScreenBitmap& Dsb() = 0; |
218 | }; |
219 | |
220 | NONSHARABLE_CLASS(CDsbSurface) : public CActive |
221 | { |
222 | public: |
223 | CDsbSurface(MDsbObs& aDsb); |
224 | TUint8* Address(); |
225 | void Complete(); |
226 | ~CDsbSurface(); |
227 | private: |
228 | void RunL(); |
229 | void DoCancel(); |
230 | private: |
231 | MDsbObs& iDsb; |
232 | TUint8* iAddress; |
233 | }; |
234 | |
235 | CDsbSurface::CDsbSurface(MDsbObs& aDsb) : CActive(CActive::EPriorityHigh) , iDsb(aDsb) |
236 | { |
237 | CActiveScheduler::Add(this); |
238 | } |
239 | |
240 | CDsbSurface::~CDsbSurface() |
241 | { |
242 | Cancel(); |
243 | } |
244 | |
245 | void CDsbSurface::Complete() |
246 | { |
247 | if(iAddress != NULL && !IsActive()) |
248 | { |
249 | iAddress = NULL; |
250 | SetActive(); |
251 | iDsb.Dsb().EndUpdate(iStatus); |
252 | } |
253 | } |
254 | |
255 | TUint8* CDsbSurface::Address() |
256 | { |
257 | if(iAddress == NULL && !IsActive()) |
258 | { |
259 | TAcceleratedBitmapInfo info; |
260 | if(KErrNone == iDsb.Dsb().BeginUpdate(info)) |
261 | iAddress = info.iAddress; |
262 | } |
263 | return iAddress; |
264 | } |
265 | |
266 | void CDsbSurface::RunL() |
267 | { |
268 | iDsb.SurfaceReady(); |
269 | } |
270 | |
271 | void CDsbSurface::DoCancel() |
272 | { |
273 | //empty |
274 | } |
275 | |
276 | NONSHARABLE_CLASS(CDsaB) : public CDsa, public MDsbObs |
277 | { |
278 | public: |
279 | CDsaB(RWsSession& aSession, TInt aFlags); |
280 | private: |
281 | ~CDsaB(); |
282 | TUint8* LockSurface(); |
283 | void UnlockHWSurfaceRequestComplete(); |
284 | void UnlockHwSurface(); |
285 | void CreateSurfaceL(); |
286 | void Wipe(TInt aLength); |
287 | void RecreateL(); |
288 | void ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice); |
289 | CDirectScreenBitmap& Dsb(); |
290 | void SurfaceReady(); |
291 | TInt ExternalUpdate(); |
292 | private: |
293 | CDsbSurface* iSurface1; |
294 | CDsbSurface* iSurface2; |
295 | CDirectScreenBitmap* iDsb; |
296 | TInt iType; |
297 | }; |
298 | |
299 | CDsaB::CDsaB(RWsSession& aSession, TInt aFlags) : CDsa(aSession), iType(aFlags) |
300 | { |
301 | } |
302 | |
303 | |
304 | |
305 | void CDsaB::UnlockHWSurfaceRequestComplete() |
306 | { |
307 | iSurface1->Complete(); |
308 | if(iSurface2 != NULL) |
309 | iSurface2->Complete(); |
310 | } |
311 | |
312 | void CDsaB::CreateSurfaceL() |
313 | { |
314 | __ASSERT_ALWAYS(SwSize() == HwRect().Size(), PANIC(KErrNotSupported)); |
315 | } |
316 | |
317 | void CDsaB::Wipe(TInt aLength) //dont call in drawing |
318 | { |
319 | TUint8* addr = LockSurface(); |
320 | if(addr != NULL) |
321 | { |
322 | Mem::FillZ(addr, aLength); |
323 | UnlockHwSurface(); |
324 | } |
325 | } |
326 | |
327 | |
328 | void CDsaB::UnlockHwSurface() |
329 | { |
330 | EpocSdlEnv::Request(CDsa::ERequestUpdate); |
331 | } |
332 | |
333 | TUint8* CDsaB::LockSurface() |
334 | { |
335 | TUint8* addr = iSurface1->Address(); |
336 | if(addr == NULL && iSurface2 != NULL) |
337 | addr = iSurface2->Address(); |
338 | SetUpdating(addr == NULL); |
339 | return addr; |
340 | } |
341 | |
342 | void CDsaB::SurfaceReady() |
343 | { |
344 | SetUpdating(EFalse); |
345 | } |
346 | |
347 | CDirectScreenBitmap& CDsaB::Dsb() |
348 | { |
349 | return *iDsb; |
350 | } |
351 | |
352 | void CDsaB::ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice) |
353 | { |
354 | if(iDsb == NULL) |
355 | iDsb = CDirectScreenBitmap::NewL(); |
356 | CDsa::ConstructL(aWindow, aDevice); |
357 | if(iSurface1 == NULL) |
358 | iSurface1 = new (ELeave) CDsbSurface(*this); |
359 | if(iSurface2 == NULL && iType & CDirectScreenBitmap::EDoubleBuffer) |
360 | iSurface2 = new (ELeave) CDsbSurface(*this); |
361 | } |
362 | |
363 | CDsaB::~CDsaB() |
364 | { |
365 | delete iSurface1; |
366 | delete iSurface2; |
367 | delete iDsb; |
368 | } |
369 | |
370 | void CDsaB::RecreateL() |
371 | { |
372 | iDsb->Close(); |
373 | iDsb->Create(HwRect(), CDirectScreenBitmap::TSettingsFlags(iType)); |
374 | } |
375 | |
376 | TInt CDsaB::ExternalUpdate() |
377 | { |
378 | if(LockSurface()) |
379 | { |
380 | UnlockHWSurfaceRequestComplete(); |
381 | return KErrNone; |
382 | } |
383 | return KErrNotReady; |
384 | } |
385 | |
386 | |
387 | ///////////////////////////////////////////////////////////////////////////////////////////////////// |
388 | |
389 | |
390 | CDsa* CDsa::CreateL(RWsSession& aSession) |
391 | { |
392 | if(EpocSdlEnv::Flags(CSDL::EDrawModeDSB)) |
393 | { |
394 | TInt flags = CDirectScreenBitmap::ENone; |
395 | if(EpocSdlEnv::Flags(CSDL::EDrawModeDSBDoubleBuffer)) |
396 | flags |= CDirectScreenBitmap::EDoubleBuffer; |
397 | if(EpocSdlEnv::Flags(CSDL::EDrawModeDSBIncrentalUpdate)) |
398 | flags |= CDirectScreenBitmap::EIncrementalUpdate; |
399 | return new (ELeave) CDsaB(aSession, flags); |
400 | } |
401 | else |
402 | return new (ELeave) CDsaA(aSession); |
403 | } |
404 | |
405 | |
406 | void CDsa::RecreateL() |
407 | { |
408 | } |
409 | |
410 | void CDsa::Free() |
411 | { |
412 | } |
413 | |
414 | TSize CDsa::WindowSize() const |
415 | { |
416 | TSize size = iSwSize; |
417 | if(iStateFlags & EOrientation90) |
418 | { |
419 | const TInt tmp = size.iWidth; |
420 | size.iWidth = size.iHeight; |
421 | size.iHeight = tmp; |
422 | } |
423 | return size; |
424 | } |
425 | |
426 | void CDsa::SetSuspend() |
427 | { |
428 | iStateFlags |= ESdlThreadSuspend; |
429 | } |
430 | |
431 | void CDsa::ReleaseStop() |
432 | { |
433 | iStateFlags &= ~ESdlThreadExplicitStop; |
434 | } |
435 | |
436 | |
437 | TBool CDsa::Stopped() const |
438 | { |
439 | return (iStateFlags & ESdlThreadExplicitStop); |
440 | } |
441 | |
442 | void CDsa::SetOrientation(CSDL::TOrientationMode aOrientation) |
443 | { |
444 | TInt flags = 0; |
445 | switch(aOrientation) |
446 | { |
447 | case CSDL::EOrientation90: |
448 | flags = EOrientation90; |
449 | break; |
450 | case CSDL::EOrientation180: |
451 | flags = EOrientation180; |
452 | break; |
453 | case CSDL::EOrientation270: |
454 | flags = EOrientation90 | EOrientation180; |
455 | break; |
456 | case CSDL::EOrientation0: |
457 | flags = 0; |
458 | break; |
459 | } |
460 | if(flags != (iStateFlags & EOrientationFlags)) |
461 | { |
462 | iStateFlags |= EOrientationChanged; |
463 | iNewFlags = flags; //cannot be set during drawing... |
464 | } |
465 | } |
466 | |
467 | CDsa::~CDsa() |
468 | { |
469 | if(iDsa != NULL) |
470 | { |
471 | iDsa->Cancel(); |
472 | } |
473 | iOverlays.Close(); |
474 | delete iDsa; |
475 | User::Free(iLut256); |
476 | } |
477 | |
478 | void CDsa::ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice) |
479 | { |
480 | if(iDsa != NULL) |
481 | { |
482 | iDsa->Cancel(); |
483 | delete iDsa; |
484 | iDsa = NULL; |
485 | } |
486 | |
487 | iDsa = CDirectScreenAccess::NewL( |
488 | iSession, |
489 | aDevice, |
490 | aWindow, |
491 | *this); |
492 | |
493 | if(iLut256 == NULL) |
494 | iLut256 = (TUint32*) User::AllocL(256 * sizeof(TUint32)); |
495 | iTargetMode = aWindow.DisplayMode(); |
496 | iTargetBpp = BytesPerPixel(DisplayMode()); |
497 | iScreenRect = TRect(aWindow.Position(), aWindow.Size()); |
498 | SetTargetRect(); |
499 | RestartL(); |
500 | } |
501 | |
502 | void CDsa::DrawOverlays() |
503 | { |
504 | const TInt last = iOverlays.Count() - 1; |
505 | for(TInt i = last; i >= 0 ; i--) |
506 | iOverlays[i].iOverlay->Draw(*iDsa->Gc(), HwRect(), SwSize()); |
507 | } |
508 | |
509 | TInt CDsa::AppendOverlay(MOverlay& aOverlay, TInt aPriority) |
510 | { |
511 | TInt i; |
512 | for(i = 0; i < iOverlays.Count() && iOverlays[i].iPriority < aPriority; i++) |
513 | {} |
514 | const TOverlay overlay = {&aOverlay, aPriority}; |
515 | return iOverlays.Insert(overlay, i); |
516 | } |
517 | |
518 | TInt CDsa::RemoveOverlay(MOverlay& aOverlay) |
519 | { |
520 | for(TInt i = 0; i < iOverlays.Count(); i++) |
521 | { |
522 | if(iOverlays[i].iOverlay == &aOverlay) |
523 | { |
524 | iOverlays.Remove(i); |
525 | return KErrNone; |
526 | } |
527 | } |
528 | return KErrNotFound; |
529 | } |
530 | |
531 | void CDsa::LockPalette(TBool aLock) |
532 | { |
533 | if(aLock) |
534 | iStateFlags |= EPaletteLocked; |
535 | else |
536 | iStateFlags &= ~EPaletteLocked; |
537 | } |
538 | TInt CDsa::SetPalette(TInt aFirst, TInt aCount, TUint32* aPalette) |
539 | { |
540 | if(iLut256 == NULL) |
541 | return KErrNotFound; |
542 | const TInt count = aCount - aFirst; |
543 | if(count > 256) |
544 | return KErrArgument; |
545 | if(iStateFlags & EPaletteLocked) |
546 | return KErrNone; |
547 | for(TInt i = aFirst; i < count; i++) //not so busy here:-) |
548 | { |
549 | iLut256[i] = aPalette[i]; |
550 | } |
551 | return KErrNone; |
552 | } |
553 | |
554 | |
555 | |
556 | void CDsa::RestartL() |
557 | { |
558 | //const TBool active = iDsa->IsActive(); |
559 | |
560 | //if(!active) |
561 | |
562 | iDsa->StartL(); |
563 | |
564 | const RRegion* r = iDsa->DrawingRegion(); |
565 | const TRect rect = r->BoundingRect(); |
566 | iDsa->Gc()->SetClippingRegion(r); |
567 | |
568 | if(rect != iScreenRect) |
569 | { |
570 | // iDsa->Cancel(); |
571 | return ; |
572 | } |
573 | |
574 | |
575 | |
576 | //iScreenRect = rect; //to ensure properly set, albeit may not(?) match to value SDL has - therefore may has to clip |
577 | //targetrect shall no change |
578 | SetTargetRect(); |
579 | RecreateL(); |
580 | |
581 | iStateFlags |= ERunning; |
582 | |
583 | ReleaseStop(); |
584 | if(iStateFlags & ESdlThreadSuspend) |
585 | { |
586 | EpocSdlEnv::Resume(); |
587 | iStateFlags &= ~ ESdlThreadSuspend; |
588 | } |
589 | EpocSdlEnv::ObserverEvent(MSDLObserver::EEventWindowReserved); |
590 | } |
591 | |
592 | CDsa::CDsa(RWsSession& aSession) : |
593 | iSession(aSession), |
594 | iStateFlags(0) |
595 | { |
596 | // CActiveScheduler::Add(this); |
597 | iCFTable[0] = CopyMem; |
598 | iCFTable[1] = CopyMemFlipReversed; |
599 | iCFTable[2] = CopyMemReversed; |
600 | iCFTable[3] = CopyMemFlip; |
601 | |
602 | iCFTable[4] = Copy256; |
603 | iCFTable[5] = Copy256FlipReversed; |
604 | iCFTable[6] = Copy256Reversed; |
605 | iCFTable[7] = Copy256Flip; |
606 | |
607 | |
608 | iCFTable[8] = CopySlow; |
609 | iCFTable[9] = CopySlowFlipReversed; |
610 | iCFTable[10] = CopySlowReversed; |
611 | iCFTable[11] = CopySlowFlip; |
612 | } |
613 | |
614 | RWsSession& CDsa::Session() |
615 | { |
616 | return iSession; |
617 | } |
618 | |
619 | TInt CDsa::RedrawRequest() |
620 | { |
621 | if(!(iStateFlags & (EUpdating) && (iStateFlags & ERunning))) |
622 | { |
623 | return ExternalUpdate(); |
624 | } |
625 | return KErrNotReady; |
626 | } |
627 | |
628 | TUint8* CDsa::LockHwSurface() |
629 | { |
630 | if((iStateFlags & EUpdating) == 0) //else frame is skipped |
631 | { |
632 | return LockSurface(); |
633 | } |
634 | return NULL; |
635 | } |
636 | |
637 | /* |
638 | void CDsa::RunL() |
639 | { |
640 | iStateFlags &= ~EUpdating; |
641 | } |
642 | |
643 | |
644 | void CDsa::DoCancel() |
645 | { |
646 | iStateFlags &= ~EUpdating; |
647 | //nothing can do, just wait? |
648 | } |
649 | */ |
650 | |
651 | |
652 | TInt CDsa::AllocSurface(TBool aHwSurface, const TSize& aSize, TDisplayMode aMode) |
653 | { |
654 | if(aHwSurface && aMode != DisplayMode()) |
655 | return KErrArgument; |
656 | |
657 | iSourceMode = aMode; |
658 | |
659 | iSourceBpp = BytesPerPixel(aMode); |
660 | |
661 | const TSize size = WindowSize(); |
662 | if(aSize.iWidth > size.iWidth) |
663 | return KErrTooBig; |
664 | if(aSize.iHeight > size.iHeight) |
665 | return KErrTooBig; |
666 | |
667 | TRAPD(err, CreateSurfaceL()); |
668 | if(err != KErrNone) |
669 | return err; |
670 | |
671 | SetCopyFunction(); |
672 | |
673 | return KErrNone; |
674 | } |
675 | |
676 | |
677 | void CDsa::CreateZoomerL(const TSize& aSize) |
678 | { |
679 | iSwSize = aSize; |
680 | iStateFlags |= EResizeRequest; |
681 | CreateSurfaceL(); |
682 | SetTargetRect(); |
683 | } |
684 | |
685 | |
686 | /* |
687 | void SaveBmp(const TDesC& aName, const TAny* aData, TInt aLength, const TSize& aSz, TDisplayMode aMode) |
688 | { |
689 | CFbsBitmap* s = new CFbsBitmap(); |
690 | s->Create(aSz, aMode); |
691 | s->LockHeap(); |
692 | TUint32* addr = s->DataAddress(); |
693 | Mem::Copy(addr, aData, aLength); |
694 | s->UnlockHeap(); |
695 | s->Save(aName); |
696 | s->Reset(); |
697 | delete s; |
698 | } |
699 | |
700 | void SaveBmp(const TDesC& aName, const TUint32* aData, const TSize& aSz) |
701 | { |
702 | CFbsBitmap* s = new CFbsBitmap(); |
703 | s->Create(aSz, EColor64K); |
704 | TBitmapUtil bmp(s); |
705 | bmp.Begin(TPoint(0, 0)); |
706 | for(TInt j = 0; j < aSz.iHeight; j++) |
707 | { |
708 | bmp.SetPos(TPoint(0, j)); |
709 | for(TInt i = 0; i < aSz.iWidth; i++) |
710 | { |
711 | bmp.SetPixel(*aData); |
712 | aData++; |
713 | bmp.IncXPos(); |
714 | } |
715 | } |
716 | bmp.End(); |
717 | s->Save(aName); |
718 | s->Reset(); |
719 | delete s; |
720 | } |
721 | |
722 | TBuf<16> FooName(TInt aFoo) |
723 | { |
724 | TBuf<16> b; |
725 | b.Format(_L("C:\\pic%d.mbm"), aFoo); |
726 | return b; |
727 | } |
728 | |
729 | void ClipCopy(TUint8* aTarget, const TUint8* aSource, const TRect& aRect, const TPoint& aTargetPos) |
730 | { |
731 | const TInt iSourceBpp = 1; |
732 | const TInt iTargetBpp = 4; |
733 | const TInt iScanLineWidth = 800; |
734 | |
735 | TUint8* target = aTarget; |
736 | const TUint8* source = aSource; |
737 | const TInt lineWidth = aRect.Width(); |
738 | source += iSourceBpp * (aRect.iTl.iY * lineWidth); |
739 | const TInt sourceStartOffset = iSourceBpp * aRect.iTl.iX; |
740 | source += sourceStartOffset; |
741 | target += iTargetBpp * ((aTargetPos.iY + aRect.iTl.iY ) * lineWidth); |
742 | const TInt targetStartOffset = iTargetBpp * (aRect.iTl.iX + aTargetPos.iX); |
743 | target += targetStartOffset; |
744 | TUint32* targetPtr = reinterpret_cast<TUint32*>(target); |
745 | const TInt targetWidth = iScanLineWidth >> 2; |
746 | const TInt height = aRect.Height(); |
747 | } |
748 | */ |
749 | /* |
750 | void CDsa::ClipCopy(TUint8* aTarget, |
751 | const TUint8* aSource, |
752 | const TRect& aUpdateRect, |
753 | const TRect& aSourceRect) const |
754 | { |
755 | //TUint8* target = aTarget; |
756 | const TUint32* source = (const TUint32*) aSource; |
757 | const TInt lineWidth = aSourceRect.Width(); |
758 | |
759 | source += (aUpdateRect.iTl.iY * lineWidth); |
760 | const TInt sourceStartOffset = aUpdateRect.iTl.iX; |
761 | source += sourceStartOffset; |
762 | |
763 | TUint32* targetPtr = reinterpret_cast<TUint32*>(aTarget); |
764 | |
765 | targetPtr += (aSourceRect.iTl.iY + aUpdateRect.iTl.iY ) * SwSize().iWidth; |
766 | const TInt targetStartOffset = (aUpdateRect.iTl.iX + aSourceRect.iTl.iX); |
767 | |
768 | targetPtr += targetStartOffset; |
769 | |
770 | // TUint32* targetPtr = reinterpret_cast<TUint32*>(target); |
771 | |
772 | const TInt targetWidth32 = SwSize().iWidth; |
773 | |
774 | const TInt height = aUpdateRect.Height(); |
775 | |
776 | const TInt lineMove = iStateFlags & EOrientation90 ? 1 : lineWidth; |
777 | const TInt copyLen = aUpdateRect.Width(); |
778 | |
779 | |
780 | if(iStateFlags & EOrientation180) |
781 | { |
782 | |
783 | targetPtr += targetWidth32 * (height - 1); |
784 | |
785 | for(TInt i = 0; i < height; i++) //source is always smaller |
786 | { |
787 | iCopyFunction(*this, targetPtr, (TUint8*)source, copyLen, height); |
788 | source += lineMove; |
789 | targetPtr -= targetWidth32; |
790 | } |
791 | } |
792 | else |
793 | { |
794 | |
795 | |
796 | for(TInt i = 0; i < height; i++) //source is always smaller |
797 | { |
798 | iCopyFunction(*this, targetPtr, (TUint8*)source, copyLen, height); |
799 | source += lineMove; |
800 | targetPtr += targetWidth32; // >> 2; |
801 | } |
802 | } |
803 | |
804 | } |
805 | |
806 | */ |
807 | |
808 | void CDsa::ClipCopy(TUint8* aTarget, const TUint8* aSource, const TRect& aRect, const TPoint& aTargetPos) const |
809 | { |
810 | TUint8* target = aTarget; |
811 | const TUint8* source = aSource; |
812 | const TInt lineWidth = aRect.Width(); |
813 | source += iSourceBpp * (aRect.iTl.iY * lineWidth); |
814 | TInt sourceStartOffset = iSourceBpp * aRect.iTl.iX; |
815 | source += sourceStartOffset; |
816 | target += iTargetBpp * ((aTargetPos.iY + aRect.iTl.iY ) * lineWidth); |
817 | TInt targetStartOffset = iTargetBpp * (aRect.iTl.iX + aTargetPos.iX); |
818 | target += targetStartOffset; |
819 | TUint32* targetPtr = reinterpret_cast<TUint32*>(target); |
820 | const TInt targetWidth = iScanLineWidth >> 2; |
821 | const TInt height = aRect.Height(); |
822 | |
823 | TInt lineMove = iStateFlags & EOrientation90 ? 1 : lineWidth; |
824 | |
825 | if(iStateFlags & EOrientation180) |
826 | { |
827 | |
828 | targetPtr += targetWidth * (height - 1); |
829 | |
830 | for(TInt i = 0; i < height; i++) //source is always smaller |
831 | { |
832 | iCopyFunction(*this, targetPtr, source, lineWidth, height); |
833 | source += lineMove; |
834 | targetPtr -= targetWidth; |
835 | } |
836 | } |
837 | else |
838 | { |
839 | |
840 | |
841 | for(TInt i = 0; i < height; i++) //source is always smaller |
842 | { |
843 | iCopyFunction(*this, targetPtr, source, lineWidth, height); |
844 | source += lineMove; |
845 | targetPtr += targetWidth; |
846 | } |
847 | } |
848 | |
849 | } |
850 | |
851 | |
852 | |
853 | /* |
854 | void CDsa::ClipCopy(TUint8* aTarget, |
855 | const TUint8* aSource, |
856 | const TRect& aUpdateRect, |
857 | const TRect& aSourceRect) const |
858 | { |
859 | const TDsa dsa(*this); |
860 | switch(iSourceBpp) |
861 | { |
862 | case 1: |
863 | ::ClipCopy<TUint32, TUint8>(dsa, aTarget, aSource, aUpdateRect, aSourceRect); |
864 | break; |
865 | case 2: |
866 | ::ClipCopy<TUint32, TUint16>(dsa, aTarget, aSource, aUpdateRect, aSourceRect); |
867 | break; |
868 | case 4: |
869 | ::ClipCopy<TUint32, TUint32>(dsa, aTarget, aSource, aUpdateRect, aSourceRect); |
870 | break; |
871 | } |
872 | } |
873 | |
874 | |
875 | */ |
876 | |
877 | |
878 | |
879 | void CDsa::Wipe() //dont call in drawing |
880 | { |
881 | if(IsDsaAvailable()) |
882 | Wipe(iTargetBpp * SwSize().iWidth * SwSize().iHeight); |
883 | } |
884 | |
885 | void CDsa::SetCopyFunction() |
886 | { |
887 | //calculate offset to correct function in iCFTable according to given parameters |
888 | TInt function = 0; |
889 | const TInt KCopyFunctions = 4; |
890 | const TInt KOffsetToNative = 0; |
891 | const TInt KOffsetTo256 = KOffsetToNative + KCopyFunctions; |
892 | const TInt KOffsetToOtherModes = KOffsetTo256 + KCopyFunctions; |
893 | const TInt KOffsetTo90Functions = 1; |
894 | const TInt KOffsetTo180Functions = 2; |
895 | |
896 | if(iSourceMode == DisplayMode()) |
897 | function = KOffsetToNative; //0 |
898 | else if(iSourceMode == EColor256) |
899 | function = KOffsetTo256; //4 |
900 | else |
901 | function = KOffsetToOtherModes; //8 |
902 | |
903 | if(iStateFlags & EOrientation90) |
904 | function += KOffsetTo90Functions; // + 1 |
905 | if(iStateFlags & EOrientation180) |
906 | function += KOffsetTo180Functions; //+ 2 |
907 | |
908 | iCopyFunction = iCFTable[function]; |
909 | |
910 | Wipe(); |
911 | } |
912 | |
913 | inline void Rotate(TRect& aRect) |
914 | { |
915 | const TInt dx = aRect.iBr.iX - aRect.iTl.iX; |
916 | const TInt dy = aRect.iBr.iY - aRect.iTl.iY; |
917 | |
918 | aRect.iBr.iX = aRect.iTl.iX + dy; |
919 | aRect.iBr.iY = aRect.iTl.iY + dx; |
920 | |
921 | const TInt tmp = aRect.iTl.iX; |
922 | aRect.iTl.iX = aRect.iTl.iY; |
923 | aRect.iTl.iY = tmp; |
924 | } |
925 | |
926 | /* |
927 | int bar = 0; |
928 | */ |
929 | /* |
930 | TBool CDsa::AddUpdateRect(const TUint8* aBits, const TRect& aUpdateRect, const TRect& aRect) |
931 | { |
932 | |
933 | if(iStateFlags & EOrientationChanged) |
934 | { |
935 | iStateFlags &= ~EOrientationFlags; |
936 | iStateFlags |= iNewFlags; |
937 | SetCopyFunction(); |
938 | iStateFlags &= ~EOrientationChanged; |
939 | EpocSdlEnv::WaitDeviceChange(); |
940 | return EFalse; //skip this frame as data is may be changed |
941 | } |
942 | |
943 | if(iTargetAddr == NULL) |
944 | { |
945 | iTargetAddr = LockHwSurface(); |
946 | } |
947 | |
948 | TUint8* target = iTargetAddr; |
949 | if(target == NULL) |
950 | return EFalse; |
951 | |
952 | |
953 | TRect targetRect = TRect(TPoint(0, 0), SwSize()); |
954 | |
955 | TRect sourceRect = aRect; |
956 | TRect updateRect = aUpdateRect; |
957 | |
958 | // TPoint move(0, 0); |
959 | |
960 | |
961 | if(iStateFlags & EOrientation90) |
962 | { |
963 | Rotate(sourceRect); |
964 | Rotate(updateRect); |
965 | } |
966 | |
967 | if(iSourceMode != DisplayMode() || targetRect != sourceRect || targetRect != updateRect || ((iStateFlags & EOrientationFlags) != 0)) |
968 | { |
969 | sourceRect.Intersection(targetRect); //so source always smaller or equal than target |
970 | //updateRect.Intersection(targetRect); |
971 | ClipCopy(target, aBits, updateRect, sourceRect); |
972 | } |
973 | else |
974 | { |
975 | const TInt byteCount = aRect.Width() * aRect.Height() * iSourceBpp; //this could be stored |
976 | Mem::Copy(target, aBits, byteCount); |
977 | } |
978 | |
979 | return ETrue; |
980 | } |
981 | */ |
982 | |
983 | TBool CDsa::AddUpdateRect(const TUint8* aBits, const TRect& aUpdateRect, const TRect& aRect) |
984 | { |
985 | |
986 | if(iStateFlags & EOrientationChanged) |
987 | { |
988 | iStateFlags &= ~EOrientationFlags; |
989 | iStateFlags |= iNewFlags; |
990 | SetCopyFunction(); |
991 | iStateFlags &= ~EOrientationChanged; |
992 | EpocSdlEnv::WaitDeviceChange(); |
993 | return EFalse; //skip this frame as data is may be changed |
994 | } |
995 | |
996 | if(iTargetAddr == NULL) |
997 | { |
998 | iTargetAddr = LockHwSurface(); |
999 | } |
1000 | TUint8* target = iTargetAddr; |
1001 | if(target == NULL) |
1002 | return EFalse; |
1003 | |
1004 | |
1005 | TRect targetRect = Rect(); |
1006 | TRect sourceRect = aRect; |
1007 | TRect updateRect = aUpdateRect; |
1008 | |
1009 | if(iStateFlags & EOrientation90) |
1010 | { |
1011 | Rotate(sourceRect); |
1012 | Rotate(updateRect); |
1013 | } |
1014 | |
1015 | if(iSourceMode != DisplayMode() || targetRect != sourceRect || targetRect != updateRect || ((iStateFlags & EOrientationFlags) != 0)) |
1016 | { |
1017 | sourceRect.Intersection(targetRect); //so source always smaller or equal than target |
1018 | updateRect.Intersection(targetRect); |
1019 | ClipCopy(target, aBits, updateRect, sourceRect.iTl); |
1020 | } |
1021 | else |
1022 | { |
1023 | const TInt byteCount = aRect.Width() * aRect.Height() * iSourceBpp; //this could be stored |
1024 | Mem::Copy(target, aBits, byteCount); |
1025 | } |
1026 | |
1027 | return ETrue; |
1028 | } |
1029 | void CDsa::UpdateSwSurface() |
1030 | { |
1031 | iTargetAddr = NULL; |
1032 | UnlockHwSurface(); //could be faster if does not use AO, but only check status before redraw, then no context switch needed |
1033 | } |
1034 | |
1035 | |
1036 | void CDsa::Resume() |
1037 | { |
1038 | if(Stopped()) |
1039 | Restart(RDirectScreenAccess::ETerminateRegion); |
1040 | } |
1041 | |
1042 | void CDsa::DoStop() |
1043 | { |
1044 | if(IsDsaAvailable()) |
1045 | iStateFlags |= ESdlThreadExplicitStop; |
1046 | Stop(); |
1047 | } |
1048 | |
1049 | void CDsa::Stop() |
1050 | { |
1051 | iStateFlags &= ~ERunning; |
1052 | // Cancel(); //can be called only from main! |
1053 | iDsa->Cancel(); |
1054 | } |
1055 | |
1056 | void CDsa::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/) |
1057 | { |
1058 | // iStateFlags |= EChangeNotify; |
1059 | Stop(); |
1060 | } |
1061 | |
1062 | void CDsa::Restart(RDirectScreenAccess::TTerminationReasons aReason) |
1063 | { |
1064 | if(aReason == RDirectScreenAccess::ETerminateRegion) //auto restart |
1065 | { |
1066 | TRAPD(err, RestartL()); |
1067 | PANIC_IF_ERROR(err); |
1068 | } |
1069 | } |
1070 | |
1071 | void CDsa::SetBlitter(MBlitter* aBlitter) |
1072 | { |
1073 | iBlitter = aBlitter; |
1074 | } |
1075 | |
1076 | |
1077 | TPoint CDsa::WindowCoordinates(const TPoint& aPoint) const |
1078 | { |
1079 | TPoint pos = aPoint - iScreenRect.iTl; |
1080 | const TSize asz = iScreenRect.Size(); |
1081 | if(iStateFlags & EOrientation180) |
1082 | { |
1083 | pos.iX = asz.iWidth - pos.iX; |
1084 | pos.iY = asz.iHeight - pos.iY; |
1085 | } |
1086 | if(iStateFlags & EOrientation90) |
1087 | { |
1088 | pos.iX = aPoint.iY; |
1089 | pos.iY = aPoint.iX; |
1090 | } |
1091 | pos.iX <<= 16; |
1092 | pos.iY <<= 16; |
1093 | pos.iX /= asz.iWidth; |
1094 | pos.iY /= asz.iHeight; |
1095 | pos.iX *= iSwSize.iWidth; |
1096 | pos.iY *= iSwSize.iHeight; |
1097 | pos.iX >>= 16; |
1098 | pos.iY >>= 16; |
1099 | return pos; |
1100 | } |
1101 | |
1102 | void CDsa::SetTargetRect() |
1103 | { |
1104 | iTargetRect = iScreenRect; |
1105 | if(iStateFlags & EResizeRequest && EpocSdlEnv::Flags(CSDL::EAllowImageResizeKeepRatio)) |
1106 | { |
1107 | const TSize asz = iScreenRect.Size(); |
1108 | const TSize sz = iSwSize; |
1109 | |
1110 | TRect rect; |
1111 | |
1112 | const TInt dh = (sz.iHeight << 16) / sz.iWidth; |
1113 | |
1114 | if((asz.iWidth * dh ) >> 16 <= asz.iHeight) |
1115 | { |
1116 | rect.SetRect(TPoint(0, 0), TSize(asz.iWidth, (asz.iWidth * dh) >> 16)); |
1117 | } |
1118 | else |
1119 | { |
1120 | const TInt dw = (sz.iWidth << 16) / sz.iHeight; |
1121 | rect.SetRect(TPoint(0, 0), TSize((asz.iHeight * dw) >> 16, asz.iHeight)); |
1122 | } |
1123 | rect.Move((asz.iWidth - rect.Size().iWidth) >> 1, (asz.iHeight - rect.Size().iHeight) >> 1); |
1124 | |
1125 | iTargetRect = rect; |
1126 | iTargetRect.Move(iScreenRect.iTl); |
1127 | |
1128 | } |
1129 | if(!(iStateFlags & EResizeRequest)) |
1130 | iSwSize = iScreenRect.Size(); |
1131 | // iScanLineWidth = /*iTargetBpp **/ SwSize().iWidth; |
1132 | } |
1133 | |
1134 | /*) |
1135 | TBool CDsa::ChangeTrigger() |
1136 | { |
1137 | const TBool change = iStateFlags & EChangeNotify; |
1138 | iStateFlags &= ~EChangeNotify; |
1139 | return change; |
1140 | } |
1141 | */ |
1142 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
1143 | |
1144 | void CDsa::Copy256(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) |
1145 | { |
1146 | TUint32* target = aTarget; |
1147 | const TUint32* endt = target + aBytes; |
1148 | const TUint8* source = aSource; |
1149 | while(target < endt) |
1150 | { |
1151 | *target++ = aDsa.iLut256[*source++]; |
1152 | } |
1153 | } |
1154 | |
1155 | void CDsa::Copy256Reversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) |
1156 | { |
1157 | const TUint32* target = aTarget; |
1158 | TUint32* endt = aTarget + aBytes; |
1159 | const TUint8* source = aSource; |
1160 | while(target < endt) |
1161 | { |
1162 | *(--endt) = aDsa.iLut256[*source++]; |
1163 | } |
1164 | } |
1165 | |
1166 | void CDsa::Copy256Flip(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) |
1167 | { |
1168 | TUint32* target = aTarget; |
1169 | const TUint32* endt = target + aBytes; |
1170 | const TUint8* column = aSource; |
1171 | |
1172 | while(target < endt) |
1173 | { |
1174 | *target++ = aDsa.iLut256[*column]; |
1175 | column += aLineLen; |
1176 | } |
1177 | } |
1178 | |
1179 | void CDsa::Copy256FlipReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) |
1180 | { |
1181 | const TUint32* target = aTarget; |
1182 | TUint32* endt = aTarget + aBytes; |
1183 | const TUint8* column = aSource; |
1184 | |
1185 | while(target < endt) |
1186 | { |
1187 | *(--endt) = aDsa.iLut256[*column]; |
1188 | column += aLineLen; |
1189 | } |
1190 | } |
1191 | |
1192 | void CDsa::CopyMem(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) |
1193 | { |
1194 | const TUint32* src = reinterpret_cast<const TUint32*>(aSource); |
1195 | Mem::Copy(aTarget, src, aBytes << 2); |
1196 | } |
1197 | |
1198 | void CDsa::CopyMemFlip(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) |
1199 | { |
1200 | TUint32* target = aTarget; |
1201 | const TUint32* endt = target + aBytes; |
1202 | const TUint32* column = reinterpret_cast<const TUint32*>(aSource); |
1203 | |
1204 | while(target < endt) |
1205 | { |
1206 | *target++ = *column; |
1207 | column += aLineLen; |
1208 | } |
1209 | } |
1210 | |
1211 | void CDsa::CopyMemReversed(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) |
1212 | { |
1213 | const TUint32* target = aTarget; |
1214 | TUint32* endt = aTarget + aBytes; |
1215 | const TUint32* source = reinterpret_cast<const TUint32*>(aSource); |
1216 | while(target < endt) |
1217 | { |
1218 | *(--endt) = *source++; |
1219 | } |
1220 | } |
1221 | |
1222 | |
1223 | void CDsa::CopyMemFlipReversed(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) |
1224 | { |
1225 | const TUint32* target = aTarget; |
1226 | TUint32* endt = aTarget + aBytes; |
1227 | const TUint32* column = reinterpret_cast<const TUint32*>(aSource); |
1228 | |
1229 | while(target < endt) |
1230 | { |
1231 | *(--endt) = *column; |
1232 | column += aLineLen; |
1233 | } |
1234 | } |
1235 | |
1236 | /* |
1237 | |
1238 | LOCAL_C TRgb rgb16MA(TInt aValue) |
1239 | { |
1240 | return TRgb::Color16MA(aValue); |
1241 | } |
1242 | */ |
1243 | NONSHARABLE_CLASS(MRgbCopy) |
1244 | { |
1245 | public: |
1246 | virtual void Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed) = 0; |
1247 | virtual void FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed) = 0; |
1248 | }; |
1249 | |
1250 | template <class T> |
1251 | NONSHARABLE_CLASS(TRgbCopy) : public MRgbCopy |
1252 | { |
1253 | public: |
1254 | TRgbCopy(TDisplayMode aMode); |
1255 | void* operator new(TUint aBytes, TAny* aMem); |
1256 | void Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed); |
1257 | void FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed); |
1258 | static TUint32 Gray256(const TUint8& aPixel); |
1259 | static TUint32 Color256(const TUint8& aPixel); |
1260 | static TUint32 Color4K(const TUint16& aPixel); |
1261 | static TUint32 Color64K(const TUint16& aPixel); |
1262 | static TUint32 Color16M(const TUint32& aPixel); |
1263 | static TUint32 Color16MU(const TUint32& aPixel); |
1264 | static TUint32 Color16MA(const TUint32& aPixel); |
1265 | private: |
1266 | typedef TUint32 (*TRgbFunc) (const T& aValue); |
1267 | TRgbFunc iFunc; |
1268 | }; |
1269 | |
1270 | |
1271 | template <class T> |
1272 | void* TRgbCopy<T>::operator new(TUint /*aBytes*/, TAny* aMem) |
1273 | { |
1274 | return aMem; |
1275 | } |
1276 | |
1277 | template <class T> |
1278 | TRgbCopy<T>::TRgbCopy(TDisplayMode aMode) |
1279 | { |
1280 | switch(aMode) |
1281 | { |
1282 | case EGray256 : iFunc = (TRgbFunc) Gray256; break; |
1283 | case EColor256 : iFunc = (TRgbFunc) Color256; break; |
1284 | case EColor4K : iFunc = (TRgbFunc) Color4K; break; |
1285 | case EColor64K : iFunc = (TRgbFunc) Color64K; break; |
1286 | case EColor16M : iFunc = (TRgbFunc) Color16M; break; |
1287 | case EColor16MU : iFunc = (TRgbFunc) Color16MU; break; |
1288 | case EColor16MA : iFunc = (TRgbFunc) Color16MA; break; |
1289 | default: |
1290 | PANIC(KErrNotSupported); |
1291 | } |
1292 | } |
1293 | |
1294 | template <class T> |
1295 | void TRgbCopy<T>::Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed) |
1296 | { |
1297 | const T* source = reinterpret_cast<const T*>(aSource); |
1298 | TUint32* target = aTarget; |
1299 | TUint32* endt = target + aBytes; |
1300 | |
1301 | if(aReversed) |
1302 | { |
1303 | while(target < endt) |
1304 | { |
1305 | const T value = *source++; |
1306 | *(--endt) = iFunc(value);//iFunc(value).Value(); |
1307 | } |
1308 | } |
1309 | else |
1310 | { |
1311 | while(target < endt) |
1312 | { |
1313 | const T value = *source++; |
1314 | *target++ = iFunc(value);//iFunc(value).Value(); |
1315 | } |
1316 | } |
1317 | } |
1318 | |
1319 | template <class T> |
1320 | void TRgbCopy<T>::FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed) |
1321 | { |
1322 | const T* column = reinterpret_cast<const T*>(aSource); |
1323 | TUint32* target = aTarget; |
1324 | TUint32* endt = target + aBytes; |
1325 | |
1326 | if(aReversed) |
1327 | { |
1328 | while(target < endt) |
1329 | { |
1330 | *(--endt) = iFunc(*column); |
1331 | column += aLineLen; |
1332 | } |
1333 | } |
1334 | else |
1335 | { |
1336 | while(target < endt) |
1337 | { |
1338 | *target++ = iFunc(*column); |
1339 | column += aLineLen; |
1340 | } |
1341 | } |
1342 | } |
1343 | |
1344 | template <class T> TUint32 TRgbCopy<T>::Gray256(const TUint8& aPixel) |
1345 | { |
1346 | const TUint32 px = aPixel << 16 | aPixel << 8 | aPixel; |
1347 | return px; |
1348 | } |
1349 | |
1350 | template <class T> TUint32 TRgbCopy<T>::Color256(const TUint8& aPixel) |
1351 | { |
1352 | return TRgb::Color256(aPixel).Value(); |
1353 | } |
1354 | |
1355 | template <class T> TUint32 TRgbCopy<T>::Color4K(const TUint16& aPixel) |
1356 | { |
1357 | TUint32 col = (aPixel & 0xF00) << 12; |
1358 | col |= (aPixel & 0xF00) << 8; |
1359 | |
1360 | col |= (aPixel & 0x0F0) << 8; |
1361 | col |= (aPixel & 0x0F0); |
1362 | |
1363 | col |= (aPixel & 0x00F) << 4; |
1364 | col |= (aPixel & 0x00F); |
1365 | |
1366 | return col; |
1367 | } |
1368 | |
1369 | template <class T> TUint32 TRgbCopy<T>::Color64K(const TUint16& aPixel) |
1370 | { |
1371 | TUint32 col = (aPixel & 0xF800)<< 8; |
1372 | col |= (aPixel & 0xE000) << 3; |
1373 | |
1374 | col |= (aPixel & 0x07E0) << 5; |
1375 | col |= (aPixel & 0xC0) >> 1; |
1376 | |
1377 | col |= (aPixel & 0x07E0) << 3; |
1378 | col |= (aPixel & 0x1C) >> 2; |
1379 | |
1380 | return col; |
1381 | } |
1382 | |
1383 | template <class T> TUint32 TRgbCopy<T>::Color16M(const TUint32& aPixel) |
1384 | { |
1385 | return TRgb::Color16M(aPixel).Value(); |
1386 | } |
1387 | |
1388 | template <class T> TUint32 TRgbCopy<T>::Color16MU(const TUint32& aPixel) |
1389 | { |
1390 | return TRgb::Color16MU(aPixel).Value(); |
1391 | } |
1392 | |
1393 | template <class T> TUint32 TRgbCopy<T>::Color16MA(const TUint32& aPixel) |
1394 | { |
1395 | return TRgb::Color16MA(aPixel).Value(); |
1396 | } |
1397 | |
1398 | typedef TUint64 TStackMem; |
1399 | |
1400 | LOCAL_C MRgbCopy* GetCopy(TAny* mem, TDisplayMode aMode) |
1401 | { |
1402 | if(aMode == EColor256 || aMode == EGray256) |
1403 | { |
1404 | return new (mem) TRgbCopy<TUint8>(aMode); |
1405 | } |
1406 | if(aMode == EColor4K || aMode == EColor64K) |
1407 | { |
1408 | return new (mem) TRgbCopy<TUint16>(aMode); |
1409 | } |
1410 | if(aMode == EColor16M || aMode == EColor16MU || aMode == EColor16MA) |
1411 | { |
1412 | return new (mem) TRgbCopy<TUint32>(aMode); |
1413 | } |
1414 | PANIC(KErrNotSupported); |
1415 | return NULL; |
1416 | } |
1417 | |
1418 | |
1419 | void CDsa::CopySlowFlipReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) |
1420 | { |
1421 | TStackMem mem = 0; |
1422 | GetCopy(&mem, aDsa.iSourceMode)->FlipCopy(aTarget, aSource, aBytes, aLineLen, ETrue); |
1423 | } |
1424 | |
1425 | void CDsa::CopySlowFlip(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) |
1426 | { |
1427 | TStackMem mem = 0; |
1428 | GetCopy(&mem, aDsa.iSourceMode)->FlipCopy(aTarget, aSource, aBytes, aLineLen, EFalse); |
1429 | } |
1430 | |
1431 | void CDsa::CopySlow(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) |
1432 | { |
1433 | TStackMem mem = 0; |
1434 | GetCopy(&mem, aDsa.iSourceMode)->Copy(aTarget, aSource, aBytes, EFalse); |
1435 | } |
1436 | |
1437 | void CDsa::CopySlowReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) |
1438 | { |
1439 | TStackMem mem = 0; |
1440 | GetCopy(&mem, aDsa.iSourceMode)->Copy(aTarget, aSource, aBytes, ETrue); |
1441 | } |
1442 | |
1443 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////7 |