private static VObject CreateShapeVObject(PsdShapeFrame frame) { if (frame.Width == 0 || frame.Height == 0) { return(null); } var brush = frame.Brush as SolidBrush; var path = frame.VectorMask != null?Path.FromAdvancedPath(frame.VectorMask) : null; if (path != null) { path.Scale(72 / frame.DpiX, 72 / frame.DpiY); } var shapeVObject = new ShapeVObject { Path = path, Opacity = frame.Opacity, BorderColor = frame.Pen != null ? frame.Pen.Color : ColorManagement.GetBlackColor(frame.ColorSpace), BorderWidth = frame.Pen != null ? frame.Pen.Width : 0, FillColor = brush != null ? brush.Color : ColorManagement.GetTransparentColor(frame.ColorSpace) }; return(shapeVObject); }
internal Combiner GetImageCombiner(IImageParams destImageParams, ColorManagement colorManagement, float scale, IEnumerable <IDisposable> deps) { var pipeline = GetSvgPipeline(destImageParams, colorManagement, scale); pipeline.Add(new ScaleAlpha(Opacity)); if (!Angle.Equals(0)) { var rotate = new MatrixTransform { Matrix = Matrix.CreateRotate((float)Angle), InterpolationMode = InterpolationMode.High, BackgroundColor = ColorManagement.GetTransparentColor(destImageParams.PixelFormat) }; pipeline.Add(rotate); } var imageLocation = GetDrawingRectangle(destImageParams.DpiX * scale).Bounds.Location; var imageCombiner = new Combiner(CombineMode.AlphaOverlay, pipeline, true) { X = (int)imageLocation.X, Y = (int)imageLocation.Y }; return(imageCombiner); }
public virtual void Draw(Bitmap bitmap) { var vObject = this as IPipelineExtender; if (vObject != null && vObject.CanExtendPipeline) { var addAlpha = false; if (!bitmap.PixelFormat.HasAlpha) { bitmap.Channels.SetAlpha(1); addAlpha = true; } IEnumerable <IDisposable> deps; var pipeline = new Pipeline(bitmap); var scale = bitmap.DpiX / TargetDpi ?? 1; vObject.ExtendPipeline(pipeline, bitmap, GetColorManagement(), scale, out deps); using (var newBitmap = new Bitmap()) { pipeline.Add(newBitmap); pipeline.Run(); pipeline.Remove(bitmap); Pipeline.Run(newBitmap + bitmap); } if (addAlpha) { bitmap.Channels.RemoveAlpha(ColorManagement.GetTransparentColor(bitmap.PixelFormat)); } pipeline.DisposeAllElements(); if (deps != null) { foreach (var dep in deps) { dep.Dispose(); } } } else { using (var graphics = bitmap.GetAdvancedGraphics()) { Draw(graphics, bitmap, GetColorManagement()); } } }
internal Combiner GetImageCombiner(IImageParams destImageParams, ColorManagement colorManagement, float scale, IEnumerable <IDisposable> deps, ScaleAlpha alpha) { if (!Configuration.FileCache.FileExists(SourceFileId)) { return(null); } var imageStream = Configuration.FileCache.GetReadStream(SourceFileId, true); ((IList)deps).Add(imageStream); var reader = ImageReader.Create(imageStream); ((IList)deps).Add(reader); IImageParams firstElement; var psdReader = reader as PsdReader; if (psdReader != null) { firstElement = psdReader.MergedImageFrame; } else { firstElement = reader; } var pipeline = new Pipeline((PipelineElement)firstElement); var dpi = destImageParams.DpiX * scale; var imageRect = GetImageRectangle(dpi); if (firstElement.Width != imageRect.Width || firstElement.Height != imageRect.Height) { pipeline.Add(new Resize(imageRect.Width, imageRect.Height, _resizeInterpolationMode)); } if (alpha != null) { pipeline.Add(alpha); } // Convert color of image var colorConverter = ColorManagement.GetColorConverter(colorManagement, firstElement, destImageParams); if (colorConverter != null) { pipeline.Add(colorConverter); } if (!Angle.Equals(0)) { // Don't rotate bitmap without alpha channel. if (!firstElement.PixelFormat.HasAlpha) { // Add alpha channel if scaleAlpha or color conversion does not add it if (alpha == null && (colorConverter == null || !colorConverter.DestinationPixelFormat.HasAlpha)) { pipeline.Add(new SetAlpha(1)); } } var rotate = new MatrixTransform { Matrix = Matrix.CreateRotate((float)Angle), InterpolationMode = InterpolationMode.High, BackgroundColor = ColorManagement.GetTransparentColor(destImageParams.PixelFormat) }; pipeline.Add(rotate); } var imageLocation = GetDrawingRectangle(dpi).Bounds.Location; var imageCombiner = new Combiner(CombineMode.AlphaOverlay, pipeline, true) { X = (int)imageLocation.X, Y = (int)imageLocation.Y }; return(imageCombiner); }