<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
  <title></title>
</head>
<body text="#000000" bgcolor="#ffffff">
Hello, <br>
<blockquote type="cite"><span class="Apple-style-span"
 style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;">
  <pre>My idea is to mirror the output of the paint op. 
That's clear for Pixel brush. You stroke on the left side of the canvas
and the right side has mirrored stroke.</pre>
  </span></blockquote>
My little idea (as an user) for mirror implentation in krita would be
to use layers to do it. <br>
There is already a "clone layer" button in Krita. Imagine if you could
use this option to clone your drawing layer, but still apply
independant basic transformations to this new cloned layer ( the
dynamic way ): Translation/Grab/Move ,&nbsp; Mirroring , Rotation ,&nbsp; Scaling.<br>
<br>
This could allow the user to do a mirror ( ex: clone layer &gt; mirror
the cloned layer on X axis &gt; move the cloned layer ) ; but also
'mandalas' ( ex: multiple layers cloned and moved/rotated ) , as well
as a lot of other possibilities . ( ex: a crowd of poeple , with a lot
of characters cloned and scaled in a layer group ; paint on one and
other are updated realtime ).<br>
<br>
&nbsp; In blender you can 'duplicate linked' object, this would be almost
the same things with layers object and was my inspiration in this case.
That was just my 2 cents in the brainstorming. I'm also open to all
other solutions. <br>
<br>
( PS : Thanks Lukas for the invitation and links on the mailing-list
:)&nbsp; )<br>
<br>
-Deevad<br>
<br>
<blockquote type="cite"><span class="Apple-style-span"
 style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><b>LukasT.dev</b><span
 class="Apple-converted-space"></span><a
 href="mailto:kimageshop%40kde.org?Subject=Mirror%20strokes%20feature&amp;In-Reply-To="
 title="Mirror strokes feature"><span class="Apple-converted-space"></span></a><br>
  <i>Sun Oct 17 12:51:59 CEST 2010</i></span></blockquote>
<blockquote type="cite"><span class="Apple-style-span"
 style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;">
  <pre>Hello, 

I talked with Cyrille on IRC about mirror strokes feature, part of the 2.4 
feature list.

The idea is inspired by Alchemy which is used on the DVD Chaos&amp;Evolution.
"The 'mirror' is for me the only reason why I switch to alchemy." deevad
I want to implement it as it is hot feature for digital painters. The problem 
is how to implement it.

My idea is to mirror the output of the paint op. 
That's clear for Pixel brush. You stroke on the left side of the canvas
and the right side has mirrored stroke.

Some ASCII art:

stroke  | ekorts
is here | ereh si

But it is complicated for smudge, deform, maybe sketch:
Should smudge paintop smudge the right side or copy the result of smudging to 
the right side? In the ideal world it could of course, but it's complicated 
when you want to implement it. And it is usable that way? Do you smudge in 
mirror mode? Or it is just nice to have? 

Currently in the first iteration (for 2.4) I plan to implement only mirroring 
of the output and if it will be easy enough or we find some nice solution 
together, I can work on it for 2.4.

My analysis I did so far

Where to implement it:
o KisPainter

You would have to implement mirroring in every bitBlt method. Some 
paintops need to know which rects has been changed in the layer (currently 
experiment paintop, but I suppose more animated paintops will be there ) so
every bitBlt should return QVector&lt;QRect&gt;. I and Cyrille, we don't think it is 
nice. I don't like when low-level features like bitBlt knows fancy feature. 
Then bitBlt could be hard to optimize. Similar situation happened to composite 
ops. We solve there feature if the channel is active. When we tried to 
optimize composite ops with MMX/SSE, this feature was standing in the road 
AFAIR.GEGL is not doing that. That's just example why I think this kind of 
features should not be on that level.

o KisPaintop
The only drawback I see is that the author of the paintop is responsible for 
the implementation so more work for author of the paintop. There might be some 
code duplication from the beginning til I find some nice pattern in the code.
Some mirroring (e.g. smudging/deforming both sides) might be complicated.

Problem is UI, every paintop need to setup mirror axis X and mirror axis Y.
Maybe freehand tool could have the UI and setup the paintop, but then 
every paintop needs to support mirroring.

o KisTool(Freehand)?
Cyrille, here you go and please explain what is your idea?

I was thinking about creating two paintops in the freehand and mirror the
input coordinate and give some flag to paintop that it is painting in the 
vertical/horizontal mirror mode so that the mask is mirrored? Drawback might 
be the performance as the paintops does not share some memory stuff that are 
shared in other cases like KisPaintop place. Just my guess what Cyrille might 
thought...

== CUT HERE ==

Brainstorm, feedback, constructive critique, creativity welcomed!
"That's bad, don't do it" without arguments will be ignored ;)

Mirror feature live in action at ~10:00 in the video
<a href="http://www.youtube.com/watch?v=kGOtGDQ-K-g">http://www.youtube.com/watch?v=kGOtGDQ-K-g</a>

Mirroring implemented for the experimental paintop on the paintop level
<a href="http://imagebin.ca/view/VmEHZT.html">http://imagebin.ca/view/VmEHZT.html</a>

I will send the patch against trunk later if you are interested.</pre>
  </span></blockquote>
<br>
</body>
</html>