5 years agonew layer merging, convert layer to normal mode
Martin Renold [Wed, 8 Feb 2012 07:29:37 +0000 (08:29 +0100)]
new layer merging, convert layer to normal mode

- add convert_to_normal_mode()
- make it an undoable action with menu entry
- use it internally when merging layers

Discussions about merging behaviour:

The "convert layer to normal mode" may not be a very useful command
on its own. But it can help interoperability, so you don't have to
flatten the whole image if you switch to an application that doesn't
support a particular layer mode.

5 years agopixops: flat2rgba/rgba2flat infrastructure
Martin Renold [Mon, 6 Feb 2012 11:53:45 +0000 (12:53 +0100)]
pixops: flat2rgba/rgba2flat infrastructure

The idea is that a layer's rgba tile can be converted to flat and
back. While in flat mode, we can manipulate the colors that are
actually visible on-screen after compositing. When converting back
to rgba, the alpha is increased where required to achieve the
wanted on-screen effect (in normal blending mode).

Terminology for the 15bit pixel formats:
rgba = red*, green*, blue*, alpha (*premultiplied with alpha)
rgbu = red, green, blue, unused
flat = red, green, blue, minimum_alpha (used by flat2rgba)

5 years agohelp menu: translation contexts
Andrew Chadwick [Sun, 25 Nov 2012 03:14:38 +0000 (03:14 +0000)]
help menu: translation contexts

Add translation context to all items.

5 years agoscratch menu: strings review, translation contexts
Andrew Chadwick [Sun, 25 Nov 2012 03:05:04 +0000 (03:05 +0000)]
scratch menu: strings review, translation contexts

String review for the scratchpad menu. Add translation context to all
items. Slim labels down and edit for consistency.

5 years agocolor menu: strings review, translation contexts
Andrew Chadwick [Sun, 25 Nov 2012 02:20:41 +0000 (02:20 +0000)]
color menu: strings review, translation contexts

String review for the color menu. Add translation context to all items.

Move single-increment HSV manipulation commands to a submenu, and don't
refer to the HSV model in their blurbs. Pondering changing it to HCY.

5 years agobrush menu: strings review, translation contexts
Andrew Chadwick [Sun, 25 Nov 2012 00:02:49 +0000 (00:02 +0000)]
brush menu: strings review, translation contexts

String review for the brush menu. Add translation context to all items.

Language and terminology: attempting to be more consistent with other
similar concepts e.g. the "Opacity" of a layer. Try to balance with
shortening text to be more quickly readable in context.

* Strokes are now objects we can refer to.
  Outside a context in which we're not already talking about brushes,
  call them "Brushstrokes"; within, "Strokes" will suffice. If we need
  to refer to the strokemap in the future, perhaps use the terms
  "[brush]stroke information" or "[brush]stroke data"?

* Brushkeys are now called "Shortcut Keys".
  Rationale: split into separate words, don't repeat "Brush".

* The user's brush collection in the app, and 3rd party brush packs can
  both be referred to as "Brushes", plural. The distinction should become
  apparent in use.

Menu ordering: Saved brushes, then brush settings, then brush pack

5 years agoi18n: let translators write their credits
Martin Renold [Sat, 24 Nov 2012 13:33:51 +0000 (14:33 +0100)]
i18n: let translators write their credits

This is the usual way. It seemed shabby in the beginning when
there were only two or three translators. Seems pretty sane to
me today.

5 years agotablet detection: also match substrings
Martin Renold [Fri, 23 Nov 2012 20:05:34 +0000 (21:05 +0100)]
tablet detection: also match substrings

Fix for comment at
Device reported as " TabletPF1209".

5 years agoUI: connect mode flips, fix translation contexts
Andrew Chadwick [Fri, 23 Nov 2012 18:22:42 +0000 (18:22 +0000)]
UI: connect mode flips, fix translation contexts

Add menu items for mode radio flipping actions, and file them in the
correct menu for the thing being controlled by the mode. Move the radio
actions into a submenu; it's unlikely that anybody'll use them directly,
but they illustrate the concept, and give people who don't like the
flip-style actions an alternative action to bind a keypress to.

Translation contexts: add several, and correct the earlier approach
which used prose. Now use menu paths as described in

Translators: ensure you're using intltool-extract 0.41.1+: this should
be able to deal with contexts in UI XML despite what the GTK docs say :)

