4 years agofreehand: Split out per-TDW drawstate
Andrew Chadwick [Thu, 24 Oct 2013 02:08:00 +0000 (03:08 +0100)]
freehand: Split out per-TDW drawstate

Keep per-TDW drawing state together in a struct.

4 years agoeventhack: interpolate pressure and tilt axes
Andrew Chadwick [Tue, 22 Oct 2013 03:15:31 +0000 (04:15 +0100)]
eventhack: interpolate pressure and tilt axes

The eventhack code doesn't record pressure or tilt since that requires
knowledge of the maxima and minima for their raw readings in order to be
compatible with GDK's translated values. Such code would be fragile, so
instead interpolate their values based on the detailed eventhack times and
the time and axis values from the coarse events that make it through GDK's
motion compression.

Move pressure and tilt faking and sanity checking up front, since we now
interpolate using the sanitized values from this phase.

4 years agoeventhack: acquire GIL, bump data tuple refcount
Andrew Chadwick [Mon, 21 Oct 2013 11:55:17 +0000 (12:55 +0100)]
eventhack: acquire GIL, bump data tuple refcount

Ubuntu 13.10 (and maybe other systems) require the GIL to be held during
then event filter, so wrap the filter in the appropriate calls. Not
required for all systems, but it's good practice to do this given that the
filter uses Python API calls outside the scope of the Python interpreter,
where execution may or may not be threaded. Fixes a segfault on affected

Also bump the data tuple's refcount for the duration of the filter's
operation, if the display type is supported. Technically not needed given
the framework in which it's called, but will be safer in case of error.

4 years agoinput events: add event filter to improve capture
Andrew Chadwick [Sun, 20 Oct 2013 02:13:11 +0000 (03:13 +0100)]
input events: add event filter to improve capture

Add an experimental GDK event filter to capture events before GDK itself
can motion-compress them and thus break our drawing accuracy. See

Good coding practice dictates that we don't try to do too much inside this
fairly horrid little hack, so we only queue the pointer position and the
timestamp. For all the events GDK 3.8+ drops on the floor during a frame
clock cycle (which the filter now captures), we use the tilt and pressure
info from the event on the event that did make it through. Interpolating
would be better.

Before: 50-60 events/second for all devices.
After: 200 events/second with an Intuos 5. 80 with a touchpad.

This hack only works on X11 platforms right now

4 years agocanvasevent: per-tdw state, simplify queue API
Andrew Chadwick [Sun, 20 Oct 2013 01:55:25 +0000 (02:55 +0100)]
canvasevent: per-tdw state, simplify queue API

Make last-event times and had-pressure flags per-TDW instead of cross-TDW.
Events may theoretically arrive on any drawing widget.

Remove the need to pass devices around: we now detect device changes in the
direct event handler.

4 years agocanvasevent: add some rate-debugging code
Andrew Chadwick [Sun, 20 Oct 2013 01:51:33 +0000 (02:51 +0100)]
canvasevent: add some rate-debugging code

4 years agocanvasevent: completely remove the stroke queue
Andrew Chadwick [Sun, 20 Oct 2013 01:42:35 +0000 (02:42 +0100)]
canvasevent: completely remove the stroke queue

4 years agofill: fix mem leaks, add debugging checks
Andrew Chadwick [Sun, 20 Oct 2013 16:27:45 +0000 (17:27 +0100)]
fill: fix mem leaks, add debugging checks

The fill routine was being way too lax about reference counts.

4 years agopaletteview: fix exception when opening properties
Andrew Chadwick [Sun, 20 Oct 2013 14:17:05 +0000 (15:17 +0100)]
paletteview: fix exception when opening properties


4 years agotopbar: fix styling in some themes
Andrew Chadwick [Thu, 17 Oct 2013 19:15:26 +0000 (20:15 +0100)]
topbar: fix styling in some themes

Rework the way the menu button repacks, raiding git for the old "window
sandwich" approach and modernizing its code. No custom class assignment
during repacks now because things look too weird if we do: borders on
toolbar buttons and other ugliness.

Tested in: Numix, Orion, Albatross, Adwaita, Clearlooks, Mediterranean
Night, Greybird, Zukitwo. All as of 2013-10-17 under GTK 3.8.

Add test code for the topbar. No API changes.

4 years agolib: Split out Python specific parts of save_png_fast_progressive()
Jon Nordby [Fri, 11 Oct 2013 21:15:10 +0000 (23:15 +0200)]
lib: Split out Python specific parts of save_png_fast_progressive()

4 years agolib: Fix wrong checking of bounding box in end_atomic()
Jon Nordby [Fri, 11 Oct 2013 17:54:58 +0000 (19:54 +0200)]
lib: Fix wrong checking of bounding box in end_atomic()

