private void AddBitmapToCanvas(TouchManipulationBitmap bitmap) { var rectImage = SkiaHelper.CalculateRectangle(rectInfo, outImageWidht, outImageHeight).rect; float scale = 0.25f; var rectSticker = new SKRect(rectImage.Left + rectImage.Width * scale, rectImage.Top + rectImage.Height * scale, rectImage.Right - rectImage.Width * scale, rectImage.Bottom - rectImage.Height * scale); var rect = SkiaHelper.CalculateRectangle(rectSticker, bitmap.Bitmap.Width, bitmap.Bitmap.Height); bitmap.Matrix = new SKMatrix(rect.scaleX, 0, rectInfo.MidX - rect.rect.Width / 2, 0, rect.scaleY, rectInfo.MidY - rect.rect.Height / 2, 0, 0, 1); bitmapCollection.Add(bitmap); }
protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { config = null; bitmapDictionary = null; inProgressPaths?.Clear(); inProgressPaths = null; TrashEnabled = null; TextBitmapClicked = null; } backgroundBitmap?.Dispose(); backgroundBitmap = null; mainBitmap?.Bitmap.Dispose(); if (mainBitmap != null) { mainBitmap.Bitmap = null; } backgroundBitmap = null; mainBitmap = null; foreach (var a in completedPaths) { a.Dispose(); } completedPaths?.Clear(); completedPaths = null; foreach (var a in bitmapCollection) { if (a.Type != BitmapType.Stickers) { a.Bitmap?.Dispose(); } a.Bitmap = null; } bitmapCollection = null; disposedValue = true; } }
private void SetMainBitmap(SKBitmap bitmap) { outImageWidht = config?.IsOutImageAutoSize ?? false ? bitmap?.Width ?? 1 : config?.OutImageWidht ?? 1; outImageHeight = config?.IsOutImageAutoSize ?? false ? bitmap?.Height ?? 1 : config?.OutImageHeight ?? 1; backgroundBitmap?.Dispose(); backgroundBitmap = config.BackgroundType == BackgroundType.StretchedImage ? SKBitmapBuilder.GetBlurBitmap(bitmap, new SKRect(0, 0, outImageWidht, outImageHeight)) : null; mainBitmap?.Bitmap?.Dispose(); if (mainBitmap == null) { mainBitmap = new TouchManipulationBitmap(bitmap, BitmapType.Main, null); } else { mainBitmap.Bitmap = bitmap; } SetMainBitmapMatrix(); }
private void OnTouchBitmapEffectAction(TouchActionEventArgs args, SKPoint point) { if (args.Type != TouchActionType.Moved) { TrashEnabled?.Invoke(false, false, false); } if (bitmapDictionary == null) { bitmapDictionary = new Dictionary <long, TouchManipulationBitmap>(); } if (bitmapCollection == null) { bitmapCollection = new List <TouchManipulationBitmap>(); } switch (args.Type) { case TouchActionType.Pressed: if (!bitmapDictionary.ContainsKey(args.Id)) { bool isFindBitmap = false; if (bitmapCollection?.Count > 0) { for (int i = bitmapCollection.Count - 1; i >= 0; i--) { TouchManipulationBitmap bitmap = bitmapCollection[i]; int testResult = bitmap.HitTest(point, rectInfo); if (testResult != -1) { if (Device.RuntimePlatform == Device.UWP) { bitmap.TouchManager.Mode = testResult == 4 ? TouchManipulationMode.ScaleRotate : TouchManipulationMode.ScaleDualRotate; } bitmap.TouchAction = TouchActionType.Pressed; bitmapCollection.Remove(bitmap); bitmapCollection.Add(bitmap); // Do the touch processing bitmapDictionary.Add(args.Id, bitmap); bitmap.ProcessTouchEvent(args.Id, args.Type, point); isFindBitmap = true; InvalidateSurface(); break; } } } if ((config?.CanTransformMainBitmap ?? false) && !isFindBitmap && mainBitmap.HitTest(point, rectInfo) != -1) { bitmapDictionary.Add(args.Id, mainBitmap); mainBitmap.ProcessTouchEvent(args.Id, args.Type, point); InvalidateSurface(); } } break; case TouchActionType.Moved: if (bitmapDictionary.ContainsKey(args.Id)) { TouchManipulationBitmap bitmap = bitmapDictionary[args.Id]; bitmap.TouchAction = TouchActionType.Moved; bitmap.ProcessTouchEvent(args.Id, args.Type, point); if (bitmap.Type != BitmapType.Main) { if (rectTrash.Contains(point)) { TrashEnabled?.Invoke(false, true, !rectTrash.Contains(previousTouchPoint)); } else { TrashEnabled?.Invoke(true, false, false); } } else { TrashEnabled?.Invoke(false, false, false); } InvalidateSurface(); } else { TrashEnabled?.Invoke(false, false, false); } break; case TouchActionType.Released: case TouchActionType.Cancelled: if (bitmapDictionary.ContainsKey(args.Id)) { TouchManipulationBitmap bitmap = bitmapDictionary[args.Id]; bitmap.ProcessTouchEvent(args.Id, args.Type, point); bitmapDictionary.Remove(args.Id); if (bitmap.TouchAction == TouchActionType.Pressed && bitmap.Type == BitmapType.Text) { bitmap.IsHide = true; TextBitmapClicked?.Invoke(bitmap); } bitmap.TouchAction = null; if (rectTrash.Contains(point)) { bitmapCollection.Remove(bitmap); } InvalidateSurface(); } break; } }