Shorten and neaten lots of menu items (using translation contexts to
disambiguate), and demote some extreme detail actions that are only
really there so users can bind them to a keypress into submenus near
their related entries.

Still some work to do here before the string freeze I haven't had the
time to review every menu item (Brush, Color and Scratchpad, primarily)

Add sensible (to me) key bindings for the drawing modes:

    P = Freehand ([P]encil/[P]ainting)
    K = Lines and Kurves
    J = Connected ([J]oined) Lines
    O = Ellipses and Circles (letter shape, near freehand)

all of which bind to the mode flip action.

I guess we should start calling them tools now?

5 years agocanvasevent: fix docstrings
Andrew Chadwick [Fri, 23 Nov 2012 18:21:36 +0000 (18:21 +0000)]
canvasevent: fix docstrings

Sphinx "#:" docstring markers go before the variable.

5 years agoView menu: remove ViewHelp message
Andrew Chadwick [Fri, 23 Nov 2012 18:18:50 +0000 (18:18 +0000)]
View menu: remove ViewHelp message

Remove a somewhat unhelpful help message: panning and scrolling will be
obvious and/or inferrable from the prefs dialog, arrow keys are
conventional, and the blurb about memory looks fairly outdated.

5 years agomode stack: support contextual pushing, mode flips
Andrew Chadwick [Fri, 23 Nov 2012 18:10:31 +0000 (18:10 +0000)]
mode stack: support contextual pushing, mode flips

Add support for pushing modes onto the stack contextually, based on each
new mode's opinion of the modes it can usefully work on top of. Modes
now broadly fall into three categories:

 1. modes for drawing (freehand, straight/curve, sequence, ellipse)
 2. modes for editing other stuff (frame, symmetry one day...)
 3. modes for manipulating  the view

where higher numbers can stack onto lower ones sensibly, and pop back to

Also add support for radio flipping actions: sort of like toggle actions
but with the state stored in like-named radioactions. This will allow a
single key to be used for both push and pop, which is useful in the
above framework.

5 years agoColorize brush mode: move to shift-k
Andrew Chadwick [Fri, 23 Nov 2012 18:04:44 +0000 (18:04 +0000)]
Colorize brush mode: move to shift-k

It's a rather obscure little modifier, and I want to free unmodified "k"
up for Straight/Kurved line mode (which has slight issues with modifiers
when bound to an action, right now).

5 years agobrushlib: Fix build error and assert when building with debug=1
Jon Nordby [Fri, 23 Nov 2012 13:28:00 +0000 (14:28 +0100)]
brushlib: Fix build error and assert when building with debug=1

Linking the tests failed due to expecting a symbol for the inlined
calculate_rr and calculate_opa function.
The assert had simply been moved to the wrong lines during refactoring.

5 years agomode actions: more tool-like names; tooltip update
Andrew Chadwick [Thu, 22 Nov 2012 20:09:28 +0000 (20:09 +0000)]
mode actions: more tool-like names; tooltip update

Make the names of the mode actions more "tool-like", e.g. "Lines and
Curves", tweak others to look better in the buttonmap editor.  Update
tooltips a bit to reinforce the toolish names and make keypress
modifiers easier to scan.

5 years agobuttonmap editor: use human-readable strings
Andrew Chadwick [Thu, 22 Nov 2012 18:50:06 +0000 (18:50 +0000)]
buttonmap editor: use human-readable strings

Use translatable, human-readable strings when showing the button mapping
editor in the prefs dialog.

5 years agobuttonmap: generalize finding handler objects
Andrew Chadwick [Thu, 22 Nov 2012 18:46:15 +0000 (18:46 +0000)]
buttonmap: generalize finding handler objects

Add a generalized function for looking up which object is used for
handling a button mapping, and begin using it: the prefs dialog's button
mappings editor needs to do this, for example.

5 years agobuttonmap: no bindings for unmodified Button1
Andrew Chadwick [Thu, 22 Nov 2012 18:39:55 +0000 (18:39 +0000)]
buttonmap: no bindings for unmodified Button1

We shouldn't allow unmodified Button1 to be bound to any action for mode
switching: that button on its own should always work within the current
mode only and never cause a switch to something else.

5 years agoprefs: list only spring-loaded modes
Andrew Chadwick [Thu, 22 Nov 2012 18:35:29 +0000 (18:35 +0000)]
prefs: list only spring-loaded modes

