Ejemplo n.º 1
0
		private DisCom.LayerInfo Intersect(Area stBase)  //v: Даёт размерность, ширину, высоту кропа и относительные координаты его лев верх угла от бэка и от фора и ширину кропа.
		{                                         //в целях оптимизации убраны все проверки, т.к. они уже были в FramesMerge...
			DisCom.LayerInfo cRetVal = new DisCom.LayerInfo();
			cRetVal.nShiftPosition = _nShiftPosition;
			cRetVal.bShiftVertical = _bShiftVertical;
			Area stCrop = _stArea.CropOnBase(stBase);
			cRetVal.nWidth = stArea.nWidth;
			cRetVal.nCropWidth = stCrop.nWidth;
			cRetVal.nCropHeight = stCrop.nHeight;
			cRetVal.nCropLeft = stCrop.nLeft - stBase.nLeft; //отступ кропа слева COL
			int nBGIndxStart = (stCrop.nTop - stBase.nTop) * stBase.nWidth + cRetVal.nCropLeft; //BGIndxStart=COT*BW+COL;
			//формула вычисления FI=BI+M*(FW-BW)-(FOT*FW+FOL); M=(int)(BI/BW);
			cRetVal.nWidthDiff = _stArea.nWidth - stBase.nWidth; //5/ константа 1 - (FW-BW) 
			cRetVal.nForegroundStart = (_stArea.nTop - stBase.nTop) * _stArea.nWidth + _stArea.nLeft - stBase.nLeft; //6/ константа 2 - (FOT*FW+FOL)
			cRetVal.nBackgroundStart = nBGIndxStart; //7/  начальный индекс по BG
			cRetVal.nBackgroundStop = nBGIndxStart + (stCrop.nHeight - 1) * stBase.nWidth + stCrop.nWidth - 1;//8/ конечный индекс по BG
			cRetVal.nCropRight = cRetVal.nCropLeft + stCrop.nWidth - 1; //10/ константа COL+CW-1
			cRetVal.nAlphaConstant = nAlphaConstant; //11/ константная альфа
            cRetVal.nAlphaType = (byte)eAlpha;
			cRetVal.nShiftTotal = _nShiftTotal;
			cRetVal.nTop = stArea.nTop;
			cRetVal.nLeft = stArea.nLeft;

			if (null != _cShiftOffset)
			{
				cRetVal.nOffsetLeft = _cShiftOffset.nLeft;
				cRetVal.nOffsetTop = _cShiftOffset.nTop & 1;


				if (stBase.nTop > _stArea.nTop && ((stBase.nTop - _stArea.nTop) & 1) == 1)
					cRetVal.nOffsetTop = ~cRetVal.nOffsetTop;
			}			



			return cRetVal;
		}
Ejemplo n.º 2
0
        private DisCom.LayerInfo Intersect(Area stBase)            //v: Даёт размерность, ширину, высоту кропа и относительные координаты его лев верх угла от бэка и от фора и ширину кропа.
        {                                                          //в целях оптимизации убраны все проверки, т.к. они уже были в FramesMerge...
            DisCom.LayerInfo cRetVal = new DisCom.LayerInfo();
            Area             stCrop  = _stArea.CropOnBase(stBase); // если кроп нулевой, то w == h == 0

            if (stCrop.nWidth == 0)                                //не пересеклись
            {
                cRetVal.nCropTopLineInBG    = -1;
                cRetVal.nCropBottomLineInBG = -1;
            }
            else
            {
                cRetVal.nWidth_4     = 4 * stArea.nWidth;
                cRetVal.nCropWidth_4 = 4 * stCrop.nWidth;
                int nCropLeft = stCrop.nLeft - stBase.nLeft;                                //отступ кропа слева COL
                cRetVal.nCropLeft_4 = 4 * nCropLeft;
                int nBGIndxStart = (stCrop.nTop - stBase.nTop) * stBase.nWidth + nCropLeft; //BGIndxStart=COT*BW+COL;   начальный индекс по бг
                //формула вычисления FI=BI+M*(FW-BW)-(FOT*FW+FOL); M=(int)(BI/BW);
                cRetVal.nAlphaConstant      = nAlphaConstant;                               //11/ константная альфа
                cRetVal.nAlphaType          = (byte)eAlpha;
                cRetVal.nTop                = stArea.nTop;
                cRetVal.nLeft_4             = 4 * stArea.nLeft;
                cRetVal.nCropTopLineInBG    = nBGIndxStart / stBase.nWidth;
                cRetVal.nCropBottomLineInBG = cRetVal.nCropTopLineInBG + stCrop.nHeight - 1;

                int   nFloorX = (int)Math.Floor(_stPosition.X);
                int   nFloorY = (int)Math.Floor(_stPosition.Y);
                float nShift  = _stPosition.X - nFloorX;                  // т.е. всегда теперь 0 <= S < 1
                if ((cRetVal.nShiftPositionByteX = (byte)Math.Abs(255 * nShift)) == 255)
                {
                    cRetVal.nShiftPositionByteX = 254;
                }
                nShift = _stPosition.Y - nFloorY;
                if ((cRetVal.nShiftPositionByteY = (byte)Math.Abs(255 * nShift)) == 255)
                {
                    cRetVal.nShiftPositionByteY = 254;
                }

                cRetVal.nShiftTotalX = _nShiftTotalX;
                if (0 < Math.Abs(_nShiftTotalX))                 // то делаем поля
                {
                    int nFloorHalfX = (int)Math.Floor(_stHalfPosition.X);
                    int nFloorHalfY = (int)Math.Floor(_stHalfPosition.Y);
                    nShift = _stHalfPosition.X - nFloorHalfX;
                    cRetVal.nHalfPathShiftPositionByteX = nShift == 0 ? (byte)0 : (byte)Math.Abs(255 * nShift);
                    nShift = _stHalfPosition.Y - nFloorHalfY;
                    cRetVal.nHalfPathShiftPositionByteY = nShift == 0 ? (byte)0 : (byte)Math.Abs(255 * nShift);                      // (для диагональных смещений с полями)
                    //   знак узнаем из nDeltaPxX_4
                    cRetVal.nHalfDeltaPxX_4 = (nFloorX - nFloorHalfX) * 4;
                    cRetVal.nHalfDeltaPxY_4 = (nFloorY - nFloorHalfY) * 4;

                    if (null != _cShiftOffset)
                    {
                        cRetVal.nOffsetTop = _cShiftOffset.nTop & 1;

                        if (stBase.nTop > _stArea.nTop && ((stBase.nTop - _stArea.nTop) & 1) == 1)
                        {
                            cRetVal.nOffsetTop = ~cRetVal.nOffsetTop;
                        }
                    }
                }
            }
            return(cRetVal);
        }