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; }
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); }