private void DrawImage(RectangleF rect, CGImage image, CGAffineTransform transform)
        {
            var trans = transform;

            // Do our translation on the image transform
            trans.Translate(rect.X, rect.Height - image.Height + rect.Y);

            // The translation is already taken care of in the transform
            rect.Y = 0;
            rect.X = 0;

            // Apply our transform to the context
            context.ConcatCTM(trans);

            // we are getting an error somewhere and not sure where
            // I think the image bitmapBlock is being corrupted somewhere
            try {
                context.DrawImage(rect.ToCGRect(), image);
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.Message);
            }

            // Now we revert our image transform from the context
            var revert = CGAffineTransform.CGAffineTransformInvert(trans);

            context.ConcatCTM(revert);
        }
Exemple #2
0
        private static PointF RotateCGPointAroundCenter(PointF point, PointF center, float angle)
        {
            CGAffineTransform translation = CGAffineTransform.MakeTranslation(center.X, center.Y);
            CGAffineTransform rotation    = CGAffineTransform.MakeRotation(angle);

            var inverted = CGAffineTransform.CGAffineTransformInvert(translation);

            CGAffineTransform transformGroup = inverted * rotation * translation;

            return(transformGroup.TransformPoint(point));
        }
Exemple #3
0
        /// <summary>
        /// Draws the specified Image at the specified location and with the specified shape and size.
        ///
        /// The destPoints parameter specifies three points of a parallelogram. The three PointF structures
        /// represent the upper-left, upper-right, and lower-left corners of the parallelogram. The fourth point
        /// is extrapolated from the first three to form a parallelogram.
        ///
        /// The image represented by the image object is scaled and sheared to fit the shape of the parallelogram
        /// specified by the destPoints parameter.
        /// </summary>
        /// <param name="image">Image.</param>
        /// <param name="destPoints">Destination points.</param>
        public void DrawImage(Image image, PointF [] destPoints)
        {
            if (image == null)
            {
                throw new ArgumentNullException("image");
            }
            if (destPoints == null)
            {
                throw new ArgumentNullException("destPoints");
            }
            if (destPoints.Length < 3)
            {
                throw new ArgumentException("Destination points must be an array with a length of 3 or 4. " +
                                            "A length of 3 defines a parallelogram with the upper-left, upper-right, " +
                                            "and lower-left corners. A length of 4 defines a quadrilateral with the " +
                                            "fourth element of the array specifying the lower-right coordinate.");
            }

            // Windows throws a Not Implemented error if the points are more than 3
            if (destPoints.Length > 3)
            {
                throw new NotImplementedException();
            }
            if (image.nativeMetafilePage != null)
            {
                throw new NotImplementedException();
            }

            // create our rectangle.  Offset is 0 because the CreateGeometricTransform bakes our x,y offset in there.
            var rect = new CGRect(0, 0, destPoints [1].X - destPoints [0].X, destPoints [2].Y - destPoints [0].Y);

            // We need to flip our Y axis so the image appears right side up
            var geoTransform = new CGAffineTransform(1, 0, 0, -1, 0, rect.Height);

            //var geott = GeomUtilities.CreateGeometricTransform (rect, destPoints);
            geoTransform.Multiply(GeomUtilities.CreateGeometricTransform(rect, destPoints));

            // Apply our transform to the context
            context.ConcatCTM(geoTransform);

            // now we draw our image.
            context.DrawImage(rect, image.NativeCGImage);

            // Now we revert our image transform from the context
            var revert = CGAffineTransform.CGAffineTransformInvert(geoTransform);

            context.ConcatCTM(revert);
        }
Exemple #4
0
        private static void DrawRadialGradient(CGRect rect, CGContext context, CGGradient gradient, int yOffset)
        {
            CGAffineTransform scaleT    = CGAffineTransform.MakeScale(1, 2f);
            CGAffineTransform invScaleT = CGAffineTransform.CGAffineTransformInvert(scaleT);
            //// Extract the Sx and Sy elements from the inverse matrix
            //// (See the Quartz documentation for the math behind the matrices)
            CGPoint invS = new CGPoint(invScaleT.xx, invScaleT.yy);

            //// Transform center and radius of gradient with the inverse
            CGPoint center = new CGPoint((rect.Size.Width * .5f) * invS.X, (rect.Size.Height + yOffset) * invS.Y);
            var     radius = (rect.Size.Width * .4f) * invS.X;

            context.ScaleCTM(scaleT.xx, scaleT.yy);
            context.DrawRadialGradient(gradient, center, 0, center, radius, CGGradientDrawingOptions.DrawsBeforeStartLocation);
            context.ScaleCTM(invScaleT.xx, invScaleT.yy);
        }