Introduced in previous commit

4 years agolib: Use return value of TiledSurface::end_atomic() instead of calling Python from...
Jon Nordby [Fri, 11 Oct 2013 16:01:05 +0000 (18:01 +0200)]
lib: Use return value of TiledSurface::end_atomic() instead of calling Python from inside

Lets us get rid of custom begin/end_atomic handlers.
Side-effect: if manipulating the surface directly from C/C++,
the observers in Python will no longer be fired.

4 years agobrushlib: Add const some more places
Jon Nordby [Fri, 11 Oct 2013 16:38:48 +0000 (18:38 +0200)]
brushlib: Add const some more places

4 years agobrushlib: Add operation_queue_peek_first/last()
Jon Nordby [Fri, 11 Oct 2013 16:36:22 +0000 (18:36 +0200)]
brushlib: Add operation_queue_peek_first/last()

4 years agobrushlib: OperationQueue only updated dirty tiles on Fifo
Jon Nordby [Fri, 11 Oct 2013 15:48:34 +0000 (17:48 +0200)]
brushlib: OperationQueue only updated dirty tiles on Fifo

Causes problems if not recreating Fifo's when they have been emptied.
Never happens during current MyPaint usage though.

4 years agohcywheel: fix gamuts in New not showing
Andrew Chadwick [Thu, 10 Oct 2013 23:44:35 +0000 (00:44 +0100)]
hcywheel: fix gamuts in New not showing

Should really centralize masks the same way as we've centralized the
palette, I guess.

4 years agoFix incorrect path for palettes on first run
Andrew Chadwick [Thu, 10 Oct 2013 20:30:49 +0000 (21:30 +0100)]
Fix incorrect path for palettes on first run

Fix an "No such file or directory: u'./palettes/MyPaint_Default.gpl'"
exception when installing fully. MyPaint wasn't communicating its palette
search path correctly to its color record-keeper component after creating a
new-style config tree on its first run. This was only happening when
running the first time from somewhere other than the build tree.

Compounding the error, running from the build tree just one time somewhat
unhelpfully makes this error message go away by loading the default palette
from the file in the build tree, where the default value happens to be the
right path. This sequence of events conspires to hide the underlying fault
from testers and developers in subsequent runs.

