|
|
|
Selections in Chalk
|
|
|
|
|
|
|
|
Please disregard any lingering presence of the KisFloatingSelection
|
|
|
|
class and the associated rectangular marque rendering code. If you
|
|
|
|
find anything connected with that after I finish coding the new
|
|
|
|
selections scheme, it's something I forgot.
|
|
|
|
|
|
|
|
Selections in Chalk are special paint devices as big as their parent
|
|
|
|
layer. The selection has the alpha colour strategy. The alpha channel
|
|
|
|
contains the selectedness of a pixel. It is not a binary value, but a scale,
|
|
|
|
hardcoded to 8 bits unsigned
|
|
|
|
|
|
|
|
TODO: * implement heterogenous compositing. (Needs knowledge by the
|
|
|
|
target layer of the color strategy of the source layer).
|
|
|
|
|
|
|
|
Selections can be changed using tools that are clones of the usual
|
|
|
|
painting tools: brush, eraser, polygon, etc.
|
|
|
|
|
|
|
|
TODO: * implement most of these, the polygon, circle, rectangle tools
|
|
|
|
should fill by default. XXX: make it easier to leverage the
|
|
|
|
code for the standard tools: after all, the only difference
|
|
|
|
is which layer they should paint on.
|
|
|
|
|
|
|
|
XXX: Fill-by-default should be an option for the polygon, circle,
|
|
|
|
rectangle painting tools, too.
|
|
|
|
|
|
|
|
Selections can also changed by procedures like select-by-color etc.
|
|
|
|
|
|
|
|
TODO: * finish dialog for select by color
|
|
|
|
* implement select-by-color (depends on usable iterators)
|
|
|
|
|
|
|
|
Selections are represented as 0== unselected and 255 == fully
|
|
|
|
selected. Values in between are semi selected
|
|
|
|
|
|
|
|
Other representations of selections are possible: the selection for a
|
|
|
|
particular rect is rendered as a separate step in
|
|
|
|
KisImage::renderToProjection. I like the mask type rendering, but
|
|
|
|
someone else might want to provide an optional marque-rendering.
|
|
|
|
|
|
|
|
TODO: * enable kconfig option to select between renderings.
|
|
|
|
|
|
|
|
Selected pixels can be mangled -- for instance, filled with a
|
|
|
|
gradient, moved, made brighter, lighter or sprightlier, cut and
|
|
|
|
pasted. These manglings fall into two groups: the kind that demands
|
|
|
|
that the selected pixels are removed from their native layer, and the
|
|
|
|
kind that merely changes their value.
|
|
|
|
|
|
|
|
|
|
|
|
A) Moving, cutting, copying, pasting.
|
|
|
|
|
|
|
|
Each of these operations moves pixels to a new KisLayer that is not
|
|
|
|
part of the regular stack of layers. The operations are defined as
|
|
|
|
follows:
|
|
|
|
|
|
|
|
Moving: create new layer, copy selected pixels to this layer, set
|
|
|
|
pixels in old layer to transparent background colour, set new layer
|
|
|
|
visible.
|
|
|
|
|
|
|
|
Cutting: create new layer, copy selected pixels to this layer, set
|
|
|
|
pixels in old layer to transparent background colour, add new layer to
|
|
|
|
the cut scrapbook (if we're going to have such a thing).
|
|
|
|
|
|
|
|
XXX: Discuss desirability of cut scrapbook.
|
|
|
|
|
|
|
|
Copying: create new layer, copy selected pixels to this layer, add new
|
|
|
|
layer to the cut scrapbook (if we're going to have such a thing).
|
|
|
|
|
|
|
|
Pasting: check if cut or copy layer exists in scrapbook, copy pixels
|
|
|
|
from this layer to the target layer.
|
|
|
|
|
|
|
|
B) Changing the value of selected pixels
|
|
|
|
|
|
|
|
Use cases: fills (gradient, pattern, color), filtering.
|
|
|
|
|
|
|
|
Fills are easiest implemented by creating a filled paint device for
|
|
|
|
the rect covered by the selection, and then, while composting the fill
|
|
|
|
with the target layer, pass the mask to the compositing loop, and skip
|
|
|
|
un-selected pixels.
|
|
|
|
|
|
|
|
XXX: Discuss whether this is true
|
|
|
|
|
|
|
|
Filtering needs looping over all pixels of a layer, and, if selection
|
|
|
|
is present, only apply filter to the selected pixel.
|
|
|
|
|
|
|
|
XXX: What about convolving, which takes a matrix of pixels. If only
|
|
|
|
the middle pixel of a matrix is selected, should we take the input of
|
|
|
|
the surrounding unselected pixels, or should the operation then assume
|
|
|
|
edge conditions? Or should this be an option?
|
|
|
|
|
|
|
|
TODO: infrastructure for all these operations, actual implementation.
|
|
|
|
|
|
|
|
Actions to a selection need to be undoable.
|
|
|
|
|
|
|
|
TODO: Make it so.
|
|
|
|
|
|
|
|
I am not sure whether selections need to be saved and loaded:
|
|
|
|
Photoshop offers this, but our selection mechanism works differently.
|
|
|
|
The Gimp offers selection adding/subtracting, but that's also not
|
|
|
|
really necessary. A good idea is perhaps to add a combobox to the
|
|
|
|
selection tool properties widget to choose between 'select' and
|
|
|
|
'deselect', where the brush is initially set to 'select' and the
|
|
|
|
eraser to 'deselect'.
|
|
|
|
|
|
|
|
From a thread in the mailing list Boudewijn wrote:
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
This is the behaviour I expect from a paint app:
|
|
|
|
|
|
|
|
If there's a selection on the current layer, only the selected pixels in the
|
|
|
|
current layer should be transformed, rotated, scaled or sheared. This happens
|
|
|
|
within the layer. If the new pixels overlap untransformed pixels, they are
|
|
|
|
composed with the giving composite op and opacity.
|
|
|
|
|
|
|
|
If there's no selection, a transform on a layer should transform all pixels in
|
|
|
|
a layer, i.e., act as if the layer was completely selected. No new layer is
|
|
|
|
created. There is no composition, because the old layer data is completely
|
|
|
|
discarded.
|
|
|
|
|
|
|
|
If a transform is applied to a image, all layers are transformed. The
|
|
|
|
selection is transformed, too: in the new situation, the layer that has a
|
|
|
|
selection active still has a selection, but the shape of the selection is
|
|
|
|
transformed.
|
|
|
|
|
|
|
|
If a layer is moved, the selection moves with the layer (this is not
|
|
|
|
implemented yet).
|
|
|
|
|
|
|
|
A transform never creates a new layer (expect perhaps temporarily and it
|
|
|
|
wouldn't be visible to the user).
|