예제 #1
0
 public RenderImage(
     Image image              = null,
     float?width              = null,
     float?height             = null,
     float scale              = 1.0f,
     Color color              = null,
     BlendMode colorBlendMode = BlendMode.srcIn,
     BoxFit?fit = null,
     AlignmentGeometry alignment = null,
     ImageRepeat repeat          = ImageRepeat.noRepeat,
     Rect centerSlice            = null,
     bool matchTextDirection     = false,
     TextDirection?textDirection = null,
     bool invertColors           = false,
     FilterQuality filterQuality = FilterQuality.low
     )
 {
     D.assert(alignment != null);
     _image              = image;
     _width              = width;
     _height             = height;
     _scale              = scale;
     _color              = color;
     _colorBlendMode     = colorBlendMode;
     _fit                = fit;
     _repeat             = repeat;
     _centerSlice        = centerSlice;
     _alignment          = alignment ?? Alignment.center;
     _invertColors       = invertColors;
     _filterQuality      = filterQuality;
     _textDirection      = textDirection;
     _matchTextDirection = matchTextDirection;
     _updateColorFilter();
 }
예제 #2
0
 public static ImageFilter CreateImage(Image image, Rect src, Rect dst, FilterQuality filterQuality)
 {
     return(new ImageImageFilter()
     {
         Image = image,
         Src = src,
         Dst = dst,
         FilterQuality = filterQuality
     });
 }
예제 #3
0
        public static Image asset(
            string name,
            Key key                              = null,
            AssetBundle bundle                   = null,
            ImageFrameBuilder frameBuilder       = null,
            ImageErrorWidgetBuilder errorBuilder = null,
            float?scale                          = null,
            float?width                          = null,
            float?height                         = null,
            Color color                          = null,
            BlendMode colorBlendMode             = BlendMode.srcIn,
            BoxFit?fit                           = null,
            Alignment alignment                  = null,
            ImageRepeat repeat                   = ImageRepeat.noRepeat,
            Rect centerSlice                     = null,
            bool matchTextDirection              = false,
            bool gaplessPlayback                 = false,
            string package                       = null,
            FilterQuality filterQuality          = FilterQuality.low,
            int?cacheWidth                       = default,
            int?cacheHeight                      = null
            )
        {
            var _scale = scale ?? 1.0f;
            var _image = scale != null
                ? (AssetBundleImageProvider) new ExactAssetImage(assetName: name, bundle: bundle, scale: _scale)
                : new AssetImage(assetName: name, bundle: bundle);
            var _Image = ResizeImage.resizeIfNeeded(cacheWidth: cacheWidth, cacheHeight: cacheHeight, provider: _image);

            return(new Image(
                       key: key,
                       image: _Image,
                       frameBuilder: frameBuilder,
                       null,
                       errorBuilder: errorBuilder,
                       width: width,
                       height: height,
                       color: color,
                       colorBlendMode: colorBlendMode,
                       fit: fit,
                       alignment: alignment,
                       repeat: repeat,
                       centerSlice: centerSlice,
                       matchTextDirection: matchTextDirection,
                       gaplessPlayback: gaplessPlayback,
                       filterQuality: filterQuality
                       ));
        }
예제 #4
0
        public static Image network(
            string src,
            Key key     = null,
            float scale = 1.0f,
            ImageFrameBuilder frameBuilder       = null,
            ImageLoadingBuilder loadingBuilder   = null,
            ImageErrorWidgetBuilder errorBuilder = null,
            float?width              = null,
            float?height             = null,
            Color color              = null,
            BlendMode colorBlendMode = BlendMode.srcIn,
            BoxFit?fit = null,
            AlignmentGeometry alignment          = null,
            ImageRepeat repeat                   = ImageRepeat.noRepeat,
            Rect centerSlice                     = null,
            bool gaplessPlayback                 = false,
            bool matchTextDirection              = false,
            FilterQuality filterQuality          = FilterQuality.low,
            IDictionary <string, string> headers = null,
            int?cacheWidth  = null,
            int?cacheHeight = null
            )
        {
            var image = ResizeImage.resizeIfNeeded(cacheWidth: cacheWidth, cacheHeight: cacheHeight,
                                                   new NetworkImage(url: src, scale: scale, headers: headers));

            return(new Image(
                       key: key,
                       image: image,
                       frameBuilder: frameBuilder,
                       loadingBuilder: loadingBuilder,
                       errorBuilder: errorBuilder,
                       width: width,
                       height: height,
                       color: color,
                       colorBlendMode: colorBlendMode,
                       fit: fit,
                       alignment: alignment,
                       repeat: repeat,
                       centerSlice: centerSlice,
                       matchTextDirection: matchTextDirection,
                       gaplessPlayback: gaplessPlayback,
                       filterQuality: filterQuality
                       ));
        }