Fixed by making the parameters to ColorManager mandatory (since then
failure to supply useful args will result in a more identifiable

Thanks to deevad for the good spot here:

4 years agofeedback: turn off zoom overlay by default
Andrew Chadwick [Thu, 10 Oct 2013 01:54:01 +0000 (02:54 +0100)]
feedback: turn off zoom overlay by default

The zoom overlay is cute, but it's a somewhat unnecessary distraction,
especially in fullscreen. Could reinvent it as a fullscreen-only option,
along with a way of showing other info currently displayed via the footer/

4 years agofooter bar: add scale/rotation, add options button
Andrew Chadwick [Thu, 10 Oct 2013 01:41:00 +0000 (02:41 +0100)]
footer bar: add scale/rotation, add options button

Add a label showing the main view's scale and rotation to the footer bar.

Add an button to the footer near the mode icon to show the current options

4 years agofooter mode display: refactor, add icon tooltip
Andrew Chadwick [Thu, 10 Oct 2013 01:36:57 +0000 (02:36 +0100)]
footer mode display: refactor, add icon tooltip

Drop display of the mode's name in text form to save space in the

Make the statusbar mode icon more useful: its tooltip now shows the mode's
name and the related action's tooltip.

Move update responsibilities from gui.document to gui.drawwindow.

4 years agolinemode: various comment updates
Andrew Chadwick [Thu, 10 Oct 2013 01:31:25 +0000 (02:31 +0100)]
linemode: various comment updates

4 years agomessage revamp: update usage messages etc.
Andrew Chadwick [Thu, 10 Oct 2013 01:19:25 +0000 (02:19 +0100)]
message revamp: update usage messages etc.

Shorten and simplify mode usage messages and tooltips.
Fix a hang-over translation context issue.
Fix incorrect fill action tooltip.

4 years agoworkspace: make paned contents prettier
Andrew Chadwick [Mon, 7 Oct 2013 16:22:24 +0000 (17:22 +0100)]
workspace: make paned contents prettier

Add visible frames implemented as GtkScrolledWindow wrappers for the
sidebar and canvas Paned slots to improve the distinctiveness of these
elements from their flanking toolbar and statusbar.

We now automatically repack the central canvas's widget hierarchy to make
its frame vanish when entering fullscreen mode, and undo the change when
leaving.  Users will want the full extent of the screen when fullscreened.

Using a GtkScrolledWindow and not a GtkFrame for the canvas makes the UI
more consistent (my test themes assign different appearances to frames and
scrolledwindows inside paned). It also raises the possibility of "merely"
exposing a couple of GtkAdjustments on the TiledDrawWidget to allow real
scrolling, at least when MyPaint is not in fullscreen mode.  A somewhat
dynamic system where the visible extents are the actual document bbox plus
one sensibly-sized page might work acceptably (i.e. patches welcome).

4 years agotdw: publish viewport updates via an @event
Andrew Chadwick [Mon, 7 Oct 2013 16:19:54 +0000 (17:19 +0100)]
tdw: publish viewport updates via an @event

Add a subscribeable lib.observable.event which triggers whenever the
renderer's cached transformation matrix is regenerated.

4 years agooptions: transitions fix for common ancestries
Andrew Chadwick [Mon, 7 Oct 2013 16:16:18 +0000 (17:16 +0100)]
options: transitions fix for common ancestries

Fix mode subclasses with a common ancestry which use the same base class
singleton options panel, for example Line mode and Ellipse mode.
Transitions between them weren't updating the label and icon.

4 years agodoc: Add some notes around performance
Jon Nordby [Sat, 6 Jul 2013 14:01:20 +0000 (16:01 +0200)]
doc: Add some notes around performance

4 years agolib: Make more pixops usable from pure C/C++
Jon Nordby [Wed, 9 Oct 2013 22:33:19 +0000 (00:33 +0200)]
lib: Make more pixops usable from pure C/C++

Separate Python wrappers from the processing code.

4 years agolib: Const correctness for tile_copy_rgba16_into_rgba16_c
Jon Nordby [Wed, 9 Oct 2013 22:22:02 +0000 (00:22 +0200)]
lib: Const correctness for tile_copy_rgba16_into_rgba16_c

4 years agobrushlib: Return MyPaintRectangle from mypaint_surface_end_atomic(), not pointer...
Jon Nordby [Wed, 9 Oct 2013 21:08:07 +0000 (23:08 +0200)]
brushlib: Return MyPaintRectangle from mypaint_surface_end_atomic(), not pointer [API]

Returning pointers is always icky; who frees and when.

4 years agolib: Avoid circular dependency between tiledsurface and pixbufsurface+strokemap
Jon Nordby [Sat, 13 Jul 2013 18:53:26 +0000 (20:53 +0200)]
lib: Avoid circular dependency between tiledsurface and pixbufsurface+strokemap

4 years agobrushlib: Rename MyPaintTiledSurfaceTileRequest, add mipmap level [API]
Jon Nordby [Sat, 13 Jul 2013 18:27:28 +0000 (20:27 +0200)]
brushlib: Rename MyPaintTiledSurfaceTileRequest, add mipmap level [API]

Now called MyPaintTileRequest. mypaint_tiled_surface_tile_request_init()
becomes mypaint_tile_request_init().
Prepare for more awareness of mipmap levels in brushlib by adding it to tile request.
For now, backends may assume that this level is always 0 when called by libmypaint.

4 years agolib: Allow C++ code in pythontiledsurface
Jon Nordby [Sun, 7 Jul 2013 02:50:04 +0000 (04:50 +0200)]
lib: Allow C++ code in pythontiledsurface

4 years agogui: Use new-style classes everywhere
Jon Nordby [Tue, 8 Oct 2013 09:04:02 +0000 (11:04 +0200)]
gui: Use new-style classes everywhere

Newer Python or PyGObject in Arch Linux complaints/warns about
old-style classes.

4 years agocolorpicker: fix construction
Andrew Chadwick [Mon, 7 Oct 2013 16:41:54 +0000 (17:41 +0100)]
colorpicker: fix construction

Case issue during construction. Oops.

4 years agoframe: reveal when entering the mode
Andrew Chadwick [Sun, 6 Oct 2013 13:17:41 +0000 (14:17 +0100)]
frame: reveal when entering the mode

Show the frame when entering the mode. This includes picking a sensible
size if it doesn't have one yet, so that the user can adjust it
immediately on the canvas.

4 years agoframe: altering the frame now enables frame 1st
Andrew Chadwick [Sun, 6 Oct 2013 04:39:06 +0000 (05:39 +0100)]
frame: altering the frame now enables frame 1st

One small step to making things more discoverable: user commands which
tweak the frame now make it visible. This addition visibility step is
undoable along with the tweak.

4 years agoframewindow: rm some commented out stuff
Andrew Chadwick [Sun, 6 Oct 2013 04:37:20 +0000 (05:37 +0100)]
framewindow: rm some commented out stuff

4 years agoframe: use proper overlay, show editable elements
Andrew Chadwick [Sat, 5 Oct 2013 21:37:44 +0000 (22:37 +0100)]
frame: use proper overlay, show editable elements

Move drawing the frame to an overlay object, and make it aware of the mode
stack. If the user is currently editing the frame, draw the adjustable
edges and corners and highlight them if the pointer is near them.

Some minor adjustments to the hit-boxing tests to work better with a
visible frame.

Rationale: makes the operation of FrameEditMode more obvious.

Side effects: frame will no longer be drawn on the preview window. Is this
likely to be an issue? More redraws and calculations within FrameEditMode.

4 years agooverlays: base on object
Andrew Chadwick [Sat, 5 Oct 2013 19:46:05 +0000 (20:46 +0100)]
overlays: base on object

Convert to new-style classes, for python3 migration at some point.

4 years agofix icons: 256px icon was not in correct place
Andrew Chadwick [Sat, 5 Oct 2013 19:40:25 +0000 (20:40 +0100)]
fix icons: 256px icon was not in correct place

4 years agooptions panel: fix annoying logged exception
Andrew Chadwick [Mon, 30 Sep 2013 20:15:14 +0000 (21:15 +0100)]
options panel: fix annoying logged exception

4 years agofill: use the GIMP's matching algorithm
Andrew Chadwick [Mon, 30 Sep 2013 18:15:35 +0000 (19:15 +0100)]
fill: use the GIMP's matching algorithm

Use the GIMP's colour matching algorithm during fill: it gives better
results and allows fills to butt up against anti-aliased lines more
convincingly with larger thresholds.

4 years agorefactor linemode curves, fix opts panel reset
Andrew Chadwick [Sun, 29 Sep 2013 13:10:58 +0000 (14:10 +0100)]
refactor linemode curves, fix opts panel reset

Since we (perhaps temporarily) have two line mode curves now, refactor it
into its own class and make sure instances are updated by, and update their
model appropriately.

Line modes' option panel now resets the pressure/distance curve.

Drawing mode options panel reset buttons now reset just the options sliders
the user sees to the default, not all settings.

4 years agooptions panel: really really show AttributeErrors
Andrew Chadwick [Sun, 29 Sep 2013 13:08:14 +0000 (14:08 +0100)]
options panel: really really show AttributeErrors

Rework access to the options widget for a mode by the options panel to use
a method and not an attribute. Even hasattr() catches AttributeError, and
this is common during development, making debugging this thing a PITA.

4 years agoline modes: make switchable
Andrew Chadwick [Sat, 28 Sep 2013 06:33:05 +0000 (07:33 +0100)]
line modes: make switchable

Allow pan/rotate/zoom to be switched to temporarily with the pointer when
drawing lines. Sadly the default color picker pointer binding clashes with
the line mode keys, so we can't allow that to be switched into just yet.

4 years agominor comment fixup
Andrew Chadwick [Sat, 28 Sep 2013 06:32:50 +0000 (07:32 +0100)]
minor comment fixup

4 years agomodes: simplify stacking
Andrew Chadwick [Sat, 28 Sep 2013 06:29:58 +0000 (07:29 +0100)]
modes: simplify stacking

Modes are now divided into main modes which sit at the base of the mode
stack, and temporary helper modes which can sit on top of them. Simplifies
maintenance: reduces the amount modes need to know about the existence of
other modes.

4 years agoframe edit mode: fix an exception
Andrew Chadwick [Sat, 28 Sep 2013 06:27:42 +0000 (07:27 +0100)]
frame edit mode: fix an exception

Fix a rare exception when using color picker mode from frame edit mode.

4 years agofill: allow menu
Andrew Chadwick [Sat, 28 Sep 2013 06:27:09 +0000 (07:27 +0100)]
fill: allow menu

4 years agomodes: more careful mode exit pop()s
Andrew Chadwick [Sat, 28 Sep 2013 06:24:34 +0000 (07:24 +0100)]
modes: more careful mode exit pop()s

Avoids a double-pop when exiting colour picker mode by key-up.

4 years agoswitchy modes: filter modifier messages in taskbar
Andrew Chadwick [Sat, 28 Sep 2013 06:21:08 +0000 (07:21 +0100)]
switchy modes: filter modifier messages in taskbar

Apply the mode's permitted_switch_actions as a filter for what's possible
when deciding what message to display.

4 years agofill: feedback fixes: cursor setting & sensitivity
Andrew Chadwick [Sat, 28 Sep 2013 06:17:09 +0000 (07:17 +0100)]
fill: feedback fixes: cursor setting & sensitivity

The options widget shouldn't be made insensitive. Bad idea: the user may
want to adjust stuff even if filling won't work right now due to a layer
being locked or the cursor being outside the frame.

Fix the cursor being incorrect when the mode is entered by a key press.

4 years agofill: minor tweaks and fixes
Andrew Chadwick [Thu, 26 Sep 2013 23:49:40 +0000 (00:49 +0100)]
fill: minor tweaks and fixes

Fix an undo refresh bug with the command stack entry.

Minor code understandability tweaks.

4 years agofill: options panel for tolerance, sample merged
Andrew Chadwick [Wed, 25 Sep 2013 05:37:28 +0000 (06:37 +0100)]
fill: options panel for tolerance, sample merged

Add an options panel to flood fill mode, with options for Sample Merged and
Tolerance. Also an experimental "make new layer" one-shot toggle.

Various minor cursor setting tweaks.

Make Layer's flood_fill() accept a target layer argument, and Surface's a
target surface. Avoids mixing layers of abstraction in the API.

4 years agoworkspace: test for attrs, don't use exceptions
Andrew Chadwick [Wed, 25 Sep 2013 05:35:01 +0000 (06:35 +0100)]
workspace: test for attrs, don't use exceptions

Code style: it's better to test for attrs explicitly rather than rely on
catching the exceedingly generic AttributeError. Rationale: these attrs can
be, and often are, methods with their own code. We want to know about this
exception if/when it happens.

4 years agoGTK3: use inline-toolbar for button map editor
Andrew Chadwick [Wed, 25 Sep 2013 05:34:01 +0000 (06:34 +0100)]
GTK3: use inline-toolbar for button map editor

4 years agooptions_widget: add for various modes
Andrew Chadwick [Wed, 25 Sep 2013 05:31:33 +0000 (06:31 +0100)]
options_widget: add for various modes

Add an options panel for drawing modes, view manipulation modes, and the
frame editing mode.

4 years agomode options: add a dockable panel widget
Andrew Chadwick [Wed, 25 Sep 2013 05:21:20 +0000 (06:21 +0100)]
mode options: add a dockable panel widget

4 years agofill: threshold, fill to intermediate array
Andrew Chadwick [Fri, 13 Sep 2013 11:15:19 +0000 (12:15 +0100)]
fill: threshold, fill to intermediate array

Add a threshold feature, and implement filling into a user-supplied
tiledict (which we then composite directly onto the source, for now).

4 years agoflood-fill: complete implementation
Andrew Chadwick [Thu, 12 Sep 2013 01:34:14 +0000 (02:34 +0100)]
flood-fill: complete implementation

Implement flood fill mode.
Add proper icons (taken from Inkscape's dist; GPLv2).
Various range bugfxes.
Flood-fill without a frame or any content at all fills first: one tile,
with no frame and some content: the area including the existing content and
the seed point.
Fill empty tiles with a slice assignment.

4 years agofill: Add missing header (oops)
Andrew Chadwick [Sat, 7 Sep 2013 23:38:04 +0000 (00:38 +0100)]
fill: Add missing header (oops)

4 years agoBasic flood fill feature
Andrew Chadwick [Sat, 7 Sep 2013 17:36:37 +0000 (18:36 +0100)]
Basic flood fill feature

Add a very basic flood fill command. Currently only fills the current
layer, and does not consider layers underneath the current one when
considering which area to fill. Zero-alpha areas can be filled.

MyPaint uses an infinite canvas, so the flood fill is limited by the
document's effective bounding box (i.e. its frame if enabled, or the extent
of all its tiles in all layers).

4 years agotiledsurface: fix get_color()'s return for Python
Andrew Chadwick [Sat, 7 Sep 2013 17:33:09 +0000 (18:33 +0100)]
tiledsurface: fix get_color()'s return for Python

Make get_color() return a value SWIG can transform to a Python RGBA tuple.
Flood-fill won't necessarily use this, and it isn't used anywhere right
now, though the Python document model object exposes it in its API.

Maybe the picker could use it some day.

4 years agoupdated app icon
Jakub Steiner [Fri, 13 Sep 2013 18:16:35 +0000 (20:16 +0200)]
updated app icon

4 years agobrushiconeditor: small UI tidy up.
Leonardo A. Pereira [Thu, 22 Aug 2013 21:24:00 +0000 (18:24 -0300)]
brushiconeditor: small UI tidy up.

Buttons were reorganized and a spaces between them were added.

4 years agocanvasevent: turn off stroke queueing
Andrew Chadwick [Wed, 4 Sep 2013 12:17:00 +0000 (13:17 +0100)]
canvasevent: turn off stroke queueing

Stroke data queueing (and its cheesy interpolation) wasn't liked by our
testers, so turn it off by default. We can remove it later on if the GTK
team provide a fix for motion compression, or if we come up with a proper
solution ourselves; conversely, we can make it an option if that's not
going to happen.

Event queueing is still enabled, since it speeds things up measurably and
doesn't introduce any slow-tracking-like behaviour.

Switch to collections.deque rather than list for queues, again in the name
of reducing overhead during event processing. Deques are just under twice
as fast as lists for queue and stack behaviour.

4 years agoload_ora(): fix mispositioned frames
Andrew Chadwick [Tue, 20 Aug 2013 22:47:59 +0000 (23:47 +0100)]
load_ora(): fix mispositioned frames

Bugfix: the active frame size was being set, but not its position (which
should always be the origin of the MyPaint canvas). More apparent now that
the frame is enabled automatically if a non-whole-document-bbox size is
found in a loaded OpenRaster image.

4 years agostrokemap: allow non-tile-aligned stroke loading
Andrew Chadwick [Tue, 20 Aug 2013 22:28:17 +0000 (23:28 +0100)]
strokemap: allow non-tile-aligned stroke loading

Permit stroke data which isn't precisely tile aligned to be loaded.
Necessary because it's easy to generate such data merely by moving the
frame's left or top edge before saving.

4 years agostroke idletask: remove immediate processing
Andrew Chadwick [Sat, 17 Aug 2013 16:16:50 +0000 (17:16 +0100)]
stroke idletask: remove immediate processing

Processing perceptual tile diffing at the end of a long scribble with huge
brush was causing UI holdups due to some of the work being done immediately
over a certain threshold. Since the user now has an immediate sense of how
much stroke work is queued due to backend processing (they'll see by how
much a hefty stroke is lagging) they'll probably hold off when things get
bogged down. This hopefully kills off an annoying hang for no easily
discernible reason.

If the unboundedness of these queues becomes a memory problem, we can
impose throttles on the input side, and add some UI to give the user a
sense of when the input stroke queue is very full.

4 years agofreehand mode: improve scribble responsiveness
Andrew Chadwick [Sun, 4 Aug 2013 22:30:27 +0000 (23:30 +0100)]
freehand mode: improve scribble responsiveness

Improve responsiveness and the effectiveness of Slow Tracking under GTK3 by
processing input events with as fast a turnaround as possible, and
deferring both motion data cleanup and stroke rendering via a pair of
queues. Adds a degree of linear interpolation, primarily to make smaller
chunks of work for the backend renderer, allowing it to return quicker and
stop lagging the CPU cores (one of which will be handing input events at
the same time).

This helps address the problem since GTK3 was turned on by default in
commit 90b3ade2 whereby very, very fast scribble strokes would turn into a
series of line segments rather than nice smooth curves, even with Slow
Tracking. The speed with which GTK3 delivers input events seems to be very
much more bound by concurrent CPU use than with GTK2 for reasons which have
me guessing.

Brush authors will need to introduce a small amount of Slow Tracking (not
Slow Tracking Per Dab) to allow this fix to take effect for their
super-fast scribbly brushes: existing ones with Slow Tracking in the 0.5 to
1.0 range seem to do OK on my system at least, so try that.

Major user benefit of these per-mode-instance queues: strokes which are
slow to render are now seen to be "working slowly" in the UI, and can be
cancelled during the render/display crawl by pressing Escape. Better than
staring a blank unresponsive screen, anyway.

Fairly hefty potential drawback: greater total overhead. The finer chunks
mean a reduced capacity for MP stuff. Perhaps some messing with
begin_atomic/end_atomic and when they're called might work (more
stroke queues...)

