public static void ScaleGraphicsObject(PointF touchLocation, PointF prevTouchLocation, LayerInfo layerItem, CanvasControlPoint controlPoint, bool aspectRatioLocked, ContentPackItem.ItemSize itemSize = ContentPackItem.ItemSize.Small) { RectangleF boundingBox = layerItem.GetBoundingBox (); bool scaleUpOnly = boundingBox.Width < 10f || boundingBox.Height < 10f; float sx = 0; float sy = 0; PointF fixedPoint = PointF.Empty; switch (controlPoint) { case CanvasControlPoint.TopLeft: // Fixed point is bottom-right fixedPoint = new PointF (boundingBox.Right, boundingBox.Bottom); sx = boundingBox.Width / (boundingBox.Width + (touchLocation.X - prevTouchLocation.X)); sy = aspectRatioLocked ? sx : boundingBox.Height / (boundingBox.Height + (touchLocation.Y - prevTouchLocation.Y)); break; case CanvasControlPoint.TopRight: // Fixed point is bottom-left fixedPoint = new PointF (boundingBox.Left, boundingBox.Bottom); sx = boundingBox.Width / (boundingBox.Width - (touchLocation.X - prevTouchLocation.X)); sy = aspectRatioLocked ? sx : boundingBox.Height / (boundingBox.Height + (touchLocation.Y - prevTouchLocation.Y)); break; case CanvasControlPoint.BottomRight: // Fixed point is top-left fixedPoint = boundingBox.Location; sx = boundingBox.Width / (boundingBox.Width - (touchLocation.X - prevTouchLocation.X)); sy = aspectRatioLocked ? sx : boundingBox.Height / (boundingBox.Height - (touchLocation.Y - prevTouchLocation.Y)); break; case CanvasControlPoint.BottomLeft: // Fixed point is top-right fixedPoint = new PointF (boundingBox.Right, boundingBox.Top); sx = boundingBox.Width / (boundingBox.Width + (touchLocation.X - prevTouchLocation.X)); sy = aspectRatioLocked ? sx : boundingBox.Height / (boundingBox.Height - (touchLocation.Y - prevTouchLocation.Y)); break; }//end switch if (scaleUpOnly && sx < 1) { sx = 1; }//end if if (scaleUpOnly && sy < 1) { sy = 1; }//end if foreach (DrawingInfo eachDrawingInfo in layerItem.DrawingItems.Values) { if (eachDrawingInfo.DrawingType == DrawingLayerType.Drawing) { for (int i = 0; i < eachDrawingInfo.PathPoints.Count; i++) { PointF point = eachDrawingInfo.PathPoints [i]; point.X = sx * (point.X + (-fixedPoint.X)) + fixedPoint.X; point.Y = sy * (point.Y + (-fixedPoint.Y)) + fixedPoint.Y; eachDrawingInfo.PathPoints [i] = point; }//end for } else if (eachDrawingInfo.DrawingType == DrawingLayerType.Image || eachDrawingInfo.DrawingType == DrawingLayerType.Comix || eachDrawingInfo.DrawingType == DrawingLayerType.Stamp || eachDrawingInfo.DrawingType == DrawingLayerType.Callout) { RectangleF imgFrame = eachDrawingInfo.ImageFrame; imgFrame.Width *= sx; imgFrame.Height *= sy; switch (controlPoint) { case CanvasControlPoint.BottomLeft: imgFrame.X += touchLocation.X - prevTouchLocation.X; break; case CanvasControlPoint.BottomRight: //NOTE: Location is ok, when the only item in the layer is the image. break; case CanvasControlPoint.TopLeft: imgFrame.X += touchLocation.X - prevTouchLocation.X; imgFrame.Y += touchLocation.Y - prevTouchLocation.Y; break; case CanvasControlPoint.TopRight: imgFrame.Y += touchLocation.Y - prevTouchLocation.Y; break; }//end switch eachDrawingInfo.ImageFrame = imgFrame; eachDrawingInfo.RotatedImageBox = eachDrawingInfo.ImageFrame.Rotate (eachDrawingInfo.RotationAngle); if (eachDrawingInfo.DrawingType == DrawingLayerType.Callout) { eachDrawingInfo.CalloutTextRect = GetCalloutTextRect (eachDrawingInfo.ImageFrame, itemSize); }//end if }//end if else }//end foreach }
public static void RotateGraphicsObject(PointF touchLocation, LayerInfo layerItem, ref double prevRadAngle) { RectangleF boundingRect = layerItem.GetBoundingBox (); // PointF center = new PointF (boundingRect.GetMidX (), boundingRect.GetMidY ()); PointF center = boundingRect.GetCenterOfRect(); double deltaX = touchLocation.X - center.X; double deltaY = touchLocation.Y - center.Y; double radAngle = Math.Atan2 (deltaY, deltaX); double angleDiff = radAngle - prevRadAngle; float angleCos = (float)Math.Cos (angleDiff); float angleSin = (float)Math.Sin (angleDiff); foreach (DrawingInfo eachDrawingInfo in layerItem.DrawingItems.Values) { if (eachDrawingInfo.DrawingType == DrawingLayerType.Drawing) { for (int i = 0; i < eachDrawingInfo.PathPoints.Count; i++) { PointF point = eachDrawingInfo.PathPoints [i]; // Translate point float tx = point.X - center.X; float ty = point.Y - center.Y; // Rotate it float rx = (tx * angleCos) - (ty * angleSin); float ry = (ty * angleCos) + (tx * angleSin); // Translate back rx += center.X; ry += center.Y; point.X = rx; point.Y = ry; eachDrawingInfo.PathPoints [i] = point; }//end for } else if (eachDrawingInfo.DrawingType == DrawingLayerType.Image || eachDrawingInfo.DrawingType == DrawingLayerType.Comix || eachDrawingInfo.DrawingType == DrawingLayerType.Stamp || eachDrawingInfo.DrawingType == DrawingLayerType.Callout) { double degAngle = radAngle * RadToDeg; RectangleF imgFrame = eachDrawingInfo.ImageFrame; eachDrawingInfo.RotatedImageBox = imgFrame.Rotate (degAngle); }//end if else if eachDrawingInfo.RotationAngle = radAngle * RadToDeg; }//end foreach prevRadAngle = radAngle; }
public static void RotateGraphicsObjectByAngle(double degAngle, LayerInfo layerItem) { RectangleF boundingBox = layerItem.GetBoundingBox (); // PointF center = new PointF (boundingBox.GetMidX (), boundingBox.GetMidY ()); PointF center = boundingBox.GetCenterOfRect(); double radAngle = degAngle * DegToRad; float angleCos = (float)Math.Cos (radAngle); float angleSin = (float)Math.Sin (radAngle); foreach (DrawingInfo eachDrawingInfo in layerItem.DrawingItems.Values) { if (eachDrawingInfo.DrawingType == DrawingLayerType.Drawing) { for (int i = 0; i < eachDrawingInfo.PathPoints.Count; i++) { PointF point = eachDrawingInfo.PathPoints [i]; // Translate point float tx = point.X - center.X; float ty = point.Y - center.Y; // Rotate it float rx = (tx * angleCos) - (ty * angleSin); float ry = (ty * angleCos) + (tx * angleSin); // Translate back rx += center.X; ry += center.Y; point.X = rx; point.Y = ry; eachDrawingInfo.PathPoints [i] = point; }//end for } else if (eachDrawingInfo.DrawingType == DrawingLayerType.Image || eachDrawingInfo.DrawingType == DrawingLayerType.Comix || eachDrawingInfo.DrawingType == DrawingLayerType.Stamp) { RectangleF imgFrame = eachDrawingInfo.ImageFrame; eachDrawingInfo.RotatedImageBox = imgFrame.Rotate (degAngle); eachDrawingInfo.RotationAngle = degAngle; } else if (eachDrawingInfo.DrawingType == DrawingLayerType.Callout) { RectangleF imgFrame = eachDrawingInfo.ImageFrame; eachDrawingInfo.RotatedImageBox = imgFrame.Rotate (degAngle); eachDrawingInfo.RotationAngle = degAngle; }//end if else if }//end foreach }
public static AnimationTypesTransitionEffectType CreateTransitionEffect(LayerInfo guideLayer, TransitionInfo transitionItem) { AnimationTypesTransitionEffectType toReturn = AnimationTypesTransitionEffectType.None; RectangleF layerBox = guideLayer.GetBoundingBox (); RectangleF trBox = new RectangleF (transitionItem.EndLocation, transitionItem.EndSize); // Check for Move transition if (layerBox.Location != transitionItem.EndLocation) { toReturn = AnimationTypesTransitionEffectType.Move; }//end if // Check for Rotation transition double guideRotationAngle = guideLayer.DrawingItems.Select (s => s.Value.RotationAngle).Max (); if (guideRotationAngle != transitionItem.RotationAngle) { if (toReturn == AnimationTypesTransitionEffectType.None) { toReturn = AnimationTypesTransitionEffectType.Rotate; } else { toReturn |= AnimationTypesTransitionEffectType.Rotate; }//end if else }//end if // Check for Scale transition if (layerBox.Size != transitionItem.EndSize) { if (toReturn == AnimationTypesTransitionEffectType.None) { toReturn = AnimationTypesTransitionEffectType.Scale; } else { toReturn |= AnimationTypesTransitionEffectType.Scale; }//end if else }//end if return toReturn; }