Example #1
0
        MemBitmap GetTransformedBitmapNoInterpolation()
        {
            var destCB = new MemBitmap(_destBounds.Width, _destBounds.Height);

#if DEBUG
            destCB._dbugNote = "GetTransformedBitmapNoInterpolation()";
#endif
            var    destWriter = new MyBitmapBlender(destCB);
            PointF ptInPlane  = new PointF();

            int    x1, y1;
            double dab, dbc, dcd, dda;

            int    rectWidth  = _destBounds.Width;
            int    rectHeight = _destBounds.Height;
            Vector ab_vec     = _AB;
            Vector bc_vec     = _BC;
            Vector cd_vec     = _CD;
            Vector da_vec     = _DA;
            int    rectLeft   = _destBounds.Left;
            int    rectTop    = _destBounds.Top;



            unsafe
            {
                using (TempMemPtr.FromBmp(_srcBmp, out int *bufferPtr))
                {
                    BufferReader4 reader = new BufferReader4(bufferPtr, _srcBmp.Width, _srcBmp.Height);

                    for (int y = 0; y < rectHeight; ++y)
                    {
                        for (int x = 0; x < rectWidth; ++x)
                        {
                            PointF srcPt = new PointF(x, y);
                            srcPt.Offset(rectLeft, rectTop);
                            if (!IsOnPlaneABCD(srcPt))
                            {
                                continue;
                            }
                            x1 = (int)ptInPlane.X;
                            y1 = (int)ptInPlane.Y;

                            reader.SetStartPixel(x1, y1);
                            destWriter.SetPixel(x, y, reader.Read1());
                            //-------------------------------------
                            dab         = Math.Abs((MyVectorHelper.NewFromTwoPoints(_p0, srcPt)).CrossProduct(ab_vec));
                            dbc         = Math.Abs((MyVectorHelper.NewFromTwoPoints(_p1, srcPt)).CrossProduct(bc_vec));
                            dcd         = Math.Abs((MyVectorHelper.NewFromTwoPoints(_p2, srcPt)).CrossProduct(cd_vec));
                            dda         = Math.Abs((MyVectorHelper.NewFromTwoPoints(_p3, srcPt)).CrossProduct(da_vec));
                            ptInPlane.X = (float)(_srcW * (dda / (dda + dbc)));
                            ptInPlane.Y = (float)(_srcH * (dab / (dab + dcd)));
                        }
                    }
                    return(destCB);
                }
            }
        }