4 years agoload_ora(): enable frame if it was customized
Andrew Chadwick [Mon, 19 Aug 2013 23:40:45 +0000 (00:40 +0100)]
load_ora(): enable frame if it was customized

Enable or disable the frame when loading an OpenRaster file. The frame is
enabled if it's not the same as the calculated MyPaint image size, i.e.
the extent of the image's tiles. Avoids having to save a flag in stack.xml,
at the expense of some possible user confusion.

Users who change the frame extents hopefully get what they want when an
image is loaded now. Users who want an infinite sketchpad and no frames on
loading should also be happy.

To revert from a customized frame to a default one, set it to the bounding
box of the document. There's a button for that in the dialog, but perhaps
it needs a "reset everything" button too?

4 years agoframe: adjustment and enabling are now undoable
Andrew Chadwick [Mon, 19 Aug 2013 23:40:33 +0000 (00:40 +0100)]
frame: adjustment and enabling are now undoable

Adjusting the frame, enabling, and disabling it are now command stack
actions which can be undone or redone.

4 years agoframewindow: fix updating bug
Andrew Chadwick [Mon, 19 Aug 2013 21:32:21 +0000 (22:32 +0100)]
framewindow: fix updating bug

Fix GTK3 regression: digits must be set in 3.8 for these spinners to appear

