4 years agoSo long, and thanks for all the fish master
Andrew Chadwick [Sun, 27 Jul 2014 20:01:40 +0000 (21:01 +0100)]
So long, and thanks for all the fish

MyPaint has moved to Github; this commit replaces everything with a message
explaining how to follow us across, reproduced here:


Here's how to update your local repository to point to the new place:

    $ git checkout -b move-message-20140727
    $ git branch -D master
    $ git remote remove origin
    $ git remote add origin
    $ git fetch origin
    $ git checkout --track origin/master

(You can start again with a fresh clone, and it's easier:

    $ cd ~/somewhere/else
    $ git clone

but doing it this way eats more bandwidth)


4 years agoRefactor mode hierarchy
Andrew Chadwick [Tue, 22 Jul 2014 00:37:38 +0000 (01:37 +0100)]
Refactor mode hierarchy

Apply a few simplifications and improvements to the mode class hierarchy
that have been pending for a while:

* Use ALL_CAPS for "const"s,
* Split concrete mode classes out of the base class module,
* Rename gui.canvasevent -> gui.mode.
* Registry: build list of registered mode classes to simplify refactoring.
* Remove spring-loaded mixin
  - All concrete spring-loaded mode classes were also DragModes and vv.
  - Push the behaviour down into the DragMode class
* All oneshot modes are drags, merge mixin into OneshotDragMode

4 years agoBrushlib: submodule bump
Andrew Chadwick [Wed, 23 Jul 2014 18:38:05 +0000 (19:38 +0100)]
Brushlib: submodule bump

Various bits of tidyup code.

4 years agoAdded lib/mypaintlib_wrap.cpp to .gitignore
iirelu [Sun, 20 Jul 2014 14:10:12 +0000 (15:10 +0100)]
Added lib/mypaintlib_wrap.cpp to .gitignore

Another generated file, this time from swig, apparently.

4 years agoSubmodule bump to fix M_PI macro redefinition
Andrew Chadwick [Mon, 21 Jul 2014 18:09:30 +0000 (19:09 +0100)]
Submodule bump to fix M_PI macro redefinition

Fixes #53.

4 years agoSCons: better default prefix; improve help
Andrew Chadwick [Mon, 21 Jul 2014 16:23:16 +0000 (17:23 +0100)]
SCons: better default prefix; improve help

* Use /usr/local even on Darwin to avoid clashes with Macports.
* Remove hardcoded default strings: --help does this for us more prettily.
* Correct typo.

Fixes #60.

4 years agoRefactor Brushmanager init; bugfix
Andrew Chadwick [Mon, 21 Jul 2014 16:04:58 +0000 (17:04 +0100)]
Refactor Brushmanager init; bugfix

* Break up the unwieldy groups initialization into separate methods
* Typos, documentation
* Fix exception when a brush to be loaded is inaccessible
* Improve logging a bit

4 years agoRefined Two Symbolic Icons and Patched Export Script
Albert Westra [Mon, 21 Jul 2014 04:27:10 +0000 (21:27 -0700)]
Refined Two Symbolic Icons and Patched Export Script

Refined the mypaint-tab-options, and the mypaint-fill symbolic icons to
help the wrench flow with the theme, and the paint bucket look a bit
better(it the small things).

Also, it was getting anoying that one had to close Inkscape in order to
finish the symbolic icon export. So adding a --verb=FileQuit command did
the trick to close inkscape when it was finished.

Lastly, notice that for some of the symbolic icons, the export script
did not remove the bounding box of the icon. Fixed by adding a loop
to looked for something that was common between the bounding boxes
which they all start with "use". Simple Band-Aid fix, but I plan to open
and issue about an alternate method on how to export the symbolic icons.

4 years agoREADME: minor clarifcation
Andrew Chadwick [Sun, 20 Jul 2014 20:38:53 +0000 (21:38 +0100)]
README: minor clarifcation

4 years agoUpdate docs with OS X build notes
Andrew Chadwick [Sun, 20 Jul 2014 20:08:12 +0000 (21:08 +0100)]
Update docs with OS X build notes

Preliminary build notes tested on Mavericks. Thanks to Stuart for the testing and patches!

4 years agoSConstruct: turn off '-z origin' fully for OSX
Andrew Chadwick [Sun, 20 Jul 2014 19:43:16 +0000 (20:43 +0100)]
SConstruct: turn off '-z origin' fully for OSX

I was hoping we'd be OK with it behind -Wl, but linking reportedly fails
even when wrapping it up in -Wl,-z,origin on Darwin. Hopefully lack of it
won't break installs.

4 years agoSConstruct: different openmp defaults for OS X
Andrew Chadwick [Sun, 20 Jul 2014 19:37:32 +0000 (20:37 +0100)]
SConstruct: different openmp defaults for OS X

We already do this for the prefix, so it's fine to do it for OpenMP support
too. The defaults can of course be overridden when clang adds support for
OpenMP, or when compiling with compilers that support -fopenmp.

Fixes #55.

4 years agoOS X: remove workaround for python<2.7.4
Andrew Chadwick [Sun, 20 Jul 2014 02:55:28 +0000 (03:55 +0100)]
OS X: remove workaround for python<2.7.4

