⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsa_old.cpp

📁 SDL库 在进行视频显示程序spcaview安装时必须的库文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{			iCopyFunction(*this, targetPtr, source, lineWidth, height);			source += lineMove;			targetPtr -= targetWidth;			}		}	else		{						for(TInt i = 0; i < height; i++) //source is always smaller			{			iCopyFunction(*this, targetPtr, source, lineWidth, height);			source += lineMove;			targetPtr += targetWidth;			}		}	}		void CDsa::Wipe() //dont call in drawing	{	if(IsDsaAvailable())		Wipe(iTargetBpp * iScreenRect.Width() * iScreenRect.Height());	}	void CDsa::SetCopyFunction()	{	//calculate offset to correct function in iCFTable according to given parameters	TInt function = 0;	const TInt KCopyFunctions = 4;	const TInt KOffsetToNative = 0;	const TInt KOffsetTo256 = KOffsetToNative + KCopyFunctions;	const TInt KOffsetToOtherModes = KOffsetTo256 + KCopyFunctions;	const TInt KOffsetTo90Functions = 1;	const TInt KOffsetTo180Functions = 2;		if(iSourceMode == DisplayMode())		function = KOffsetToNative; 		//0	else if(iSourceMode == EColor256)		function = KOffsetTo256;			//4	else		function = KOffsetToOtherModes; 	//8		if(iStateFlags & EOrientation90)		function += KOffsetTo90Functions; 	// + 1	if(iStateFlags & EOrientation180)		function += KOffsetTo180Functions; 	//+ 2		iCopyFunction = iCFTable[function];		Wipe();	}	inline void Rotate(TRect& aRect)	{	const TInt dx = aRect.iBr.iX - aRect.iTl.iX;	const TInt dy = aRect.iBr.iY - aRect.iTl.iY;	aRect.iBr.iX = aRect.iTl.iX + dy;	aRect.iBr.iY = aRect.iTl.iY + dx;		const TInt tmp = aRect.iTl.iX;	aRect.iTl.iX = aRect.iTl.iY;	aRect.iTl.iY = tmp;	}	/*	int bar = 0;*/	TBool CDsa::AddUpdateRect(const TUint8* aBits, const TRect& aUpdateRect, const TRect& aRect)	{	if(iStateFlags & EOrientationChanged)		{		iStateFlags &= ~EOrientationFlags;		iStateFlags |= iNewFlags;		SetCopyFunction();		iStateFlags &= ~EOrientationChanged;	    EpocSdlEnv::WaitDeviceChange();	    return EFalse; //skip this frame as data is may be changed		}	if(iTargetAddr == NULL)		{		iTargetAddr = LockHwSurface();		}	TUint8* target = iTargetAddr;	if(target == NULL)		return EFalse;			TRect targetRect = HwRect();	TRect sourceRect = aRect;	TRect updateRect = aUpdateRect;		if(iStateFlags & EOrientation90)		{		Rotate(sourceRect);		Rotate(updateRect);		}			if(iSourceMode != DisplayMode() ||  targetRect != sourceRect || targetRect != updateRect || ((iStateFlags & EOrientationFlags) != 0))		{		sourceRect.Intersection(targetRect); //so source always smaller or equal than target		updateRect.Intersection(targetRect);		ClipCopy(target, aBits, updateRect, sourceRect);		}	else		{		const TInt byteCount = aRect.Width() * aRect.Height() * iSourceBpp; //this could be stored		Mem::Copy(target, aBits, byteCount);		}	return ETrue;	}	CDsa* CDsa::CreateL(RWsSession& aSession)	{	if(EpocSdlEnv::Flags(CSDL::EDrawModeDSB))		{		TInt flags = CDirectScreenBitmap::ENone;		if(EpocSdlEnv::Flags(CSDL::EDrawModeDSBDoubleBuffer))			flags |= CDirectScreenBitmap::EDoubleBuffer;		if(EpocSdlEnv::Flags(CSDL::EDrawModeDSBIncrentalUpdate))			flags |= CDirectScreenBitmap::EIncrementalUpdate;		return new (ELeave) CDsaB(aSession);		}    else        return new (ELeave) CDsaA(aSession);	} 	void CDsa::CreateZoomerL(const TSize& aSize)	{	iSwSize = aSize;	iStateFlags |= EResizeRequest;	CreateSurfaceL();	SetTargetRect();	}	TPoint CDsa::WindowCoordinates(const TPoint& aPoint) const		{	TPoint pos = aPoint - iScreenRect.iTl;	const TSize asz = iScreenRect.Size();	if(iStateFlags & EOrientation180)		{		pos.iX = asz.iWidth - pos.iX;		pos.iY = asz.iHeight - pos.iY;			}		if(iStateFlags & EOrientation90)		{		pos.iX = aPoint.iY;		pos.iY = aPoint.iX;			}	pos.iX <<= 16;	pos.iY <<= 16;	pos.iX /= asz.iWidth; 	pos.iY /= asz.iHeight;	pos.iX *= iSwSize.iWidth;	pos.iY *= iSwSize.iHeight;	pos.iX >>= 16;	pos.iY >>= 16;	return pos; 		}	void CDsa::SetTargetRect()	{	iTargetRect = iScreenRect;	if(iStateFlags & EResizeRequest && EpocSdlEnv::Flags(CSDL::EAllowImageResizeKeepRatio))		{		const TSize asz = iScreenRect.Size();		const TSize sz = iSwSize;				TRect rect;				const TInt dh = (sz.iHeight << 16) / sz.iWidth;		if((asz.iWidth * dh ) >> 16 <= asz.iHeight)			{			rect.SetRect(TPoint(0, 0), TSize(asz.iWidth, (asz.iWidth * dh) >> 16));			}		else			{			const TInt dw = (sz.iWidth << 16) / sz.iHeight;	    	rect.SetRect(TPoint(0, 0), TSize((asz.iHeight * dw) >> 16, asz.iHeight));			}		rect.Move((asz.iWidth - rect.Size().iWidth) >> 1, (asz.iHeight - rect.Size().iHeight) >> 1);  				iTargetRect = rect;		iTargetRect.Move(iScreenRect.iTl);		} 	if(!(iStateFlags & EResizeRequest))		iSwSize = iScreenRect.Size();//	iScanLineWidth = /*iTargetBpp **/ SwSize().iWidth;	}		void CDsa::RecreateL()	{	}void CDsa::Free()	{	}		void CDsa::UpdateSwSurface()	{	iTargetAddr = NULL;	UnlockHwSurface();	//could be faster if does not use AO, but only check status before redraw, then no context switch needed	}void CDsa::SetBlitter(MBlitter* aBlitter)	{	iBlitter = aBlitter;	}	void CDsa::DrawOverlays()	{	const TInt last = iOverlays.Count() - 1;	for(TInt i = last; i >= 0 ; i--)		iOverlays[i].iOverlay->Draw(*iDsa->Gc(), HwRect(), SwSize());	}TInt CDsa::AppendOverlay(MOverlay& aOverlay, TInt aPriority)	{	TInt i;	for(i = 0; i < iOverlays.Count() && iOverlays[i].iPriority < aPriority; i++)		{}	const TOverlay overlay = {&aOverlay, aPriority};	return iOverlays.Insert(overlay, i);	}	TInt CDsa::RemoveOverlay(MOverlay& aOverlay)	{	for(TInt i = 0; i < iOverlays.Count(); i++)		{		if(iOverlays[i].iOverlay == &aOverlay)			{			iOverlays.Remove(i);			return KErrNone;			}		}	return KErrNotFound;	}		TInt CDsa::RedrawRequest()	{	if(!(iStateFlags & (EUpdating) && (iStateFlags & ERunning)))		{		return ExternalUpdate();		}	return KErrNotReady;	}void CDsa::Resume()		{	if(Stopped())		Restart(RDirectScreenAccess::ETerminateRegion);	}	void CDsa::DoStop()	{	if(IsDsaAvailable())		iStateFlags |= ESdlThreadExplicitStop;	Stop();	}	void CDsa::Stop()	{	iStateFlags &= ~ERunning;//	Cancel(); //can be called only from main!	iDsa->Cancel();	}	void CDsa::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/)	{//	iStateFlags |= EChangeNotify;	Stop();	}	void CDsa::Restart(RDirectScreenAccess::TTerminationReasons aReason)	{	if(aReason == RDirectScreenAccess::ETerminateRegion) //auto restart		{														TRAPD(err, RestartL());		PANIC_IF_ERROR(err);		}	}/*)TBool CDsa::ChangeTrigger()	{	const TBool change = iStateFlags & EChangeNotify;	iStateFlags &= ~EChangeNotify;	return change;	}*/	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CDsa::Copy256(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)	{	TUint32* target = aTarget;	const TUint32* endt = target + aBytes; 	const TUint8* source = aSource;	while(target < endt)		{		*target++ = aDsa.iLut256[*source++]; 		}	}	void CDsa::Copy256Reversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)	{	const TUint32* target = aTarget;	TUint32* endt = aTarget + aBytes; 	const TUint8* source = aSource;	while(target < endt)		{		*(--endt) = aDsa.iLut256[*source++]; 		}	}		void CDsa::Copy256Flip(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)	{	TUint32* target = aTarget;	const TUint32* endt = target + aBytes; 	const TUint8* column = aSource;	while(target < endt)		{		*target++ = aDsa.iLut256[*column];		column += aLineLen;		}	}	void CDsa::Copy256FlipReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)	{	const TUint32* target = aTarget;	TUint32* endt = aTarget + aBytes; 	const TUint8* column = aSource;	while(target < endt)		{		*(--endt) = aDsa.iLut256[*column];		column += aLineLen;		}	}		void CDsa::CopyMem(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)	{	Mem::Copy(aTarget, aSource, aBytes);	}	void CDsa::CopyMemFlip(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)	{	TUint32* target = aTarget;	const TUint32* endt = target + aBytes; 	const TUint32* column = reinterpret_cast<const TUint32*>(aSource);	while(target < endt)		{		*target++ = *column;		column += aLineLen;		}	}	void CDsa::CopyMemReversed(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)	{	const TUint32* target = aTarget;	TUint32* endt = aTarget + aBytes; 	const TUint32* source = reinterpret_cast<const TUint32*>(aSource);	while(target < endt)		{		*(--endt) = *source++; 		}	}			void CDsa::CopyMemFlipReversed(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)	{	const TUint32* target = aTarget;	TUint32* endt = aTarget + aBytes; 	const TUint32* column = reinterpret_cast<const TUint32*>(aSource);	while(target < endt)		{		*(--endt) = *column;		column += aLineLen;		}	}			typedef TRgb (*TRgbFunc) (TInt aValue);LOCAL_C TRgb rgb16MA(TInt aValue)	{	return TRgb::Color16MA(aValue);	}	NONSHARABLE_CLASS(MRgbCopy)	{	public:	virtual void Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed) = 0;	virtual void FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed) = 0;	};template <class T>NONSHARABLE_CLASS(TRgbCopy) : public MRgbCopy	{	public:	TRgbCopy(TDisplayMode aMode);	void* operator new(TUint aBytes, TAny* aMem);	void Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed);	void FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed);	private:		TRgbFunc iFunc;	};		template <class T>		void* TRgbCopy<T>::operator new(TUint /*aBytes*/, TAny* aMem)	{	return aMem;	}		template <class T>TRgbCopy<T>::TRgbCopy(TDisplayMode aMode)	{	switch(aMode)	{	case EGray256 : iFunc = TRgb::Gray256; break;	case EColor256 : iFunc = TRgb::Color256; break;	case EColor4K : iFunc = TRgb::Color4K; break;	case EColor64K : iFunc = TRgb::Color64K; break;	case EColor16M : iFunc = TRgb::Color16M; break;	case EColor16MU : iFunc = TRgb::Color16MU; break;	case EColor16MA : iFunc = rgb16MA; break;	default:		PANIC(KErrNotSupported);	}	}	template <class T>void TRgbCopy<T>::Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed)	{	const T* source = reinterpret_cast<const T*>(aSource);	TUint32* target = aTarget;	TUint32* endt = target + aBytes;		if(aReversed)		{		while(target < endt)			{			TUint32 value = *source++;			*(--endt) = iFunc(value).Value();			}		}	else		{		while(target < endt)			{			TUint32 value = *source++;			*target++ = iFunc(value).Value();			}		}	}	template <class T>void TRgbCopy<T>::FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed)	{	const T* column = reinterpret_cast<const T*>(aSource);	TUint32* target = aTarget;	TUint32* endt = target + aBytes;		if(aReversed)		{		while(target < endt)			{			*(--endt) = iFunc(*column).Value();			column += aLineLen;			}		}	else		{		while(target < endt)			{			*target++ = iFunc(*column).Value();			column += aLineLen;			}		}	}		typedef TUint64 TStackMem;LOCAL_C MRgbCopy* GetCopy(TAny* mem, TDisplayMode aMode)	{	if(aMode == EColor256 || aMode == EGray256)		{		return new (mem) TRgbCopy<TUint8>(aMode);		}	if(aMode == EColor4K || aMode == EColor64K)		{		return new (mem) TRgbCopy<TUint16>(aMode);		}	if(aMode == EColor16M || aMode == EColor16MU || aMode == EColor16MA)		{		return new (mem) TRgbCopy<TUint32>(aMode);		}	PANIC(KErrNotSupported);	return NULL;	}	void CDsa::CopySlowFlipReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)	{	TStackMem mem = 0;	GetCopy(&mem, aDsa.iSourceMode)->FlipCopy(aTarget, aSource, aBytes, aLineLen, ETrue);		}	void CDsa::CopySlowFlip(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)	{	TStackMem mem = 0;	GetCopy(&mem, aDsa.iSourceMode)->FlipCopy(aTarget, aSource, aBytes, aLineLen, EFalse);	}	void CDsa::CopySlow(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)	{	TStackMem mem = 0;	GetCopy(&mem, aDsa.iSourceMode)->Copy(aTarget, aSource, aBytes, EFalse);		}	void CDsa::CopySlowReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)	{	TStackMem mem = 0;	GetCopy(&mem, aDsa.iSourceMode)->Copy(aTarget, aSource, aBytes, ETrue);		}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -