1. 02 Sep, 2018 3 commits
    • Ell's avatar
      app, icons, menus: add performance-log recording to the dashboard · 36477bb2
      Ell authored
      Add an option to record a performance log through the dashboard.
      The log contains a series of samples of the dashboard variables, as
      well as the full program backtrace, when available.  As such, it
      essentially acts as a built-in profiler, which allows us to
      correlate program execution with the information available through
      the dashboard.  It is meant to be used for creating logs to
      accompany perofrmance-related bug reports, as well as for profiling
      GIMP during development.
      The sample frequency defaults to 10 samples per second, but can be
      environment variable.  Backtraces are included by default when
      available, but can be suppressed using the
      GIMP_PERFORMANCE_LOG_NO_BACKTRACE environment variable.
      Logs are created through the new "record" button at the bottom of
      the dashboard dialog.  When pressed, a file dialog is opened to
      select the log file, and, once confirmed, data is being recorded to
      the selected file.  Recording is stopped by pressing the "record"
      button again (we use a highlight to indicate that recording is
      While recording, the "reset" button is replaced with an "add marker"
      button, which can be used to add event markers to the log.  These
      can be used to mark events of interest, such as "started painting"
      and "stopped painting", which then appear in the log as part of the
      sample stream.  Markers are numbered sequentually, and the number
      of the next (to-be-added) marker appears on the button.  Shift-
      clicking the button adds an empty (description-less) marker, which
      is only identified by its number; this can be used when markers
      need to be added quickly.
      The log is an XML file, containing some extra information (such as
      the output of "$ gimp -v", and symbol information) in addition to
      the samples.  The data in the file is delta-encoded to reduce the
      file size, meaning that samples (as well as some other elements)
      only specify the changes since the previous sample.  This adds a
      necessary decoding step before data can be processed; the next
      commit adds a tool that does that.
      There are currently no tools to actually analyze the data -- that's
      still TBD -- but at least we can start gathering it.
    • Ell's avatar
      app: add GimpBacktrace · 80bf686c
      Ell authored
      GimpBacktrace provides an interface for creating and traversing
      multi-threaded backtraces, as well as querying symbol information.
      While we already have some backtrace functionality, it relies on
      external tools for the most part, and as such is rather expensive,
      and is only meant for producing opaque backtraces.  GimpBacktrace,
      on the other hand, is meant to be relatively cheap (we're going to
      use it for profiling,) and allow inspection of the backtrace data.
      In the future, it might make sense to replace some, or all, of the
      other backtrace functions with GimpBacktrace.
      GimpBacktrace currently only supports Linux.  By default, it uses
      dladdr() to query symbol information, which is somewhat limited (in
      particular, it doesn't work for static functions.)  When libunwind
      is installed, GimpBacktrace uses it to get more complete symbol
      information.  libunwind is currently an optional dependency, but it
      might make sense to promote it to a mandatory, or opt-out,
      dependency, as it's lightweight and widely available.
      On other platforms, the GimpBacktrace interface can still be used,
      but it always returns NULL backtraces.
    • Ell's avatar
      app: add mnemonics to dashboard action labels · a109a77d
      Ell authored
  2. 01 Sep, 2018 1 commit
  3. 31 Aug, 2018 3 commits
  4. 30 Aug, 2018 6 commits
  5. 29 Aug, 2018 1 commit
    • Debarshi Ray's avatar
      file-jpeg: Fix the copyright and license notices of jpeg-icc.* · 5dcee9ad
      Debarshi Ray authored
      This code was originally written by Thomas G. Lane and Todd Newman,
      and proposed for inclusion in the Independent JPEG Group's software.
      However, that fell through when Tom left the IJG. It was not written by
      Marti Maria - Little cms only had a copy of that code.
      This code has recently been merged into libjpeg-turbo, so it seems
      reasonable to now consider libjpeg-turbo as the canonical source of
      these files. However, since the GIMP carries the original version of
      the code proposed for IJG's JPEG, and doesn't contain any of the more
      recent and minor tweaks made during its inclusion in libjpeg-turbo,
      only the original copyright holders (ie., Thomas G. Lane and Todd
      Newman) are mentioned.
      The relevant license text was lifted from the Independent JPEG Group's
      software, similar to the way it's done in Chromium and other users of
      this code.
  6. 28 Aug, 2018 2 commits
  7. 26 Aug, 2018 2 commits
  8. 25 Aug, 2018 2 commits
    • Christian Kirbach's avatar
      Update German translation · 4c9d82aa
      Christian Kirbach authored
      (cherry picked from commit 9feca3b0)
    • Ell's avatar
      Issue #2095 - Filter wavelet-decompose error with layer Group option active · e5638451
      Ell authored
      In gimp_image_merge_layers(), explicitly fetch the graph of the top
      layer's parent layer (if exists), to make sure that the top layer's
      graph has a parent node.  We already fetch the image graph, which
      takes care of top-level layers, however, if the top layer is a
      child of an invisible layer group, as is the case in the wavelet-
      decompose plug-in, this is not generally enough to guarantee that
      the group's graph is constructed.
  9. 21 Aug, 2018 1 commit
  10. 20 Aug, 2018 10 commits
    • Ell's avatar
      app: explicitly clear GUI when halting a filter tool · ec80a885
      Ell authored
      In gimp_filter_tool_halt(), explicitly clear the GUI container
      before clearing filter_tool->config, since the tool might be halted
      during the GUI dialog's delete event, in which case the GUI will
      only be implicitly destroyed *after* the function returns.  The
      destruction of the GUI might fire signals whose handlers rely on
      filter_tool->config, so we need to make sure it happens while it's
      still alive.
      In particular, this fixes a CRITICAL in the threshold tool, which
      occurs due to the histogram view's "range-changhed" signal being
      fired during its destruction, and its handler accessing
    • Ell's avatar
      app: add gimp_gtk_container_clear() · fd64aae4
      Ell authored
      ... which removes all non-internal children of a GtkContainer.
    • Michael Natterer's avatar
      app: make GimpDeviceInfo more rubust against broken device listings · 717c183a
      Michael Natterer authored
      gimp_device_info_set_device(): don't just bail out if a device with
      the same name is added again, instead, simply continue and overwrite
      the info's old device with the new one.
      NOTE that this only happens if something is wrong on the USB or udev
      or libinput or whatever side and the same device is present multiple
      times. The only "safe" thing is to assume that devices listed earlier
      are dead and dangling entities and that the last registered device is
      the one actually delivering events.
    • Michael Natterer's avatar
      icons: make the gap of the broken chain larger in the Color theme · 5d937a23
      Michael Natterer authored
      (cherry picked from commit 68375543)
    • Jehan's avatar
      tools: invert-svg build tool no longer necessary. · 49fc5e30
      Jehan authored
      This tool has been outdated for some time now as we don't generate an
      "inverted icons" theme anymore. This is all done through CSS from a
      single symbolic icon theme.
    • Jehan's avatar
    • Ell's avatar
      app: use adaptive chunk size when rendering projections · a1706bbd
      Ell authored
      In GimpProjection, use an adaptive chunk size when rendering the
      projection asynchronously, rather than using a fixed chunk size.
      The chunk size is determined according to the number of pixels
      processed during the last frame, and the time it took to process
      them, aiming for some target frame-rate (currently, 15 FPS).  In
      other words, the chunks become bigger when processing is fast, and
      smaller when processing is slow.  We're currently aiming for
      generally-square chunks, whose sides are powers of 2, within a
      predefined range.
      Note that the chunk size represents a trade off between throughput
      and responsiveness: bigger chunks result in better throughput,
      since each individual chunk incurs an overhead, in particular when
      rendering area filters or multithreaded ops, while smaller chunks
      result in better responsiveness, since the time each chunk
      individual takes to render is smaller, allowing us to more
      accurately meet the target frame rate.  With this commit, we aim to
      find a good compromise dynamically, rather than statically.
      The use of adaptive chunk sizes can be disabled by defining the
      environment variable GIMP_NO_ADAPTIVE_CHUNK_SIZE, in which case we
      use a fixed chunk size, as before.
    • Ell's avatar
      app: don't chunk update area when rendering projection synchronously · 105ffc78
      Ell authored
      Add a boolean "chunk" parameter to
      gimp_projection_chunk_render_iteration(), which determines whether
      the work area should be sub-divided into chunks prior to rendering
      (previously, the work area would always be sub-divided.)  Only
      pass TRUE when rendering the projection asynchronously, in the
      render callback, and pass FALSE when rendering the projection
      synchronously, in gimp_projection_finish_draw(), which is called
      when flushing the projection through the GimpPickable interface.
      Rendering the projection using as big chunks as possible improves
      performance, while worsening responsiveness.  Since responsiveness
      doesn't matter when rendering synchronously, there's no reason to
      render in chunks.
    • Jehan's avatar
      configure: reorder the dependency version list. · b8d4ab48
      Jehan authored
      Current order was just completely random, which makes it hard to manage.
      Let's order alphabetically.
    • Ell's avatar
      Issue 2052 - Crash when using the flip tool · 94208055
      Ell authored
      In gimp_transform_tool_transform(), use "active_item", instead of
      "tool->drawable", when cutting/pasting the selected portion of a
      layer for transformation.  The latter is a remnant of the old
      transform-tool code, and is not guaranteed to be correspond to the
      correct drawable, or even to a valid drawable (i.e., it can
      potentially produce wrong results, or segfault.)
  11. 19 Aug, 2018 9 commits
    • Ell's avatar
      libgimp: in GimpTileBackendPlugin, use gegl_tile_backend_command() · 668fee96
      Ell authored
      In the command handler of GimpTileBackendPlugin, forward unhandled
      commands to gegl_tile_backend_command(), instead of asserting that
      they're within range (which has already been disabled by commit
      bc3b076c).  See GEGL commit
    • Jehan's avatar
    • Jehan's avatar
      configure: more explicit error message for gtk-encode-symbolic-svg. · 11cee13f
      Jehan authored
      Make it obvious this is a tool searched in PATH (and not for instance a
      lib) from the error message.
    • Ell's avatar
      libgimp: disable tile command range check in plug-in tile backend · bc3b076c
      Ell authored
      In gimp_tile_backend_plugin_command(), disable the range check for
      the input tile command.  This check prevents us from adding new
      tile commands to GEGL without breaking the ABI; yet, the next GEGL
      release will add a new command.  We're going to have to decide what
      to do about this, but for now, let's just disable the check, so
      that at least GIMP 2.10.6 is compatible with newer versions of
      GEGL, no matter how we end up handling this.
      (cherry picked from commit 90ed3c8d)
    • Jehan's avatar
      Issue #1970: Python-fu missing in 2.10.4. · de11e353
      Jehan authored
      Do not set the interpreter to `python2` but to whatever was found by the
      AM_PATH_PYTHON2() m4 macro.
      It looks like the Python2 binary we ship in our DMG may be call "python"
      only (without the '2'). Let's just make our code more resilient to
      various builds.
      I am not sure yet this is the only/actual problem for this issue on
      macOS, but this is at least in the right way.
      (cherry picked from commit 8f21c948)
    • Jehan's avatar
      app: fix "Bad interpreter" error messaging. · b67d7c44
      Jehan authored
      If I override the `program` variable, and it is not found in PATH
      environment, then it is NULL and the error message is unhelpful. Make
      the return value of g_find_program_in_path() into a separate variable
      instead, and only override `program` in the end, when we know it is
      (cherry picked from commit 87a9feb6)
    • Ell's avatar
      configure.ac: require GEGL >= 0.4.9 · f1ff239d
      Ell authored
    • Ell's avatar
      app: show swap read/write throughput in the dashboard · 5446163e
      Ell authored
      Show the read/write throughput of swap data in the corresponding
      swap-group fields.
    • Ell's avatar
      app: add "queued" field to the dashboard swap group · cd54457d
      Ell authored
      ... which reports the amount of data queued for writing to the
      swap (see GEGL commit 64021786ee067cf66c038622719acc590e6341db.)
      When the swap queue is full, a yellow color underlay is shown in
      the history graph.