5 years agoImprove button mapping, spring-loaded modes
Andrew Chadwick [Fri, 24 Aug 2012 12:04:57 +0000 (13:04 +0100)]
Improve button mapping, spring-loaded modes

New look for the button mapping preferences tab, allowing more actions
to be tied to pointer buttons and combinations of modifier keys. Added
support for more than 3 buttons, allowing Wacom pad buttons to be
assigned to MyPaint functions. Actions can now have more than one button
combination pointed at them.

Removed all the hardcoded button mappings. Everything is now managed in
user preferences. Space is now a fake Button2, and responds to the same

Updated button mapping defaults: Ctrl equivalents for all Alt+button
combos. Popup menu is now on Button3 where it belongs - my personal
preference because I don't use colour history, but it can be set back to
the old color history behaviour in preferences.

Some interaction modes are now spring-loaded, which means that if
they're started with button-modifier combinations, they cancel when the
modifiers and button are released.

Mode classes now use cooperative supercalls, to allow common code to be
shared via mixins. More modes are now zoomable and rotatable with the
mouse wheel, but support's still lacking for mode-switching via the
button map and also modifier+drag translations, rotations and zooms in
some of the fancier modes.

5 years agotablet detection: add aiptek to whitelist
Martin Renold [Sat, 17 Nov 2012 10:57:15 +0000 (11:57 +0100)]
tablet detection: add aiptek to whitelist

5 years agoi18n: fix build issue
Martin Renold [Fri, 16 Nov 2012 09:38:19 +0000 (10:38 +0100)]
i18n: fix build issue

5 years agoworkaround for build problem
Martin Renold [Fri, 16 Nov 2012 08:46:29 +0000 (09:46 +0100)]
workaround for build problem

Do not try to generate a translated headerfile.

5 years agoi18n: make intltool happy
Martin Renold [Fri, 16 Nov 2012 09:21:05 +0000 (10:21 +0100)]
i18n: make intltool happy

Fix warnings about strings that are not reorderable.
Not that you'd really want to reorder those, but well...

5 years agoi18n: German translation bugfix
Martin Renold [Wed, 14 Nov 2012 20:16:27 +0000 (21:16 +0100)]
i18n: German translation bugfix

Fix a very visible translation mistake.

5 years agoi18n: fix translation of menu labels
Martin Renold [Wed, 14 Nov 2012 20:05:36 +0000 (21:05 +0100)]
i18n: fix translation of menu labels

5 years agomypaint.xml: make compat with intltool-extract
Andrew Chadwick [Wed, 14 Nov 2012 13:21:55 +0000 (13:21 +0000)]
mypaint.xml: make compat with intltool-extract

Amend GtkBuilder XML to keep intltool-extract 0.41.1 happy. This version
requires translatable="yes", not the translatable="1" which GtkBuilder
itself is happy with. This allows strings to be extracted with

  intltool-extract --type=gettext/glade gui/mypaint.xml

and do more than just generate blank .h files.

5 years agobugfix: escape key ends fullscreen again
Martin Renold [Fri, 9 Nov 2012 16:33:51 +0000 (17:33 +0100)]
bugfix: escape key ends fullscreen again

The event was swallowed unconditionally. Propagate the return value
down to GTK instead. Seems right, but I hope it doesn't break
something else.

5 years agoSetLayerOpacity: don't recalc bbox needlessly
Andrew Chadwick [Fri, 9 Nov 2012 01:57:29 +0000 (01:57 +0000)]
SetLayerOpacity: don't recalc bbox needlessly

Minor UI jerkiness removal for a special case. If SetLayerOpacity makes
no changes to the effective opacity - which should only happen for
invisible layers - the command now no longer recalculate the bbox of the
layer once or twice for each move of the opacity slider. This can add up
to an appreciable but small delay for layers with a lot of tiles, and
jerkiness in what could be a smooth slider.

The problem really lies with tiledsurface.get_tiles_bbox() and
MyPaintSurface.get_bbox() iterating over index-tuple-keyed hashes merely
to obtain four numbers - would it help matters elsewhere to maintain a
cache of extents?

5 years agolayerswindow: reorder controls, better spacing
Andrew Chadwick [Fri, 9 Nov 2012 00:54:37 +0000 (00:54 +0000)]
layerswindow: reorder controls, better spacing

Now we have more blend modes, the mode GtkComboBox's menu can be cut off
short and awkwardly if the layers dialog is near the bottom of the
screen. Therefore move the controls which show details of the current
layer to the top, and the controls which affect the layers stack to the
bottom. The result is closer to the way the GIMP does it, and gives more
footroom for the combobox's menu. Headroom might now be a problem, but
layers aren't created using a mode that's further down the list: Normal
is at the top.

Space out controls in the Layers subwindow a tiny amount for some
breathing room. If this seems right, we should use it in other dockable
subwindows for consistency.

5 years agomacos: fix whitespace problem in brushgroup selector
Martin Renold [Thu, 8 Nov 2012 20:50:32 +0000 (21:50 +0100)]
macos: fix whitespace problem in brushgroup selector