Remove some OS-specific workaround clutter which can be worked around by
installing a newer Python now that is
fixed and in widespread deployment (H/T @ryandesign in #52).

The current Apple-supplied Framework Python is 2.7.8, same as Macports.

4 years agoEstablish build order, don't let scons guess
Andrew Chadwick [Sun, 20 Jul 2014 01:56:44 +0000 (02:56 +0100)]
Establish build order, don't let scons guess

Some combinations of the build/rebuild cycle occasionally cause build
ordering screwups still. Try establishing a definite order.

4 years agoSwig: use native support provided by SCons
Andrew Chadwick [Sun, 20 Jul 2014 01:02:43 +0000 (02:02 +0100)]
Swig: use native support provided by SCons

SCons version 2.1.0+ appear to support swig just fine, and provided you're
careful about declaring inter-module dependencies the resultant project
build order is correct too.

* Use SCons's native swig support
* Move the → brushlib dependency into lib/ where it belongs

Builds work correctly after a --clean, over many calls with --random, and
rebuild correctly following changes in source deps correctly. Versions of
scons tested: 2.1.0, 2.3.1.

MyPaint now doesn't try to call scons until after --help has been
processed, so this commit closes #54.

4 years agoDocument scons build dependency, nominate version
Andrew Chadwick [Sun, 20 Jul 2014 00:36:26 +0000 (01:36 +0100)]
Document scons build dependency, nominate version

Dependency on scons wasn't documented. Fixed.

Nominate version 2.1.0 as the minimum supported level. That's in Ubuntu
12.04LTS (like, the *old* LTS); also, scons 2.1.0 is required for mingw
builds, according to

The current scons version is 2.3.2 at the time of writing, and that's what
I mostly develop against.

4 years agoMore central and portable removal of old targets
Andrew Chadwick [Sat, 19 Jul 2014 22:07:23 +0000 (23:07 +0100)]
More central and portable removal of old targets

Removal of build targets from ancient MyPaint trees is fairly dubious, but
it's a project-level hack. Centralize it the root SConstruct, and make it
more portable.

4 years agoReduce number of prints in --help mode
Andrew Chadwick [Sat, 19 Jul 2014 21:39:57 +0000 (22:39 +0100)]
Reduce number of prints in --help mode

4 years agoFix test perms, allow nosetests from toplevel
Andrew Chadwick [Fri, 18 Jul 2014 17:48:10 +0000 (18:48 +0100)]
Fix test perms, allow nosetests from toplevel

Make executable, to avoid it being run by default by
nosetests when run at the top level. It only executes correctly when
compiled from a debug build.

4 years agoSubmodule bump
Andrew Chadwick [Fri, 18 Jul 2014 17:44:24 +0000 (18:44 +0100)]
Submodule bump

4 years agoBetter handling of optimization flags for lib/
Andrew Chadwick [Fri, 18 Jul 2014 12:27:59 +0000 (13:27 +0100)]
Better handling of optimization flags for lib/

Rethink the way scons should reinstate -O0 if compiling with debug=1.
Trying to be clever with CCFLAGS was causing problems: see #52.

4 years agoFix build when using clang on Linux
Andrew Chadwick [Fri, 18 Jul 2014 01:25:48 +0000 (02:25 +0100)]
Fix build when using clang on Linux

The build environment was assuming gcc on the "linux2" platform, or at
least it was using "-z origin" when the linker was being invoked via clang
wrappers. Replaced with passthru variant for better portability.

We should be testing this to help OSX users and porters (see #49). The
current way of compiling with a nonstandard compiler is via the standard
environment vars CC and CXX:

   $ CC=clang CXX=clang++ scons

Builds with clang 3.4 and gcc 4.9.0 under Debian testing/unstable.

4 years extra github flavour
Andrew Chadwick [Thu, 17 Jul 2014 01:32:26 +0000 (02:32 +0100)] extra github flavour

Correct misformatting.

4 years agoUpdate README, convert to Markdown
Andrew Chadwick [Thu, 17 Jul 2014 01:24:51 +0000 (02:24 +0100)]
Update README, convert to Markdown

More comprehensive and better-formatted main, with begging slots
for Windows docs.

4 years agoRevised Icons and Coded them In
Albert Westra [Wed, 16 Jul 2014 21:42:11 +0000 (14:42 -0700)]
Revised Icons and Coded them In

  -Removed the Previous Symbolic Icons and added new Wrench Symbolic
Icon in Desktop/.../actions/ folder
  -Added "icon_name" perameter in def buttonless_button in
  -Coded the Symbolic icons in gui/
  -Added Wrench Icon under Actions
  -Moved Rejected Symbolic Icons on the outside of

4 years agoAdded Two Symbolic Icons and Added Info to Icon Extract Script
Albert Westra [Tue, 15 Jul 2014 00:25:07 +0000 (17:25 -0700)]
Added Two Symbolic Icons and Added Info to Icon Extract Script

Added two new symbolic icons to "desktop/icons/hicolor/scalable/actions/
Added Useage txt to "svg/" script to lessen confusion
Lastly, symbolic-icons.svgz has the two new icons mentioned earlier under Actions

Fixes #17

4 years agoTidy up brush editor & fix exception
Andrew Chadwick [Wed, 16 Jul 2014 17:27:15 +0000 (18:27 +0100)]
Tidy up brush editor & fix exception

Newer Glade versions insist on writing internal child widgets for scale
buttons that older GTK and GtkBuilder versions don't support, even when the
Builder XML file's <requires/> field is set correctly.

Fix the resultant exception by manually deleting the plus_button and
minus_button internal children of the two (repeated, templated)
ScaleButtons we use.  We'll just have to be careful about doing that for a
few versions.

Fixes #46.

Also, a general and long-needed UI tidy-up for the brush editor:

* Symbolic icons for X-axis scale editors (still unintuitive though...)
* Put the scale editors at the outside & reduce margins a bit
* Use Gtk.ShadowType.IN for the main edit area - nicer for Ubuntu
* Silly padding widgets for where we had placeholders (Glade convenience)

4 years agoSubmodule bump, wider libjson[-c] version compat
Andrew Chadwick [Mon, 14 Jul 2014 21:18:37 +0000 (22:18 +0100)]
Submodule bump, wider libjson[-c] version compat

Brushlib now supports older libjson/libjson-c across that lib's rename.
Bump the submodule, and update README.

4 years agoAdd Kaerhon Brush Pack v1
Andrew Chadwick [Mon, 14 Jul 2014 18:37:27 +0000 (19:37 +0100)]
Add Kaerhon Brush Pack v1

Kindly contributed as CC0 by Guillaume Loussarévian. Many thanks!

4 years agoMerge pull request #44 from iirelu/gitignore-edit
Andrew Chadwick [Mon, 14 Jul 2014 09:57:58 +0000 (10:57 +0100)]
Merge pull request #44 from iirelu/gitignore-edit

Added desktop/mypaint-ora-thumbnailer to .gitignore

4 years agoAdded a generated file to .gitignore
iirelu [Mon, 14 Jul 2014 09:45:05 +0000 (10:45 +0100)]
Added a generated file to .gitignore

desktop/mypaint-ora-thumbnailer is generated from
desktop/ so changes to it shouldn't be done

4 years agoForbid zero-pressure events if a button is down
Andrew Chadwick [Sun, 13 Jul 2014 02:33:38 +0000 (03:33 +0100)]
Forbid zero-pressure events if a button is down

Devices using the Linux evdev driver sometimes report zero pressure for an
axis when the value hasn't changed since the last reading. This results in
seemingly random breaks in what should be smooth brushstrokes. This
behaviour is common with Monoprice, Genius, or other UC-Logic based
tablets, which typically only have pressure inputs. Tilt inputs suffer from
this too, for Wacom devices using evdev.

Attempt to fix this by reusing the last good reading for the axes in
question if a button is held down when we receive a zero reading. For
pressure this should be fine in all cases. For tilt we may be discarding
valid readings, but who holds their pen exactly vertical anyway?

This may or may not fix the problem; earlier reports show spurious button
presses at the times when the pressure hits zero (but it's difficult to
read someone else's "xinput test" trace!)

This initial attempt at a fix depends on there being no spurious button
presses or releases at the same time as the input dropping to zero or

Addresses #29, but perhaps not for every tablet (please test!)

4 years agoImprove debugging some more
Andrew Chadwick [Sun, 13 Jul 2014 00:01:26 +0000 (01:01 +0100)]
Improve debugging some more

Looks like we'll need the source as well to distinguish some multi-faceted
devices, i.e. tablets sporting touchpads, pad buttons, or eraser pens in
addition to pen input, all of which which present as separate devices.

Quite a lot of non-Wacom tablets present all of these devices under the
same name when used with the evdev driver.  See the output people have
reported in #29.

Getting the references we store right will be important for preferences
driven inclusion or exclusion of devices, bug #40.

4 years agoMore device debugging at startup
Andrew Chadwick [Fri, 11 Jul 2014 17:19:28 +0000 (18:19 +0100)]
More device debugging at startup

* List all axes found
* Be explicit about devices which get skipped
* Log a warning if there are no devices with >1 axes
  - Gdk reports all non-"fancy" devices' axes as Gdk.AxisUse.IGNORE now :(
  - Mice and touchpads aren't fancy enough, seemingly
  - Don't know yet if tablets that have problems do this (see #29)
  - Let's find out!

4 years agoRe-enter current mode when entering fullscreen
Andrew Chadwick [Thu, 10 Jul 2014 12:44:27 +0000 (13:44 +0100)]
Re-enter current mode when entering fullscreen

When entering fullscreen mode, leave() and then immediately enter() the top
mode on the stack. This allows modes like freehand to reestablish any hacks
or workarounds they need which get reset or perturbed by state changes at
the Gdk window level.

Fixes #39.

4 years agoFix modifiers+space binding
Andrew Chadwick [Wed, 9 Jul 2014 17:54:13 +0000 (18:54 +0100)]
Fix modifiers+space binding

GdkEventKey.is_modifier isn't useful any more in GTK3.12 with introspected
bindings, so use a more explicit test for modifiers being held down.

Fixes #24

4 years agoSupport fake, hopefully faster, checkerboard bgs
Andrew Chadwick [Wed, 9 Jul 2014 17:29:22 +0000 (18:29 +0100)]
Support fake, hopefully faster, checkerboard bgs

Optimizing the part of the rendering path involving rendering RGBA data
with A<1 is proving intractable. "RGBU" (i.e. RGBA with A=1) is noticeably
faster. Therefore use the tile rendering phase to fake a checkerboard

New setting: "Prefs → View → Zoom → Use a real checkerboard pattern".
The faked kind is a little ugly, and is prone to dithering artefacts. Also
its appearance changes with the mipmap level, which looks odd. Therefore
it's off by default.

Addresses #21 by trading a little raw performance for hopefully much less
lag when a fake transparency checkerboard background is turned on. CPU use
for 1:1 zoom + a single destination-in layer on my system drops from 160%
to 120%.

4 years agoForbid Merge Down if either layer is locked
Andrew Chadwick [Tue, 8 Jul 2014 12:53:52 +0000 (13:53 +0100)]
Forbid Merge Down if either layer is locked

Locking layers should mean that their contents can't be changed, and the
Merge Down code correctly raises an assertion when it detects this
condition. However the layers should be greyed out too. Fix the resultant
exception by indicating in the query that locked layers cannot be sources
or targets for Merge Down.

Fixes #38.

4 years agoTidy some dead code and unused vars
Andrew Chadwick [Sun, 6 Jul 2014 21:01:26 +0000 (22:01 +0100)]
Tidy some dead code and unused vars

Removed some dead code and unused vars after the removal of the eraser mode
radius ratio stuff.

4 years agoSimplified the functionality of eraser mode
iirelu [Sun, 6 Jul 2014 03:41:49 +0000 (04:41 +0100)]
Simplified the functionality of eraser mode

It now no longer changes size by itself. This is more of the nuclear
option than anything, as a lot of brushes DO need to have their size
changed to work well as an eraser, but the previous code was so
user-hostile and counter-intuitive that it was best to entirely remove

4 years agoMake "Normal" the default mode for groups
Andrew Chadwick [Sat, 5 Jul 2014 23:36:37 +0000 (00:36 +0100)]
Make "Normal" the default mode for groups

The default mode for groups should be Normal rather than Pass-through.
Pass-through is a bad default for new groups. It's:

* More limiting to the user because its opacity cannot be changed.
* Not called "Normal", which users might justifiably expect! ☺
* Not like what GIMP and Krita do.

Fixes #15.

4 years agoWork in premult alpha for more modes
Andrew Chadwick [Thu, 3 Jul 2014 00:29:06 +0000 (01:29 +0100)]
Work in premult alpha for more modes

Add partial specializations which operate on arrays with premultiplied data
directly for the following combinations:

* Source Over (for the DSTALPHA=true variant as well)
* Destination In (both variants)
* Destination Out (both variants)

Using svg:src-over onto an alpha backdrop within the UI is becoming more
common (masks, Show Background toggle, Pass-through layer groups).  It
makes sense to have this code path work more efficiently.

Addresses issue #21 a bit as well: doing this gets a couple of extra fps
for both the scroll_1x_lazy_all_onscreen_masks and the
scroll_1x_lazy_all_onscreen_nobg test cases. To me it's noticeable in the
app too, if still a bit laggy.

Verified we can use the same template for src-over without penalty to the
no-alpha case, at least on the compiler I use.

4 years agoPixel ops: deparallelize, _c()ify the rgba one
Andrew Chadwick [Sat, 5 Jul 2014 20:05:17 +0000 (21:05 +0100)]
Pixel ops: deparallelize, _c()ify the rgba one

Using OpenMP was the wrong approach for 16→8bit conversion as written. Big
slowdown, not sure why (false sharing, maybe?); removed. Addresses #21.

Migrate guts of tile_convert_rgba16_to_rgba8() to a private C++-only
function, to make comparisons with its rgbu sibling simpler.

4 years agoRendering tests: add some more cases
Andrew Chadwick [Sat, 5 Jul 2014 21:07:05 +0000 (22:07 +0100)]
Rendering tests: add some more cases

Add test cases for rendering with mask layers, and without backgrounds.

4 years agoFix incorrect OpenMP variable privacy
Andrew Chadwick [Thu, 3 Jul 2014 01:45:03 +0000 (02:45 +0100)]
Fix incorrect OpenMP variable privacy

Correct a broken OpenMP private() declaration for instantiations of the
unspecialized BufferCombineFunc<> template.

Bug was made apparent only in bb8e660 and was only evident when MyPaint was
built with -O0, which that commit introduces for debug=1.  Visible with

4 years agodisplay rendering: use a LRU cache
Andrew Chadwick [Tue, 1 Jul 2014 03:04:17 +0000 (04:04 +0100)]
display rendering: use a LRU cache

Rendering for the display involves a fix15 → 8bpp transformation after
generating each fix15 tile. Tile generation is a moderately expensive
operation compared to conversion, so cache that fix15 data in RAM using a
cache with an LRU metric.

The ideal maximum capacity for the cache remains to be determined, but 32
or 64 MiB has a nice feel, and shouldn't cause modern systems any trouble.

Addresses mypaint/mypaint#21.

4 years agoImprove rendering speed test
Andrew Chadwick [Wed, 2 Jul 2014 21:25:23 +0000 (22:25 +0100)]
Improve rendering speed test

* Add fps measure
  - for comparison only, it's not application fps
  - relates only to blits into an offscreen surface sans. accel.
* Improve commenting
* Drop 5x-radius scroll test @ 100%
  - all it was doing was rendering empty space (oops)
* More test cases
* Better test naming

Addresses #21

4 years agoBuild: add help output
Andrew Chadwick [Wed, 2 Jul 2014 22:31:15 +0000 (23:31 +0100)]
Build: add help output

Now running with `scons -h` will reveal options.

4 years agoSubmodule bump + add options
Andrew Chadwick [Wed, 2 Jul 2014 22:26:15 +0000 (23:26 +0100)]
Submodule bump + add options

Update to "support" use_sharedlib and use_glib for the updated brushlib,
although building brushlib as shared currently breaks installs and local
tests. So don't do that (for now).

4 years agoLines and Curves: fix pressure curve error
Andrew Chadwick [Wed, 2 Jul 2014 13:01:04 +0000 (14:01 +0100)]
Lines and Curves: fix pressure curve error

An exception was being raised when manipulating the pressure curve
in the options panel for the Lines and Curves tool.

Fixes #33.

4 years agotests: add raw rendering performance test
Andrew Chadwick [Tue, 1 Jul 2014 02:03:14 +0000 (03:03 +0100)]
tests: add raw rendering performance test

Per #32, the scroll performance tests are a bit useless now. Part of what
that was good for was testing how fast rendering a layer stack is.

Add a new test that does an off-screen emulation of scrolling in a circle
with a big document on a 1080p screen to address #21. It also exercises the
Cairo rendering path. Should be good for testing future tile caches, and
improvements to the C++ tile compositing code.

4 years agotile clearing: fix HEAVY_DEBUG assertion
Andrew Chadwick [Mon, 30 Jun 2014 17:59:36 +0000 (18:59 +0100)]
tile clearing: fix HEAVY_DEBUG assertion

Fixes a C++ assertion accidentally introduced in 6414ab0 which was visible
only when compiled with debug=1.  We use tile_clear() in more
places now, but its action was data-type specific and calling it with the
wrong tile array could cause data corruption (hence the assertion)

* Provide separate tile_clear_…() functions for rgba16 and rgba8 data
* Fixes a potential data corruption with MyPaintSurface.blit_tile_into()
  - was probably never actually provoked in the wild

Minor stuff:

* Headers: remove internal-only …_c() routines from lib/pixops.hpp
* Couch some assertions in #ifdef HEAVY_DEBUG

4 years agofreehand: clearer event compression workarounds
Andrew Chadwick [Sun, 29 Jun 2014 22:21:53 +0000 (23:21 +0100)]
freehand: clearer event compression workarounds

* Make the code for setting up and tearing down event compression clearer
* Now warn if evhack is in use, or no workarounds are enabled

4 years agoFrame observers: replace with fine grained @events
Andrew Chadwick [Sat, 28 Jun 2014 00:27:52 +0000 (01:27 +0100)]
Frame observers: replace with fine grained @events

Replace the old frame_observers mechanism with observable events that
report which document the change originated on.

Closes #22

Old and new frame sizes are now reported to observers, so this could be
used for rendering cleaner updates in future.

4 years agolib.observable: log methods that fail before call
Andrew Chadwick [Sat, 28 Jun 2014 00:12:58 +0000 (01:12 +0100)]
lib.observable: log methods that fail before call

Observer methods are sometimes registered which raise exceptions before
their stack frame is entered, e.g. when required parameters are missing.
This can be uninformative in the stack trace, so log the registered
observer to make the error messages a bit more useful.

4 years agotiledsurface: optimize dst-in compositing
Andrew Chadwick [Fri, 27 Jun 2014 23:57:03 +0000 (00:57 +0100)]
tiledsurface: optimize dst-in compositing

Don't combine tiles in dst-in mode if we don't have to.  Clearing seems
faster.  We now make the assumption that this is the only mode that erases
its backdrop at zero alpha.

Partly addresses #21.

4 years agoMinor docs spelling fix
Andrew Chadwick [Fri, 27 Jun 2014 11:24:10 +0000 (12:24 +0100)]
Minor docs spelling fix

4 years agoRemove/replace deprecated API
Andrew Chadwick [Thu, 26 Jun 2014 18:26:37 +0000 (19:26 +0100)]
Remove/replace deprecated API

Remove deprecated API calls and properties from lib.document.Document:

* layer_idx
* doc_observers
* layers
* layer
* get_current_layer()
* set_background()
* render_as_pixbuf()

Replacing any remaining usages of them.

4 years agoFile→New: don't change the scratchpad bg
Andrew Chadwick [Thu, 26 Jun 2014 18:26:32 +0000 (19:26 +0100)]
File→New: don't change the scratchpad bg

The scratchpad is an independent document.
File→New was updating its background to match the main doc default,
which is ugly and side-effecty.

4 years agoscons: more useful message if brushlib is missing
Andrew Chadwick [Wed, 25 Jun 2014 20:04:27 +0000 (21:04 +0100)]
scons: more useful message if brushlib is missing

Tell people building MyPaint how to obtain the brushlib submodule if for
some reason it's absent at the start of the build.

Fixes #20.

4 years agoscons: Remove Python's -O flags from lib build
Andrew Chadwick [Wed, 25 Jun 2014 19:29:16 +0000 (20:29 +0100)]
scons: Remove Python's -O flags from lib build

Python is often built with optimization flags that override -O0. Remove
them from the C++ build of lib/ (though we could probably manage this with
reordering instead).


4 years agoFrame tool: snap to nearest px; fix modified test
Andrew Chadwick [Wed, 25 Jun 2014 19:21:08 +0000 (20:21 +0100)]
Frame tool: snap to nearest px; fix modified test

* Snap to the nearest pixel intersection
* Fix the "frame modified" test to allow smooth passage through
  the original frame size when dragging

Fixes #19

4 years agoFrame tool: fix resizing weirdness
Andrew Chadwick [Wed, 25 Jun 2014 12:24:51 +0000 (13:24 +0100)]
Frame tool: fix resizing weirdness

* Make an independent copy of the frame before starting
  - the original one was being accidentally changed
* Better minimum size enforcement
  - no arbitrary stop to the resize when overshooting limits
  - makes it easier to resize to the minimum size (1x1 pixel)
* Tidier transform calculation

Fixes #19.

4 years agoBrushlib update
Martin Renold [Tue, 24 Jun 2014 16:04:44 +0000 (18:04 +0200)]
Brushlib update

4 years agofilehandling: RecentManager fixes
Andrew Chadwick [Sun, 22 Jun 2014 16:25:57 +0000 (17:25 +0100)]
filehandling: RecentManager fixes

Construct and publish a proper RecentEntry now, with correct MIME types and

4 years agoMinor code tidyup + docs
Andrew Chadwick [Sun, 22 Jun 2014 16:23:09 +0000 (17:23 +0100)]
Minor code tidyup + docs

* Add docstrings for the save methods
* Evolved PEP8: minor code reformatting
* lib.document: mark some save methods internal-only

4 years agoSave robustness: via tempfile, fsync()ed backup
Andrew Chadwick [Sun, 22 Jun 2014 15:51:50 +0000 (16:51 +0100)]
Save robustness: via tempfile, fsync()ed backup


Save all files using a tempfile with rename-over if possible to make saving
on flaky systems which use ext4 a trifle more reliable. At least for newer
ext4 versions, renaming over an existing file supposedly causes the OS to
aggressively flush data blocks to disk so that power outages hopefully
won't lose data.

Also make backup copies (yes, copies), and try to fsync them as we make
them. This provides an additional safety net, and it makes sense to do an
fsync for the copy operation at the same time we expect newer ext4
filesystems to aggressively sync data.

(Why associate the manual fsync with the backup file copyi and not the
initial write? Well, pretty much any save operation in MyPaint uses
external libs and filenames.)

If users hate this behaviour, or it takes too long for big files, we can
reduce the level of paranoia a bit. I guess. I mean, it's not as if fsync()
actually buys you any safety anyway:

4 years agowith_wait_cursor(): better error reporting
Andrew Chadwick [Sun, 22 Jun 2014 14:46:28 +0000 (15:46 +0100)]
with_wait_cursor(): better error reporting

Improve backtraces from functions using this decorator.

4 years agoSplit out file and URI handling helpers
Andrew Chadwick [Sun, 22 Jun 2014 14:40:01 +0000 (15:40 +0100)]
Split out file and URI handling helpers

4 years agotests+doc: remove deprecated usages
Andrew Chadwick [Fri, 20 Jun 2014 00:38:38 +0000 (01:38 +0100)]
tests+doc: remove deprecated usages

Remove the old stroke_to() - either go through the controller's current
mode now, and let that handle stroke recording and splitting, or go through
the model's current layer.

Update tests accordingly, so that they're closer to what now happens in the
app. For, not using the deprecated version also
cures a detected (but spurious) leak.

4 years update to reflect moved strs
Andrew Chadwick [Thu, 19 Jun 2014 23:55:03 +0000 (00:55 +0100)] update to reflect moved strs

4 years agoSubmodule bump & build update
Andrew Chadwick [Thu, 19 Jun 2014 23:25:45 +0000 (00:25 +0100)]
Submodule bump & build update

* Update README to reflect new libjson-c requirements
* Update brushlib submodule to latest HEAD
  - now builds into itself, so update LIBPATH & rm previous files

4 years agoversioning: set up for next release cycle
Andrew Chadwick [Thu, 13 Mar 2014 16:01:32 +0000 (16:01 +0000)]
versioning: set up for next release cycle

* Release script can now make pre-release tarballs too
* Tarballs have git revision info baked into them
* Builds with no .git use baked-in release info if present
* Document new versioning & release strategy
  - now use Semantic Versioning
  - prerelease tarball verions will compare correctly
  - version always suffixed by (potential) prerelease during development
  - only the final release commit is unsuffixed
* Slightly meaningless version bump to 1.1.1-alpha
  - this really means the same thing as "git after 1.1.0", same as now
  - its betas & release will probably be 1.2.0, given the amount of change
  - it has to be semantically after 1.1.0 :)

4 years agoLayers dialog: update icons
Andrew Chadwick [Tue, 17 Jun 2014 20:23:31 +0000 (21:23 +0100)]
Layers dialog: update icons

* Groups now show a folder icon
* Add a blank icon for painting layers, for stupid layout reasons

4 years agoLayers stack: add Pass-through mode
Andrew Chadwick [Tue, 17 Jun 2014 19:10:34 +0000 (20:10 +0100)]
Layers stack: add Pass-through mode

Re-express the absence of group isolation as a mode in its own right, to
simplify the user interface. This replaces the toggle for group isolation,
which was making the UI messy and hard to grok.

* New mode: "Pass-through", for layer groups only
  - named after the one in a certain large photo manipulation package
  - should be fairly self explanatory
  - hides lots of pointless internal complexity, yay!
* Remove isolated flag and group auto-isolation test (much rejoicing)
* Move UI strings to lib.layer
* Pass-through mode prevents the opacity being set, so grey out UI bits
* Update doctests
* SetLayerMode command now also saves & restores previous opacity
* Remove the update() mechanism for SetLayerMode
  - the update is no longer atomic, so it's trickier to code now
  - update() was dubious anyway: users may want to compare back'n'forth
* Mark a few internal constants with underscore prefixes

4 years agoRemove UI for layer group isolation
Andrew Chadwick [Tue, 17 Jun 2014 17:32:03 +0000 (18:32 +0100)]
Remove UI for layer group isolation

* Remove the user-facing toggle action (will be replaced with a mode)

4 years agofreehand: correct log message, deprioritize
Andrew Chadwick [Tue, 17 Jun 2014 19:04:29 +0000 (20:04 +0100)]
freehand: correct log message, deprioritize

* Make the log chatter debug-only
* Correct a typo in the message for GTK beyond 3.12

4 years agoAdd some doc comments [NFC]
Andrew Chadwick [Tue, 17 Jun 2014 17:35:45 +0000 (18:35 +0100)]
Add some doc comments [NFC]

4 years agoFactor out some pixbuf loading
Andrew Chadwick [Mon, 16 Jun 2014 18:16:59 +0000 (19:16 +0100)]
Factor out some pixbuf loading

* Removes duplicate code

4 years agoFix missing **kwds during rename
Andrew Chadwick [Mon, 16 Jun 2014 09:38:59 +0000 (10:38 +0100)]
Fix missing **kwds during rename

4 years agoAdd a GtkAccelMap editor
Andrew Chadwick [Mon, 16 Jun 2014 00:14:49 +0000 (01:14 +0100)]
Add a GtkAccelMap editor

The ability to rebind the global accelmap directly from the menus is gone
permanently in GTK 3.12+, which prefers that you migrate to GtkApplication
and manage your accelerators through its API.  However due to API
mismatches, binding editors working via GtkApplication cannot be
implemented simply AND completely AND in a way that's compatible with 3.10.

We'd like to target 3.10 while not having accels break in 3.12+.  Something
has to change.  Sorry, Martin ☹

For now, add an editor for the legacy global AccelMap to the dialog so that
accels can be edited under both GTK+ 3.10 and 3.12+. The UI we'll need for
this after migrating to GtkApplication will be pretty similar to this old
GtkAction stuff, so it's hopefully not a wasted effort.

4 years agoRemove commented-out unused lines
Andrew Chadwick [Fri, 13 Jun 2014 23:00:37 +0000 (00:00 +0100)]
Remove commented-out unused lines

4 years agogui.document: fix RenameLayer exception
Andrew Chadwick [Fri, 13 Jun 2014 22:18:56 +0000 (23:18 +0100)]
gui.document: fix RenameLayer exception

As reported in

4 years agogui.layers: fix hidden typo in do_get_iter()
Andrew Chadwick [Fri, 13 Jun 2014 17:28:49 +0000 (18:28 +0100)]
gui.layers: fix hidden typo in do_get_iter()

Squish a typo-bug that was hiding under a rock.

Possible fix for

4 years agoUI: better behaviour when no layer is selected
Andrew Chadwick [Fri, 13 Jun 2014 16:12:15 +0000 (17:12 +0100)]
UI: better behaviour when no layer is selected

Bit of a grab-bag: basically make it all work correctly when the layer
stack is empty (currently that's just for debugging purposes). Helps shed
light on some weird edge cases.

* Actions which require a current layer now have managed sensitivities
* Add Layer can now add if there's nothing in the stack
* Make certain GtkTreeView state-management callbacks more robust
* Layer mode combo now has its sensitivity managed
* Layer opacity scale now has its sensitivity managed
* More careful checking when updating the UI selection
* More careful auto-scrolling when the stack presents as empty
* Clear current path when clearing the root stack
* Bugfix: announce path clearing done by set_current_path() (missed one)
* API clarity: rename command methods if they only affect current layer
* Robustness: such actions and commands now stop if current layer invalid

4 years agodebugging: add flag for testing layer notify bugs
Andrew Chadwick [Fri, 13 Jun 2014 15:37:29 +0000 (16:37 +0100)]
debugging: add flag for testing layer notify bugs

The GUI code *should* be capable of displaying an empty layers list now,
but it isn't. Not being able to do so reliably really hides certain bugs
when you're trying to work with someone debugging their problem via bug
report discussions.

Add a debugging flag (off by default, non-user-accessible) to lib.document
allowing the document model's New, Load, and Clear options to create empty
layer stacks. That should help in eliminating edge cases.

4 years agoTentative fix for bug 22182
Andrew Chadwick [Thu, 12 Jun 2014 21:22:49 +0000 (22:22 +0100)]
Tentative fix for bug 22182

4 years agoapplication: use python-gi; Turkish l18n
Andrew Chadwick [Wed, 11 Jun 2014 19:46:42 +0000 (20:46 +0100)]
application: use python-gi; Turkish l18n

* Use python-gi names, and remove gtk2compat stuff
* Remove dead GTK2 code
* Fix Turkish l18n issue (case for ıIiİ, see URL in comment)
* Explicitly use new-style classes everywhere

4 years agohelp strings: remove "hover and press key" info
Andrew Chadwick [Wed, 11 Jun 2014 17:44:50 +0000 (18:44 +0100)]
help strings: remove "hover and press key" info

This help text is misleading now that GTK no longer supports it.

Towards (but not a fix...)

4 years agodrawwindow: bump copyright date
Andrew Chadwick [Wed, 11 Jun 2014 17:44:16 +0000 (18:44 +0100)]
drawwindow: bump copyright date

4 years agodrawwindow: re-enable DnD; use python-gi dialect
Andrew Chadwick [Wed, 11 Jun 2014 17:40:03 +0000 (18:40 +0100)]
drawwindow: re-enable DnD; use python-gi dialect

* Re-enable dropping of colours and files from other apps
* Use python-gi names, and remove gtk2compat stuff

4 years agodrawwindow: switch filename and app name order
Andrew Chadwick [Wed, 11 Jun 2014 17:22:03 +0000 (18:22 +0100)]
drawwindow: switch filename and app name order

* Update the format string for titlebars with filenames
* Also mark the strings for translation, just in case

I've noticed that most of the programs on my desktop suffix filenames with
the app name, not vice versa.  This has the effect of putting the more
user-relevant information, namely the file basename, at the front of the
titlebar string.  That allows crowded window lists in panels to display
more of the user-relevant information despite their truncation of titlebar

4 years agodrawwindow: no longer unfullscreen on Escape
Andrew Chadwick [Wed, 11 Jun 2014 17:16:47 +0000 (18:16 +0100)]
drawwindow: no longer unfullscreen on Escape

Escape is now only for exiting the current mode, since we have buttons for
exiting fullscreen now which are always available.

4 years agoBrush editor: Auto button, symbolic icons
Andrew Chadwick [Tue, 10 Jun 2014 00:14:46 +0000 (01:14 +0100)]
Brush editor: Auto button, symbolic icons

* Use symbolic icons for the brush editor
* Use symbolic icons for the brush icon editor
* Add an "Auto" button to the brush icon editor
  - Renders a procedural brush preview

4 years agoUse a procedural brush preview for fallback
Andrew Chadwick [Mon, 9 Jun 2014 23:52:58 +0000 (00:52 +0100)]
Use a procedural brush preview for fallback

* New module for utility drawing code
* New code for generating procedural brush previews
* Move check bg rendering to (shared with new preview code)
* Move splining to (shared, useful)
* History now matches on brushinfo settings, hopefully not too slow
* Reset all brush settings when creating a new ManagedBrush
 - fixes an exception when defaulting
* Don't create a new ManagedBrush each time a brush not in the list is picked
 - needed to avoid only showing a default procedural preview for these
* Use the procedural brush instead of falling back to a white square
* Fall back to default image when failing to load a preview (robustness)
* Also update mtimes more robustly for this case

4 years agolib.brush: Fix docstr, rm dead code [NFC]
Andrew Chadwick [Mon, 9 Jun 2014 23:48:29 +0000 (00:48 +0100)]
lib.brush: Fix docstr, rm dead code [NFC]

* Correct an erroneous doc comment.
* Remove dead code that wasn't being called from anywhere.

No functional changes in this commit.

4 years agoBrushwork command: fix a potential exception
Andrew Chadwick [Mon, 9 Jun 2014 23:42:16 +0000 (00:42 +0100)]
Brushwork command: fix a potential exception

Fix exception when clearing a document a lot while also drawing to it in
freehand mode with event queues. This only replicably happens in the brush
preview editor (for slightly mysterious reasons), and it doesn't matter
about screwing up the undo stack there - so just log the problem for now.

4 years agoLayer Solo: always show bg; show effect against bg
Andrew Chadwick [Sun, 1 Jun 2014 22:54:15 +0000 (23:54 +0100)]
Layer Solo: always show bg; show effect against bg

* Always show the background in Layer Solo mode
* Layer Solo renders the effect of the current layer against the BG

This involves rendering everything specially though, with special choices
for what's visible and what's not all the way along the parent chain. The
code is hard to explain too :(

4 years agolayers: improve rendering-layer enumeration
Andrew Chadwick [Sun, 1 Jun 2014 02:01:04 +0000 (03:01 +0100)]
layers: improve rendering-layer enumeration

* Replace the _enum/get_render_layers() mess with nicer code.

4 years agoMinor: docs, style, code cleanup
Andrew Chadwick [Sun, 1 Jun 2014 01:55:31 +0000 (02:55 +0100)]
Minor: docs, style, code cleanup

* Minor docstring fixes & code style
* Code the layers notification stuff a little more robustly;
* Remove redundant test in rendering loop