예제 #5
0
        public static AVMI.BitmapInterpolationMode ToBitmapInterpolationMode(this FilterQuality filterQuality)
        {
            switch (filterQuality)
            {
            default:
            case FilterQuality.None:
                return(AVMI.BitmapInterpolationMode.Default);

            case FilterQuality.Low:
                return(AVMI.BitmapInterpolationMode.LowQuality);

            case FilterQuality.Medium:
                return(AVMI.BitmapInterpolationMode.MediumQuality);

            case FilterQuality.High:
                return(AVMI.BitmapInterpolationMode.HighQuality);
            }
        }
예제 #6
0
        public static Image memory(
            byte[] bytes,
            Key key     = null,
            float scale = 1.0f,
            ImageFrameBuilder frameBuilder       = null,
            ImageErrorWidgetBuilder errorBuilder = null,
            float?width              = null,
            float?height             = null,
            Color color              = null,
            BlendMode colorBlendMode = BlendMode.srcIn,
            BoxFit?fit                  = null,
            Alignment alignment         = null,
            ImageRepeat repeat          = ImageRepeat.noRepeat,
            Rect centerSlice            = null,
            bool matchTextDirection     = false,
            bool gaplessPlayback        = false,
            FilterQuality filterQuality = FilterQuality.low,
            int?cacheWidth              = default,
            int?cacheHeight             = null
            )
        {
            // ResizeImage.resizeIfNeeded(cacheWidth, cacheHeight, MemoryImage(bytes, scale: scale));
            var memoryImage = new MemoryImage(bytes: bytes, scale: scale);

            return(new Image(
                       key: key,
                       ResizeImage.resizeIfNeeded(cacheWidth: cacheWidth, cacheHeight: cacheHeight,
                                                  new MemoryImage(bytes: bytes, scale: scale)),
                       frameBuilder: frameBuilder,
                       null,
                       errorBuilder: errorBuilder,
                       width: width,
                       height: height,
                       color: color,
                       colorBlendMode: colorBlendMode,
                       fit: fit,
                       alignment: alignment,
                       repeat: repeat,
                       centerSlice: centerSlice,
                       matchTextDirection: matchTextDirection,
                       gaplessPlayback: gaplessPlayback,
                       filterQuality: filterQuality
                       ));
        }
예제 #7
0
 public Paint()
 {
     Style         = PaintStyle.Fill;
     IsAntialias   = false;
     StrokeWidth   = 0;
     StrokeCap     = StrokeCap.Butt;
     StrokeJoin    = StrokeJoin.Miter;
     StrokeMiter   = 4;
     Typeface      = null;
     TextSize      = 12;
     TextAlign     = TextAlign.Left;
     LcdRenderText = false;
     SubpixelText  = false;
     TextEncoding  = TextEncoding.Utf8;
     Color         = new Color(0x00, 0x00, 0x00, 0xFF);
     Shader        = null;
     ColorFilter   = null;
     ImageFilter   = null;
     PathEffect    = null;
     BlendMode     = BlendMode.SrcOver;
     FilterQuality = FilterQuality.None;
 }
예제 #8
0
 public Image(
     Key key                              = null,
     ImageProvider image                  = null,
     ImageFrameBuilder frameBuilder       = null,
     ImageLoadingBuilder loadingBuilder   = null,
     ImageErrorWidgetBuilder errorBuilder = null,
     float?width                          = null,
     float?height                         = null,
     Color color                          = null,
     BlendMode colorBlendMode             = BlendMode.srcIn,
     BoxFit?fit                           = null,
     AlignmentGeometry alignment          = null,
     ImageRepeat repeat                   = ImageRepeat.noRepeat,
     Rect centerSlice                     = null,
     bool matchTextDirection              = false,
     bool gaplessPlayback                 = false,
     FilterQuality filterQuality          = FilterQuality.low
     ) : base(key: key)
 {
     D.assert(image != null);
     this.image              = image;
     this.frameBuilder       = frameBuilder;
     this.loadingBuilder     = loadingBuilder;
     this.errorBuilder       = errorBuilder;
     this.width              = width;
     this.height             = height;
     this.color              = color;
     this.colorBlendMode     = colorBlendMode;
     this.fit                = fit;
     this.alignment          = alignment ?? Alignment.center;
     this.repeat             = repeat;
     this.centerSlice        = centerSlice;
     this.gaplessPlayback    = gaplessPlayback;
     this.filterQuality      = filterQuality;
     this.matchTextDirection = matchTextDirection;
 }