4 years agoframe: add Trim Layer command
Andrew Chadwick [Mon, 19 Aug 2013 16:50:56 +0000 (17:50 +0100)]
frame: add Trim Layer command

Add a command to trim parts of the current layer which lie outside the
current frame.

4 years agoapp: move updating setting sliders on brush change
Andrew Chadwick [Sun, 18 Aug 2013 21:32:37 +0000 (22:32 +0100)]
app: move updating setting sliders on brush change

Make updating the base value sliders for brush settings a responsibility of
the main app, in order to keep updates independent of whether the brush
editor has been shown yet.

4 years agoFix brush settings not updating until editor shown
Andrew Chadwick [Sun, 18 Aug 2013 17:04:50 +0000 (18:04 +0100)]
Fix brush settings not updating until editor shown

Fix regression: key presses to control radius, opacity etc., and the
dropdown controls for the same things were not working until the brush
editor window was shown for the first time. Fixed by moving the callback
binding for these GtkAdjustments to the main application instance.

Document the dict that contains these things, since that's the primary
interface for accessing them.

4 years agolayer move: improve appearance
Andrew Chadwick [Thu, 15 Aug 2013 20:38:38 +0000 (21:38 +0100)]
layer move: improve appearance

Process tile clearances in the same sweep as the move itself to reduce the
extent of the tile move artefacts.

