From: Jeff R. <jef...@us...> - 2005-11-19 03:13:36
|
Update of /cvsroot/svgdomcsharp/SharpVectorGraphics/src/SharpVectorRenderingEngine/SharpVectors/Renderer/Gdi In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12283/src/SharpVectorRenderingEngine/SharpVectors/Renderer/Gdi Modified Files: GdiRenderer.cs GraphicsNode.cs GraphicsWrapper.cs Log Message: Library wide changes for scripting support and automated re-rendering Index: GraphicsNode.cs =================================================================== RCS file: /cvsroot/svgdomcsharp/SharpVectorGraphics/src/SharpVectorRenderingEngine/SharpVectors/Renderer/Gdi/GraphicsNode.cs,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- GraphicsNode.cs 11 Sep 2005 18:26:09 -0000 1.40 +++ GraphicsNode.cs 19 Nov 2005 03:13:24 -0000 1.41 @@ -44,9 +44,9 @@ element is ISvgPatternElement) { // check overflow property - CssValue overflow = element.GetComputedCssValue("overflow", String.Empty) as CssValue; + CssValue overflow = ((SvgElement)element).GetComputedCssValue("overflow", String.Empty) as CssValue; // TODO: clip can have "rect(10 10 auto 10)" - CssPrimitiveValue clip = element.GetComputedCssValue("clip", String.Empty) as CssPrimitiveValue; + CssPrimitiveValue clip = ((SvgElement)element).GetComputedCssValue("clip", String.Empty) as CssPrimitiveValue; string sOverflow = null; @@ -112,13 +112,13 @@ if ( element is IGraphicsElement || element is IContainerElement) { - CssPrimitiveValue clipPath = element.GetComputedCssValue("clip-path", String.Empty) as CssPrimitiveValue; + CssPrimitiveValue clipPath = ((SvgElement)element).GetComputedCssValue("clip-path", String.Empty) as CssPrimitiveValue; if(clipPath != null && clipPath.PrimitiveType == CssPrimitiveType.Uri) { - string absoluteUri = element.ResolveUri(clipPath.GetStringValue()); + string absoluteUri = ((SvgElement)element).ResolveUri(clipPath.GetStringValue()); - SvgClipPathElement eClipPath = element.OwnerDocument.GetNodeByUri(absoluteUri) as SvgClipPathElement; + SvgClipPathElement eClipPath = ((SvgDocument)element.OwnerDocument).GetNodeByUri(absoluteUri) as SvgClipPathElement; if ( eClipPath != null ) { @@ -163,7 +163,7 @@ { Graphics graphics = gr.Graphics; - string colorRendering = element.GetComputedStringValue("color-rendering", String.Empty); + string colorRendering = ((SvgElement)element).GetComputedStringValue("color-rendering", String.Empty); switch(colorRendering) { case "optimizeSpeed": @@ -184,7 +184,7 @@ // Unfortunately the text rendering hints are not applied because the // text path is recorded and painted to the Graphics object as a path // not as text. - string textRendering = element.GetComputedStringValue("text-rendering", String.Empty); + string textRendering = ((SvgElement)element).GetComputedStringValue("text-rendering", String.Empty); switch(textRendering) { case "optimizeSpeed": @@ -208,7 +208,7 @@ } else { - string shapeRendering = element.GetComputedStringValue("shape-rendering", String.Empty); + string shapeRendering = ((SvgElement)element).GetComputedStringValue("shape-rendering", String.Empty); switch(shapeRendering) { case "optimizeSpeed": Index: GdiRenderer.cs =================================================================== RCS file: /cvsroot/svgdomcsharp/SharpVectorGraphics/src/SharpVectorRenderingEngine/SharpVectors/Renderer/Gdi/GdiRenderer.cs,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- GdiRenderer.cs 23 Oct 2005 23:39:29 -0000 1.38 +++ GdiRenderer.cs 19 Nov 2005 03:13:24 -0000 1.39 @@ -27,7 +27,7 @@ /// Renders a Svg image to GDI+ /// </summary> public class GdiRenderer - : ISvgRenderer + : ISvgRenderer, IDisposable { #region Private Fields @@ -89,7 +89,7 @@ /// <summary> /// The renderer's <see cref="SvgWindow">SvgWindow</see> object. /// </summary> - private SvgWindow window; + private ISvgWindow window; /// <summary> /// @@ -154,7 +154,7 @@ /// <value> /// The <see cref="Window">Window</see> of the renderer. /// </value> - public SvgWindow Window { + public ISvgWindow Window { get { return window; @@ -271,23 +271,24 @@ /// corresponds to the given <see cref="XmlElement">XmlElement</see>. /// </returns> public RenderingNode GetRenderingNode( - XmlElement node) + ISvgElement node) { - string name = node.NamespaceURI + ":" + node.LocalName; + SvgElement svgNode = (SvgElement)node; + string name = svgNode.NamespaceURI + ":" + svgNode.LocalName; RenderingNode result; if (nodeByTagName.ContainsKey(name)) { - object[] args = new object[] {(SvgElement)node}; + object[] args = new object[] {svgNode}; result = (RenderingNode) nodeByTagName.CreateInstance(name, args); } else if (node is ISharpGDIPath) { - result = new GDIPathGraphicsNode((SvgElement)node); + result = new GDIPathGraphicsNode(svgNode); } else { - result = new GraphicsNode((SvgElement)node); + result = new GraphicsNode(svgNode); } return result; @@ -325,7 +326,7 @@ // TODO: Handle xml:base here? // Right now just skip this... it can't be resolved, must assume it is absolute } - XmlElement elm = ((SvgDocument)Window.Document).GetNodeByUri(url) as XmlElement; + ISvgElement elm = ((SvgDocument)Window.Document).GetNodeByUri(url) as ISvgElement; if(elm != null) { @@ -353,6 +354,11 @@ if (rasterImage == null || rasterImage.Width != innerWidth || rasterImage.Height != innerHeight) { // Nope, so create one + if (rasterImage != null) + { + rasterImage.Dispose(); + rasterImage = null; + } rasterImage = new Bitmap(innerWidth, innerHeight); } @@ -373,16 +379,21 @@ invalidatedRasterImage.Height < invalidRect.Bottom) { // Nope, so create one + if (invalidatedRasterImage != null) + { + invalidatedRasterImage.Dispose(); + invalidatedRasterImage = null; + } invalidatedRasterImage = new Bitmap((int)invalidRect.Right, (int)invalidRect.Bottom); } // Make a GraphicsWrapper object from the regionRasterImage and clear it to the background color - graphics = GraphicsWrapper.FromImage(invalidatedRasterImage); + graphics = GraphicsWrapper.FromImage(invalidatedRasterImage, false); graphics.Clear(backColor); } else { // Make a GraphicsWrapper object from the rasterImage and clear it to the background color - graphics = GraphicsWrapper.FromImage(rasterImage); + graphics = GraphicsWrapper.FromImage(rasterImage, false); graphics.Clear(backColor); } } @@ -424,6 +435,8 @@ } else { + if (idMapRaster != null && idMapRaster != graphics.IdMapRaster) + idMapRaster.Dispose(); idMapRaster = graphics.IdMapRaster; } @@ -451,12 +464,19 @@ /// The bitmap on which the rendering was performed. /// </returns> public Bitmap Render( - SvgElement node) + ISvgElement node) { - RendererBeforeRender(); - node.Render(this); + RectangleF updatedRect; + if (invalidRect != RectangleF.Empty) + updatedRect = new RectangleF(invalidRect.X, invalidRect.Y, invalidRect.Width, invalidRect.Height); + else + updatedRect = RectangleF.Empty; + RendererBeforeRender(); + ((SvgElement)node).Render(this); RendererAfterRender(); - return rasterImage; + if (onRender != null) + OnRender(updatedRect); + return rasterImage; } /// <summary> @@ -470,11 +490,18 @@ /// The bitmap on which the rendering was performed. /// </returns> public Bitmap Render( - SvgDocument node) + ISvgDocument node) { - RendererBeforeRender(); - node.Render(this); + RectangleF updatedRect; + if (invalidRect != RectangleF.Empty) + updatedRect = new RectangleF(invalidRect.X, invalidRect.Y, invalidRect.Width, invalidRect.Height); + else + updatedRect = RectangleF.Empty; + RendererBeforeRender(); + ((SvgDocument)node).Render(this); RendererAfterRender(); + if (onRender != null) + OnRender(updatedRect); return rasterImage; } @@ -495,7 +522,20 @@ #endregion #region Event handlers - + private RenderEvent onRender; + public RenderEvent OnRender + { + get + { + return onRender; + } + set + { + onRender = value; + } + + } + /// <summary> /// Processes mouse events. /// </summary> @@ -518,7 +558,7 @@ GraphicsNode grNode = _getGraphicsNodeFromColor(pixel); if (grNode != null) { - SvgElement grElement = grNode.Element; + SvgElement grElement = (SvgElement)grNode.Element; IEventTarget target; if (grElement.ElementInstance != null) target = grElement.ElementInstance as IEventTarget; @@ -894,5 +934,22 @@ #endif #endregion - } + + #region IDisposable Members + + public void Dispose() + { + if (idMapRaster != null) + idMapRaster.Dispose(); + if (invalidatedRasterImage != null) + invalidatedRasterImage.Dispose(); + if (rasterImage != null) + rasterImage.Dispose(); + if (graphics != null) + graphics.Dispose(); + + } + + #endregion + } } Index: GraphicsWrapper.cs =================================================================== RCS file: /cvsroot/svgdomcsharp/SharpVectorGraphics/src/SharpVectorRenderingEngine/SharpVectors/Renderer/Gdi/GraphicsWrapper.cs,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GraphicsWrapper.cs 23 Dec 2004 17:39:16 -0000 1.4 +++ GraphicsWrapper.cs 19 Nov 2005 03:13:24 -0000 1.5 @@ -17,7 +17,7 @@ /// <summary> /// Wraps a Graphics object since it's sealed /// </summary> - public class GraphicsWrapper + public class GraphicsWrapper : IDisposable { #region Private Fields private bool _isStatic; @@ -27,8 +27,9 @@ #endregion #region Constructors - private GraphicsWrapper(Image image) + private GraphicsWrapper(Image image, bool isStatic) { + this._isStatic = isStatic; if(!IsStatic) { _idMapImage = new Bitmap(image.Width, image.Height); @@ -39,19 +40,40 @@ } _graphics = Graphics.FromImage(image); } + + private GraphicsWrapper(IntPtr hdc, bool isStatic) + { + this._isStatic = isStatic; + if(!IsStatic) + { + // This will get resized when the actual size is known + _idMapImage = new Bitmap(0, 0); + _idMapGraphics = Graphics.FromImage(_idMapImage); + _idMapGraphics.InterpolationMode = InterpolationMode.NearestNeighbor; + _idMapGraphics.SmoothingMode = SmoothingMode.None; + _idMapGraphics.CompositingQuality = CompositingQuality.Invalid; + } + _graphics = Graphics.FromHdc(hdc); + } #endregion - public static GraphicsWrapper FromImage(Image image) + public static GraphicsWrapper FromImage(Image image, bool isStatic) { - return new GraphicsWrapper(image); + return new GraphicsWrapper(image, isStatic); } + public static GraphicsWrapper FromHdc(IntPtr hdc, bool isStatic) + { + return new GraphicsWrapper(hdc, isStatic); + } + #region Properties public bool IsStatic { get{return _isStatic;} set{ _isStatic = value; + _idMapGraphics.Dispose(); _idMapGraphics = null; } } @@ -231,5 +253,4 @@ internal GraphicsContainer mainGraphicsContainer; } - } |