<su_v> maxy: this works ok (with MyPaint 1.0.0, GTK+/X11 2.24.13)

5 years agoblend modes: add missing ones, redo as templates
Andrew Chadwick [Wed, 7 Nov 2012 20:48:11 +0000 (20:48 +0000)]
blend modes: add missing ones, redo as templates

Implement all the missing layer blend modes from the recently published

Specifically this adds Darken, Lighten, Difference, Exclusion, Hue, and
Saturation layer blend modes.

Added human-readable explanatory tooltips to the blend mode dropdown in
the Layers subwindow.

Fairly deep internal changes to the way layer compositing works: we now
use templates which inline blend mode functors working with *non*-
premultiplied components in place of the messy arrangement of macros and
functions operating on premultiplied components. This should make it
easier to implement pluggable compositing methods other than src-over at
a later date, if that's what we decide OpenRaster needs.

There's one template specialization already for the most common editing
case, Normal + Src-Over. We can add more as needed for other blend modes
which can be reduced down sanely to faster forms, using premultiplied
operation or something else.

Time: < ±1% - though that's really only the tweaked Normal + Src-Over.
We should add more blendmode-specific tests to tests/

We also now insist on contiguous data within tiles, but this should
already have been the case for all layers.

5 years agoREADME: update mention need for ldconfig
Andrew Chadwick [Sat, 3 Nov 2012 23:25:22 +0000 (23:25 +0000)]
README: update mention need for ldconfig

Create and expand a new post-installation section.

General reformatting.

5 years agobackgrounds: handle loading exceptions better
Andrew Chadwick [Sat, 3 Nov 2012 22:23:10 +0000 (22:23 +0000)]
backgrounds: handle loading exceptions better

If libgdkpixbuf cannot load a background image for any reason, it raises
an exception. Rewrite the background error handling to more tolerant of
this, and use longer aggregated error messages. With broken Gdk-Pixbuf
installations, there might be a lot of background loading exceptions.

5 years agoupdate brush download link
Martin Renold [Sat, 3 Nov 2012 12:29:05 +0000 (13:29 +0100)]
update brush download link

We have a new brush format, it may be useful to split the brushpack
wikipage later.

5 years agocolor history: fix most-recent adjuster
Andrew Chadwick [Fri, 2 Nov 2012 21:30:10 +0000 (21:30 +0000)]
color history: fix most-recent adjuster

