Skip to content
Commits on May 29, 2016
  1. Browse for folder: Vista+ users now get an IFileDialog instance

    The modern "browse for folder" dialog is WAAAAY better than the horrible
    old XP one.  Vista+ users now receive it by default.
    I hope this will fix #222, but I'll wait for @vhreal1302 to confirm.  (I
    couldn't reproduce that issue locally, alas.)
    Note that changing the temp file folder while in the midst of image
    editing could break things.  A fix for that particular issue is still
    TBD, but I've added an update so the user is at least given a warning to
    restart the program.
    committed May 28, 2016
  2. Fix non-destructive tool synchronization after Undo/Redo operations

    Fixes #225.  Thank you @vhreal1302 for catching and reporting.
    committed May 28, 2016
Commits on May 28, 2016
  1. Add 32-bpp CMYK support

    The FreeImage import function really needs some refactoring, but I'm
    going to wait to tackle that until I can also refactor the GDI+ load
    path (which has *not* been converted to the new color management engine
    That said, 32-bpp CMYK images are now handled through LittleCMS as well.
    This means PD supports the full set of CMYK test images from Apple's
    color management test suite - very cool!
    committed May 28, 2016
  2. Tools > Options: manually validate text-entry settings

    Fixes #223.  Thank you to @vhreal1302 for catching and reporting.
    committed May 28, 2016
  3. Fix a number of toolbox preference issues

    Fixes #219
    Fixes #220
    Fixes #221
    Thank you to @vhreal1302 for catching and reporting these bugs in the
    new toolbox manager.
    committed May 28, 2016
Commits on May 27, 2016
  1. Extend ICC profile support to many new image formats

    Grayscale and high bit-depth images now have full color management
    support, woohoo!  This nearly doubles our compatibility with Apple's ICC
    test coverage library
    Additionally, this handling is great for RAW photos with embedded
    profiles - instead of tone-mapping, we can use the embedded profile to
    generate a 24-bpp image.  This is faster, higher-quality, and it
    requires less work/knowledge on the part of the user.
    (Note that 16-bit CMYK images are also now handled correctly - sweet! -
    but 8-bit CMYK images are still to-do, as they have some special
    committed May 27, 2016
Commits on May 26, 2016
  1. Kill hidden pens, DCs for toolboxes and subpanels

    I completely forgot to do this during the last purge.  The results are
    encouraging: another 60 GDI objects shaved off a cold start.
    Nightly build GDI object count is now ~700 objects below the last stable
    release, and ~2100 objects below the nightly build peak (build 678, when
    I first realized something was horribly wrong).
    Some large-scale fixes (like custom tooltips) are still to-do, but I'm
    encouraged by the results from these little resource cuts.  They add up
    over time!
    committed May 26, 2016
  2. Fix focus issues when generating web-optimized PNG previews

    I hope this fixes #216.  Thank you to @vhreal1302 for catching and
    committed May 26, 2016
  3. Fix non-destructive edits breaking Alt+Tab icons on old OSes

    Fixes #218.  Thank you to @vhreal1302 for catching and reporting this.
    committed May 26, 2016
  4. Master UI support class: free some resources after rendering to screen

    This isn't a perfect system, as some controls render to their backbuffer
    out-of-order so we need to maintain a persistent DC, but for other
    controls, this technique appears to work well.
    I've also fixed some control properties that were contributing to
    unnecessary resource usage (DrawStyle, HasDC).
    Cold start GDI count is down by another ~78 objects as of this commit.
    committed May 26, 2016
  5. Convert various other UI elements to new "free DC" system

    This shaves another 37 GDI objects off a cold-start
    committed May 26, 2016
  6. pdButtonToolbox: free button icon DC between renders

    It's a tiny bit of code with no discernible impact on the user's
    experience, but it frees 42 GDI objects on a cold start.  Worth it, I
    Pending additional testing, I'd like to roll this out to some other
    controls as well.  (The central ucSupport class would be an especially
    good target, although it also has the greatest potential for
    accidentally breaking things...)
    committed May 26, 2016
  7. pdDIB: make preparations for arbitrarily freeing the associated DC

    My goal here is to make it easy for long-lived pdDIB objects (like those
    that hold UI icons) to free their DC when they're not being immediately
    rendered to screen.  Things like toolbox buttons may be used
    infrequently, so we only need to select their associated DIBs into DCs
    when the button needs to be redrawn.
    To ensure that this works without breaking anything, the class has been
    rewritten to use its own .GetDibDC function, which auto-creates a new DC
    as necessary.  (In most places, anyway; in places where we access the DC
    immediately after creating a blank DIB, there's no need for these
    If successful, this could decrease our running GDI object count by a
    meaningful amount.
    committed May 26, 2016
  8. Deprecate old Windows ICM color management functions

    Also, convert the few ICM functions I still need (like retrieving the
    user's current display ICM settings) to Unicode-compatible versions.
    committed May 26, 2016
  9. LittleCMS interface: convert to OOP design

    Profiles and Transforms are now managed by dedicated classes that
    self-free upon termination, so LCMS interactions should be largely
    This was also a necessary step for creating persistent profiles and
    transforms throughout PD.  (This will be crucial for high-performance
    display transformations, as LittleCMS - unlike the Windows ICM -
    optimizes transforms upon creation.  Also, the insanely stupid Windows
    ICM operates purely on file paths when activating DC color management;
    this new solution is going to perform much, much better.)
    committed May 26, 2016
Commits on May 25, 2016
  1. For RGB/A images, switch to LittleCMS for color management

    Good lord, this is SO much faster than the Windows CMS engine.  Huge
    JPEGs and PNGs particularly benefit from this switch (not to mention my
    coding sanity, which is improved by using a color management engine
    that's well-documented and functional!).
    At present, LittleCMS has only been activated for the import-time
    conversion of RGB/A images to the current working space.  Pending
    additional testing, I'll start rolling it out to more esoteric formats
    (e.g. CMYK), and hopefully, I can soon reactivate display color
    management as well.
    committed May 25, 2016
  2. Command bar: map spinner, slider reset to new .Reset function

    Individual dialogs can still override the command bar's Reset action
    with non-standard behavior, as desired, but in 99% of cases, we'll want
    to default to spinner and slider defaults.
    (With that in mind, please notify me if you see any command bar reset
    buttons that reset to different values than individual sliders/spinners
    on that dialog.  Those need to be unified.)
    committed May 25, 2016
  3. WebP, JPEG-XR dialogs: set the command bar reset option to use lossle…

    …ss encoding
    This better aligns the reset result with the default reset behavior of
    the associated quality slider.
    committed May 25, 2016
  4. Keyboard accelerators: use menu associations to determine enablement

    If a hotkey is associated with a menu (e.g. Ctrl+S and File > Save), the
    corresponding menu's .Enabled state will now be checked prior to firing
    the accelerator.
    Fixes #213.  Thank you to @vhreal1302 for catching and reporting.
    committed May 25, 2016
  5. FreeImage interface: fix details of PBM encoding

    FreeImage's ASCII export is broken for monochrome files, and for some
    reason it mistakenly inverts BINARY exports.  I have no idea why this
    happens, but it's easy enough to work around.
    committed May 25, 2016
  6. FreeImage interface: condense all PPM formats to PNM

    FreeImage has different internal formats IDs for every variation of
    portable bit/pix/gray/floatmap files.  These formats also vary by their
    ASCII/RAW encoding.
    These various formats are now condensed to PNM internally, which greatly
    simplifies export handling.  (Also, this fixes the problematic portion
    of #215.  Thank you to @vhreal1302 for catching and reporting.)
    committed May 25, 2016
  7. Fix interface not re-enabling after loading a deleted Recent File

    Thank you to @bgerasimoski for catching and reporting.
    committed May 25, 2016
  8. Spinner, Slider controls: set correct default values throughout the p…

    Lots of dialogs touched by this, obviously.  If you encounter any odd
    "default" values, please let me know so I can rectify them.
    While I was here, I cleaned up a number of other interface issues, like
    some old listboxes that hadn't been migrated to pdListBox.  I was also
    able to purge the old alpha cutoff dialog, since that is handled by the
    new format-specific export dialogs instead.
    committed May 24, 2016
Commits on May 24, 2016
  1. pdSpinner/pdSlider: fix default values for main window instances

    I hope I caught all relevant controls.  Sometimes, a default value is
    unclear (e.g. what's the default selection width/height?) and I haven't
    entirely decided what to do there.  I could suppress the reset button,
    but I dislike inconsistency... perhaps I'll just default to the current
    layer's width/height.
    Anyway, among other benefits, this reduces cold-start GDI objects by 18,
    and user objects by 9.
    committed May 24, 2016
  2. pdSpinner: tweak reset icon design

    Counter-clockwise arrows make more sense, IMO
    committed May 24, 2016
  3. pdSpinner: add reset button

    Well, this will be a huge and ugly project, but it needed to be done.
    The default values for a given control are not always intuitive.  For
    example, many controls default to 0 (e.g. angle), while others default
    to 100 (e.g. opacity), while still others default to some arbitrary
    value (e.g. many effects and adjustments have tool-specific defaults).
    PD's current sliders make this clear, by providing a visual "notch" in
    the UI where the default value is located, but previously, the only way
    to set the control to that default value was to either 1) manually drag
    it into place (on sliders with large ranges this can be extremely
    difficult), or 2) reset the entire dialog (also not ideal).
    Now, each spinner control (including those embedded in sliders) has its
    own dedicated reset button.  The control has also received a
    .DefaultValue property and a .Reset command, and these do exactly what
    you'd think.  (Similarly, those same properties have been extended to
    the slider control, as well.)
    As part of reducing PD's reliance on pre-generated icons, the new reset
    button is drawn dynamically, at run-time, using the new pd2d drawing
    classes.  This means there is no increase in user or GDI objects (as
    there would be when using a PNG).  High-DPI displays have not been
    tested yet, but they'll likely need some tweaking.
    The ugly part of this project is that each slider/spinner in the project
    needs to have its .DefaultValue double-checked for correctness.  I've
    used some tricks when instantiating the property to try and auto-set
    reasonably good values, but short of manual inspection, there's no way
    to guarantee correctness.  Also, some specialized controls (like any
    resize dialogs) need to have their .DefaultValue properties generated at
    So there's the potential for lots of little bugs here, but once those
    are fixed, I believe the UI will be much better for it.
    committed May 24, 2016
  4. Prototype changing of layer's rotational center point

    There are too many kinks for me to work out right now, so I'm just going
    to leave the rest of this project for a future date.  (Not ideal,
    obviously, but at least my theory on how to implement it proved
    Also, I want to make sure that rotational center points are saved
    to/from PDI files, starting now.
    committed May 24, 2016
  5. Selection tool panel: further reduce GDI and User Object count

    Similar to the previous commit, replacing standalone labels with
    captioned PD-specific controls is a good way to further reduce resource
    usage and improve program start time.  Cold start is down another 11
    user objects and 22 GDI objects.
    committed May 23, 2016
Commits on May 23, 2016
  1. Toolboxes: further reduce GDI and User Object count

    PD's custom controls can self-caption, and while we can't replace *all*
    toolbox labels with this, we can replace some.  This commit modifies the
    move/size and "quick-fix" panels to cut 9 user objects and 18 GDI
    objects on a cold start.
    committed May 23, 2016
  2. pdLayer: start work on rotating layers about an arbitrary point

    At present, layer rotation defaults to the layer's center point.  It is
    sometimes useful to rotate layers around arbitrary points, instead.
    I hope to crack the required geometry for this.  Fingers crossed!
    committed May 23, 2016
Something went wrong with that request. Please try again.