Currently only spring-loaded modes will work usefully from button
mappings, so have the editor list only those modes as options. States,
the popup menu, and regular action bindings are unaffected.

5 years agodoc: more useful default strings for Undo/Redo
Andrew Chadwick [Thu, 22 Nov 2012 18:32:14 +0000 (18:32 +0000)]
doc: more useful default strings for Undo/Redo

Cosmetic. It's nice in a menu to have the labels for the Undo and Redo
actions describe the absence of anything on their corresponding stacks,
but appending this text makes the strings less useful for the button
mapping editor in preferences.

5 years agostategroup: display names for popup states
Andrew Chadwick [Thu, 22 Nov 2012 18:25:51 +0000 (18:25 +0000)]
stategroup: display names for popup states

Expose displayable names on our popup states, to permit the button
mapping editor to show meaningful, translated strings. These are taken
from the label string for the gtk.Action corresponding to each state.

5 years agolayer-move, linemodes: no-op if layer locked/invis
Andrew Chadwick [Thu, 22 Nov 2012 05:36:39 +0000 (05:36 +0000)]
layer-move, linemodes: no-op if layer locked/invis

Reject user input in LayerMoveMode and LineModeBase if the current layer
is locked or not visible. Modes which will do nothing show that they'll
do nothing via their cursors.

5 years agotdw: make cursors reflect model state better
Andrew Chadwick [Thu, 22 Nov 2012 05:17:36 +0000 (05:17 +0000)]
tdw: make cursors reflect model state better

Update the cursor when the model structure changes in order to reflect
changes to layer locking and visibility. Also on pointer entry, just in

5 years agofreehand: set the past painting position properly
Andrew Chadwick [Thu, 22 Nov 2012 04:17:58 +0000 (04:17 +0000)]
freehand: set the past painting position properly

Freehand mode should probably set the last painting position used by
sequence mode etc.: looks like it got missed in the refactor.

Resetting it on entry to the mode would probably be overkill.

5 years agoidletask: fix finish_all() data loss; add docs
Andrew Chadwick [Thu, 22 Nov 2012 03:10:11 +0000 (03:10 +0000)]
idletask: fix finish_all() data loss; add docs

Bugfix: finish_downto(0) didn't always empty the queue, which could
cause data loss for callers of finish_all().

Possibly this is caused by rounding, either inadvertantly to int or just
general floating-point weirdness.  Anyway, guard against it with type
forcing and assertions, and more importantly make finish_all() always do
what it it promises.

Document module.

5 years agoUpdate brushlib/PERFORMANCE
Jon Nordby [Tue, 9 Oct 2012 11:33:07 +0000 (13:33 +0200)]
Update brushlib/PERFORMANCE

5 years agobrushlib: Only use multiple threads if tile requests are declared threadsafe
Jon Nordby [Tue, 13 Nov 2012 22:45:02 +0000 (23:45 +0100)]
brushlib: Only use multiple threads if tile requests are declared threadsafe

5 years agobrushlib: Actually make the operationqueue resize automatically
Jon Nordby [Tue, 6 Nov 2012 10:14:41 +0000 (11:14 +0100)]
brushlib: Actually make the operationqueue resize automatically

Was hardcoded while evaluting the feasibility of the concept.

5 years agobrushlib: Pass mandatory args for MyPaintTiledSurface through constructor
Jon Nordby [Tue, 9 Oct 2012 12:39:37 +0000 (14:39 +0200)]
brushlib: Pass mandatory args for MyPaintTiledSurface through constructor

Makes it clearer for a subclass what is required.

5 years agobrushlib: Precalculate "rr" in render_dab_mask, make use of auto-vectorization
Jon Nordby [Mon, 17 Sep 2012 20:19:26 +0000 (22:19 +0200)]
brushlib: Precalculate "rr" in render_dab_mask, make use of auto-vectorization

5 years agobrushlib: Split out inner-loop calculations in render_dab_mask
Jon Nordby [Mon, 17 Sep 2012 18:35:15 +0000 (20:35 +0200)]
brushlib: Split out inner-loop calculations in render_dab_mask

Again makes it easier to see dependencies between different
pieces of code. Seems like it also gives a small speedup (<5%).