예제 #9
0
        public static void paintImage(
            Canvas canvas               = null,
            Rect rect                   = null,
            Image image                 = null,
            float scale                 = 1.0f,
            ColorFilter colorFilter     = null,
            BoxFit?fit                  = null,
            Alignment alignment         = null,
            Rect centerSlice            = null,
            ImageRepeat repeat          = ImageRepeat.noRepeat,
            bool flipHorizontally       = false,
            bool invertColors           = false,
            FilterQuality filterQuality = FilterQuality.low
            )
        {
            D.assert(canvas != null);
            D.assert(rect != null);
            D.assert(image != null);
            alignment = alignment ?? Alignment.center;

            if (rect.isEmpty)
            {
                return;
            }

            Size   outputSize  = rect.size;
            Size   inputSize   = new Size(image.width, image.height);
            Offset sliceBorder = null;

            if (centerSlice != null)
            {
                sliceBorder = new Offset(
                    centerSlice.left + inputSize.width - centerSlice.right,
                    centerSlice.top + inputSize.height - centerSlice.bottom
                    );
                outputSize -= sliceBorder;
                inputSize  -= sliceBorder;
            }

            fit = fit ?? (centerSlice == null ? BoxFit.scaleDown : BoxFit.fill);
            D.assert(centerSlice == null || (fit != BoxFit.none && fit != BoxFit.cover),
                     () => $"centerSlice was used with a BoxFit {fit} that is not supported.");
            FittedSizes fittedSizes     = FittedSizes.applyBoxFit(fit.Value, inputSize / scale, outputSize);
            Size        sourceSize      = fittedSizes.source * scale;
            Size        destinationSize = fittedSizes.destination;

            if (centerSlice != null)
            {
                outputSize      += sliceBorder;
                destinationSize += sliceBorder;
                D.assert(sourceSize == inputSize,
                         () =>
                         $"centerSlice was used with a BoxFit {fit} that does not guarantee that the image is fully visible.");
            }

            if (repeat != ImageRepeat.noRepeat && destinationSize == outputSize)
            {
                repeat = ImageRepeat.noRepeat;
            }

            Paint paint = new Paint();

            if (colorFilter != null)
            {
                paint.colorFilter = colorFilter;
            }

            if (sourceSize != destinationSize)
            {
                paint.filterQuality = filterQuality;
            }

            paint.invertColors = invertColors;

            float  halfWidthDelta  = (outputSize.width - destinationSize.width) / 2.0f;
            float  halfHeightDelta = (outputSize.height - destinationSize.height) / 2.0f;
            float  dx = halfWidthDelta + (flipHorizontally ? -alignment.x : alignment.x) * halfWidthDelta;
            float  dy = halfHeightDelta + alignment.y * halfHeightDelta;
            Offset destinationPosition = rect.topLeft.translate(dx, dy);
            Rect   destinationRect     = destinationPosition & destinationSize;
            bool   needSave            = repeat != ImageRepeat.noRepeat || flipHorizontally;

            if (needSave)
            {
                canvas.save();
            }

            if (flipHorizontally)
            {
                float dxInside = -(rect.left + rect.width / 2.0f);
                canvas.translate(-dxInside, 0.0f);
                canvas.scale(-1.0f, 1.0f);
                canvas.translate(dxInside, 0.0f);
            }

            if (repeat != ImageRepeat.noRepeat)
            {
                canvas.clipRect(rect);
            }

            if (centerSlice == null)
            {
                Rect sourceRect = alignment.inscribe(
                    sourceSize, Offset.zero & inputSize
                    );
                if (repeat == ImageRepeat.noRepeat)
                {
                    canvas.drawImageRect(image, sourceRect, destinationRect, paint);
                }
                else
                {
                    foreach (Rect tileRect in _generateImageTileRects(rect, destinationRect, repeat))
                    {
                        canvas.drawImageRect(image, sourceRect, tileRect, paint);
                    }
                }
            }
            else
            {
                if (repeat == ImageRepeat.noRepeat)
                {
                    canvas.drawImageNine(image, centerSlice, destinationRect, paint);
                }
                else
                {
                    foreach (Rect tileRect in _generateImageTileRects(rect, destinationRect, repeat))
                    {
                        canvas.drawImageNine(image, centerSlice, tileRect, paint);
                    }
                }
            }

            if (needSave)
            {
                canvas.restore();
            }
        }
예제 #10
0
 /// <summary>
 /// Imposta i filtri per le textures
 /// </summary>
 /// <param name="quality"></param>
 /// <returns></returns>
 public bool SetFilterQuality(FilterQuality quality)
 {
     switch (quality)
     {
         case FilterQuality.None:
             device.SamplerState[0].MinFilter = TextureFilter.None;
             device.SamplerState[0].MagFilter = TextureFilter.None;
             return true;
         case FilterQuality.Point:
             device.SamplerState[0].MinFilter = TextureFilter.Point;
             device.SamplerState[0].MagFilter = TextureFilter.Point;
             return true;
         case FilterQuality.Linear:
             device.SamplerState[0].MinFilter = TextureFilter.Linear;
             device.SamplerState[0].MagFilter = TextureFilter.Linear;
             return true;
         case FilterQuality.Anisotropic:
             device.SamplerState[0].MinFilter = TextureFilter.Anisotropic;
             device.SamplerState[0].MagFilter = TextureFilter.Anisotropic;
             return true;
         case FilterQuality.PyramidalQuad:
             device.SamplerState[0].MinFilter = TextureFilter.PyramidalQuad;
             device.SamplerState[0].MagFilter = TextureFilter.PyramidalQuad;
             return true;
         case FilterQuality.GaussianQuad:
             device.SamplerState[0].MinFilter = TextureFilter.GaussianQuad;
             device.SamplerState[0].MagFilter = TextureFilter.GaussianQuad;
             return true;
         default:
             return false;
     }
 }