Fix an unduly early cleanup at the end of a move drag which was causing an
apparent UI hang.

4 years agoSurface impl: some docs, minor refactor
Andrew Chadwick [Wed, 14 Aug 2013 16:30:27 +0000 (17:30 +0100)]
Surface impl: some docs, minor refactor

Document stuff; factor out the background-specific uint16 case to the
subclass in question.

4 years agopixel brushes: add snap_to_pixel
Andrew Chadwick [Mon, 5 Aug 2013 13:52:56 +0000 (14:52 +0100)]
pixel brushes: add snap_to_pixel

For some reason they were omitting this setting.

4 years agouicolor: better definition of HCY
Andrew Chadwick [Fri, 2 Aug 2013 20:15:35 +0000 (21:15 +0100)]
uicolor: better definition of HCY

The KDE definition of these functions is somewhat more understandable, so
use that. Ultimately it's an instance of GLHS. More blurb and refs; add
some test cases too.

4 years agobrusheditor: various fixes & UI tweaks
Andrew Chadwick [Fri, 2 Aug 2013 18:55:20 +0000 (19:55 +0100)]
brusheditor: various fixes & UI tweaks

Bugfix: update the brush settings user interface when a new brush preset is
chosen by the user. Doing this discards the current set of brush settings,
replacing them with the newly chosen set, and the UI was not reflecting