5 years agobrushlib: Minimize scope of variables in render_dab_mask
Jon Nordby [Mon, 17 Sep 2012 17:38:06 +0000 (19:38 +0200)]
brushlib: Minimize scope of variables in render_dab_mask

Makes the dependencies between variables clearer.

5 years agobrushlib: Process get_color in parallel using OpenMP
Jon Nordby [Mon, 17 Sep 2012 17:11:08 +0000 (19:11 +0200)]
brushlib: Process get_color in parallel using OpenMP

5 years agobrushlib: Process tiles mypaint_tiled_surface_end_atomic in parallel using OpenMP
Jon Nordby [Sun, 16 Sep 2012 10:35:16 +0000 (12:35 +0200)]
brushlib: Process tiles mypaint_tiled_surface_end_atomic in parallel using OpenMP

5 years agobuild: Add option to enable OpenMP based multithreading
Jon Nordby [Sun, 16 Sep 2012 10:22:30 +0000 (12:22 +0200)]
build: Add option to enable OpenMP based multithreading

Use "scons enable_openmp=true"

5 years agobrushlib: Fix two memory management errors
Jon Nordby [Sun, 16 Sep 2012 20:33:57 +0000 (22:33 +0200)]
brushlib: Fix two memory management errors

5 years agoMake tile store interface in MyPaintTiledSurface concurrency friendly
Jon Nordby [Sun, 16 Sep 2012 10:51:37 +0000 (12:51 +0200)]
Make tile store interface in MyPaintTiledSurface concurrency friendly

Store a request state object in the consumer that wants to get/set tiles,
and allow tile stores to attach information to this object at the
start of a request, and use this to finalize the request on a subsequent
The C++ interfaces used in MyPaint is not changed. Instead the wrapper
classes serializes requests so that one happens at a time.

5 years agobrushlib: Call mypaint_tiled_surface_update_tile() after read-only _get_tile()
Jon Nordby [Sun, 16 Sep 2012 10:23:31 +0000 (12:23 +0200)]
brushlib: Call mypaint_tiled_surface_update_tile() after read-only _get_tile()

All get_tile/update_tile are now done in pairs, so implementations
can sanely keep state between them.

5 years agobrushlib: Prepare the list of dirty tiles in operation_queue_add
Jon Nordby [Sat, 15 Sep 2012 15:40:40 +0000 (17:40 +0200)]
brushlib: Prepare the list of dirty tiles in operation_queue_add

Gets rid of the overhead the iterations of the tile map that
operation_queue_get_tiles() used to cause.
This means that operation_queue_add is no longer thread-safe.

5 years agobrushlib: Let dab mask be on stack instead of static
Jon Nordby [Fri, 14 Sep 2012 19:40:39 +0000 (21:40 +0200)]
brushlib: Let dab mask be on stack instead of static

Required for concurrent use of get_color and process_tile,
as the mask should be in thread-local storage.

5 years agobrushlib: Don't use recursion for symmetry in draw_dab
Jon Nordby [Fri, 14 Sep 2012 11:01:56 +0000 (13:01 +0200)]
brushlib: Don't use recursion for symmetry in draw_dab

There was always only two levels of recursion, with a simple
transformations of the input parameters, so it is much
clearer to just do the two calls directly.

5 years agobrushlib: Flush queued draw_dab operations on get_color
Jon Nordby [Fri, 14 Sep 2012 11:05:25 +0000 (13:05 +0200)]
brushlib: Flush queued draw_dab operations on get_color

The result of get_color, which must be returned to the brush engine
immediately may depend on the draw_dab operations for the affected tiles.
Also add some comments about where we can use OpenMP concurrent processing.

5 years agobrushlib: Move processing from draw_dab to end_atomic
Jon Nordby [Tue, 28 Aug 2012 14:08:58 +0000 (16:08 +0200)]
brushlib: Move processing from draw_dab to end_atomic

This will allow draw_dab operations to queue up and only
be processed at the end of the transaction.
Also allocate a temporary operation stuct on the stack instead of heap.

5 years agobrushlib: Actually implement queueing in OperationQueue
Jon Nordby [Tue, 28 Aug 2012 15:49:55 +0000 (17:49 +0200)]
brushlib: Actually implement queueing in OperationQueue

The size of the operation map is still hardcoded however,
and will need to be able to expand dynamically in order
to be a general solution.