Exemple #5
0
        public static void AnimateHighlight(this UIImageView imgView, bool highlighted, float duration = 0.35f)
        {
            var expandTransform = CGAffineTransform.MakeScale(1.15f, 1.15f);
            var initDur         = duration * 0.25f;
            var lastDur         = duration * 0.75f;

            UIView.TransitionNotify(imgView, initDur, UIViewAnimationOptions.TransitionCrossDissolve,
                                    () =>
            {
                imgView.Highlighted = highlighted;
                imgView.Transform   = expandTransform;
            }, finished =>
            {
                UIView.AnimateNotify(lastDur, 0.0f, 0.4f, 0.2f, UIViewAnimationOptions.CurveEaseOut, () =>
                                     imgView.Transform = CGAffineTransform.CGAffineTransformInvert(expandTransform), null);
            });
        }
        /// <summary>
        /// Draws the specified portion of the specified Image at the specified location and with the specified size.
        ///
        /// The destPoints specifies a parallelogram with the first point specifying the upper left corner,
        /// second point specifying the upper right corner and the third point specifying the lower left corner.
        ///
        /// The srcRect parameter specifies a rectangular portion of the image object to draw. This portion is scaled
        /// up or down (in the case where source rectangle overruns the bounds of the image) to fit inside the rectangle
        /// specified by the destRect parameter.
        /// </summary>
        /// <param name="image">Image.</param>
        /// <param name="destPoints">Destination points.</param>
        /// <param name="srcRect">Source rect.</param>
        /// <param name="srcUnit">Source unit.</param>
        public void DrawImage(Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit)
        {
            if (image == null)
            {
                throw new ArgumentNullException("image");
            }
            if (destPoints == null)
            {
                throw new ArgumentNullException("destPoints");
            }

            if (destPoints.Length < 3)
            {
                throw new ArgumentException("Destination points must be an array with a length of 3 or 4. " +
                                            "A length of 3 defines a parallelogram with the upper-left, upper-right, " +
                                            "and lower-left corners. A length of 4 defines a quadrilateral with the " +
                                            "fourth element of the array specifying the lower-right coordinate.");
            }

            // Windows throws a Not Implemented error if the points are more than 3
            if (destPoints.Length > 3)
            {
                throw new NotImplementedException();
            }

            var srcRect1 = srcRect;

            // If the source units are not the same we need to convert them
            // The reason we check for Pixel here is that our graphics already has the Pixel's baked into the model view transform
            if (srcUnit != graphicsUnit && srcUnit != GraphicsUnit.Pixel)
            {
                ConversionHelpers.GraphicsUnitConversion(srcUnit, graphicsUnit, image.HorizontalResolution, image.VerticalResolution, ref srcRect1);
            }

            if (srcRect1.Location == Point.Empty && srcRect1.Size == image.Size)
            {
                DrawImage(image, destPoints);
                return;
            }
            if (image.NativeCGImage == null)
            {
                throw new NotImplementedException();
            }

            // Obtain the subImage
            var subImage = image.NativeCGImage.WithImageInRect(srcRect1.ToCGRect());

            // If we do not have anything to draw then we exit here
            if (subImage.Width == 0 || subImage.Height == 0)
            {
                return;
            }

            // create our rectangle.  Offset is 0 because the CreateGeometricTransform bakes our x,y offset in there.
            var rect = new RectangleF(0, 0, destPoints [1].X - destPoints [0].X, destPoints [2].Y - destPoints [0].Y);

            // We need to flip our Y axis so the image appears right side up
            var geoTransform = new CGAffineTransform(1, 0, 0, -1, 0, rect.Height);

            // Make sure we scale the image in case the source rectangle
            // overruns our subimage bounds (width and/or height)
            float scaleX = subImage.Width / srcRect1.Width;
            float scaleY = subImage.Height / srcRect1.Height;

            geoTransform.Scale(scaleX, scaleY);

            //var geott = GeomUtilities.CreateGeometricTransform (rect, destPoints);
            geoTransform.Multiply(GeomUtilities.CreateGeometricTransform(rect, destPoints));

            // Apply our transform to the context
            context.ConcatCTM(geoTransform);

            // now we draw our image.
            context.DrawImage(rect.ToCGRect(), subImage);

            // Now we revert our image transform from the context
            var revert = CGAffineTransform.CGAffineTransformInvert(geoTransform);

            context.ConcatCTM(revert);

            subImage.Dispose();
        }