Clone now copies the currently edited settings, and the current brush's
icon into its newly created brush.

Various language and icon choices in the UI. Ensure the subwindow is
smaller than 800x600.

4 years agobrushsettingswin: remove, replaced by new editor
Andrew Chadwick [Fri, 2 Aug 2013 13:30:05 +0000 (14:30 +0100)]
brushsettingswin: remove, replaced by new editor

Remove the old brush settings window fully, now there's a feature-complete

4 years agostroke: fix re-rendering for live update
Andrew Chadwick [Fri, 2 Aug 2013 10:59:34 +0000 (11:59 +0100)]
stroke: fix re-rendering for live update

API changed, which broke the brush editor's live update functionality.

4 years agobrusheditor: tidy up brush settings editor GUI
Andrew Chadwick [Thu, 1 Aug 2013 22:03:47 +0000 (23:03 +0100)]
brusheditor: tidy up brush settings editor GUI

New look for the brush settings editor, reusing all of its code into a new
module. The editor now takes the form of an index tree with the settings on
the left, a main area with base values and curve foldouts, and lots of
lovely whitespace and headings and indent. It should be more comprehensible
to new users like this, hopefully!

For my Xfce4 desktop at least, subwindows in fullscreen need to EITHER
reject keyboard input entirely and be added to the keyboard manager, OR
accept it and be fully modal dialogs with properly set transient-for hints.
Mixing the two styles leads to Great Confusion in fullscreen mode.  This
applies to things like spinners even, so the brush input curves now use
scalebuttons. Hopefully OK there...