5 years agobrushlib: Prepare for queued processing of operations
Jon Nordby [Sat, 23 Jun 2012 21:36:29 +0000 (23:36 +0200)]
brushlib: Prepare for queued processing of operations

Introduce the OperationQueue class, which will hold operations
to be processed. Right now the API is in place, but only holds one
operation per tile. This is sufficient as long as we do immediate
processing (the op is pushed and popped within a single draw_dab call).

5 years agobrushlib: Allocate draw_dab operation on heap
Jon Nordby [Sat, 23 Jun 2012 20:51:07 +0000 (22:51 +0200)]
brushlib: Allocate draw_dab operation on heap

5 years agobrushlib: Make draw_dab an operation that can be stored
Jon Nordby [Sat, 23 Jun 2012 20:45:17 +0000 (22:45 +0200)]
brushlib: Make draw_dab an operation that can be stored

Also separate out processing of a single tile to its own function.
This makes the dependencies of the tile processing clear, as
well as the interdependencies between processing of different tiles.

5 years agobrushlib: Update TODO
Jon Nordby [Wed, 21 Nov 2012 17:14:53 +0000 (18:14 +0100)]
brushlib: Update TODO

5 years agotoolbar: some initial rationalization
Andrew Chadwick [Wed, 21 Nov 2012 02:03:36 +0000 (02:03 +0000)]
toolbar: some initial rationalization

Sort out the viewport manipulation stuff a bit. More options for turning
irrelevant buttons off. Cluster the icons for special, non-line-drawing
modes. Subwindow buttons on the right. Replace vertical mirror with
the more useful fit-to-view action.

5 years agoicons: revamp and cleanup
Andrew Chadwick [Tue, 20 Nov 2012 12:26:16 +0000 (12:26 +0000)]
icons: revamp and cleanup

Make a stronger icon for layer moving, and update the layers window icon
to match.

New brush-mods-{active,inactive} icons. The old ones were annoying me by
not being pixel-aligned.

Distinguish more clearly between icon sources and resources.

Update icon exporter script to also save scalable versions (with a
little manual help in Inkscape). This requires a new template for all
icon sources.

Replace the weak frame edit mode icon with a nicer ormolu picture frame
icon derived and SVG-ified from the Fatcow Hosting set: CC-By 3.0 (US).

Clean out some old pixmaps/ icons we no longer use.

Update LICENSE for new frame icon, and remove no-longer relevant clause.

5 years agoframe dialog: add unit and dpi selection
Till Hartmann [Tue, 20 Nov 2012 14:12:39 +0000 (15:12 +0100)]
frame dialog: add unit and dpi selection

Add unit and dpi selection to frame dialog.

5 years agogegl: Fix crash in due to GTK+2 being pulled in
Jon Nordby [Mon, 19 Nov 2012 17:19:34 +0000 (18:19 +0100)]
gegl: Fix crash in due to GTK+2 being pulled in

5 years agocanvasevent: reinstate missing ColorPickerPopup
Andrew Chadwick [Sun, 18 Nov 2012 23:50:22 +0000 (23:50 +0000)]
canvasevent: reinstate missing ColorPickerPopup

Offer the color picker and as an allowed action when switching modes
with the pointer + modifiers. It got dropped by accident. Early testers
may need to manually reinstate it on <Control>Button1 or <Alt>Button1;
sorry. Thanks to savageorange on the forums for spotting the omission!

5 years Call begin_atomic/end_atomic periodically
Jon Nordby [Sun, 18 Nov 2012 17:46:53 +0000 (18:46 +0100)] Call begin_atomic/end_atomic periodically

Work-around for a crash in the brush engine, but also is how the
API is typically used in the application.
Also makes sure that end_atomic() is inside the measured section.

5 years agocanvasevent: permit more in move-layer; split hack
Andrew Chadwick [Sun, 18 Nov 2012 17:23:54 +0000 (17:23 +0000)]
canvasevent: permit more in move-layer; split hack

Allow more button-bound commands in the move-layer mode; Undo for

Hacky (but probably correct and vaguely helpful) fix for button-bound
undo not being able to undo the last partial stroke. Improves
responsibility for one-handed tablet-only operation, but really this
needs addressing somewhere else, e.g. by enabling the Undo GtkAction
when any paint dab hits the canvas and ensuring Undo performs a split.

