• Content count

  • Joined

  • Last visited

  • Days Won


MJW last won the day on March 1

MJW had the most liked content!

Community Reputation



About MJW

  • Rank
    2016 Plugin of the Year

Profile Information

  • Gender
  1. We very much appreciate you anyway, toe_head2001! I see the entries are now posted in full size, which I also appreciate. I do think it would probably still be a good idea to reduce the maximum entry size to 600x600 in future competitions. 800x800 is pretty large.
  2. Try toe_head2001's Quadrilateral Correction plugin. EDIT: I didn't see that toe_head2001 had already replied. I guess it was because it was on the next page.
  3. I notice that when the entries are posted for voting, they're posted at a reduced size. If they can't be posted at the 800x800 size allowed by the rules, I think the rules should be changed to the maximum size for the voted-on version. I don't see much point in allowing an entry size larger than the version that will be voted on. (I wouldn't have problem with the maximum size for entries being reduced to perhaps 600x600.)
  4. Use MadJik's Polar Transformation plugin with "transform rectangular to polar" selected. It will be under the Distort menu. It's kind of a finicky plugin: getting the exact result you're after may take a little experimentation with the scaling. I recommend using a square canvas, with the object to be transformed centered in the window. In order to get the half circle you want, make the object's length half the canvas width.
  5. Mejallen, you did an excellent job! "Heavenly" looking, without going over the top. The flare in place of the halo was a good choice. It conveys the same idea, but more subtly.
  6. What is the file format? Does the image actually have more than one layer? Load it into PDN and look at the Layer menu. (If the Layer menu isn't displayed, press the F7 key to display it.) If there are multiple layers, they will be shown by the Layer menu. If it shows only one layer, there is but one.
  7. I'm disappointed there were so few entries in the pocket watch OOTF contest. I thought it was a quite interesting subject. Maybe it required too many separate parts. I know I sort of felt like, "Well I finished that, now I've still got this, and this, and this to do."
  8. I notice several entries in the pocket watch competition have backgrounds. There are few enough entries as it is; we don't need to have any disqualified for not following the rules. I hope the entrants revise their entries. While I'm at it, get better soon Woodsy! I wish you could have submitted a pocket watch entry.
  9. In my opinion, the proportions are much better, but the legs are still too short. An idealized man is about eight heads high, and the waist is somewhere around three and a half heads down. Your version has the waist at the midpoint, which looks a bit low. There are lots of websites that provide information on artistic proportions, but probably the easiest way is to find a photo of an actual man, and use that as a guide.
  10. EDIT: Slightly modified the colors. EDIT 2: Modified (improved, I hope) colors again.
  11. Well done, Drew, lynxster4, and Pixey! Some very imaginative entries. Thanks to Pixey for hosting.
  12. Simmetric, I looked at the code, and now I see the problem. You don't override OnCreateConfigUI at all. I didn't know that could even be done, since I assumed it was the only way to assign the control labels. Apparently IndirectUI uses the property's name if no label is assigned. If I wrote the config code it would look like this: protected override ControlInfo OnCreateConfigUI(PropertyCollection props) { ControlInfo configUI = CreateDefaultConfigUI(props); configUI.SetPropertyControlValue("Text", ControlInfoPropertyNames.DisplayName, "Text"); configUI.SetPropertyControlValue("FontSize", ControlInfoPropertyNames.DisplayName, "Font Size"); configUI.SetPropertyControlValue("LetterSpacing", ControlInfoPropertyNames.DisplayName, "Letter Spacing"); configUI.SetPropertyControlValue("LetterSpacing", ControlInfoPropertyNames.SliderLargeChange, 0.25); configUI.SetPropertyControlValue("LetterSpacing", ControlInfoPropertyNames.SliderSmallChange, 0.05); configUI.SetPropertyControlValue("LetterSpacing", ControlInfoPropertyNames.UpDownIncrement, 0.01); configUI.SetPropertyControlValue("LetterSpacing", ControlInfoPropertyNames.DecimalPlaces, 2); configUI.SetPropertyControlValue("AntiAliasLevel", ControlInfoPropertyNames.DisplayName, "Antialias Level"); configUI.SetPropertyControlValue("FontFamily", ControlInfoPropertyNames.DisplayName, "Font Family"); PropertyControlInfo FamilyControl = configUI.FindControlForPropertyName("FontFamily"); FontFamily[] FontFamilies = new InstalledFontCollection().Families; foreach (FontFamily ff in FontFamilies) { FontFamilyControl.SetValueDisplayName(ff, ff.Name); } configUI.SetPropertyControlValue("Bold", ControlInfoPropertyNames.DisplayName, string.Empty); configUI.SetPropertyControlValue("Bold", ControlInfoPropertyNames.Description, "Bold"); configUI.SetPropertyControlValue("Italic", ControlInfoPropertyNames.DisplayName, string.Empty); configUI.SetPropertyControlValue("Italic", ControlInfoPropertyNames.Description, "Italic"); configUI.SetPropertyControlValue("Underline", ControlInfoPropertyNames.DisplayName, string.Empty); configUI.SetPropertyControlValue("Underline", ControlInfoPropertyNames.Description, "Underline"); configUI.SetPropertyControlValue("Strikeout", ControlInfoPropertyNames.DisplayName, string.Empty); configUI.SetPropertyControlValue("Strikeout", ControlInfoPropertyNames.Description, "Strikeout"); return configUI; } Notes: 1) I haven't tested it, so I there could be typos or other errors. 2) Most of the code was adapted from the code generated by CodeLab. I think that's how many of us learned what to do. 3) I don't understand how the font code I use relates to your version. My version is based on the CodeLab-generated code; beyond that, it's magic to me. (I've never written a plugin that uses a font selector, so I haven't given it much thought.) 4) Apparently the DisplayName code is often unnecessary if the property name is a string. (The property name can be any object. CodeLab uses an enum.) That would mean that the controls like IntSliders don't actually require any code in OnCreateConfigUI. 5) The checkbox configuration sets the DisplayName to an empty string and sets the Description to the label. This results in the control having the label on the same line as the checkbox rather than above it.
  13. Simmetric, the step sizes can be set at the time the controls are configured: configUI.SetPropertyControlValue(name, ControlInfoPropertyNames.SliderSmallChange, mySliderSmallChange); configUI.SetPropertyControlValue(name, ControlInfoPropertyNames.SliderLargeChange, mySliderLargeChange); configUI.SetPropertyControlValue(name, ControlInfoPropertyNames.UpDownIncrement, myUpDownIncrement); configUI.SetPropertyControlValue(name, ControlInfoPropertyNames.DecimalPlaces, myDecimalPlaces);
  14. I've thought about writing a plugin to do that, but haven't gotten around to it. I suggest such a plugin would have ranges for the hue, saturation, and value, and per-component control over how much the values should be concentrated around the center: from being spread equally through the range to being mostly near the original value. The hue range would, of course, have to handle the circular wrap-around. Perhaps there could be a choice of whether the changes are centered at the original value, or only change upward or downward (that might be overkill). The transparency should be preserved, or maybe it could also be randomly alterable. That, too, might be overkill, and would require care not to make an object pixel completely transparent. Each pixel in an object should, I think, have the same modifications, but the modifications should be relative to the pixel's initial color. That would preserve variations within the object. In essence, it would randomly apply the Hue/Saturation Adjustment to each object. There would probably need to be a buffer of flags for whether a particular pixel had been processed, since there's no easy for the fill routine to tell by the state of a pixel whether it had been modified, Maybe I'll try to write such a plugin. If anyone else is interested, they might benefit from my comments about and code from the Average Object Color plugin. Though the code I show is for CodeLab, Visual Studio would be a much better choice. The simplest, and perhaps best, choice is to do most everything in OnSetRenderInfo. The modified version could be created in auxiliary surface. The surface could be initialized to a transparent color (or colors), which would serve as flags for processed pixels (since no pixel within an object is transparent). The Render threads would simply copy the pixels to the dst buffer. A fancier choice is to have an integer buffer the same size as the canvas or selection. As a one-time operation, create numbered images for each object, along with a record for each object which would contain the amount of HSV modifications to apply. Then in OnSetRenderInfo, initialize the modification amounts, and in Render, apply them, using the object-number buffer to identify which object the pixel is in. This allows the fills to be done only once instead of each time a control changes. (In pathological situations, such as a checkerboard of transparent and nontransparent pixels, this could result in quite a large number of object records.) (Humility, plugins can't modify the behavior of the Paint Bucket or any other tool.)
  15. Thanks, toe_head2001! I played around with some VS extensions, but I'm not using any now. C# v.7 seems to have some interesting features. The idea of returning multiple values from methods as tuples is something that had occurred to me. In many situations it seems more elegant than rather arbitrarily making one a return value and the others "out" arguments. I'm somewhat surprised to see it actually implemented.