Fix display of the most recently painted colour in the Colors subwindow
by listening for both automatic stroke splits (so that opaque splatter
brushes update the history like they should) and for when the user lifts
the pen (so the dialog and history is updated immediately even though
the last stroke isn't split yet).

Some secondary fixes and tweaks:

Test and fix out-of-box defaults and restored cases; document new order
for history.

Fix: default colour now isn't just RGBColor.new_from_hex_str()'s boring
mid-grey (oops). It's now the last item in the history.

New default history colours; might as well since that needed its order

5 years agobuild: enable more assertions
Martin Renold [Wed, 31 Oct 2012 20:40:04 +0000 (21:40 +0100)]
build: enable more assertions

We seem to be building a 2nd environment now which didn't remove
the -DNDEBUG that python-config adds. Remove that flag there, too.

This fixes a warning, and assertions are pointless if nobody enables
them. We have HEAVY_DEBUG for performance-critical stuff.

5 years agolayer modes: add soft light blend mode
Andrew Chadwick [Wed, 31 Oct 2012 19:08:58 +0000 (19:08 +0000)]
layer modes: add soft light blend mode

Add the svg:soft-light operator, specified as being the W3C SVG one(s)
by the OpenRaster specification.

The current SVGCompositing reference has an incorrect derivation for
working in premultiplied alpha, so let's not implement that for now. The
nonpremult math is correct and matches the current FXTF one.

5 years agolayer modes: factor out some fix15 arithmetic
Andrew Chadwick [Wed, 31 Oct 2012 19:01:45 +0000 (19:01 +0000)]
layer modes: factor out some fix15 arithmetic

This sort of code is much easier to understand and write without
bitshifts peppering everything. Use inlineable static functions and try
to standardise types and operator names initially; we can get clever
with macros and/or templates later if we need it.

5 years agoupdate default brush
Martin Renold [Wed, 31 Oct 2012 08:27:47 +0000 (09:27 +0100)]
update default brush

Using a brush/eraser pair good for pencil sketches now.

5 years agobrushes: update Deevad's brushset (set #2)
David Revoy [Wed, 31 Oct 2012 08:07:11 +0000 (09:07 +0100)]
brushes: update Deevad's brushset (set #2)

This is Deevad's brushset version 6 done for Mypaint version 1.1.0
This brush kit is released in public domain, so feel free to create
what you want with it.

5 years agowin32: fix unicode problem
Martin Renold [Tue, 30 Oct 2012 19:18:53 +0000 (20:18 +0100)]
win32: fix unicode problem

Fix exception on some systems when saving/loading with non-ascii username.

5 years agolayer modes: add hard light blend mode
Andrew Chadwick [Sun, 28 Oct 2012 02:55:58 +0000 (02:55 +0000)]
layer modes: add hard light blend mode

Add the svg:hard-light operator, specified as being the W3C SVG one by the
OpenRaster specification.

5 years agolayer modes: add overlay blend mode
Andrew Chadwick [Sun, 28 Oct 2012 01:11:23 +0000 (01:11 +0000)]
layer modes: add overlay blend mode

Add the svg:overlay operator, specified as being the W3C SVG one by the
OpenRaster specification.

5 years agotablet detection: switch to whitelist
Martin Renold [Sun, 28 Oct 2012 08:49:37 +0000 (09:49 +0100)]
tablet detection: switch to whitelist

Recent Xorg versions seem to report a pressure axis for a lot of
ordinary mice and keyboards now. Setting them to "screen" mode
produces strange bugs (e.g.

This commit adds a whitelist.

5 years agogtk2 pressure detection stuff
Martin Renold [Sat, 27 Oct 2012 18:33:12 +0000 (20:33 +0200)]
gtk2 pressure detection stuff

ignore another mouse type (spacebar panning doesn't work if enabled)

5 years agobrushlib: Update TODO
Jon Nordby [Tue, 9 Oct 2012 09:59:02 +0000 (11:59 +0200)]
brushlib: Update TODO

5 years agobrushlib: Use expf() instead of exp()
Jon Nordby [Mon, 17 Sep 2012 17:13:08 +0000 (19:13 +0200)]
brushlib: Use expf() instead of exp()

We work with floats, so no point using the double function.
Small speedup on my setup, and clearer profiling data (all uses
of exp/expf() function now shown together).

5 years agoFixed color history regression
John Watson [Fri, 5 Oct 2012 00:56:09 +0000 (17:56 -0700)]
Fixed color history regression

bug 20129 Made color history swap between last used colors during stroke

5 years agoAdd unity labels to number entries in edit Frame window
Manuel Quiñones [Mon, 24 Sep 2012 17:14:22 +0000 (14:14 -0300)]
Add unity labels to number entries in edit Frame window

Use the same abbreviation as GIMP, 'px', and mark it translatable.

Signed-off-by: Manuel Quiñones <>
5 years agofix segfault at startup on linux
Martin Renold [Sun, 23 Sep 2012 10:36:05 +0000 (12:36 +0200)]
fix segfault at startup on linux

5 years agofix #include
Martin Renold [Sun, 23 Sep 2012 10:23:29 +0000 (12:23 +0200)]
fix #include

implicit declaration of snprintf

5 years agoBuild: Return mypaintlib (lib/) in SConscript file
Jon Nordby [Sun, 23 Sep 2012 00:39:03 +0000 (02:39 +0200)]
Build: Return mypaintlib (lib/) in SConscript file

Will hopefully fix the explicit dependency between
mypaintlib (lib/) and brushlib/

5 years agoBuild: Add explicit dependency on brushlib for application
Jon Nordby [Sun, 23 Sep 2012 00:29:37 +0000 (02:29 +0200)]
Build: Add explicit dependency on brushlib for application

5 years agoReplace malloc.h with stdlib.h to allow building on osx.
Clayton Walker [Sun, 23 Sep 2012 00:20:49 +0000 (18:20 -0600)]
Replace malloc.h with stdlib.h to allow building on osx.

5 years agoUpdate build files to work on osx.
Clayton Walker [Sat, 22 Sep 2012 23:58:25 +0000 (17:58 -0600)]
Update build files to work on osx.

5 years agobrushlib: Install the (optional) headers that use glib
Jon Nordby [Sat, 22 Sep 2012 23:58:24 +0000 (01:58 +0200)]
brushlib: Install the (optional) headers that use glib

5 years agobrushlib: fix smudge starting transparent
Martin Renold [Thu, 20 Sep 2012 19:36:32 +0000 (21:36 +0200)]
brushlib: fix smudge starting transparent

Fix a problem where a smudging stroke would suddenly start
with transparency, even in the center of a solid layer.

Fixed by reordering of code: update the smudge color before using
it, instead of after. I'm not sure why it wasn't ordered like that
before, I see no advantage to the old order.

After calling reset() on a brush, the smudge color is set to
zero (transparent). Use the LAST_GETCOLOR_RECENTNESS state (which
is also reset to zero) to detect the initial get_color().

Reordering changes the behaviour of all smudge and watercolor brushes
very slightly, in theory. In practice I was unable to notice any
difference at all.

MyPaint still has a tendency to round down the alpha channel and
thus introduce slight transparency when smudging the same spot really
often, but it is a different problem.

5 years agogtk2 pressure detection stuff
Martin Renold [Thu, 20 Sep 2012 18:15:28 +0000 (20:15 +0200)]
gtk2 pressure detection stuff

clean up debug prints a bit, add another device exception

5 years agodocstring update
Martin Renold [Thu, 20 Sep 2012 16:15:40 +0000 (18:15 +0200)]
docstring update

I respectfully disagree with what was written here :-)

For MyPaint "stroke" and "mouse button" are two entirely unrelated
concepts; we have a somewhat confusing mix of those terms here.

It seems that recent xorg/wacom setups don't send a stylus "button
up" event until pressure is zero, so maybe the result is the same
for most setups (e.g. default click force).

But the real stroke certainly starts before callbacks in
input_stroke_started_observers are called, and it is possible
to make very faint strokes that trigger neither callback.

5 years agobutton action to toggle eraser
Martin Renold [Wed, 19 Sep 2012 11:11:40 +0000 (13:11 +0200)]
button action to toggle eraser

5 years agoallow to choose if brushkeys remember color
Martin Renold [Sun, 16 Sep 2012 09:55:32 +0000 (11:55 +0200)]
allow to choose if brushkeys remember color

It seems to be a tradition to change this behaviour every now and
then. Time for a preference (not in the preferences window, just
a toggle item in the menu). Also, update the current code to the
new brushmodifier behaviour.

Should we remember the color together with the brush?
Let's put an end to this insanity :-)

5 years agobrushlib/tests: Add missing charcoal.myb file
Jon Nordby [Sun, 16 Sep 2012 10:10:24 +0000 (12:10 +0200)]
brushlib/tests: Add missing charcoal.myb file

5 years agobrushlib/tests: Add some more test cases
Jon Nordby [Sat, 15 Sep 2012 22:07:18 +0000 (00:07 +0200)]
brushlib/tests: Add some more test cases

Also scale the input events to test more realistic cases (user
painting on 25% or 12.5% zoom).

5 years agobrushlib/tests: Specify test parameters outside test function
Jon Nordby [Fri, 14 Sep 2012 15:36:12 +0000 (17:36 +0200)]
brushlib/tests: Specify test parameters outside test function

5 years agobuild: Add -O3 to CFLAGS when not building in debug mode
Jon Nordby [Fri, 14 Sep 2012 15:16:37 +0000 (17:16 +0200)]
build: Add -O3 to CFLAGS when not building in debug mode

MyPaint brush engine gets a massive speedup with -O3 compared to -O2,
around 3x on a Core 2 Duo 2,2Ghz laptop. So we enable it by default.

5 years agobrushlib/tests: Fix gperftools utility
Jon Nordby [Fri, 14 Sep 2012 14:29:39 +0000 (16:29 +0200)]
brushlib/tests: Fix gperftools utility

Wrong pkg-config file, include path and function name
made this not compile.

5 years agobrushlib/tests: Call begin_atomic / end_atomic around stroke_to calls
Jon Nordby [Fri, 14 Sep 2012 10:36:14 +0000 (12:36 +0200)]
brushlib/tests: Call begin_atomic / end_atomic around stroke_to calls

Can be disabled, which allows to test transactions that are bigger
than individual stroke_to calls. For instance one could (re)play
an entire stroke and only then end the transaction.

5 years agobrushlib: Move begin_atomic / end_atomic vfuncs to MyPaintSurface
Jon Nordby [Fri, 14 Sep 2012 10:31:07 +0000 (12:31 +0200)]
brushlib: Move begin_atomic / end_atomic vfuncs to MyPaintSurface

The transaction concept is generally useful and should be present
on the public interface of surfaces. This will suggest consumers
to make use of it, which allows surfaces to implement deferred
Implementing these vfuncs is optional for a surface.

5 years agobrushlib: Update failing RNG test
Jon Nordby [Fri, 14 Sep 2012 10:10:07 +0000 (12:10 +0200)]
brushlib: Update failing RNG test

The RNG parameters where changed in a previous commit
to optimize its usage a bit, leading to different initial results
for a given seed.

5 years agobrushlib: Remove need for separate binary to run benchmarks
Jon Nordby [Fri, 14 Sep 2012 10:04:04 +0000 (12:04 +0200)]
brushlib: Remove need for separate binary to run benchmarks

Will just use a commandline option or environment variable to
detect the difference.
Right now the benchmark mode is always run for the surface tests
because verification of the output result has not been implemented.

5 years agobrushlib: Remove separate "utils" library
Jon Nordby [Fri, 14 Sep 2012 09:42:23 +0000 (11:42 +0200)]
brushlib: Remove separate "utils" library

The code is only used in tests, and probably only
will be, so build it into that library.

5 years agobrushlib: Rename "libmypaint-brushlib" to "libmypaint"
Jon Nordby [Mon, 10 Sep 2012 20:07:02 +0000 (22:07 +0200)]
brushlib: Rename "libmypaint-brushlib" to "libmypaint"

pkg-config files already had this name in them.
Renaming the source and install directories still todo.

5 years agolayers window: reflect undo stack changes fully
Andrew Chadwick [Sun, 9 Sep 2012 21:11:20 +0000 (22:11 +0100)]
layers window: reflect undo stack changes fully

Fix a minor state-reflection issue.

Changes to the layer visibility and locked state weren't immediately
shown by the layers list when the model state changed due to an undo or
redo user command.

5 years agocommand stack: permit updating the last command
Andrew Chadwick [Sun, 9 Sep 2012 21:04:46 +0000 (22:04 +0100)]
command stack: permit updating the last command

Allow the last command on the undo stack to be updated, to avoid having
to use undo() then do() in circumstances where only the final state of a
user's choice is deemed to matter in their workflow.


5 years agoDisables live update when brush settings not visible
João S. O. Bueno [Mon, 3 Sep 2012 01:32:38 +0000 (22:32 -0300)]
Disables live update when brush settings not visible

The live update of last stroke option would continue active
even with the dialog closed, causing the last stroke to
be modified when changing the drawing color, for example

5 years agobuild: clean .so file left over by old versions
Martin Renold [Wed, 29 Aug 2012 11:55:51 +0000 (13:55 +0200)]
build: clean .so file left over by old versions

This fixes a runtime error if an old version of MyPaint has been
compiled in the same directory (e.g. git update from v1.0.0).

5 years agofastpng: ignore non-RGB embedded ICC profiles
Andrew Chadwick [Mon, 27 Aug 2012 18:29:32 +0000 (19:29 +0100)]
fastpng: ignore non-RGB embedded ICC profiles

Gimp 2.8 happily embeds greyscale color profiles into PNG data with RGB
samples. This seems like a GIMP bug. Neverthless, it's revealed one of
ours: we need to be able to cope with non-RGB color profiles. Just
dropping them on the floor (similar to Gimp 2.6) should suffice while
we're using libpng to perform the limited number of transformations we

5 years agoDrag modes: ignore failed attempts to grab pointer
Andrew Chadwick [Mon, 27 Aug 2012 16:48:48 +0000 (17:48 +0100)]
Drag modes: ignore failed attempts to grab pointer

Workaround for - a GTK2 issue where some
other widget fails to release its pointer grab (an implicit grab?)
before the drag mode's grab is established.

Hopefully this won't screw too much up. For the more common of our drag
modes, the grabs are only there to make handling across multiple docs
and tdws, e.g. the scratchpad's setup, saner: they're not essential in
the single window case.

5 years agokeyboard: fix an exception when pressing Escape
Andrew Chadwick [Sun, 26 Aug 2012 21:57:13 +0000 (22:57 +0100)]
keyboard: fix an exception when pressing Escape

Not every window added to the keyboard manager will have a
It's fine for the KeyboardManager to retain its own reference to the
singleton application instance.

5 years agofix exception in brush settings dialog
Martin Renold [Sun, 26 Aug 2012 17:24:34 +0000 (19:24 +0200)]
fix exception in brush settings dialog

Reported here:

5 years agoframe window: allow frame colour to be changed
Andrew Chadwick [Fri, 24 Aug 2012 13:38:52 +0000 (14:38 +0100)]
frame window: allow frame colour to be changed

Allow the frame colour and opacity to be configured by the user via the
frame editing mode's dialog.

5 years agooptimize brush selection
Martin Renold [Sun, 19 Aug 2012 14:32:59 +0000 (16:32 +0200)]
optimize brush selection

Simple optimizations in
- don't report no-changes to observers
- get rid of 2300 calls to dict.deepcopy()

This reduces CPU time for brush selection by 50% and makes
the "pick context" feature more responsive again.

We still are doing all the work 3 times for our 3 different
documents (gui, scratchpad, brushcreation widget).

5 years agoupdate ru translation
George Shuklin [Sun, 19 Aug 2012 07:21:43 +0000 (09:21 +0200)]
update ru translation

5 years agoframe: make editing the frame a mode
Andrew Chadwick [Thu, 16 Aug 2012 01:17:09 +0000 (02:17 +0100)]
frame: make editing the frame a mode

Frame editing is now hopefully a little more intuitive: added a toolbar
button and a corresponding bindable action for editing the frame. Dialog
and mode are now combined.

Users can now drag the frame edges while the tool/mode is active. The
cursor reflects what will happen on canvas while the mode is active.

The dialog crop buttons now unconditionally enable the frame: users will
always want to see the result of these actions immediately.

Added a horrible icon for frame editing mode. Really we need a better
one (a fancy ormolu picture frame, maybe?)

Minor dialog layout stuff.

FrameToggle is now a real ToggleAction.

lib/ strip out frame moving and delta accumulation: it's now
managed by the top mode.

Gtk3: fixed pointer_ungrab() breakage.

5 years agomarkup string encodings: fix encoding bug
Andrew Chadwick [Mon, 13 Aug 2012 14:12:07 +0000 (15:12 +0100)]
markup string encodings: fix encoding bug

Fix an encoding bug which was causing unescaped content to get into
Pango markup. Fixes the brush list breaking with names which contain
ampersands, and similar potential faults in a couple of other places.

5 years agolayer move mode: don't always automatically cancel
Andrew Chadwick [Sun, 12 Aug 2012 13:57:04 +0000 (14:57 +0100)]
layer move mode: don't always automatically cancel

Make LayerMoveMode only auto-cancel if it's launched with modifiers +
pointer. If it's invoked from the toolbar or menu or a keypress
shortcut, the mode persists until a new mode is selected or escape is

5 years agoHCY mask load dialog: use a bigger preview
Andrew Chadwick [Sun, 12 Aug 2012 13:24:58 +0000 (14:24 +0100)]
HCY mask load dialog: use a bigger preview

Previews in mask loaders need to be fairly big.

5 years agoAdd interaction modes for lines, view manipulation
Andrew Chadwick [Fri, 10 Aug 2012 21:03:29 +0000 (22:03 +0100)]
Add interaction modes for lines, view manipulation

Refactor LineMode to support the new modes interface.

Line modes are now accessible a) from the kitchen sink default freehand
mode with modifiers+drag, b) from the Edit menu and c) from the toolbar.
Other locations are possible too, of course.