5 years agolib: Add brushlib perf tests for Python-based tile surface
Jon Nordby [Sat, 17 Nov 2012 18:32:39 +0000 (19:32 +0100)]
lib: Add brushlib perf tests for Python-based tile surface

A bit complicated since the brushlib tests are in C, and the surface
implementation parly in Python. Have to embedd a Python interpreter
in the executable, and get the C surface interface from the Python instance
using SWIG.

5 years agobrushlib/tests: Test different brush sizes
Jon Nordby [Wed, 14 Nov 2012 01:20:37 +0000 (02:20 +0100)]
brushlib/tests: Test different brush sizes

5 years agopalettes: add tigert's watercolour palette
Andrew Chadwick [Sat, 17 Nov 2012 23:19:03 +0000 (23:19 +0000)]
palettes: add tigert's watercolour palette

Tuomas Kuosmanen confirms that it's OK for us to treat this as PD, and
it fits the pattern of the nice, naturalistic palettes we want.

5 years agomodes: make more of them switchable
Andrew Chadwick [Sat, 17 Nov 2012 18:34:21 +0000 (18:34 +0000)]
modes: make more of them switchable

Factor out switchability, allowing more modes to push temporary
sub-modes (and perform arbitrary actions) in response to configured user
input. In other words, panning, rotating and zooming with button 2 is
now supported when adjusting the frame. That plus any non-mode action is
now possible from line-geometry modes.

5 years agomodes: make more of them switchable
Andrew Chadwick [Sat, 17 Nov 2012 18:34:21 +0000 (18:34 +0000)]
modes: make more of them switchable

Factor out switchability, allowing more modes to push temporary
sub-modes (and perform arbitrary actions) in response to configured user
input. In other words, panning, rotating and zooming with button 2 is
now supported when adjusting the frame. That plus any non-mode action is
now possible from line-geometry modes.

5 years agoRemove some debug print cruft
Andrew Chadwick [Sat, 17 Nov 2012 18:32:48 +0000 (18:32 +0000)]
Remove some debug print cruft

5 years agomodes: begin using fancy cursors
Andrew Chadwick [Sat, 17 Nov 2012 18:29:21 +0000 (18:29 +0000)]
modes: begin using fancy cursors

Enable the fancy cursor stuff in various modes.

5 years agoapplication: add central compositing cursor cache
Andrew Chadwick [Sat, 17 Nov 2012 17:17:00 +0000 (17:17 +0000)]
application: add central compositing cursor cache

Modes should have better cursors which contain their icons, so add the
capability to composite new cursors from the mode's own icon, or an
arbitrary "pixbufs/" pixmap image.

Tidied up some old pixbufs.

Update license: the cursors' Expat ("MIT") license is considered
GPL-compatible by the Free Software Foundation, Inc.:

5 years agoLayerMoveMode: fix spacebar drags
Andrew Chadwick [Fri, 16 Nov 2012 03:03:57 +0000 (03:03 +0000)]
LayerMoveMode: fix spacebar drags

Fix exception: drags can be started with the space bar, but keypresses
don't have .x and .y. Use the workaround we set up earlier for this very

5 years agocanvasevent: docstring fixes
Andrew Chadwick [Fri, 16 Nov 2012 03:03:07 +0000 (03:03 +0000)]
canvasevent: docstring fixes

5 years agospring-loaded drags: fix spacebar key-up
Andrew Chadwick [Fri, 16 Nov 2012 03:00:11 +0000 (03:00 +0000)]
spring-loaded drags: fix spacebar key-up

The special case only applies for modifier key-ups. This was causing
spacebar drags to not release properly.

5 years agocanvasevent: improve flow for spring-loaded modes
Andrew Chadwick [Thu, 15 Nov 2012 19:11:39 +0000 (19:11 +0000)]
canvasevent: improve flow for spring-loaded modes

Make spring-loaded modes actually persist for as long as modifiers are
held. Not bouncing between modes will be better for UI feedback.

One little benefit: (any modifiers)+(toolbar button click) now engages a
"secret" versions of some modes which lasts only for as long as the
modifiers are held. For frame manipulation this means the dialogless
version of the mode. Really the "secret" version is just what you get
when you bind it to a (modified) button press via preferences.

Fix: releasing modifiers while dragging in oneshot+spring-loaded modes
should not exit the mode. That now happens correctly when the drag

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)

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

6 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).

6 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

6 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 <>
6 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

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

implicit declaration of snprintf