The GUI layout for this window is now defined in a GtkBuilder XML file,
editable in glade (see glade/ It's a bit of an evolving hack given
that we have to template it for all the fiddly little per-input widgets,
but it seems to work sanely.

4 years agocurve: display fixup, quieter logging
Andrew Chadwick [Thu, 1 Aug 2013 22:00:25 +0000 (23:00 +0100)]
curve: display fixup, quieter logging

Some drawing and appearance fixes.

Add suppressible logging, and limit the number of log messages about
strange theme behaviour.

4 years agodialogs: migrate to PyGI
Andrew Chadwick [Thu, 1 Aug 2013 22:47:18 +0000 (23:47 +0100)]
dialogs: migrate to PyGI

4 years agowindowing: convert to PyGI
Andrew Chadwick [Sun, 28 Jul 2013 16:52:49 +0000 (17:52 +0100)]
windowing: convert to PyGI

4 years agoBrush icon editor: split out, rework
Andrew Chadwick [Wed, 24 Jul 2013 22:07:35 +0000 (23:07 +0100)]
Brush icon editor: split out, rework

Remove icon editing from the brush settings editor.  Editing icons is a
different task with a different work-flow: the icon must be locked for
editing, and can then be worked on with brushes, perhaps its own perhaps

Rework the brush icon editor into the newer style, with big friendly action
buttons down the right hand side.  It also shows exactly what's being
edited, and what the edit state is all through the process.

4 years agotdw: cursor improvements
Andrew Chadwick [Wed, 24 Jul 2013 21:32:08 +0000 (22:32 +0100)]
tdw: cursor improvements

Allow the override cursor to be set before the first map.
Suppress spurious/boring debug messages, and raise priority of error ones.

4 years agotdw: allow the pixelize threshold to be set
Andrew Chadwick [Wed, 24 Jul 2013 21:26:34 +0000 (22:26 +0100)]
tdw: allow the pixelize threshold to be set

4 years agotdw: allow scrolling on realloc to be turned off
Andrew Chadwick [Wed, 24 Jul 2013 21:24:28 +0000 (22:24 +0100)]
tdw: allow scrolling on realloc to be turned off

Certain uses of the TiledDrawWidget will need this to be disabled.

4 years agocolor adjusters: move into toolbar dropdown
Andrew Chadwick [Thu, 11 Jul 2013 11:58:11 +0000 (12:58 +0100)]
color adjusters: move into toolbar dropdown

Save space on the toolbar by moving color adjusters to a single button.
Also factor out the new style of menu-only tool button.

4 years agocolortools: remove unused method
Andrew Chadwick [Thu, 11 Jul 2013 09:20:55 +0000 (10:20 +0100)]
colortools: remove unused method

4 years agobrushmanager: remove active_groups stuff
Andrew Chadwick [Thu, 11 Jul 2013 09:10:35 +0000 (10:10 +0100)]
brushmanager: remove active_groups stuff

Remove the redundant active_groups stuff: visible brush groups are now
managed entirely by the workspace.

Reveal the newly added groups after group import (fix minor regression)

Simplify new group creation: they now all go in group "New", which is
revealed when necessary.

4 years agobrush group action: fix labelling & translation
Andrew Chadwick [Thu, 11 Jul 2013 02:19:23 +0000 (03:19 +0100)]
brush group action: fix labelling & translation

* Submenu: use the translated form of the brush group names.
* Proper capitalization for the top menu item.
* Add a short-form title for toolbar items to use.

4 years agobrush groups: replace old selection widget
Andrew Chadwick [Thu, 11 Jul 2013 02:04:36 +0000 (03:04 +0100)]
brush groups: replace old selection widget

Brush groups are now separate tabs in the UI, and are accessed from the
main menu or from a toolbar menu button.

4 years agobackgroundwindow: fix exception when opening
Andrew Chadwick [Wed, 10 Jul 2013 00:37:59 +0000 (01:37 +0100)]
backgroundwindow: fix exception when opening

Fix error caused by excluding the default backgrounds when trying to load
them.  Some code tidying. Add lots of debugging info, and log image load
errors to the various outputs.

4 years agopixbuflist/brushlist: fix DnD exceptions
Andrew Chadwick [Wed, 10 Jul 2013 00:04:47 +0000 (01:04 +0100)]
pixbuflist/brushlist: fix DnD exceptions

4 years agoTabbed workspace support for brush groups
Andrew Chadwick [Tue, 9 Jul 2013 22:08:41 +0000 (23:08 +0100)]
Tabbed workspace support for brush groups

Let each brush group have its own tab in the workspace. The icon used is
that of the first brush in the group, but that can probably be improved.

Support brush group creation, import, export, rename, delete from various
menus and popup dialogs.  All the stuff that the soon to be deleted
GroupSelector currently does, in other words.