Red ochre Posted May 23, 2013 Posted May 23, 2013 'Bentley' - beta for 'Bezncurve' updateI am starting a thread to discuss possible improvements to the 'Bezncurve' plugin I recently published here: http://forums.getpaint.net/index.php?/topic/26457-bezncurve-6-control-points-new-21st-may-2013/To avoid confusion with the published version I have called this 'Bentley'.I have attached the VS CS file and the new .dll file (with grey construction lines as suggested by Midora).I would like to stress that I am new to Visual studio so there will be horrible mistakes in the code.All are welcome to change and 'play' with the code to suit their own needs (maybe adding more control points) - it is only setting the start/end control point of Bezier in the middle of the points either side (just the simplest way to ensure all 3 are in a straight line).Questions:1. Is it correct to dispose of the pens and graphics surface g, or is that automatically done when PDN stops using the effect?2. Is there an easy way to make the 'grayPen' construction lines dotted?3. Any other glaring mistakes?4. If anyone would like the challenge of creating a full size interactive U.I. I'm sure users would appreciate it and the example code would be invaluable. (I haven't got a clue about WPF, forms, eventargs etc. and would make a complete hash of it!). Bentley.zip BentleyC#code.zip Quote Red ochre Plugin pack.............. Diabolical Drawings ................Real Paintings
Rick Brewster Posted May 23, 2013 Posted May 23, 2013 (I haven't looked at the code so I'm responding in a general sense) 1. If you created the object then you should dispose it. This does not affect "correctness" but it is a good optimization. (Also, key word is "should" ... this isn't required) 1a. If you didn't create an object, and there's no clear indication that "ownership" has been transferred to you, then you should not dispose it. 1b. When in doubt, don't call Dispose() on objects you didn't create or that you've handed out to other components. Probably doesn't apply here. 2. If you want to make a Pen that draws with dashes, use the Pen.DashStyle property. You can also do further customization with other properties. http://msdn.microsoft.com/en-us/library/system.drawing.pen.dashstyle.aspx Quote The Paint.NET Blog: https://blog.getpaint.net/ Donations are always appreciated! https://www.getpaint.net/donate.html
Ego Eram Reputo Posted May 23, 2013 Posted May 23, 2013 I've always intended to create separate VS templates for a Windows Form UI vs IndirectUI. Unfortunately, I'm a great procrastinator and always find something else to do. Would you like to collaborate on a Bentley port? You would get to figure out some Forms stuff, and I'll get a kick into starting the Forms template. The "Mercedes Benz" port Quote ebook: Mastering Paint.NET | resources: Plugin Index | Stereogram Tut | proud supporter of Codelab plugins: EER's Plugin Pack | Planetoid | StickMan | WhichSymbol+ | Dr Scott's Markup Renderer | CSV Filetype | dwarf horde plugins: Plugin Browser | ShapeMaker
midora Posted May 23, 2013 Posted May 23, 2013 (edited) If you are creating temporary object like pens of file handles you may use the 'using' directive using (var pen = (Pen)Pens.Red.Clone()) { ... } because its scope controls the lifetime of these objects. Means they are disposed at the end of the block. Nice to see the construction lines. But now there are too many ;-) The tangents are the important ones because they are defining the black control points. In a typical UI you would activate a black control point which then shows the tangent of this point including the two end points of the tangent. Rick stalked in his blog about the new shape tool. There ou can see a curve shape. But I do not expect that 4.0 allows to control the amount of control points and tangents. One additional remark: I would allow to control the points on the curve and just one end of the tangents. This way the user already knows that half of the points are on the curve (see attachment). And you avoid the difference between the open and the closed curve. Moving one control point of the line should move the associated control point by the same amount. Moving the associated point relativ to it curve point changes curvature and flatness. Edited May 23, 2013 by midora Quote
null54 Posted May 23, 2013 Posted May 23, 2013 Converted it to a Visual Studio 2010 solution for you. BentleySrc.zip The Pens have been moved into the effect class and are disposed when the effect closes, and the surface copying has been moved to OnSetRenderInfo so it can be done all at once. Also the Graphics object now uses the built-in DstArgs field that Paint.NET disposes, along with some minor cleanup / renaming of the generated CodeLab code. Quote Plugin Pack | PSFilterPdn | Content Aware Fill | G'MIC | Paint Shop Pro Filetype | RAW Filetype | WebP Filetype The small increase in performance you get coding in C++ over C# is hardly enough to offset the headache of coding in the C++ language. ~BoltBait
midora Posted May 23, 2013 Posted May 23, 2013 the surface copying has been moved to OnSetRenderInfo so it can be done all at once. This raises a general question, which may be of interest for the developers. What's the proposed method to copy the source: - doing one call in OnSetRenderInfo() to copy the whole surface - doing dst.CopySurface(src, renderRect.Location, renderRect); in OnRender() for each rectangle in the list. The first one may be a little bit faster on a single core but the second one on multi core plus it is faster to abort (I guess Paint.NET aborts current rendering if the UI forces a new FinishTokenUpdate()). Quote
midora Posted May 23, 2013 Posted May 23, 2013 (edited) One additional tip: Use a GraphicsPath for the closed curves to avoid the caps at the end of the line (you mentioned this issue in the description of the original plugin). using (GraphicsPath gp = new GraphicsPath()) { gp.StartFigure(); gp.AddBeziers(closedBezPoints); gp.CloseFigure(); g.DrawPath(priPen, gp); } Edited May 23, 2013 by midora Quote
Red ochre Posted May 23, 2013 Author Posted May 23, 2013 Rick - Many thanks for the general advice as to when and what to dispose. I will experiment with the Pen.DashStyle properties too.EER - Re Templates - If I can help in anyway, I will.Midora - I like the 'using' block idea to ensure things are correctly disposed and may try using it in future. I'm afraid you lost me a bit regarding the control points and tangents. As I understand, the black control points could be anywhere along the line between the control points on either side but I opted to put them halfway purely for simplicity and to reduce the number of controls required on the U.I. I also like the idea of the 'GraphicsPath', and many thanks for the example code.Null54 - Thank you! - I have only just had a chance to download this and have a quick look through the changes. The comments seem to answer most of my questions. I used your 'clipwarp' VS files as a template for both this and 'BevelObject' (without the extra surfaces), so having this example in the same 'style' of layout should make things more understandable.Thank you all again. Quote Red ochre Plugin pack.............. Diabolical Drawings ................Real Paintings
Red ochre Posted May 26, 2013 Author Posted May 26, 2013 I have built the version of 'Bentley' from the source files very kindly provided by Null54.The problem is that when running the effect it works as intended until I try to render (by clicking on the OK button).It doesn't render anything and I can't work out why?Null54 - did the compiled .dll do this on your system or have I changed something or set it up incorrectly?(I didn't notice on the first few test of the .dll as it looked o.k. and I didn't render.)I have tried it both with and without the changes I have made - both behave the same way.I added an 'else if' to get the antialiasing to turn off and used Midora's graphics path code for the closed Bezier.These work well until I try to render.I am, of course, still very grateful for the work you have put in.Perhaps something is being disposed of before the dst surface is rendered?Bentley.zipI also included Midora's graphic path idea in my source code for Bezncurve - I had to use 'pdnGraphicsPath' as intellisense wouldn't recognize 'GraphicsPath' in this version. I have disposed of the pens but not the PdnGraphicsPath or 'g' - thinking that will be handled by PDN itself - is that correct?I thought the 'g.Clip = new Region(rect);' would mean GDI+ is effectively being used single threadedly?This works as expected and renders normally.Bezncurve.zip The 'bug' I referred to when I originally published Bezncurve may be the correct behaviour - it just looks wrong as it so different depending on line width. It happens when the control points are very close together and using a very large line width. Example: The other'bug' where the closed Bezier didn't close properly is fixed by Midora's suggestion of using a graphics path. Thanks again Quote Red ochre Plugin pack.............. Diabolical Drawings ................Real Paintings
midora Posted May 26, 2013 Posted May 26, 2013 I have built the version of 'Bentley' from the source files very kindly provided by Null54. The problem is that when running the effect it works as intended until I try to render (by clicking on the OK button). It doesn't render anything and I can't work out why? That's an interesting problem. OnRender() will be called the expected number of times after Ok but the length parameter is always zero which means that Render() will never be called. (I tested the Null54 original project). I had to use 'pdnGraphicsPath' as intellisense wouldn't recognize 'GraphicsPath' in this version. I have disposed of the pens but not the PdnGraphicsPath or 'g' - thinking that will be handled by PDN itself - is that correct? GraphicsPath should be there if you are adding "using "System.Drawing.Drawing2D". If you are creating a new object than you should dispose it. I thought the 'g.Clip = new Region(rect);' would mean GDI+ is effectively being used single threadedly? I guess you are mixing something here. Clip() just defines the area of output not the gdi problem that two threads may share the same object like a pen. BTW g.SetClip( rect) does the same, there is no need to create a new region. I never used GDI+ single threaded. But this means that each OnRender has to use its own set of objects. There are bugs and flaws in GDI+ but at the end it is easy to use. 1 Quote
null54 Posted May 26, 2013 Posted May 26, 2013 I have built the version of 'Bentley' from the source files very kindly provided by Null54. The problem is that when running the effect it works as intended until I try to render (by clicking on the OK button). It doesn't render anything and I can't work out why? It turns out that the source surface was being copied when Paint.NET skips rendering after the dialog closes. I have updated the code in my first post to fix this problem. 1 Quote Plugin Pack | PSFilterPdn | Content Aware Fill | G'MIC | Paint Shop Pro Filetype | RAW Filetype | WebP Filetype The small increase in performance you get coding in C++ over C# is hardly enough to offset the headache of coding in the C++ language. ~BoltBait
Red ochre Posted May 26, 2013 Author Posted May 26, 2013 Many, many thanks both of you - I will download the new version, Null54. I'm still a little unsure as to what to dispose (and what is handled by pdn) - however if I am using Null54's code, I can use the straight forward GraphicsPath and dispose of it in the OnDispose block along with the pens. - but not Graphics 'g'. Haven't looked at the new code yet, but many thanks in advance! Quote Red ochre Plugin pack.............. Diabolical Drawings ................Real Paintings
null54 Posted May 26, 2013 Posted May 26, 2013 Many, many thanks both of you - I will download the new version, Null54. I'm still a little unsure as to what to dispose (and what is handled by pdn) - however if I am using Null54's code, I can use the straight forward GraphicsPath and dispose of it in the OnDispose block along with the pens. - but not Graphics 'g'. Haven't looked at the new code yet, but many thanks in advance! The Graphics 'g' variable is an alias for DstArgs.Graphics which will be disposed by Paint.NET. Quote Plugin Pack | PSFilterPdn | Content Aware Fill | G'MIC | Paint Shop Pro Filetype | RAW Filetype | WebP Filetype The small increase in performance you get coding in C++ over C# is hardly enough to offset the headache of coding in the C++ language. ~BoltBait
Red ochre Posted May 30, 2013 Author Posted May 30, 2013 I have updated the 'Bezncurve' .dll in the publishing thread - it is very similar to the recent versions here.I was going to upload the full VS project file here but it seems to be too big?I intend to explore a custom U.I for this (hopefully working with EER) and will post any developements back here.Many thanks to all that have helped particularly Null54 and Midora - much appreciated. Quote Red ochre Plugin pack.............. Diabolical Drawings ................Real Paintings
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.