I prefer all the sticky modes to be visible together on the toolbar
while they're the only reflection of what mode the app is in, but we're
admittedly getting a bit cluttered up there now. It's probably time for
some judicious culling and replacement.

New icons for rotating and zooming the view in "cursor and view" style,
and a generic Tango-style one for moving stuff.

5 years agocanvasevent: begin associating actions with modes
Andrew Chadwick [Wed, 8 Aug 2012 22:40:16 +0000 (23:40 +0100)]
canvasevent: begin associating actions with modes

Interaction modes can now have an associated GtkAction, looked up by
name via the builder when needed. Set this up for the switchable
freehand mode and the viewport manipulation modes as a quick demo.

Some needed fixes to the mode stack's handling.

Escape now resets the interaction mode stack for the main doc.

Add an Icon for viewport (viewfinder?) panning mode. Need more though.

5 years agoupdated german translation
Daniel Ruf [Sat, 4 Aug 2012 15:18:12 +0000 (17:18 +0200)]
updated german translation

5 years agooptimize new random generator
Martin Renold [Wed, 8 Aug 2012 12:49:04 +0000 (14:49 +0200)]
optimize new random generator

Don't call rng_double_set_seed() any more while painting.
Reduce RNG quality settings.

For the brush "classic/coarse_bulk_1" this reduces the RNG related
functions from taking 9.5% CPU down to 0.5% (of all brushlib activity).

This breaks a feature where brushlib can re-render a previous stroke
exactly by restoring the initial state. (And removes the reason for
not using the system's RNG in the first place... uhm...)

Appart from the slightly nicer "live stroke preview" on the canvas
when editing the brush settings, this feature was unused for quite
some time now. It was used for undo/redo in early days. Actually it
was already broken before this commit (since the new RNG, I assume)
for some reason that I was unable to figure out.

5 years agofix rand_gauss() offset
Martin Renold [Wed, 8 Aug 2012 10:26:54 +0000 (12:26 +0200)]
fix rand_gauss() offset

The previous random_gauss() had a very prominent bias since
the introduction of the new integer RNG. Fixed by converting
the algorithm to float and removing the integer RNG completely.
rand_gauss() was the only consumer of integer random numbers.

5 years agocanvasevent: fix exception with bad devices
Martin Renold [Wed, 8 Aug 2012 09:11:47 +0000 (11:11 +0200)]
canvasevent: fix exception with bad devices

5 years agokeyboard and pointer input: big refactor
Andrew Chadwick [Wed, 1 Aug 2012 01:12:23 +0000 (02:12 +0100)]
keyboard and pointer input: big refactor

Move even more stuff out of the TDW, moving the input processing stuff
to a stack of interaction mode objects owned by each gui Document, only
the top mode of which is active. gui.document.Document ("doc") objects
are evolving into something more like classical MVC controllers.

The new InteractionMode objects know which doc and which tdw was active
at the time of the event, which may allow us to add additional views of
a model controlled by a single doc.

Active interaction modes' handlers can freely push new sub-modes to the
mode stack, and pop the stack when they're finished: this is how
switching modes using modifiers now works. There's an enter/leave
protocol at work for ensuring grabs are released appropriately.

* Replaces older button-press abstractions.

* Modes replace dragfuncs: certain modes are specialised for dragging between
  pen-down and pen-up events, and for keypresses involving space.

* Bye bye tdw's DragHandler, hello new super-grabby DragMode base class.

Differences between space drags and button-down drags are abstracted
away by the DragMode interface.

* Can now space-drag and zoom etc. on the scratchpad.

* Input stroke observers now belong to the gui-doc only.

* Global pressure mapping is now an Application attribute.

The controller classes track last event position and time on their TDWs
so that all modes can use the information, and so that it updates for
all modes.

* There's a minimal canvas controller for testing and the
  brush icon editor: it uses a freehand-only mode which cannot be switched
  using modifier keys.

TODO: need Actions for changing the active mode. Kinda what we're aiming
at here.

TODO: merge "" modes into the new structure. This already
uses its own similar scheme.

5 years agotdw: split cursor stuff to a mixin
Andrew Chadwick [Tue, 31 Jul 2012 13:42:07 +0000 (14:42 +0100)]
tdw: split cursor stuff to a mixin

Cursor stuff belongs on the renderer, but it's highly reusable and
doesn't really carry much of its own state. Therefore make it a mixin.

Generate fewer cursor updates (ISTR MS Windows cursors being reported as
a little flickery), and move cursor sizing to the new mixin to make what
the new conditional brush_modified_cb() does easier to understand.

Various minor cleanups.

5 years agoscratchpad: don't autosave unless changed
Martin Renold [Mon, 6 Aug 2012 14:28:59 +0000 (16:28 +0200)]
scratchpad: don't autosave unless changed

Especially after editing the preferences, the scratchpad ORA was
always saved no matter what, resulting in a notable delay.

5 years agofix global pressure mapping
Martin Renold [Mon, 6 Aug 2012 13:47:09 +0000 (15:47 +0200)]
fix global pressure mapping

5 years agowheel adjusters: notches
Andrew Chadwick [Mon, 30 Jul 2012 22:25:15 +0000 (23:25 +0100)]
wheel adjusters: notches

Add small notches to the edges of larger hue/saturation wheels denoting
the angular positions of the pure hues. These can be somewhat difficult
to find with these adjusters otherwise.

5 years agoGamut mask editor: behavioural fixes
Andrew Chadwick [Mon, 30 Jul 2012 21:49:46 +0000 (22:49 +0100)]
Gamut mask editor: behavioural fixes

Raise voids to the top when hovering over them for ease of editing.

Improve hightlighting a bit.

Voids can now be deleted by dragging them entirely within other voids.

Can now add up to 6 voids.

5 years agocolor adjusters: modifiers should do 1 thing only
Andrew Chadwick [Mon, 30 Jul 2012 21:41:03 +0000 (22:41 +0100)]
color adjusters: modifiers should do 1 thing only

Behavioural fixes for the colour bending implementation (microadjusting
the selected colour by selecting with button2 or button3 then dragging).
Modifiers should just toggle between three operations and not combine
them: it's easier to explain and much easier to figure out.

 * Unmodified + button2/3 drag: select, then adjust luma.
 * Shift + button2/3 drag: select, then adjust chroma.
 * Control + button2/3 drag: select, then adjust hue.

Bugfix: base hue bending on initial hue, not intial chroma. Oops.

5 years agocolor sels: minor cosmetic stuff
Andrew Chadwick [Mon, 30 Jul 2012 21:37:00 +0000 (22:37 +0100)]
color sels: minor cosmetic stuff

Reduce mask previews from 100 to 64 pixels to better support small screens.

Minor internal comment and annotation clarifications.

5 years agoluminosity/luma: use the same coeffs everywhere
Andrew Chadwick [Fri, 27 Jul 2012 16:50:29 +0000 (17:50 +0100)]
luminosity/luma: use the same coeffs everywhere

Use the coefficients from the forthcoming Compositing and Blending 1.0
specification from FXTF everywhere we compute luma: it'll help to avoid
inconsistencies like being seemingly able to brush-colourize a Color
layer visually brighter or darker with with a colour of the same exact
shade and 100% opacity.

5 years agopixops: add color and luminosity layer blend modes
Andrew Chadwick [Thu, 26 Jul 2012 19:20:33 +0000 (20:20 +0100)]
pixops: add color and luminosity layer blend modes

Artists can now use layer-based colourization and lightness setting, as
described at

This implementation uses the algorithm described in the PDF Reference,
the Cairo documentation, and most recently in a W3C (FXTF, i.e. SVG and
CSS) Editor's Draft specification. Let's refer to it in OpenRaster files
as svg:color and svg:luminosity and hope the SVG names don't change.

5 years agoLayer stack actions: update, make more keybindable
Andrew Chadwick [Wed, 25 Jul 2012 18:22:42 +0000 (19:22 +0100)]
Layer stack actions: update, make more keybindable

New keybindable commands in the menu:

  * Raising and lowering a layer in the layers stack
  * Duplicating the current layer
  * Renaming the current layer
  * Setting the current layer's visibility
  * Setting the current layer's locked status

Renaming a layer is now undoable, for consistency with the other layer
metadata commands.

Internal changes

A more sensible implementation for labelling unnamed layers. It's not a
fix for yet, but that really isn't going to
be fixed until we decide not to allow unnamed layers at all, or save our
bodged-in reference numbers.

lib.command.RemoveLayer can now remove the final layer. If it does so,
it replaces it with a new unnamed layer. Required by the cleaner
nameless layer labelling code, which uses the layer to store its own
ref number, and it's better for identity and semantics. It was always
silly that "removing" the final layer would keep its name.

5 years agoapp/doc/layer: minor cleanups and documentation
Andrew Chadwick [Wed, 25 Jul 2012 18:06:18 +0000 (19:06 +0100)]
app/doc/layer: minor cleanups and documentation

No significant code changes.

5 years agoREADME: update build deps for Debian systems
Andrew Chadwick [Tue, 24 Jul 2012 01:16:46 +0000 (02:16 +0100)]
README: update build deps for Debian systems

python-gtk2-dev is necessary, and also pulls in the required
libgtk2.0-dev and the runtime stuff.

5 years agoactions: move core actions to GtkBuilder XML
Andrew Chadwick [Mon, 23 Jul 2012 19:54:28 +0000 (20:54 +0100)]
actions: move core actions to GtkBuilder XML

Gather all the scattered lists of document- and view-level actions
together in one place. Keeps the code tidy, and hopefully it's easier to

Review action labels and tooltips for capitalization and uniqueness.
Also fix a few minor bugs here and there (visualize_rendering_cb(),
initialization of _show_subwindows).

5 years agogtk3: various fixups
Andrew Chadwick [Fri, 20 Jul 2012 20:53:41 +0000 (21:53 +0100)]
gtk3: various fixups

Final few fixups for GTK3 mode before merging back into master:

- reenable window position saving for the main window

- fix a line modes crash

5 years agopixbuf-wrapper related fixups for GTK3
Andrew Chadwick [Fri, 20 Jul 2012 18:04:38 +0000 (19:04 +0100)]
pixbuf-wrapper related fixups for GTK3

Fixes colour selection in the background window, and some corner cases
in the brush edit window.

5 years agovarious GTK3 fixes
Andrew Chadwick [Fri, 20 Jul 2012 17:02:16 +0000 (18:02 +0100)]
various GTK3 fixes

Fix history and colour popups so they run without showing exceptions.
General fixup to drawwindow so that the preferences window can be

REGRESSION: no fancy shaped window support upstream in this PyGI+GTK3,
see comment.

5 years agocolor picker: refactor/update for GTK3-pygtkcompat
Andrew Chadwick [Thu, 19 Jul 2012 17:12:14 +0000 (18:12 +0100)]
color picker: refactor/update for GTK3-pygtkcompat

Refactor and reimplement the colour picker functions and buttons in
terms of pixbufs and the appropriate screen getter function for both
PyGTK and PyGI+GTK2.

5 years agotoolbar+panels: initial fixes for pygtkcompat-gtk3
Andrew Chadwick [Wed, 18 Jul 2012 23:06:36 +0000 (00:06 +0100)]
toolbar+panels: initial fixes for pygtkcompat-gtk3

Fix up toolbars and dropdown panels so that they initialize without any
exceptions under pygtkcompat+PyGI+GTK3.


* gtk.Action.connect_proxy(w) -> Gtk.Activatable.set_related_action(a).
  - old form deprecated since 2.16

* The gtk.Action.set_tool_item_type() classmethod is better handled by
  overriding create_tool_item() when making toolbars via UIManager.
  - supposedly since 2.4

The usual mess:

* Fix menu button bold to use markup - nicer for the more restrictive
  PyGI-era Pango wrappings.

* .allocation -> .get_allocation();

* .window -> .get_window();

* .parent -> .get_parent();

* gdk.pointer_ungrab() requires a timestamp;

* Popup menu positioners have args in a different order.

5 years agogui.layout: various fixes/workarounds for gtk3
Andrew Chadwick [Tue, 17 Jul 2012 16:22:04 +0000 (17:22 +0100)]
gui.layout: various fixes/workarounds for gtk3

Fixes docked window tear-off behaviour, albeit using an ugly workaround.
Really we need shaped windows for the drag preview.

Fix an exception with the roll-up button.

5 years agolayers window: fix occasional gtk3 exception
Andrew Chadwick [Tue, 17 Jul 2012 16:21:17 +0000 (17:21 +0100)]
layers window: fix occasional gtk3 exception

5 years agolayers window: fix up for pygtkcompat/GTK3
Andrew Chadwick [Tue, 17 Jul 2012 15:33:03 +0000 (16:33 +0100)]
layers window: fix up for pygtkcompat/GTK3

Resolve most exceptions, allowing the window to be brought up and used
for layer selection, renaming, reordering, layer blend mode setting,
merging, and deleting.

5 years agobrush list: make broadly functional under GTK3
Andrew Chadwick [Tue, 17 Jul 2012 01:57:32 +0000 (02:57 +0100)]
brush list: make broadly functional under GTK3

Group names list and pixbuflist drawing and size requesting for GTK3.

REGRESSION: DnD is broken, but shouldn't throw exceptions now.

5 years agolayout: partial support for GTK3
Andrew Chadwick [Mon, 16 Jul 2012 18:26:58 +0000 (19:26 +0100)]
layout: partial support for GTK3

Work around and fix some of the immediate exceptions under GTK3.
Floating windows can now be shown and docked, but dragging and
repositioning is still a work in progress.

5 years agotool widgets: revert title finding to the old way
Andrew Chadwick [Mon, 16 Jul 2012 17:08:29 +0000 (18:08 +0100)]
tool widgets: revert title finding to the old way

No longer look up tool widget titles via stock: it's not possible with
stock mappings created by GtkBuilder. Revert to the old way, which was
always more modular.