tag:blogger.com,1999:blog-54330883784975386582024-03-13T02:09:54.122+02:00dmitryK's blogDmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.comBlogger40125tag:blogger.com,1999:blog-5433088378497538658.post-81348251560261292012019-08-13T15:54:00.000+02:002019-08-13T16:00:15.228+02:00Krita 2019 Sprint: Animation and Workflow BoF<div dir="ltr" style="text-align: left;" trbidi="on">
Last week we had a huge Krita Sprint in Deventer. A detailed report is written by Boudewijn <a href="https://krita.org/en/item/krita-2019-sprint/">here</a>, and I will concentrate on the Animation and Workflow discussion we had on Tuesday, when Boudewijn was away, meeting and managing people arriving. The discussion was centered around <a href="https://bollebib.deviantart.com/">Steven</a> and his workflow, but other people joined during the discussion: <a href="https://www.artstation.com/nolanfa">Noemie</a>, Scott, <a href="https://raghukamath.com/">Raghavendra</a> and Jouni.<br />
<h3 style="text-align: left;">
(Eternal) Eraser problem</h3>
Steven brought up a point that current brush options "Eraser Switch Size" and "Eraser switch Opacity" are buggy, so it winded up an old topic again. These options were always considered as a workaround for people who need a distinct eraser tool/brush tip, and they were always difficult to maintain.<br /><br />After a long discussion with broader circle of people we concluded that "Ten Brushes Plugin" can be used as an alternative for a separate eraser tool. One should just assign some eraser-behaving preset to the 'E' key using this plugin. So we decided that we need the following steps:<br />
<h4 style="text-align: left;">
Proposed solution:</h4>
<ol style="text-align: left;">
<li>Ten Brushes Plugin should have some eraser preset configured by default</li>
<li>This eraser preset should be assigned to "Shift+E" by default. So when people ask about "Eraser Tool" we could just tell them "please use Shift+E".</li>
<li>[BUG] Ten brushes plugin doesn't reset back to a normal brush when the user picks/changes painting color, like normal eraser mode does.</li>
<li>[BUG] Brush slot numbering is done in 1,2,3,...,0 order, which is not obvious. It should be 0,1,2,...,9 instead.</li>
<li>[BUG] It is not possible to set up a shortcut to the brush preset right in the Ten Brushes Plugin itself. The user should go to the settings dialog.</li>
</ol>
<h3 style="text-align: left;">
Stabilizer workflow issues</h3>
<div style="text-align: left;">
In Krita stabilizer settings are global. That is, they are applied to whatever brush preset you use at the moment. That is very inconvenient, e.g. when you do precise line art. If you switch to a big eraser to fix up the line, you don't need the same stabilization as in the liner. </div>
<h4 style="text-align: left;">
Proposed solution:</h4>
<ol style="text-align: left;">
<li>The stabilizer setting are still in the Tool Options docker, we don't move them into the Brush Settings (because sometimes you need to make them global?)</li>
<li>Brush Preset should have a checkbox "Save Stabilizer Settings" that will load/save the stabilizer settings when the preset is selected/unselected.</li>
<li>The editing of these (basically) brush-based setting will happen in the tool option.</li>
</ol>
<div style="text-align: left;">
</div>
<h4 style="text-align: left;">
Questions:</h4>
<ul style="text-align: left;">
<li>I'm not sure if the last point is sane. Technically, we can move the stabilizer settings into the brush preset. And if the user wants to use the same stabilizer settings in different presets, he can just lock the corresponding brush settings (we have an special lock icon for that). So should we move the stabilizer settings into the brush preset editor or keep it in the tool options?</li>
</ul>
<h3 style="text-align: left;">
Cut Brush feature</h3>
<div style="text-align: left;">
Sometimes painter need a lot of stamps for often-used objects. E.g. a head or a leg for an animation character. A lot of painters use brush preset selector as a storage for that. That is, if you need a copy of a head on another frame, just select the preset and click in a proper position. We already have stamp brushes and they work quite well, we just need streamline workflow a bit.</div>
<h4 style="text-align: left;">
Proposed solution:</h4>
<ol style="text-align: left;">
<li>Add a shortcut for converting the current selection into a brush. It should in particular:
<ul style="text-align: left;">
<li>create a brush from the current selection, add default name to it and create an icon from the selection itself</li>
<li>deselect the current selection. It is needed to ensure that the user can paint right after pressing this shortcut</li>
</ul></li>
<li>There should be shortcuts to rotate, scale current brush</li>
<li>There should be a shortcut for switching prev/next dab of the animated brush</li>
<li>Brush needs a special outline mode, when it paints not an outline, but a full colorful preview. It should be activated by some modifier (that is pres+hold).</li>
<li>Ideally, if multiple frames are selected, the created brush should become animated. That would allow people to create "walking brush" or "raining brush".</li>
</ol>
<h3 style="text-align: left;">
Multiframe editing mode</h3>
<div style="text-align: left;">
One of the major things Krita's animation still lack is multiframe editing mode, that is ability to transform/edit multiple frames at once. We discussed it and ended up with a list of requirements.</div>
<h4 style="text-align: left;">
Proposed solution:</h4>
<ol style="text-align: left;">
<li>By default all the editing tools transform the current frame only</li>
<li>The only exception is "Image" operations, which operate on the entire image, e.g. scale, rotate, change color space. These operations work on all existing frames.</li>
<li>If there is more than one frame selected in the timeline, then operation/tool should be applied on these frames only.</li>
<li>We need a shortcut/action in the frame's (or timeline's layer) context menu: "Selection all frames"</li>
<li>Tools/Actions that should support multiframe operations:<ul style="text-align: left;">
<li>Brush Tool (low-priority)</li>
<li>Move Tool</li>
<li>Transform Tool</li>
<li>Fill Tool (may be efficiently used on multiple frames with erase-mode-trick)</li>
<li>Filters</li>
<li>Copy-Paste selection (now we can only copy-paste frames, not selections)</li>
<li>Fill with Color/Pattern/Clear</li>
</ul>
</li>
</ol>
<div style="text-align: left;">
</div>
<h3 style="text-align: left;">
BUGS</h3>
<div style="text-align: left;">
There is also a set of unsorted bugs that we found out during the discussion:</div>
<ol style="text-align: left;">
<li>On Windows multiple main windows don't have unique identifier, so they are no distinguishable from OBS.</li>
<li>Animated brush spits a lot of dabs in the beginning of the stroke</li>
<li>Show in Timeline should be default for all the new layers</li>
<li>Fill Tool is broken with Onion Skins (BUG:405753)</li>
<li>Transform Tool is broken with Onion Skins (BUG:408152)</li>
<li>Move Tool is broken with Onion Skins (BUG:392557)</li>
<li>When copy-paste frames on the timeline, in-betweens should override the destination (and technically remove everything that was in the destination position). Right now source and destination keyframes are merged. That is not what animators expect.</li>
<li>Changing "End" of animation in "Animation" docker doesn't update timeline's scroll area. You need to create a new layer to update it.</li>
<li>Delayed Save dialog doesn't show the name of the stroke that delays it (and sometimes the progress bar as well). It used to work, but now is broken.</li>
<li>[WISH] We need "Insert pasted frames", which will not override destination, but just offset it to the right.</li>
<li>[WISH] Filters need better progress reporting</li>
<li>[WISH] Auto-change the background of the Text Edit Dialog, when the text color looks alike.</li>
</ol>
</div>
<p>As a conclusion, it was very nice to be at the sprint and to be able to talk to real painters! Face to face meetings are really important for getting such detailed lists of new features we need to implement. If we did this discussion through Phabricator we would spend weeks on it :)</p>
</br></br>Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com1tag:blogger.com,1999:blog-5433088378497538658.post-20378039323938321802018-11-20T18:25:00.001+02:002018-11-20T18:27:43.719+02:00Krita Fall 2018 Sprint Results: HDR support for Krita and Qt!<div dir="ltr" style="text-align: left;" trbidi="on">
<p>In October we held a Krita developers' sprint in Deventer. One of my goals for the sprint was to start implementing High Dynamic Range (HDR) display support for Krita. Now almost a month have passed and I am finally ready to publish some preliminary results of what I started during the sprint.</p><p>
The funny thing is, before the sprint I had never seen what HDR picture even looks like! People around talked about that, shops listed displays with HDR support, documentation mentioned that, but what all this buzz was about? My original understanding was like "Krita passes 16-bit color to OpenGL, so we should already be ready for that". In Deventer I managed to play with <a href="https://www.asus.com/us/Monitors/ROG-SWIFT-PG27UQ/">Boud's display</a>, which is basically one of few certified HDR displays with support of <a href="https://en.wikipedia.org/wiki/Candela_per_square_metre">1000 nits</a> brightness, and found out that my original understanding was entirely wrong :)</p>
<p>
Last couple of years the computer display industry has changed significantly. For almost 30 years people expected their monitors to look like normal paper. Displays were calibrated to look like a sheet of white paper illuminated by a strictly <a href="https://en.wikipedia.org/wiki/Illuminant_D65">defined source of light (D65)</a>.</p><p>
Now, with appearance of HDR technology, the things has changed. Displays don't try to emulate paper, they try to resemble real sources of light! For example, modern displays can show a sun beam piercing through a window not just like "a paper photo of a beam", but just as a real source of light getting directly into you eye! Basically, now the displays have LEDs that can shine as bright as a real sun, so why not use it? :) (Well, the display is only 1000 nits, and the sun 1.6 billion nits, but it's still very bright).</p><p>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDlrdQlczHFP9Kg2dwAjHAjIeQqKtfHJjTkmFqgmtfgyfqPc2c0iO8TUl7E2UvQOhmuj56O3iGEppzS0Ju4cCFUF5HQNfQwEGU3ODyr3HUgs895Kx2673jada3XDPWK9Eb22TlP-YSVX2z/s1600/Desk.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDlrdQlczHFP9Kg2dwAjHAjIeQqKtfHJjTkmFqgmtfgyfqPc2c0iO8TUl7E2UvQOhmuj56O3iGEppzS0Ju4cCFUF5HQNfQwEGU3ODyr3HUgs895Kx2673jada3XDPWK9Eb22TlP-YSVX2z/s400/Desk.png" width="295" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">If you look at the original original EXR file you will see how the window "shines" from your screen, as if it were real</td></tr>
</tbody></table>
By itself, the idea of having a display that can send a sun-strength beam into your eye might be not a lot of fun, but the side effects might of the technology are quite neat. </p><p>
In the first place, the displays supporting HDR do not work in the standard <a href="https://en.wikipedia.org/wiki/SRGB">sRGB</a> color space! Instead they use <a href="https://en.wikipedia.org/wiki/Rec._2020">Rec. 2020</a>, a color space widely used in cinematography. It has different primary colors for "green" and “red” channels, which means it can encode much more variations of greenish and reddish colors. </p><p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie12vzOZyA3I3lTHGjhvECokJPrTf8iQzK03_KdLnTOlX2MRcbh666LW9arAeHR9VbbBm7p60sYVWpqLKF61NU3ZQx0dbpjB_YwQJDRJorDYp00Rk1GKnLXB3Zjij3MMAynvvQX097Pf7N/s1600/hdr_color_spaces.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie12vzOZyA3I3lTHGjhvECokJPrTf8iQzK03_KdLnTOlX2MRcbh666LW9arAeHR9VbbBm7p60sYVWpqLKF61NU3ZQx0dbpjB_YwQJDRJorDYp00Rk1GKnLXB3Zjij3MMAynvvQX097Pf7N/s640/hdr_color_spaces.png" width="640" /></a></div>
In the second place, instead of using traditional exponential gamma correction, they use <a href="https://en.wikipedia.org/wiki/High-dynamic-range_video#Perceptual_Quantizer">Perceptual Quantizer (PQ)</a>, which not just extends the dynamic range to sun-bright values, but also allows to encode very dark areas, not available in usual sRGB. </p><p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSHPs5CIebGUmUnA2WVbzLT8nR9eEVgfbcMoAPDoWHd2nd_-0STWpN6KIahWvmkMqiAvWARxKhqoIZ5kcTtqGl7fIk9v7A8ep2AHXcqeNN5Kf1SZN_K7z5bkMwVVQ7WNGdnn3_irh4wV8/s1600/hdr-bright-and-dark.png" imageanchor="1"><img border="0" height="323" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSHPs5CIebGUmUnA2WVbzLT8nR9eEVgfbcMoAPDoWHd2nd_-0STWpN6KIahWvmkMqiAvWARxKhqoIZ5kcTtqGl7fIk9v7A8ep2AHXcqeNN5Kf1SZN_K7z5bkMwVVQ7WNGdnn3_irh4wV8/s400/hdr-bright-and-dark.png" width="400" /></a></div>
Finally, all HDR displays transfer data in 10-bit mode! Even if one doesn't need real HDR features, having a 10-bit pipeline can improve both painters' and designers' workflow a lot!</p><p>
<h3 style="text-align: left;">
Technical details</h3>
From the developer's point of view, the current state of HDR technology is a bit of a mess. It's really early days. The only platform where HDR is supported at the moment is <a href="https://docs.microsoft.com/en-us/windows/desktop/direct3ddxgi/high-dynamic-range-and-wide-color-gamut">Windows 10 (via DirectX)</a>.</p><p>
Neither Linux nor OSX can handle the hardware in HDR mode currently. Therefore all the text below will be related to Windows-only case.</p><p>
When the user switches the display into HDR mode, the OS automatically starts to communicate with it in p2020-pq mode. Obviously, all the colors that normal applications render in sRGB will be automatically converted. That is, if an application wants to render an image directly in p2020-pq, it should create a special "framebuffer" object (swap chain), set its colorspace to p2020-pq and ensure that all the internal textures have correct color space and bit depth.</p><p>
In general, to ensure that the window is rendered in HDR mode, one should do the following:</p><p>
<ol style="text-align: left;">
<li>Create a DXGI swap chain with 10-bit or 16-bit pixel format</li>
<li>Set the color space of that swap chain to either p2020-pq (for 10-bit mode) or scRGB (for 16-bit mode).</li>
<li>Make sure all the intermediate textures/surfaces are rendered in 10/16-bit mode (to avoid loss of precision)</li>
<li>Since the GUI is usually rendered on the same swap chain, one should also ensure that the GUI is converted from sRGB into the destination color space (either p2020-pq or scRGB)</li>
</ol>
In Krita we use Qt to render everything, including our OpenGL canvas widget. I had to go deep into Qt's code to find out that Qt unconditionally uses 8-bit color space for rendering windows. Therefore, even though Krita passes 16-bit textures to the system, the data is still converted into 8-bits somewhere in Qt/OpenGL. So I had to hack Qt significantly...</p>
<h3 style="text-align: left;">
Making Qt and Angle support HDR</h3>
<p>Here comes the most interesting part. We use Qt to access the system's OpenGL implementation. Traditionally, Qt would forward all our requests to the OpenGL implementation of the GPU driver, but... The problem is that quite a lot of OpenGL drivers on Windows are of "suboptimal quality". The quality of the drivers is so "questionable", that people from the Google Chromium project even wrote a special library that converts OpenGL calls into DirectX API calls and use it instead of calling OpenGL directly. The library is called <a href="https://github.com/google/angle">Angle</a>. And, yes, Qt also uses Angle.</p><p>
Below is a sketch, showing the relation between all the libraries and APIs. As you can see, Angle provides two interfaces: EGL for creating windows, initializing surfaces configuring displays and traditional OpenGL for the rendering itself.</p><p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1NCHdmSM3_Kr2BQ7IN0OO1h37-dVNQBGG3vfvTmUOolwBfCVVIRdLvWMBi7MHfpaKdvnPfXOr61EauHjxblg2yxQAFjwZHs7fiRJ99ne6sXhqU7lJCFO3genDQGLTSEmocbPgAUd4mZ27/s1600/angle-diagram.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1NCHdmSM3_Kr2BQ7IN0OO1h37-dVNQBGG3vfvTmUOolwBfCVVIRdLvWMBi7MHfpaKdvnPfXOr61EauHjxblg2yxQAFjwZHs7fiRJ99ne6sXhqU7lJCFO3genDQGLTSEmocbPgAUd4mZ27/s1600/angle-diagram.png" /></a></div>
<p>To allow switching of the surface's colorspace I had to hack Angle's EGL interface and, basically, implement three extensions for it:
<ul style="text-align: left;">
<li><a href="https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_gl_colorspace.txt">EGL_KHR_gl_colorspace</a> — allows switching the surface into sRGB color space (also implements auto gamma correction of texture and framebuffer samplers)</li>
<li><a href="https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_gl_colorspace_scrgb_linear.txt">EGL_EXT_gl_colorspace_scrgb_linear</a> — allows switching the surface into scRGB color space</li>
<li><a href="https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_gl_colorspace_bt2020_linear.txt">EGL_EXT_gl_colorspace_bt2020_pq</a> — allows switching the surface into p2020-pq color space</li>
</ul>
</p><p>
After that I had to patch QTextureFormat a to support all these color spaces (previously, it supported sRGB only). So now, if you configure the default format before creating a QGuiApplication object, the frame buffer object (swap chain) will have it! :)</p>
<blockquote class="tr_bq">
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">// set main frame buffer color space to scRGB</span></span><br />
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">QSurfaceFormat fmt;</span></span><br />
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">// ... skipped ...</span></span><br />
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">fmt.setColorSpace(QSurfaceFormat::scRGBColorSpace);</span></span><br />
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">QSurfaceFormat::setDefaultFormat(fmt);</span></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">// create the app (also initializes OpenGL implementation</span></span><br />
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">// if compiled dynamically)</span></span><br />
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">QApplication app(argc, argv);</span></span><br />
<span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">return app.exec();</span></span></blockquote>
<p>I have implemented a preliminary demo app that uses a patched Qt and shows an EXR image in HDR mode. Please check out the source code here:</p>
<p>Demo application itself:<br />
<a href="https://github.com/dimula73/hdrtest/tree/test-hacked-hdr">https://github.com/dimula73/hdrtest/tree/test-hacked-hdr</a></p>
<p>Patched version of QtBase (based on Qt 5.11.2):<br />
<a href="https://github.com/dimula73/qtbase/tree/krita-hdr">https://github.com/dimula73/qtbase/tree/krita-hdr</a></p>
<p>The application and Qt's patch are still work-in-progress, but I would really love to hear some feedback and ideas from KDE and Qt community about it. I would really love to push this code upstream to Qt/Angle when it is finished! :)</p>
<h3 style="text-align: left;">
List of things to be done</h3>
<ol style="text-align: left;">
<li>Color-convert Qt's internal GUI textures. Qt renders the GUI (like buttons, windows and text boxes) in a CPU memory (in sRGB color space), then uploads the stuff into an OpenGL texture and renders that into a frame buffer. Obviously, when the frame buffer is tagged with a non-sRGB color space, the result is incorrect --- the GUI becomes much brighter or darker than expected. I need to somehow mark all Qt's internal textures (surfaces?) with a color space tag, but I don't yet know how... Does anybody know how?</li>
<li>Qt should also check if the extensions are actually supported by the implementation, e.g. when Qt uses a driver-provided implementation of OpenGL. Right now it tries to use the extensions without any asking :)</li>
<li>The most difficult problem: OpenGL does not provide any means of finding out if a combination of frame buffer format and color space is actually supported by the hardware! A conventional way to check if the format/color space is supported: create an OpenGL frame buffer and set the desired color space. If the calls do not fail with error, then the mode is supported. But it doesn't fit the way how Qt selects it! Qt expects one to call a singleton QSurfaceFormat::setDefaultFormat() once and then proceed to creation of the application. If the creation fails, there is no way to recover! Does anybody have an idea how that could be done in the least hackish way?</li>
</ol>
<p>I would really love to hear your questions and feedback on this topic! :)</p>
</div>Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com1tag:blogger.com,1999:blog-5433088378497538658.post-36263739602502570912014-08-02T23:46:00.002+03:002014-08-02T23:46:40.919+03:00Krita: illustrated beginners guide in Russian<div dir="ltr" style="text-align: left;" trbidi="on">
Some time ago our user <a href="http://tysontan.tumblr.com/">Tyson Tan</a> (creator of Krita's mascot Kiki) published his beginners guide for Krita. Now this tutorial is also available in Russian language!<br />
<br />
If you happen to know Russian, please follow the <a href="http://dimula73.blogspot.ru/2014/08/krita.html">li<span id="goog_1809391793"></span><span id="goog_1809391794"></span>nk</a> :)<br />
<br />
<br />
<a href="http://dimula73.blogspot.ru/2014/08/krita.html">
<img alt="слайд" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_HZDS41U2DZKA7DPKr_8sujYE6SZtGmT8seXemfvyP2tJrwLK8D8CIIiZmYiYRx_HGR-ayHtFocFhiABeBGhSv2Oci8NuPqNKh7f23UB3kdMO3UGLYWPTJcQg0RIFK1CtkWQ3Fq6niK_y/s320/001_cover.jpg" />
</a>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com0tag:blogger.com,1999:blog-5433088378497538658.post-35388978049554737512014-08-02T23:25:00.001+03:002014-08-02T23:35:54.219+03:00Krita: иллюстрированное руководство начинающего художника на русском<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_HZDS41U2DZKA7DPKr_8sujYE6SZtGmT8seXemfvyP2tJrwLK8D8CIIiZmYiYRx_HGR-ayHtFocFhiABeBGhSv2Oci8NuPqNKh7f23UB3kdMO3UGLYWPTJcQg0RIFK1CtkWQ3Fq6niK_y/s1600/001_cover.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<link href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet"></link>
<link href="http://blueimp.github.io/Gallery/css/blueimp-gallery.min.css" rel="stylesheet"></link>
<link href="css/bootstrap-image-gallery.min.css" rel="stylesheet"></link>
<br />
<div>
<div>Совсем недавно наш пользователь <a href="http://tysontan.tumblr.com/">Тайсон Тан</a> создал замечательное руководство для начинающих пользователей Криты. А благодаря переводу Георгия Сыпченко теперь это руководство доступно и на русском. Щелкаем на картинку и изучаем!</div>
<br /></div>
<!-- The Bootstrap Image Gallery lightbox, should be a child element of the document body -->
<br />
<div class="blueimp-gallery" id="blueimp-gallery">
<!-- The container for the modal slides -->
<br />
<div class="slides">
</div>
<!-- Controls for the borderless lightbox -->
<br />
<h3 class="title">
</h3>
<a class="prev" href="https://www.blogger.com/null">‹</a>
<a class="next" href="https://www.blogger.com/null">›</a>
<a class="close" href="https://www.blogger.com/null">×</a>
<a class="play-pause" href="https://www.blogger.com/null"></a>
<br />
<ol class="indicator"></ol>
<!-- The modal dialog, which will be used to wrap the lightbox content -->
<br />
<div class="modal fade">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button aria-hidden="true" class="close" type="button">×</button>
<br />
<h4 class="modal-title">
</h4>
</div>
<div class="modal-body next">
</div>
<div class="modal-footer">
<button class="btn btn-default pull-left prev" type="button">
<i class="glyphicon glyphicon-chevron-left"></i>
Previous
</button>
<button class="btn btn-primary next" type="button">
Next
<i class="glyphicon glyphicon-chevron-right"></i>
</button>
</div>
</div>
</div>
</div>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="http://blueimp.github.io/Gallery/js/jquery.blueimp-gallery.min.js"></script>
<script src="js/bootstrap-image-gallery.min.js"></script>
<br />
<div style="text-align: center;" id="links">
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_HZDS41U2DZKA7DPKr_8sujYE6SZtGmT8seXemfvyP2tJrwLK8D8CIIiZmYiYRx_HGR-ayHtFocFhiABeBGhSv2Oci8NuPqNKh7f23UB3kdMO3UGLYWPTJcQg0RIFK1CtkWQ3Fq6niK_y/s1600/001_cover.jpg">
<img alt="слайд" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_HZDS41U2DZKA7DPKr_8sujYE6SZtGmT8seXemfvyP2tJrwLK8D8CIIiZmYiYRx_HGR-ayHtFocFhiABeBGhSv2Oci8NuPqNKh7f23UB3kdMO3UGLYWPTJcQg0RIFK1CtkWQ3Fq6niK_y/s320/001_cover.jpg" />
</a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicF1srM_8lMm2SLg2p4kVw4QlHKrhc4XtKSN0FuZlA5SWvGM1q0BqbtxJZrgLrQp_iseadqXguUotJKs2U4l27LB55PjQgP4kQaRNa42SUHEztJIHfIft338w6hV7hwXgLn8mj1JAer_CZ/s1600/002_stage1_01_sketching.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrMpaTURiZl1egWL8kejc8vUD6MFCEZp9i7aONGnlIw-vohNI9X1gCtzkHa6sFd8AUCaSQXRp3LH4vMc-n2fZsPbGrOJc7AGzNDAedksMvhIBgBq2-JbkI8aVhh3CPouVNzIX0459AhXKg/s1600/003_stage1_02_brush.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW70bUEL_eOEcvQyJZXV_y7Gar0li0i3YnezRx1vDoezo1SW6JP9sQi5NYRN1kEIc76F4LiDTwgY0GGKVE3YEwrZLUYaheFCf4jgP-cGPR4OyZ3m0f2X3uq-nOTTH7TcSlYUtnTy0lRMeu/s1600/004_stage1_03_fav.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVwJ8c24RY2yN5XZj_C-4L9hxPYBceSjDVoLJgzaTzis0BgJa3dUOIvtMAQQry1NtzvzIKu01gJgVxtk1hqHFJiEjqWcv_ui8jiBNA5FZ-YlBKIH63EGaB7udz_IJRi0I4icI8KBKluFLl/s1600/005_stage1_04_shortcuts.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhptTjw-qVyUD4FC1yMRQpeYqtBxKchtU29ZLcI2R-C2sAC4W_5njh5IUeyhD_vdZUUkhWYn3l5T07dw1YE2lLU0TO3kr3zFMtzw5JH1JxFM5pSP6mmrQwp7jNXJPrHgEKhJDlNHHo7xvHF/s1600/006_stage1_05_shortcuts2.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjegOtDeBnU2ycUMxO8ZTLNqGY1bV2d5cEf-U9OoatVQmADd7zFAaUUIKyhq_Co1tFRDy85V8QUkezsCcGrm2FmiuZ7b0c9aC3SeLIJ009lZV9TXUSbDmXjuQjomG877u9-o92pu8dC_Zpy/s1600/007_stage2_01_colorplanning.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia-cFJ_O3nQnPx0k9NmmLX_XSrfx4yEvH3unq4F-jxHuqh5SoX8LVB9IOjDhskryv5ppObXl8GZ6eskvNOZJ9Of8V76sLGYTwEzbhlNkpbPkHNFNxPiEgaaL1eT2gauvbNQIctyYXoHa3E/s1600/008_stage2_02_layers.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBBGrm6eflQt2-c_t4gENZfy2XSVwyZGQNqiwsbnAcJ8QwUszwKePn3IE7vil18DRdBjFmpC6kwFCQs29cSGlR3befNclI3nVPeTGRCsw2qbtCFguAhqq5jGwY5-yi5EGSl4Md9_F_m5nQ/s1600/009_stage2_03_layers_docker.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho2_7jWJsHl-yXE6PGlq3zBCYq5S23mby1LuFC9ragPIKxc_NBCdpot-Qwbe3B_44dugWyk6Gpbce1AuPlcD80-BWFEquEQ9sRJ4il-zM_CfMNl2qXavh5zk12-hmivXTD_teqqTY9d10S/s1600/010_stage3_01_character.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlvXnqqKPqb2HB5TPvEK5cySX8B55BBfi5ewXZ8El5U2rVvFBM3ExtQbGRAgoZmZoar56jPdIBDQCd_HjDyI8aKo3EdCF3m7WjuMOL9Scn8HYqro7tz0p1RH266EzOKzCVzCq4hOjV23sh/s1600/011_stage3_02_multiply.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSUShtqx77XGD54_j1pIdCiA-qFrdKu7uVTAF2PhjTzez8Sjjzpge5OYkCTyf7a9l5VG0yjKeve6wePSvrUCBN5ZzjGGMAhYtVJJK25VmQcuoyOZhmE-3U04ADOvYSTQWyuzmTnplepEDL/s1600/012_stage3_03_multiply2.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL0iHeJiz123D84d28FGuoqGPvsjUzhPalHWrbkz1y-YfYlbs9y5Ncuu2j9O8L8Y9kxQ_yI7sHox20Fs8-xRlNI4eVc02PPuJ1izt_ltXuhd4e2JKHKpTP0zl1Slv1zHVGupUAnqZGzwom/s1600/013_stage3_04_multiply3.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOpA__AmtNE76o6neeXK8TB5ggg1p1CA2xZvtNJaRS67Zq52RayAWm-NAJIOLX0Z9-_KF72gcH420dgeEdLQwkWrdSj17B28vNnxCjwDtLxr16vc-S1j3qPCM1y7FgLPwB1M_h2A8MR6TS/s1600/014_stage3_05_paintover.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvnjMwsCcFrl_R8KXSmofJ3-33wI69akqHVzdyR_SeHj5QSnms9c5FsdLv0gL7lu3cG0ewWvDDfbsw9XCjk6C9eStwaedlcr7FwksM6iPIfX_uKc-382EMwTwwlcQa3eWZWv6Fh_eCwbFt/s1600/015_stage3_06_paintover2.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjC6bYeHJ7u2p6OMxDOcWFeTo81ylWGBal9IWVt97Fhfd39auDwpVLxM6UjWuAYQVyFB2tXXS4ZQAWmcwjTVAT93tGwIXTIVuNU2WAxxkiz_T_6Af7cWJO_wneZJOhHdN5srxITvJI_HWeE/s1600/016_stage3_06_ruler.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie9PWS-jvhcotBV_GHUqoJoIq1GwHOVvsCrDt3aIGCqDD4095xcAN-DsW0C46bLvuMcbDOpHLQEmrgiwyN7jH5YA8011UY3ePFurAZg6-29HkRU-_CN2Aib22N2p7t2jZuwPEZ45lYpYV8/s1600/017_stage3_07_transformation.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja6pJkTgrgv9Z2SbRsiRGeVJknjSoAOMMVRsaIcKDi3e8i2Sbx8pwPyIenFlbJPpnSTED026SvPhNAeskdyuCeyvsCBBHJpeyVC79cro9lMShisyaeGRvyu-_2FNAHd30oCONTTrlHEoKr/s1600/018_stage3_08_warp.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTZ_-Xnp2MaKx3zStKWJcpLcU24R0Sk4jlYYWlBMWvytW337Oz-Dqdke79lPkpIHlgMbKjySnt2VCruNvccQnS1I3CenQOyechhjmTw12kojEOONpsh2WEjevM4Ie-dPOEC6qtWJFqscSQ/s1600/019_stage4_01_adjust.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOlW0mGduQy17aiQTNISXlEujzUFN4zhvlPtu7KERpvYr0ry4do_pufM_cwscXsBeKL4OM5FNQKvvPz9AstNmVhXhOuZXI6oU1OREDh-mJZw9tWdrdgQVolwsEC8oDydmLBYvzoXldffCM/s1600/020_stage4_02_overlay.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiD6mqdbBEQZwkex4OvEb64fTMja44dg6XousG87RY9WIuVHHfP68JqndxMznTYnvqLjrL4WS-rjANTiztGidSw78SWiFC0lUZ4_OBL4F7jQgmp7NJVoGmQNJaBYs3xLNcEfhq3DaUnG6Ks/s1600/021_stage4_03_crop.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnjr12EFnBGrMdgqasQeehKX-JsKgrURy-ljiN0ziWSQLEV_FsIElavNuWiw9Vx0ZURQe7XGTLhT7_nChL-PxI5AIvy7FBFhio3OCkR4df3LRJgh5AK91BvA4cXhQTU6VMQsyrwsMFjdFd/s1600/022_stage4_04_mask.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqBvxjnby2LYp5fPsC3rL6hr9fOLtLYEgIVzO2SIAey8J0GW69DNEP-bhYpEA4h4mXLDjwPI7EYwXjBVYSL38CkRGaC3Ro05TwB7JAQYg27CtU91qualkA-YmgsJKLdM34vtru8xF8Bva5/s1600/023_stage4_05_mask2.jpg"> </a>
<a data-gallery="" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7fqPNWfF5bNV5XRk0haYDhd0aA-YgOYxFLbThwpVD_Yj6ECbMSoXi6q9KqgeKnhYiUGu8UeuK0w2lfnoBoKPAJT8qT3QvNZrpDagGgzjluJBTun095MUAxCGHzpv8cd5MZ0pSFBXHoFKm/s1600/024_stage5_01_end.jpg"> </a>
</div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com2tag:blogger.com,1999:blog-5433088378497538658.post-79802053188597879862014-07-14T09:01:00.000+03:002014-07-14T09:01:00.084+03:00Notes from Calligra Sprint. Part 2: Memory fragmentation in Krita fixed<div dir="ltr" style="text-align: left;" trbidi="on">
During the second day of Calligra sprint in Deventer we split into two small groups. Friedrich, Thorsten, Jigar and Jaroslaw were discussing global Calligra issues, while Boud and me concentrated on the performance of Krita and its memory consumption.<br />
<br />
We tried to find out why Krita is not fast enough for painting with big brushes on huge images. For our tests we created a two-layer image 8k by 8k pixels (which is 3x256 MiB (2 layers + projection)) and started to paint with 1k by 1k pixels brush. Just to compare, SAI Painting Tool simply forbids creating images more than 5k by 5k pixels and brushes more than 500 pixels wide. And during these tests we found out a really interesting thing...<br />
<br />
I guess everyone has at least once read about custom memory management in C++. All these custom new/delete operators, pool allocators usually seem so "geekish" and for "really special purposes only". To tell you the truth, I though I would never need to use them in my life, because standard library allocators "should be enough for everyone". Well, until curious things started to happen...<br />
<br />
Well, the first sign of the problems appeared quite long ago. People started to complain that according to system monitor tools (like 'top') Krita ate quite much memory. We could never reproduce it. And what's more 'massif' and internal tile counters always showed we have no memory leaks. We used exactly the number of tiles we needed to store the image of a particular size.<br />
<br />
But while making these 8k-image tests, we started to notice that although the number of tiles doesn't grow, the memory reported by 'top' grows quite significantly. Instead of occupying usual 1.3 GiB, which such image would need (layers data + about 400MiB for brushes and textures) reported memory grew up to 3 GiB and higher until OOM Killer woke up and killed Krita. This gave us a clear evidence that we have some problems with fragmentation.<br />
<br />
Indeed, during every stoke we have to create about 15000(!) 16KiB objects (tiles). It is quite probable that after a couple of strokes the memory becomes rather fragmented. So we decided to try boost::pool for allocation of these chunks... and it worked! Instead of growing the memory footprint stabilized on 1.3GiB. And that is not counting the fact that boost::pool doesn't free the free'd memory until destruction or explicit purging [0]<br />
<br />
Now this new memory management code is already in master! According to some synthetic tests, the painting should become a bit fasted. Not speaking about the much smaller memory usage.<br />
<h3 style="text-align: left;">
Conclusion:</h3>
If you see unusually high memory consumption in your application, and the results measured by massif significantly differ from what you see in 'top', you probably have some fragmentation problem. To proof it, try not to return the memory back to the system, but reuse it. The consumption might fall significantly, especially is you allocate memory in different threads.<br />
<br />
<br />
<br />
[0] - You can release unused memory by explicitly calling release_memory(), but 1) the pool must be ordered, which is worse performance; 2) the release_memory() operation takes about 20-30 seconds(!), so there is no use of it for us.<br />
<br />
<br />
<br /></div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com0tag:blogger.com,1999:blog-5433088378497538658.post-40234385056318910252014-07-13T17:42:00.000+03:002014-07-13T17:44:11.657+03:00Notes from Calligra Sprint in Deventer. Part 1: Translation-friendly code<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
Last weekend we had a really nice sprint Deventer, which was hosted by Irina and Boudewijn (thank you very much!). We spent two days on discussions, planning, coding and profiling our software, which had many fruitful results.<br />
<br />
On Saturday we were mostly talking and discussing our current problems, like porting Calligra to Qt5 and splitting libraries more sanely (e.g. we shouldn't demand mobile applications compile and link QWidget-based libraries). Although these problems are quite important, I will not describe them now (the other people will blog about it very soon). Instead I'm going to tell you about a different problem we also discussed — translations.<br />
<br />
The point is, when using i18n() macro, it is quite easy to make mistakes which will make translator's life a disaster, so we decided to make a set of rules of thumb which developers should follow for not creating such issues. Here are these five short rules:<br />
<br />
<ol style="text-align: left;">
<li>Avoid passing a localized string into a i18n macro</li>
<li>Add context to your strings</li>
<li>Undo commands must have (qtundo-format) context</li>
<li>Use capitalization properly</li>
<li>Beware of sticky strings </li>
</ol>
<div style="text-align: left;">
Next we will talk about each of the rules in details:</div>
<br />
<h3 style="text-align: left;">
1. Avoid passing a localized string into a i18n macro</h3>
<i>They might be not compatible in case, gender or anything else you have no idea about</i><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">// Such code is incorrect in 99% of the cases<br />QString str = i18n(“foo bar”);<br />i18n(“Some nice string %1”, str);</span><br />
<span style="font-family: "Courier New",Courier,monospace;"></span>
<br />
<h4 style="text-align: left;">
Example 1</h4>
<span style="font-family: "Courier New",Courier,monospace;">// WRONG:</span><br />
<span style="font-family: "Courier New",Courier,monospace;">wrongString = i18n(“Delete %1”, XXX ? i18n(“Layer”) : i18n(“Mask”))<br /><br />// CORRECT:</span><br />
<span style="font-family: "Courier New",Courier,monospace;">correctString = XXX ? i18n(“Delete Layer”) : i18n(“Delete Mask”)<br /> </span><br />
Such string concatenation is correct in English, but it is completely inappropriate in many languages in which a noun can change its form depending on the case. The problem is that in macro <span style="font-family: "Courier New",Courier,monospace;">i18n(“Mask”)</span> the word "Mask" is used in <a href="http://en.wikipedia.org/wiki/Nominative_case">nominative case</a> (is a subject), but in expression "Delete Mask” it is in <a href="http://en.wikipedia.org/wiki/Accusative_case">accusative case</a> (is an object). For example is Russan the two strings will be different and the translator will not be able to solve the issue easily.<br />
<h4 style="text-align: left;">
Example 2</h4>
</div>
<span style="font-family: "Courier New",Courier,monospace;">// WRONG:</span><br />
<span style="font-family: "Courier New",Courier,monospace;">wrongString = i18n(“Last %1”, XXX ? i18n(“Monday”) : i18n(“Friday”))</span><br />
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace;">// CORRECT:</span><br />
<span style="font-family: "Courier New",Courier,monospace;">correctString = XXX ? i18n(“Last Monday”) : i18n(“Last Friday”) </span></div>
<br /></div>
This case is more complicated. Both words "Monday" and "Friday" are used in the nominative case, so they will not change their form. But "Monday" and "Friday" have different gender in Russian, so the adjective "Last" must change its form depending on the second word used. Therefore we need to separate strings for the two terms. <br />
<br />
The tricky thing here is that we have 7 days in a week, so ideally we should have 7 separate strings for "Last ...", 7 more strings for "Next ..." and so on.<br />
<h4 style="text-align: left;">
Example 3 — Using registry values</h4>
<span style="font-family: "Courier New",Courier,monospace;">// WRONG:</span><br />
<span style="font-family: "Courier New",Courier,monospace;">KisFilter *filter = filterRegistry->getFilter(id);</span><br />
<span style="font-family: "Courier New",Courier,monospace;">i18n(“Apply %1”, filter->name())</span><br />
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace;">// CORRECT: is there a correct way at all?</span><br />
<span style="font-family: "Courier New",Courier,monospace;">KisFilter *filter = filterRegistry->getFilter(id);</span><br />
<span style="font-family: "Courier New",Courier,monospace;">i18n(“Apply: \”%1\””, filter->name())</span><br />
<br />
Just imagine how many objects can be stored inside the registry. It can be a dozen, a hundred or a thousand of objects. We cannot control the case, gender and form of each object in the list (can we?). The easiest approach here is to put the object name in quotes and "cite" that literally. This will hide the problem in most of the languages.<br />
<h3 style="text-align: left;">
2. Add context to your strings</h3>
<i>Prefer adding context to your strings rather than expecting translators reading your thoughts</i><br />
<br />
Here is an example of three strings for blur filter. They illustrate the three most important translation contexts<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">i18nc(“@title:window”, “Blur Filter”)</span><br />
<br />
<span style="font-size: small;">Window titles are usually <b>nouns</b> (and translated as nouns). There is no limit on the size of the string.</span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">i18nc(“@action:button”, “Apply Blur Filter”)</span><br />
<br />
<span style="font-size: small;">Button actions are usually <b>verbs</b>. The length of the string is also not very important.</span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">i18nc(“@action:inmenu”, “Blur”)</span><br />
<br />
<span style="font-size: small;">Menu actions are also <b>verbs</b>, but the length of the string should be as short as possible.</span><br />
<br />
<h3 style="text-align: left;">
3. Undo commands must have (qtundo-format) context</h3>
<i>Adding this context tells the translators to use “Magic String” functionality. Such strings are special and are not reusable anywhere else.</i><br />
<br />
In Krita and Calligra this context is now added automatically, because we use C++ type-checking mechanism to limit the strings passed to an undo command:<br />
<br />
KUndo2Command(const KUndo2MagicString &text, KUndo2Command *parent);<br />
<h3 style="text-align: left;">
4. Use capitalization properly</h3>
See <a href="https://techbase.kde.org/Projects/Usability/HIG/Capitalization">KDE policy</a> for details. <br />
<h3 style="text-align: left;">
5. Beware of sticky strings</h3>
<i>When the same string without a context is reused in different places (and especially in different files), doublecheck whether it is appropriate.</i><br />
<br />
E.g. i18n("Duplicate") can be either a brush engine name (noun) or a menu action for cloning a layer (verb). Obviously enough not all the languages have the same form of a word for both verb and noun meanings. Such strings must be split by assigning them different contexts.<br />
<br />
Alexander Potashev has created a <a href="http://comments.gmane.org/gmane.comp.kde.devel.internationalization-and-documentation/26892">special python script</a> that can iterate through all the strings in a .po file and report all the sticky strings in a convenient format.<br />
<h3 style="text-align: left;">
Conclusion</h3>
Of course all these rules are only recommendation. They all have exceptions and limitations, but following them in the most trivial cases will make the life of translators much easier.<br />
<br />
In the next part of my notes from the sprint I will write how Boud and me were hunting down memory fragmentation problems in Krita on Sunday... :)</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com2tag:blogger.com,1999:blog-5433088378497538658.post-18393522384760388432014-07-05T10:30:00.001+03:002014-07-05T10:30:04.682+03:00Calligra Sprint 2014 has started!<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCA4WczOy0SrqbcZVCvrl44yvT2aRPILzpIEm_fgIFfiG1oVC6ZDqVEaVnRPz8Q4UpEpptB02vwc-FKjLWlaOKPrauEqU_9MO6FWj6nMr7_bGeUNOQar1MUxMCLTBoniNt7q1mvf5wJJzF/s1600/calligra_twitter.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCA4WczOy0SrqbcZVCvrl44yvT2aRPILzpIEm_fgIFfiG1oVC6ZDqVEaVnRPz8Q4UpEpptB02vwc-FKjLWlaOKPrauEqU_9MO6FWj6nMr7_bGeUNOQar1MUxMCLTBoniNt7q1mvf5wJJzF/s1600/calligra_twitter.png" /></a>Calligra Sprint 2014 has started! Today you have a unique chance to ask developers any questions about Calligra, Krita and Kexi on Twitter on a hash tag<strong class="search-query"> </strong><b>#AskCalligraDevs</b></div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com0tag:blogger.com,1999:blog-5433088378497538658.post-13423621992234955552014-06-18T22:25:00.000+03:002014-06-18T22:25:20.919+03:00Krita: "Edit Global Selection" feature<div dir="ltr" style="text-align: left;" trbidi="on">
Our <a href="https://www.kickstarter.com/projects/krita/krita-open-source-digital-painting-accelerate-deve">Kickstarter project</a> is over 50% of the goal now! To say "Thank you!" to our supporters we decided to implement another small feature in Krita: editing of the global selection. Now you can view, transform, paint and do whatever you like on any global selection!<br />
<br />
To activate the feature, just go to<i> </i>main menu and activate <i>Selection->Show Global Selection Mask</i> check box. Now you will see your global selection as a usual mask in the list of layers in the docker. Activate it and do whatever you want with it. You can use any Krita tool to achieve your goal: from trivial Brush tool to complex Transformation or Warp tool. When you are done, just deactivate the check box to save precious space of the Layers docker.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbVp24laVjAOFb9yNjjw2GUMV8SsPWSba9dI0QopxVEICH9jeHXvouNVn9MysYjYhV5BBLyi9dQzweMnIFIgM-MKSsauj1xPE0vIE8oI0_L-3Xkc-06Vqj5F8I-Nf2WkAVItbd5Ww4HVXo/s1600/krita_selections_1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbVp24laVjAOFb9yNjjw2GUMV8SsPWSba9dI0QopxVEICH9jeHXvouNVn9MysYjYhV5BBLyi9dQzweMnIFIgM-MKSsauj1xPE0vIE8oI0_L-3Xkc-06Vqj5F8I-Nf2WkAVItbd5Ww4HVXo/s1600/krita_selections_1.png" height="209" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Add usual global selection</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDBkHcWrC79ECw-ZSFm5vmUW5HI7Cpl3Mf4DIH9X_w7OvjkwCj-b4yyqp6bkZsAn6c-B9WYAtlEXIlPAa_NsnuHoy97R9y_mkroTOKoNHMaW84GvRnO1fn6pLNx_IrIx20RYJv8_idUkGp/s1600/krita_selections_2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDBkHcWrC79ECw-ZSFm5vmUW5HI7Cpl3Mf4DIH9X_w7OvjkwCj-b4yyqp6bkZsAn6c-B9WYAtlEXIlPAa_NsnuHoy97R9y_mkroTOKoNHMaW84GvRnO1fn6pLNx_IrIx20RYJv8_idUkGp/s1600/krita_selections_2.png" height="209" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Deform with Warp Tool and paint with Brush Tool</td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<br />
This feature (as well as the Isolated Mode one) was a really low hanging fruit for us. It was possible to implement due to a huge refactoring we did in the selections area about two years ago, so adding it was only extending existing functionality. It is really a pity that the other features from the Kickstarter list cannot be implemented so easily :) Now I'm going to dig deep into the Vanishing Points and Transformations problem. Since Saturday I've been trying to struggle through the maths of it, but with limited success...<br />
<br />
Next Windows and <a href="http://dimula73.blogspot.ru/2013/05/krita-lime-ppa-always-fresh-versions.html">Krita Lime</a> will have this feature included!<br />
<br />
And don't forget to your friends about our <a href="https://www.kickstarter.com/projects/krita/krita-open-source-digital-painting-accelerate-deve">Kickstarter</a>!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.kickstarter.com/projects/krita/krita-open-source-digital-painting-accelerate-deve"><img alt="https://www.kickstarter.com/projects/krita/krita-open-source-digital-painting-accelerate-deve" border="0" src="http://krita.org/images/kickstarter-29-front-ban.png" height="60" width="640" /></a></div>
<br />
<br />
<br />
<br /></div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com2tag:blogger.com,1999:blog-5433088378497538658.post-91659692520817071642014-06-16T12:17:00.000+03:002014-06-16T12:17:33.511+03:00Krita team starts implementing features declared for the Kickstarter!<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
During the first week of our <a href="https://www.kickstarter.com/projects/krita/krita-open-source-digital-painting-accelerate-deve">Kickstarter campaign</a> we collected more than 6500 eur, which is about 43% of the goal. That is quite a good result, so we decided to start implementing the features right now, even though the campaign is not finished yet :)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
I started to work on three low-hanging fruits in parallel: perspective transformation of the image basing on vanishing points, editing of the global selection and enhanced isolate layer mode.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
It turned out that the vanishing point problem is not so "low-hanging" as I thought in the beginning, so right now I'm in the middle of my way of searching the math solution for it: to provide this functionality to the user the developer must find right perspective transformation matrix basing only on points in the two coordinate systems. This problem is inverse to what everyone is accustomed to solve at school :) This is quite interesting ans challenging task and I'm sure we will solve it soon!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Until I found the solution for maths task, I decided to work on small enhancements of our Isolate Layer mode. We have this feature already for a long time, but it was too complicated to use because the only way to activate it was to select "Isolate Layer" item in the right-click menu. Now this problem is gone! You can just press <i>Alt key </i>and click of the layer or mask in the Layers docker. This enables many great use cases for artists, which now can be done with a single <i>Alt-click</i>:</div>
<div style="text-align: justify;">
</div>
<ul style="text-align: justify;">
<li>Show/Edit the contents of a single layer, without other layers interferring</li>
<li>Show/Edit the masks. This includes Selection Masks, so you can edit non-global selections very easily (modifying global selections will be simplified later)</li>
<li>Inspect all the layers you have by simply switching between them and looking into their contents in isolated environment</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK9V4_Or7TNoYv3phoy56YRfSDUsZVa8x-eM0dALynevwF5jqWqfrM4S3Y7COB2ccL1bzGze1f-nOxJCh5jdceMEhF_dyN1B0A224Tmh2KOPyFp1cb-41FYOyhS1LFBNgqCDl98eSAL3Wu/s1600/isolate_layer_0.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK9V4_Or7TNoYv3phoy56YRfSDUsZVa8x-eM0dALynevwF5jqWqfrM4S3Y7COB2ccL1bzGze1f-nOxJCh5jdceMEhF_dyN1B0A224Tmh2KOPyFp1cb-41FYOyhS1LFBNgqCDl98eSAL3Wu/s1600/isolate_layer_0.png" height="211" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivzh1yMefKf38l0NfWvwV6Xtpig4r5iFQNRbSM-TgFISUsqI5PaGyAtW7pNuoWgbqdf6waHKUW-ADUOdHTRpSksGIfF7GLvMW6khle4mOTXHVuAS4EoL6-jcoWRixhA1kPXh0gKebpoIOj/s1600/isolate_layer_1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivzh1yMefKf38l0NfWvwV6Xtpig4r5iFQNRbSM-TgFISUsqI5PaGyAtW7pNuoWgbqdf6waHKUW-ADUOdHTRpSksGIfF7GLvMW6khle4mOTXHVuAS4EoL6-jcoWRixhA1kPXh0gKebpoIOj/s1600/isolate_layer_1.png" height="209" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A comic page by <span style="font-weight: normal;">Timothée Giet</span></td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
There are several more things we are planning to do with the Isolated Mode like adding a bit of optimizations, but that is not for today :) </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The next packages in <a href="http://dimula73.blogspot.ru/2013/05/krita-lime-ppa-always-fresh-versions.html">Krita Lime</a> will include this new feature. They are now building at Launchpad and will be available tonight!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
And don't forget to spread the word about our <a href="https://www.kickstarter.com/projects/krita/krita-open-source-digital-painting-accelerate-deve">Kickstarter</a>!</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://www.kickstarter.com/projects/krita/krita-open-source-digital-painting-accelerate-deve"><img alt="https://www.kickstarter.com/projects/krita/krita-open-source-digital-painting-accelerate-deve" border="0" src="http://krita.org/images/kickstarter-29-front-ban.png" height="60" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com2tag:blogger.com,1999:blog-5433088378497538658.post-59497398097972311822014-06-10T18:01:00.000+03:002014-06-10T18:02:14.709+03:00Krita Lime is updated again!<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
It was about a month when we last updated <a href="http://dimula73.blogspot.de/2013/05/krita-lime-ppa-always-fresh-versions.html">Krita Lime</a>. And it is not because we had leisure time and did nothing here ;) In reverse, we got so many features merged into master so it became a bit unstable for a short period of time. And now we fixed all the new problems so you can see a nice build of Krita with lots of shiny features!</div>
<h3 style="text-align: justify;">
Wacom Artpen rotation sensor improved</h3>
<div style="margin-bottom: 0in; text-align: justify;">
If you are a happy owner of a Wacom Artpen stylus, now you can use its rotation sensor efficiently: now it works on both Linux and Windows, and more, it works exactly the same way on both operating systems! For those who are not accustomed to work with drivers directly it might come as surprise, but the direction of rotation reported by the Windows and Linux drivers are opposite, not speaking about an offset by 180°. The good news: now it is gone! Just use it!<br />
<h3>
Avoid stains on the image when using touch-enabled Wacom device</h3>
The most popular advice you get from an experienced artist concerning Wacom touch-enabled usually sounds like: "disable touch right after connecting it". Well, it has some grounds... The problem is that the artist while painting with the stylus can easily tap on a tablet with a finger and soil the image with stains of paint. Yes, most of the taps will be filtered by the Wacom driver (it disables touch while stylus is in proximity), but sometimes it doesn't work. Anyway, now the problem is solved, though only on Linux.<br />
<br />
Now Linux version of Krita has a special "hidden" configuration option called <i>disableTouchOnCanvas</i>. If you add line<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">disableTouchOnCanvas=true</span></span><br />
<br />
to the beginning of your <i>kritarc</i> file, the touch will not disturb you with extra points on the canvas anymore! Though it will continue to work with UI elements as usual!<br />
<h3>
OpenColorIO-enabled color selectors for HDR images</h3>
This is a very huge and really nice feature, on which we were working hard. There will be a separate article about it soon! Just subscribe to us and wait a bit! ;)<br />
<h3>
Many small nice enhancements</h3>
<ul><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzDuzSZ7CPiEkIXIru0QzMBofO20QeFXwWRKXjsYJh8KYXyjiX-2Cv2sXNMlxVxejFGRe3XVuuV7c18lad6R8ax5koHySVGanTCd5-sp52vz2N1HOm_k1C6duh7BhH5DnWVeD7rNp075P/s1600/zooming_floating.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzDuzSZ7CPiEkIXIru0QzMBofO20QeFXwWRKXjsYJh8KYXyjiX-2Cv2sXNMlxVxejFGRe3XVuuV7c18lad6R8ax5koHySVGanTCd5-sp52vz2N1HOm_k1C6duh7BhH5DnWVeD7rNp075P/s1600/zooming_floating.png" /></a>
<li> '[' and ']' shortcuts for changing image size now don't have hysteresis, and scale smoothly with the brush size</li>
<li>Zooming, Rotation and Mirroring now have a floating window showing the current state of the operation. This is highly necessary when working in full-screen mode or without the status bar shown.</li>
<li>Pseudo Infinite Canvas will not make your canvas too huge. It will grow the image by 100% and no more. Now you can use this feature for doubling any dimension of the canvas with a single click.</li>
<li>Added "Scalable Smoothing Distance" feature. When using Weighted Smoothing, the distance will be automatically corrected according to your zoom level, so the behavior of the stylus will not alter with changing the canvas zoom.</li>
<li>Made the handles of the Transform Tool easier to click on. Now clickable area is twice wider! Just click!</li>
</ul>
<h3>
Kickstarter campaign</h3>
And yes, today we started our first donation <a href="http://www.krita.org/kickstarter.php">campaign</a> on Kickstarter! It will last for 30 days only, during which we are going to raise money for 2.9 <br />
release!<br />
<br />
Direct link: <a href="https://vk.com/away.php?to=http%3A%2F%2Fwww.krita.org%2Fkickstarter.php" target="_blank">http://www.krita.org/kickstarter.php</a><br />
<br />
Help us, and together we will make Krita awesome!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiecfCfZtmCh7vHbkfedyEF2LgELmL4hxwp0yJN5Ix4YAijpiTs2u9z4lx1G8S0VXRMN9gFa1wLpgASrBB6OAcXL4QsihxFwCEJtYXHVycKIJhhxWmi_gZeKaDyixEQUIqejNMqkT7QkiHP/s1600/kickstarter_logo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiecfCfZtmCh7vHbkfedyEF2LgELmL4hxwp0yJN5Ix4YAijpiTs2u9z4lx1G8S0VXRMN9gFa1wLpgASrBB6OAcXL4QsihxFwCEJtYXHVycKIJhhxWmi_gZeKaDyixEQUIqejNMqkT7QkiHP/s1600/kickstarter_logo2.png" /></a></div>
<br /></div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com0tag:blogger.com,1999:blog-5433088378497538658.post-25878030370714064772014-06-02T15:21:00.000+03:002014-06-02T15:21:25.626+03:00Some notes from Krita Sprint 2014<div dir="ltr" style="text-align: left;" trbidi="on">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidAILnLjd-RyptPqFw0w64ALI9QFz-y1pr005DtqtjpfkwFMci8ZSnHUE6nEHx0t9qq2Ut11huR_EZ0lNhxbX3lqHYMJ8bIY1s7NgsYQeKTSGWd4g7maYwhXVD4bMDkD_3hWd_LaCmcFZF/s1600/IMG_9045.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidAILnLjd-RyptPqFw0w64ALI9QFz-y1pr005DtqtjpfkwFMci8ZSnHUE6nEHx0t9qq2Ut11huR_EZ0lNhxbX3lqHYMJ8bIY1s7NgsYQeKTSGWd4g7maYwhXVD4bMDkD_3hWd_LaCmcFZF/s1600/IMG_9045.jpg" height="213" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Krita people in Deventer: <br />
Sven, Lukas, Timothee and Steven</td></tr>
</tbody></table>
<div style="text-align: justify;">
Almost two weeks have passed since we returned from the sprint, but we are now only beginning to sort out and formalize all the data and notes we did during the meeting. The point is, this time (as well as during the last sprint in 2011) we had three painters with us who gave us immeasurable amount of input about how they use Krita and what can be improved. This is the case when criticizing and complaining was exactly what we needed :)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
So after having general discussions about Krita's roadmap on Saturday <a href="http://mail.kde.org/pipermail/kimageshop/2014-May/012313.html">[0]</a>, we devoted Sunday on listening to painters. <a href="http://wolthera.info/">Wolthera</a>, <a href="http://bollebib.deviantart.com/">Steven</a> and <a href="http://www.timotheegiet.com/">Timothée</a> gave us short sessions during which they were painting their favorite characters and we could look at it and notice all the usecases and small inconveniences they face when working with Krita. The final <a href="https://docs.google.com/document/d/1f2weyaHAw7xLfUo0geKj9DRys3dLY3QCIRO-NVO_t-Y/edit#heading=h.emp1mzq0xdil">list of our findings</a> became rather long :), but it will surely have immense impact on our future. We saw not only wishes and bugs, we also had several revelations, the things which we could not even imagine before. Here is a brief list of them.</div>
<div style="text-align: justify;">
<br /></div>
<h3 style="text-align: justify;">
Tablet-only workflow</h3>
<div style="text-align: justify;">
Yeah, not all the painters have a keyboard! ;) Sometimes a painter can use a tablet with built-in digitizer for painting. In such a case the workflow completely changes!</div>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUT1Z10v09nn3gheR_Zn_HoJIj_4Fp8RDd5XscrnPJ6qN_GZo0TPk3PGeExrNfxtD4XheXhkqiI7PlWQ5eCEk4hRf7H6nlwQT4_mro-M93BxteKLciqq1OHEug2gw5PRf263Yo8NtQiUo8/s1600/krita-tool-bars.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUT1Z10v09nn3gheR_Zn_HoJIj_4Fp8RDd5XscrnPJ6qN_GZo0TPk3PGeExrNfxtD4XheXhkqiI7PlWQ5eCEk4hRf7H6nlwQT4_mro-M93BxteKLciqq1OHEug2gw5PRf263Yo8NtQiUo8/s1600/krita-tool-bars.png" height="266" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Two tool bars is too few! More floating toolbars!</td></tr>
</tbody></table>
<ol style="text-align: justify;">
<li>The painter may decide to reassigns the two stylus buttons to pan and zoom gestures since he has no access to a usual Spacebar shortcut.</li>
<li>The toolbars! Yes, the toolbars are the precious space where the painter will put all the actions he needs. And there should be many configurable toolbars. The problem we have now is that there can be only one toolbar of a specific type and every action belongs to its own toolbar. The user should be able to create many general-case toolbars and put/group actions however he likes. I'm not sure this is possible to implement within current KDE framework, but we must investigate into it! </li>
<li>Even when using a tablet some painters cheat a bit and use gaming keypads to access most needed actions, like pop-up palette, color picker and others. Steven came to Deventer with his Razer Nostromo device, and it seems he is quite convenient with it.</li>
</ol>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.razerzone.ru/media/brands/2010-11-26/razer-nostromo-gallery4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="http://www.razerzone.ru/media/brands/2010-11-26/razer-nostromo-gallery4.jpg" height="200" title="Razer Nostromo. Not for gaming!" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Razer Nostromo. Not for gaming :)</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<h3 style="text-align: justify;">
Revelations</h3>
<div style="text-align: justify;">
Though it might sound funny, but some of Krita features really surprised me! I never knew we could use old-good tools this way.</div>
<div style="text-align: justify;">
</div>
<ol style="text-align: justify;">
<li>Experiment Brush. Have you ever thought that this brush might be an ideal tool for creation of shadows on a comic-look pictures? Well, it is ;)</li>
<li>Group Layers + Inherit Alpha layer option. I could never imagine that Inherit Alpha feature can be combined with the Group Layers! If you use Inherit Alpha withing a group, then it'll use only the colors of this group! This can be used for filling/inking the parts of the final image. Just move it into a separate group, activate Inherit Alpha and you can easily fill/outline your part of the image!</li>
<li>Color Picker. This is a trivial tool of course. But if you assign it to the second stylus' button, it becomes an efficient tool for mixing color right on the canvas! Paint, pick and mix colors as if you use a real-world brush.</li>
</ol>
<div style="text-align: justify;">
Well, there were many other issues we found during the sessions. There were also some bugs, but the severity of those was really minor. Especially in comparison to the sessions we did in 2011, when David Revoy had to restart Krita several times due to crashes and problems... We did really much progress since Krita 2.4!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Yeah, it was a really nice and efficient sprint! Thanks Boudewijn and Irina for hosting the whole team in their house and KDE e.V. for making all this possible!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
[0] - see Boud's report about it</div>
<div style="text-align: justify;">
<a href="http://mail.kde.org/pipermail/kimageshop/2014-May/012313.html">http://mail.kde.org/pipermail/kimageshop/2014-May/012313.html</a></div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com0tag:blogger.com,1999:blog-5433088378497538658.post-63340624832673885302014-04-09T14:45:00.000+03:002014-04-10T11:08:47.948+03:00Krita: Russian Translations Updated!<div dir="ltr" style="text-align: left;" trbidi="on">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgezYm4wp3T0mYni9Ojo_2HTiH4C3CM80LOerHAAxolckgkGKwOoFuL9Z6D0TlSnRRUwwebl3cJsoPM_3Bfl4EVYLmO35fTlB-xu7p21nuPtshPxdrG3ryv094o_1kws4ItYKcht9AnjQC7/s1600/krita-ru.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgezYm4wp3T0mYni9Ojo_2HTiH4C3CM80LOerHAAxolckgkGKwOoFuL9Z6D0TlSnRRUwwebl3cJsoPM_3Bfl4EVYLmO35fTlB-xu7p21nuPtshPxdrG3ryv094o_1kws4ItYKcht9AnjQC7/s1600/krita-ru.jpg" height="237" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A picture by Georgiy Syptchenko <br>after a well-known <a href="http://www.davidrevoy.com/article193/guide-building-krita-on-linux-for-cats">series</a> by David Revoy :)</td><td class="tr-caption" style="text-align: center;"><br /></td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
Thanks to <a href="http://vk.com/superzhook">Georgiy Syptchenko</a> from <a href="http://vk.com/ilovefreeart">Krita Russian Community</a> [0] Krita's translations into Russian got significantly improved recently!<br />
<br />
We have already done three translation updates in Krita Lime repository and there are new changes yet to come!<br />
<br />
So if you happen to speak Russian and want to help us with testing our translations, please follow this manual [1] and install updated translation packages!<br />
<br />
<br />
<br />
[0] - <a href="http://vk.com/ilovefreeart">http://vk.com/ilovefreeart</a><br />
[1] - <a href="http://dimula73.blogspot.ru/2014/03/krita-lime-localization-support.html">http://dimula73.blogspot.ru/2014/03/krita-lime-localization-support.html</a></div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com0tag:blogger.com,1999:blog-5433088378497538658.post-82359808340074648502014-03-28T13:36:00.000+03:002014-03-28T14:49:45.687+03:00Krita 2.9 (pre-alpha): Updated Fill Tool!<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVqKmrwCN3UqHyX0TxWUsj22JBb70u3uIQXnUBL1uBM6Q_-J4dQt0JDmOSZDDvueybZDgsuC4itGDBgbTIGvoKJ7xvX6QndN46tYnT1UPHBIdUPbjPvbtDjEggo-83-wcuEVXKeXbhksr3/s1600/fill_comics_animtim_screenshot-fs8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVqKmrwCN3UqHyX0TxWUsj22JBb70u3uIQXnUBL1uBM6Q_-J4dQt0JDmOSZDDvueybZDgsuC4itGDBgbTIGvoKJ7xvX6QndN46tYnT1UPHBIdUPbjPvbtDjEggo-83-wcuEVXKeXbhksr3/s1600/fill_comics_animtim_screenshot-fs8.png" height="348" width="640" /></a></div>
<h3 style="text-align: left;">
Preface</h3>
<div style="text-align: justify;">
The Fill Tool was present in Krita since the ancient days. Its was first implemented back in 2004, and since then there were only minor changes to the algorithm it used. Now we are glad to announce a major update of it!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The old implementation used a, though a bit optimized, but still conventional, flood-fill algorithm that iterated through all the pixels recursively using a huge array as a map to store which pixels were visited and which not. It had two obvious drawbacks: it ate your memory (~100MiB for a map for an 10k x 10k image) and it was rather slow. The new algorithm is free from these disadvantages!</div>
<div style="text-align: justify;">
</div>
<h3 style="text-align: justify;">
Scanline Flood Fill Algorithm</h3>
<div style="text-align: justify;">
The new algorithm uses larger entities than just a single pixel. It uses "scanlines", which is effectively a chunk of a row of the image. The process of filling looks like a game. Several scanlines traveling throughout the image and checking or filling the pixel data. Each scanline can travel in either upward or downward direction. When two scanlines of opposite directions meet, they eat each other and both disappear! The process continues while there is at least one scanline alive :)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The rules for breeding and eating scanlines are a bit complicated, but they guarantee that not a single pixel will ever be visited twice! And that is without keeping any map of visited pixels, and therefore without oppressing your RAM! The experiments we conducted showed that to flood-fill an image of 10k by 10k pixels one would need only about 1MiB of memory! Just compare that to the 100MiB demanded by the conventional algo!</div>
<div style="text-align: justify;">
</div>
<h3 style="text-align: justify;">
Real Performance Tests</h3>
<div style="text-align: justify;">
The tests showed that the performance of the new Fill Tool greatly depends on whether the user needs some complex compositioning or not. That is why we introduced two new modes for the Fill Tool:</div>
<ul style="text-align: justify;">
<a href="data:image/png;base64,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" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" border="0" src="data:image/png;base64,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" /></a>
<li><i>Advanced Mode</i> — the mode supporting all the features of the tool, such as applying a selection, rendering the result with a user-supplied composite op, growing or feathering the selection area. This mode works about <b>1.4 times</b> faster than the old implementation;</li>
<br />
<li><i>Fast Mode</i> — just fill the area with color! No compositioning or selections are supported, but thanks to these limitations it is capable of up to 2 times better performance than the Advanced Mode. Which is almost <b>3 times</b> faster that the old conventional algorithm! </li>
</ul>
<div style="text-align: justify;">
And, of course, these speed benefits are nothing in comparison to the economy of memory we achieve!</div>
<div style="text-align: justify;">
<br /></div>
<h3 style="text-align: justify;">
Conclusion</h3>
<div style="text-align: justify;">
The new Flood Fill algorithm is already present in Krita master and is available for all the users having Krita Lime [0] installed! Just update and have fun with your painting!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
And yes, this work would be impossible without the support from <i>Krita Foundation</i>! Become a sponsor of the Krita Project and help us move the painting world further!</div>
<div style="text-align: left;">
<br />
<table align="center" cellspacing="10">
<tbody>
<tr><td></td><td style="text-align: center;" valign="top"><div style="text-align: center;">
<b> Monthly Donation through Paypal</b></div>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input name="cmd" type="hidden" value="_s-xclick" /> <input name="hosted_button_id" type="hidden" value="GVWHRVH69C37L" />
<br />
<table>
<tbody>
<tr>
<td style="text-align: center;"><input name="on0" type="hidden" value="Krita Development Funding" />Krita Development Funding</td>
</tr>
<tr>
<td><select name="os0">
<option value="Bronze">Bronze : €5,00 EUR - monthly</option>
<option value="Sliver">Sliver : €10,00 EUR - monthly</option>
<option value="Gold">Gold : €25,00 EUR - monthly</option>
<option value="Platinum">Platinum : €100,00 EUR - monthly</option>
<option value="Diamond">Diamond : €250,00 EUR - monthly</option>
</select></td>
</tr>
</tbody>
</table>
<input name="currency_code" type="hidden" value="EUR" /> <input alt="PayPal - The safer, easier way to pay online!" name="submit" src="https://www.paypalobjects.com/en_US/i/btn/btn_subscribeCC_LG.gif" type="image" /> <img alt="" border="0" height="1" src="https://www.paypalobjects.com/nl_NL/i/scr/pixel.gif" width="1" /></form>
</td>
</tr>
</tbody>
</table>
<table align="center" cellspacing="10">
<tbody>
<tr>
<td valign="top"><br />
<b>One-time donation through Paypal</b><br />
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input name="cmd" type="hidden" value="_s-xclick" /> <input name="hosted_button_id" type="hidden" value="PU4JABGLLTYDQ" /> <input alt="PayPal — The safer, easier way to pay online." name="submit" src="https://www.paypalobjects.com/en_US/GB/i/btn/btn_donateCC_LG.gif" type="image" /> <img alt="" border="0" height="1" src="https://www.paypalobjects.com/nl_NL/i/scr/pixel.gif" width="1" /></form>
</td>
</tr>
</tbody>
</table>
<br /></div>
<div style="text-align: left;">
</div>
<div style="text-align: left;">
[0] - <a href="http://dimula73.blogspot.ru/2013/05/krita-lime-ppa-always-fresh-versions.html">http://dimula73.blogspot.ru/2013/05/krita-lime-ppa-always-fresh-versions.html</a><br />
<br />
PS:<br />
<div class="iw" style="text-align: left;">
Thanks <span class="gD" name="Timothée Giet">Timothée Giet for a nice title image!</span></div>
</div>
<ul style="text-align: left;">
</ul>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com2tag:blogger.com,1999:blog-5433088378497538658.post-60943782232808449952014-03-27T15:19:00.000+03:002014-03-27T15:19:16.939+03:00Krita: new extended tablet support!<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1AvQFYqu9QFSjj_rtZ16VlVTQ_fYdt6FHMEdNJhZTfod1mGtlEx4XBi63f3fwcEuyKM6pE_mBk7s3aN8v03n7atrAAojRVaH_RHgHzg_0tMAIirzNYdB5QIsbemE3Wz42WYij8IshzXqW/s1600/IMG_7608_scaled.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1AvQFYqu9QFSjj_rtZ16VlVTQ_fYdt6FHMEdNJhZTfod1mGtlEx4XBi63f3fwcEuyKM6pE_mBk7s3aN8v03n7atrAAojRVaH_RHgHzg_0tMAIirzNYdB5QIsbemE3Wz42WYij8IshzXqW/s1600/IMG_7608_scaled.JPG" height="213" width="320" /></a>Traditionally Krita supported various types of tablets on Linux, but this support was limited to the tablets handled by <i>wacom</i> driver. The list of the supported hardware included (obviously) all the Wacom-branded tablets and some rare species that were trying to resemble the branded devices. It was the best that one could get form the <i>Qt</i>'s tablet code. From now on Krita can also work with all the devices which are handled by the <i>evdev</i> X11 driver!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The list of the devices supported by <i>evdev</i> is really vast. It includes such not-very-expensive brands like <i>Monoprice</i>, <i>Bosto</i>, <i>Huion</i> and <i>Genius</i>. By the moment we tested Krita on two devices: <i>Bosto 19MA</i> [0] and <i>Genius G-Pen 560</i>. Both work fine with Krita and have really nice pressure support! Right now we are also working on support for the <i>Huion</i> tablet supplied by <a href="http://huiontablet.com/">huiontablet.com</a> to the Krita project as well!</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://bosto-tablet.com/i/19ma-1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://bosto-tablet.com/i/19ma-1.jpg" height="230" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Bosto kingtee 19MA now works with Krita!</td></tr>
</tbody></table>
<div style="text-align: justify;">
So if you have a tablet device which used to refuse to work with Krita on Linux, <b>test it now! </b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
I also did a small cross-test of my old <i>Wacom Graphire2</i> device and <i>Genius G-Pen 560</i>. What I noticed is that the lines generated by the Wacom tablet are more stable and smooth, whereas the lines by the Genius tablet are a bit dizzy. I don't know what is the exact reason for it, but I have a feeling that Wacom does some internal filtering of the coordinates generated by the hardware, which gives us better lines. Anyway, even if you own this Genius device, Krita allows you to workaround the issue. Just enable <i>Weighted Smoothing</i> painting algorithm and it will produce the results just like Wacom does!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
And if you would like to know the technical details about why Qt's tablet code supports wacom-driver-based tablets only...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Qt's code doesn't fully support the interface of the <i>XDeviceMotionEvent</i>. Qt expects that the values of all six axes of the tablet will be sent to the client in each event. This is true for <i>wacom</i> driver, but it is not guaranteed to be true for other XInput devices. The motion event can also send the values that changed since the last event only. It even has special fields for that:</div>
<div style="text-align: justify;">
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"><br /></span></span>
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">typedef struct <br /> {<br /> /* ... skipped ... */<br /> unsigned char axes_count;<br /> unsigned char first_axis;<br /> int axis_data[6];<br /> } XDeviceMotionEvent;</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">axes_count</span></span> field tells us how many axes are really delivered to the client and <span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">first_axis</span></span> tells to what absolute axis the first element of <span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">axis_data</span></span> corresponds to.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Now Krita can handle that effectively, as well as recognize to what s<span id="goog_993400120"></span><span id="goog_993400121"></span>ensor each axis is assigned to! [1] </div>
<br />
<br />
[0] - <a href="https://groups.google.com/forum/#!topic/bosto-user-group/sL_O4VoopVk">https://groups.google.com/forum/#!topic/bosto-user-group/sL_O4VoopVk</a><br />
[1] - unlike Gimp's way, where the user must manually investigate to which sensor each axis is connected to ;P<br />
<br />
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com12tag:blogger.com,1999:blog-5433088378497538658.post-75000465633706327982014-03-10T11:30:00.000+03:002014-03-10T13:08:16.284+03:00Krita Lime: Localization Support<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVmDq0Iyd5WLKO1_spFjdO8k_b-cZacCK6RjCmDdlx3p61phTRr9RTYiTEpNsZwDL6C3eABuyXeIu8vykNeIQCnTpc24u8z1ugSovYkFG2k7iQL2WzTuZOc2rDZHsdQeYIzzZfbCZF2q8/s1600/krita_lime_128.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVmDq0Iyd5WLKO1_spFjdO8k_b-cZacCK6RjCmDdlx3p61phTRr9RTYiTEpNsZwDL6C3eABuyXeIu8vykNeIQCnTpc24u8z1ugSovYkFG2k7iQL2WzTuZOc2rDZHsdQeYIzzZfbCZF2q8/s1600/krita_lime_128.png" /></a>After some time of really hard work we are happy to announce that our Krita Lime packages now support localization!<br />
<br />
If you want to see Krita in your own language, just install a corresponding package...<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">apt-get install krita-testing-l10n-<span style="font-size: x-small;">[your_language_id]</span></span></span><br />
<br />
... and run Krita!<br />
<br />
If you want to see Krita is a language that differs from your system one, type<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">KDE_LANG=<span style="font-size: x-small;">[</span>your_language<span style="font-size: x-small;">_id]</span> krita</span></span><br />
<div style="text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrGiwBjJMSXGdZUus1argQ0QVXbfV7y3kkRz1NJJoAqNwnPo0O474rs0Sq-MO6f9muYWsbR2NtNQeEJThEJw0qKYlnQk39RveOcFBrot5YKpZ9NBYRcDY73RVCPVcpUiFQgVnBNxWWG1ir/s1600/out_l10n.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrGiwBjJMSXGdZUus1argQ0QVXbfV7y3kkRz1NJJoAqNwnPo0O474rs0Sq-MO6f9muYWsbR2NtNQeEJThEJw0qKYlnQk39RveOcFBrot5YKpZ9NBYRcDY73RVCPVcpUiFQgVnBNxWWG1ir/s1600/out_l10n.png" height="640" width="566" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Happy painting with Krita! :)<br />
<br />
PS:<br />
And for some languages the help of translators is really needed! Join our KDE translators team on <a href="http://l10n.kde.org/">l10n.kde.org</a> and we will move KDE forward together! :)<br />
<br />
<br /></div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com1tag:blogger.com,1999:blog-5433088378497538658.post-59233892101081786132014-02-27T23:31:00.000+03:002014-02-27T23:31:38.128+03:00Krita 2.8 (Beta3) is now in Krita Lime!<div dir="ltr" style="text-align: left;" trbidi="on">
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVmDq0Iyd5WLKO1_spFjdO8k_b-cZacCK6RjCmDdlx3p61phTRr9RTYiTEpNsZwDL6C3eABuyXeIu8vykNeIQCnTpc24u8z1ugSovYkFG2k7iQL2WzTuZOc2rDZHsdQeYIzzZfbCZF2q8/s1600/krita_lime_128.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVmDq0Iyd5WLKO1_spFjdO8k_b-cZacCK6RjCmDdlx3p61phTRr9RTYiTEpNsZwDL6C3eABuyXeIu8vykNeIQCnTpc24u8z1ugSovYkFG2k7iQL2WzTuZOc2rDZHsdQeYIzzZfbCZF2q8/s1600/krita_lime_128.png" /></a></div>
As you may already know for some reasons the release of Calligra 2.8, which should have happened on the last Wednesday, was postponed for at least a week. That is sad but we could do nothing with it :(<br />
<br />
But Krita team didn't want to let its users down! So we created our own packages based on the 2.8 release branch and published them on Krita Lime! Now you can not only install '<b>krita-testing</b>' package, which is based on quite unstable <i>master</i> branch, but also '<b>krita-2.8</b>' package, which is almost exactly the same thing which is going to be published in a week as Krita 2.8! :)<br />
<br />
To install the stable Krita packages for any still supported Ubuntu distro (Precise, Quantal or Saucy) you need to do a couple of steps:<br />
<ol style="text-align: left;">
<li>Check that you don't have any original calligra or krita packages provided by your distribution or project-neon (if you have one, the installer will report you about a conflict)</li>
<li>Add the PPA to repositories list:<br /><span style="font-family: "Courier New",Courier,monospace;">sudo add-apt-repository ppa:dimula73/krita</span></li>
<li>Update the cache:
<br /><span style="font-family: "Courier New",Courier,monospace;">sudo apt-get update</span></li>
<li>Install Krita 2.8:
<br /><span style="font-family: "Courier New",Courier,monospace;">sudo sudo apt-get install krita-2.8 krita-2.8-dbg </span></li>
</ol>
</div>
<span style="font-family: "Courier New",Courier,monospace;">We've also prepared new packages for Windows users:</span><br />
<span style="font-family: "Courier New",Courier,monospace;">For 64-bit: </span><a href="http://heap.kogmbh.net/downloads/krita_x64_2.7.9.12.msi"><span style="font-family: "Courier New",Courier,monospace;">Krita_x64_2.7.9.12</span></a><br />
<span style="font-family: "Courier New",Courier,monospace;">and 32-bit: <a href="http://heap.kogmbh.net/downloads/krita_x86_2.7.9.12.msi">Krita_x86_2.7.9.12</a></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<div>
<ol style="text-align: left;">
</ol>
</div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com0tag:blogger.com,1999:blog-5433088378497538658.post-55704368894299660432014-02-06T19:24:00.000+03:002014-02-06T19:24:17.216+03:00"Of Missing Persons" Russian-based open movie project!<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<a href="https://vk.com/public365mult" target="_blank">365mult</a> is a small open movie project based on the story "Of Missing Persons" by Jack Finney and using only opensource software in its production: Blender for 3D modelling and Gimp+Krita for texturing and concept art!<br />
<br />
<span class="gD" name="Artur Shamshadinov">The project was started in the end of December 2013 and was declared to publish updates every single day. <a href="mailto:shamshadinov@gmail.com" target="_blank">Artur Shamshadinov</a>, the founder of the project, says: "<i>Every day we must do a small piece of work and the same day we must publish a report about it! That way everyone can follow the progress and we have no opportunity to relax and shirk from making out movie rock!</i>"</span><br />
<br />
The main part of the team is located in Kazan (Russia), but they would be glad to accept contributors from all over the world! <br />
<br />
Here are their first concepts of the landscape around the barn: <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWkl1azJwwSWK2p9UsCy_7RnJ2w8Z57llSswL0Jg6sTVw7q-7dVV-fEnpeX-kk-cZVzvbVAkthBoKR10ZxwO_KhOSjX1J0iv1JRlC-zWzGpUlKoaIT5d5E1ztSgIwyyb-FCLfe7K-gvcZn/s1600/clouds_have.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWkl1azJwwSWK2p9UsCy_7RnJ2w8Z57llSswL0Jg6sTVw7q-7dVV-fEnpeX-kk-cZVzvbVAkthBoKR10ZxwO_KhOSjX1J0iv1JRlC-zWzGpUlKoaIT5d5E1ztSgIwyyb-FCLfe7K-gvcZn/s1600/clouds_have.jpg" height="355" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpVjKBu2_xR245lfLsV6JRIjxml_NfidrZ3QJzXNFK0osmYIsX2O8YtaSbkvT-U35Bj7uMYgDnfZEVKM_4ByVp2tvB3CFV-CjAhsvGzJBD5DUd2mj1iSKCGJ2YatEEBnImFjttWGBQjfto/s1600/clouds_3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpVjKBu2_xR245lfLsV6JRIjxml_NfidrZ3QJzXNFK0osmYIsX2O8YtaSbkvT-U35Bj7uMYgDnfZEVKM_4ByVp2tvB3CFV-CjAhsvGzJBD5DUd2mj1iSKCGJ2YatEEBnImFjttWGBQjfto/s1600/clouds_3.jpg" height="348" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzsuCjVFmmo7JA5Q1jsByOTMtWCc8MlPSki1kGdYhcSjFtb_z-qqxRboSkNpP-5fHZCcLlSjEfWu_EMqU0HqslE7qCMlRl37KoRVwf3rJo7vnjCPVTIAuEPhkvp-n54N4WeFjJV_oq0Xg/s1600/clouds_4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzsuCjVFmmo7JA5Q1jsByOTMtWCc8MlPSki1kGdYhcSjFtb_z-qqxRboSkNpP-5fHZCcLlSjEfWu_EMqU0HqslE7qCMlRl37KoRVwf3rJo7vnjCPVTIAuEPhkvp-n54N4WeFjJV_oq0Xg/s1600/clouds_4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
And the main character (surprise! ;)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicDZfzQJKgcEifnJd5RZRHYnTtIDJDmQ0F1P4B2TxtqzHJvPu-u1dYiWcVyGqouqLT_sG2vGxBYdhdmde7zBwdykjjZrS7XVEYjO_fRj1E07V4sg4Vjgy2CujTnCknb7AZGZOJl6Y9DEMz/s1600/clouds_5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicDZfzQJKgcEifnJd5RZRHYnTtIDJDmQ0F1P4B2TxtqzHJvPu-u1dYiWcVyGqouqLT_sG2vGxBYdhdmde7zBwdykjjZrS7XVEYjO_fRj1E07V4sg4Vjgy2CujTnCknb7AZGZOJl6Y9DEMz/s1600/clouds_5.jpg" height="378" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
<br /></div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com0tag:blogger.com,1999:blog-5433088378497538658.post-69668049270496417742013-11-29T17:26:00.002+03:002013-11-29T17:27:22.737+03:00New OpenGL features in Krita Lime!<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Krita team is now entirely in the process of preparation for the upcoming 2.8 release. The branch is planned for this weekend, but with <a href="https://launchpad.net/~dimula73/+archive/krita" target="_blank">Krita Lime</a> you can test all the new features right now!</div>
<br />
<span style="font-size: small;"><b>Important Note:</b></span><br />
<div style="text-align: justify;">
<span style="font-size: small;">After update you will need to reset your "Canvas Input Settings" by removing <i>~/.kde4/share/apps/krita/input</i> directory to get the new shortcuts working.</span></div>
<br />
<br />
<div style="text-align: justify;">
During November we were working not only on fixing bugs, but also on improving rendering quality and performance of Krita. As you might have already <a href="http://krita.org/item/203-on-the-road-to-krita-2-8" target="_blank">read</a>, Krita 2.8 is going to have a new significantly reworked openGL engine with the <b>High Quality Filtering Mode</b>. This will make the quality of veeery zoomed-out really much better. It will be helpful for people who need to work with hi-resolution images, which should be scaled down up to 10% to be shown on screen.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzaV2SBiz0Kyj9f0el1qPUMHcpOJxD_sE2Mrifpg1F0sSIscJUlBpfGy_52SLaszA2N8tDXMP6yeMgyVdvkBgdccySOtl-WDE8eT6lBaaimxVSkzNyR9jVMO7A_FNCqslv6R0Vq9qgZFti/s1600/scaling_comparison.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzaV2SBiz0Kyj9f0el1qPUMHcpOJxD_sE2Mrifpg1F0sSIscJUlBpfGy_52SLaszA2N8tDXMP6yeMgyVdvkBgdccySOtl-WDE8eT6lBaaimxVSkzNyR9jVMO7A_FNCqslv6R0Vq9qgZFti/s1600/scaling_comparison.png" /></a></div>
<div style="text-align: justify;">
We also spent some hours on making the engine much efficient and responsive! Now if you tablet generates too many events, the engine will start limiting the frame rate and the speed will not suffer. Note, that the tablet events will not be dropped, so your lines will keep smooth as if nothing happens at all! :)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The only drawback of the new High Quality mode is that it needs your GPU/driver support openGL 3.0. But that should not be a problem, since most of the modern GPUs, including integrated ones, support that.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Another nice new feature of Krita 2.8 is the <b>Dynamic Outline in Hover Mode</b>. Previously, you could see the rotation/mirroring of the brush outline only when you paint, but now it is available even when you just hover the cursor over your canvas. Just for a fun effect of it, select <i>Smudge_Rake</i> brush preset and activate <i>Rotation->Fuzzy</i> dynamic and see a helicopter flying over your screen! ;)</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWrzd4sWfV41sZ3d2VSWs1obyhzMn78nRJWs0vtx0NCREaCL7yCK-1RilL_pBkKgddv-rPD0YhoIoGzCsP4yZ7HYwSQEdB6HdvSb45DjqLFdYkX1eBkJnJH5dVM_GktQ3lSuoin3G9kuzN/s1600/outine_testshow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWrzd4sWfV41sZ3d2VSWs1obyhzMn78nRJWs0vtx0NCREaCL7yCK-1RilL_pBkKgddv-rPD0YhoIoGzCsP4yZ7HYwSQEdB6HdvSb45DjqLFdYkX1eBkJnJH5dVM_GktQ3lSuoin3G9kuzN/s320/outine_testshow.png" width="320" /></a></div>
<br />
<div style="text-align: justify;">
On our way to Krita 2.8 we also refactored our <b>Tool Mode Shortcuts</b> system. Now the special modes of <i>Paint Line/Rectangle/Ellipse</i> tools are available again! If you press Ctrl or Alt while painting a rectangle, the <i>Symmetric</i> or <i>Move</i> mode will be activated correspondingly. Note, that now "Ctrl + Click" and "Click + Ctrl" are two different shortcuts! The former activates the Color Picking tool, the latter --- activates <i>Symmetric Rectangle</i> mode.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
We have also enhanced the <b>Color Picking Shortcuts</b>. Now you have four options available in most of the painting tools:</div>
<br />
<i>Ctrl + Left Click</i> --- pick color from merged image to Foreground Color<br />
<i>Ctrl + Alt + Left Click</i> --- pick color from merged image to Background Color <br />
<br />
<i>Ctrl + Right Click</i> --- pick color from current layer to Foreground Color <br />
<i>Ctrl + Alt + Right Click</i> --- pick color from current layer to Background Color <br />
<br />
<br /></div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com1tag:blogger.com,1999:blog-5433088378497538658.post-66320103624836561512013-09-27T23:19:00.001+03:002013-09-27T23:19:24.418+03:00Krita Lime: packages with hot-new Wraparound Mode and Clones Array<div dir="ltr" style="text-align: left;" trbidi="on">
This week was really successful for Krita, we got four feature branches merged into master! Two of them will be quite interesting for game-designers and painters working with 3D models.<br />
<h4 style="text-align: left;">
Wraparound Mode</h4>
<div style="text-align: left;">
In this new mode (which can be activated by pressing 'W' shortcut) the sides of the image get connected to each other and the image becomes infinitely-cycled. The picture becomes repeated on a screen (openGL mode only) as if it is a texture being wrapped around some surface. The painting with a brush also becomes cycled: just move your stroke and it'll appear on the other side of the image!</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
For the lovers of psychedelic effects we also added wraparound support to the Move Tool. Just activate it and enjoy dragging the borders of the image to and fro.</div>
<div style="text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqRbXs0WgptkVGArn6cCM9NH69WBUtydy2WLcbWpHXlJJA6HcsYKgFjwpxAXh_uHuI4W9heBqNryUNpt5J9oPvgKYvQgVte50LIVy4_sO-R6PIfXmnQU78oMn4ZraTu4dTHCsBzmlQLGsy/s1600/11111.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqRbXs0WgptkVGArn6cCM9NH69WBUtydy2WLcbWpHXlJJA6HcsYKgFjwpxAXh_uHuI4W9heBqNryUNpt5J9oPvgKYvQgVte50LIVy4_sO-R6PIfXmnQU78oMn4ZraTu4dTHCsBzmlQLGsy/s320/11111.png" width="320" /></a></div>
<div style="text-align: left;">
<br /></div>
<h4 style="text-align: left;">
Clones Array</h4>
<div style="text-align: left;">
This feature (which can be found in Layer menu) allows the user to create a set of clones (tiles) which are linked to the current layer and are offset to some specific position. This feature will be useful for texture painters and online games creators where the world consists of a repeated set of 2D tiles.<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWjTL3pQdJDW4JrEHTn_uGOWxVMaYex4xqtdKLx0TX0KS_2A36CVx2hSHsFaBDzfv2DsiFyyxcBrkwozacRdROYyONvheo_-XWuIfm3Xnw6JBP0eG6QfaXwjObAXMS2DrfrqHgHV0XCxMa/s1600/2222.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWjTL3pQdJDW4JrEHTn_uGOWxVMaYex4xqtdKLx0TX0KS_2A36CVx2hSHsFaBDzfv2DsiFyyxcBrkwozacRdROYyONvheo_-XWuIfm3Xnw6JBP0eG6QfaXwjObAXMS2DrfrqHgHV0XCxMa/s320/2222.png" width="320" /></a></div>
<div style="text-align: left;">
<br /></div>
<h4 style="text-align: left;">
How to Install</h4>
<div style="text-align: left;">
New features are already present in Krita Lime! But since these features are very new, we've packaged it into a separate package: 'krita-wraparound-wip', so that everyone could rollback to a "stable" 'krita-testing' package. During installation the system will suggest you to replace the existing 'krita-testing' package.</div>
<div style="font-family: "Courier New",Courier,monospace; text-align: left;">
<br /></div>
<div style="font-family: "Courier New",Courier,monospace; text-align: left;">
sudo apt-get install krita-wraparound-wip</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
And as usual, if you find any bug of have any comment, do not hesitate to tell us about it! :)</div>
<div style="text-align: left;">
<br /></div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com2tag:blogger.com,1999:blog-5433088378497538658.post-16190407329916548472013-08-10T13:43:00.000+03:002013-08-10T13:43:12.427+03:00Krita Lime (2.8prealpha). New features overview<div dir="ltr" style="text-align: left;" trbidi="on">
Hi, all!<br />
<br />
Some time have passed since I was talking about new features of the current development version of Krita. But there are lots of them actually! Let me show them to you :)<br />
<br />
(all these feature are already available in <a href="https://launchpad.net/~dimula73/+archive/krita" target="_blank">Krita Lime PPA</a>, which has packages for Precise, Quantal and Raring)<br />
<h4 style="text-align: left;">
Optimized selections engine</h4>
<ul style="text-align: left;">
<li>all the selection tools now work incomparably faster. After pressing Ctrl+A you don't have time to drink your coffee anymore ;)</li>
<li><b>Pixel and Vector</b> selections are now <b>convertible</b>! (Yes, we always had Vector Selections!) You can convert your selection to a vector object and edit it moving the vertices as you do for any vector shape. To convert it, just use Selection->Convert To Vector Selection menu. When you are done with editing vectors, you can just start painting on selection and it will be converted back into a pixel one<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWHHEVjFTDjlONKKsgRxI6cxH004LO_CeAvhp2GqQHO9e8aeItzJFPxJtErix7gXhb_8EWICWIsk5CHEwgFwzWHwntuCj5HHB8DW0o2ILbX6oZtWsbEs_R7KQmEBeiZrHJuEUf7Qrqpstr/s1600/fig_common.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWHHEVjFTDjlONKKsgRxI6cxH004LO_CeAvhp2GqQHO9e8aeItzJFPxJtErix7gXhb_8EWICWIsk5CHEwgFwzWHwntuCj5HHB8DW0o2ILbX6oZtWsbEs_R7KQmEBeiZrHJuEUf7Qrqpstr/s320/fig_common.png" width="320" /></a></div>
</li>
</ul>
<h4 style="text-align: left;">
Optimized painting of the gradients</h4>
<ul style="text-align: left;">
<li>Gradients are now painted a couple of times faster! Thanks Camilla Boemann for this work!</li>
</ul>
<h4 style="text-align: left;">
Updated line smoothing algorithms</h4>
<ul style="text-align: left;">
<li>both Basic and Weighted Smoothing algorithms were almost rewritten. This solved many interesting bugs which caused Krita to produce "screwed" lines while painting on high speeds </li>
<li>Weighted Smoothing algorithm now has an option for controlling the ending of the stroke. It makes the line "hurry up" to the brush tip when you lift the stylus up. The speed of this "hurrying up" can be controlled by "Stroke Ending" option</li>
<li>Weighted Smoothing can now also smooth the pressure of the pen<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxzvZ8msw5RO-MO8z1xhvOyGcEsGeSUE0JWIc7dnrvl24_i4TgM4uw1TkFoaS72CCP3rDlKbPnbsaNtETLexFW0SXPmPs8zNgLmwT3HBrkObHkbJNlFmgYL8jbpEYnKvwAnB3BW8aCWG_b/s1600/fig4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxzvZ8msw5RO-MO8z1xhvOyGcEsGeSUE0JWIc7dnrvl24_i4TgM4uw1TkFoaS72CCP3rDlKbPnbsaNtETLexFW0SXPmPs8zNgLmwT3HBrkObHkbJNlFmgYL8jbpEYnKvwAnB3BW8aCWG_b/s320/fig4.png" width="320" /></a> </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</li>
</ul>
<h4 style="text-align: left;">
Refactored predefined brushes engine</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIwjHbNLx8_02aUIsIRYUuhFTuoY1kodDWgHUc1u9KRuNkLUK2ZbzNzRJ8VejzG9s1RRHlfSzxutMOC0UjpruEJWUZj65010X1UYng7PNLcjCb7NaivJWEh80GPPtLEFXB4lTixFHzPQaZ/s1600/colored_brushes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIwjHbNLx8_02aUIsIRYUuhFTuoY1kodDWgHUc1u9KRuNkLUK2ZbzNzRJ8VejzG9s1RRHlfSzxutMOC0UjpruEJWUZj65010X1UYng7PNLcjCb7NaivJWEh80GPPtLEFXB4lTixFHzPQaZ/s320/colored_brushes.png" width="320" /></a></div>
<ul style="text-align: left;">
<li>The speed of the painting with predefined brushes raised up to 20% </li>
<li>Fixed blurriness of the predefined brushes on all the scales</li>
<li>Rotation of a predefined brush now produce no artifacts!</li>
<li>Colored predefined brushes now rendered correctly (without gray traces left on the canvas)</li>
</ul>
<h4 style="text-align: left;">
Updated Brush Sensors engine</h4>
<ul style="text-align: left;">
<li><b>Anisotropic Spacing</b> Feature. Now the spacing can be configured to be related to the ratio of the brush<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFZPQfhNQaG-k0ssSOIlnc0YvvYiHicpoSWNGl-FdCxEA_WTz-YoEYo3GFWmxpeE1cCPX1rweS4kJXUTCRCiOST90yRxbzQ2jZ9Az3y8wBa3Kbk2qbdaWLpgu6pmy-ZJFYYNgUmdO9Rx19/s1600/anisotropic_spacing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFZPQfhNQaG-k0ssSOIlnc0YvvYiHicpoSWNGl-FdCxEA_WTz-YoEYo3GFWmxpeE1cCPX1rweS4kJXUTCRCiOST90yRxbzQ2jZ9Az3y8wBa3Kbk2qbdaWLpgu6pmy-ZJFYYNgUmdO9Rx19/s320/anisotropic_spacing.png" width="320" /></a></div>
</li>
<li>Fixed Speed and Distance sensors to work in a sane way ;)</li>
<li>Refactored Drawing Angle sensor, so that it became much smoother</li>
<li>Implemented <b>Fan Corners</b> feature. It can be activated in the Drawing Angle configuration dialog. It ensures, that there will be no breakups in the stroke in the corners of the line. It works like a spacing option, but only for angular values.</li>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWopU8ETdpswLwEsOE117gy5M2VaFwGXzuFJZJIGdgXhBjM6g7GlcNpmpK7Zds0NNg_PTTHGs2oQXCZIJ2ufSTS6WFPhvGdrjYmab2TcEpyOKkhCxISn9Ggl7Spd7j3rNamUtizRymYg18/s1600/fan_corners.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="246" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWopU8ETdpswLwEsOE117gy5M2VaFwGXzuFJZJIGdgXhBjM6g7GlcNpmpK7Zds0NNg_PTTHGs2oQXCZIJ2ufSTS6WFPhvGdrjYmab2TcEpyOKkhCxISn9Ggl7Spd7j3rNamUtizRymYg18/s320/fan_corners.png" width="320" /> </a></div>
</ul>
<ul style="text-align: left;">
<li>Now when the canvas is mirrored, the dab stays non-mirrored! So you can continue painting with your brush unchanged!</li>
</ul>
<div>
<ul style="text-align: left;">
</ul>
</div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com4tag:blogger.com,1999:blog-5433088378497538658.post-76149373577906137062013-05-13T12:34:00.000+03:002015-06-11T10:43:41.684+02:00Krita Lime PPA: always fresh versions for Ubuntu users!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVmDq0Iyd5WLKO1_spFjdO8k_b-cZacCK6RjCmDdlx3p61phTRr9RTYiTEpNsZwDL6C3eABuyXeIu8vykNeIQCnTpc24u8z1ugSovYkFG2k7iQL2WzTuZOc2rDZHsdQeYIzzZfbCZF2q8/s1600/krita_lime_128.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTVmDq0Iyd5WLKO1_spFjdO8k_b-cZacCK6RjCmDdlx3p61phTRr9RTYiTEpNsZwDL6C3eABuyXeIu8vykNeIQCnTpc24u8z1ugSovYkFG2k7iQL2WzTuZOc2rDZHsdQeYIzzZfbCZF2q8/s1600/krita_lime_128.png" /></a></div>
A great piece of news for Ubuntu Krita users is coming today! We have just opened a repository with regular builds of Krita git master!<br />
<br />
Link: <a href="https://launchpad.net/~dimula73/+archive/krita">https://launchpad.net/~dimula73/+archive/krita</a><br />
<br />
The main purpose of this PPA is to provide everyone with an always fresh
version of Krita, without the need to update the whole system. Now one can get all the
latest Krita features without a delay.<br />
<br />
At the moment git master version has at least three features, which are absent in Krita 2.7 Beta1 (and cannot be merged there due to code freeze):<br />
<br />
<ul style="text-align: left;">
<li>New "New Image From Clipboard" dialog with a nice preview widget implemented by our new contributor Matjaž Rous</li>
<li>New "pseudo-infinite" canvas feature (read <a href="http://dimula73.blogspot.ru/2013/05/krita-28-prealpha-new-pseudo-infinite.html" target="_blank">here</a>) for dynamical image resizing</li>
<li>New "Overview Docker" which lets you see the whole image at a glance </li>
</ul>
To install the newest Krita you need to do a few steps:<br />
<ol style="text-align: left;">
<li>Check that you don't have any original <i>calligra</i> or <i>krita</i> packages provided by your distribution or project-neon (we don't check that automatically currently) </li>
<li>Add the PPA to repositories list:<br /><pre class="wrap" id="sources-list-entries">sudo add-apt-repository ppa:dimula73/krita</pre>
</li>
<li>Update the cache:<span style="font-family: "Courier New",Courier,monospace;"> </span>
<pre class="wrap" id="sources-list-entries"></pre>
<pre class="wrap" id="sources-list-entries">sudo apt-get update </pre>
</li>
<li>Install Krita:<span style="font-family: "Courier New",Courier,monospace;"> </span>
<pre class="wrap" id="sources-list-entries"></pre>
<pre class="wrap" id="sources-list-entries"><span style="font-family: "Courier New",Courier,monospace;">sudo sudo apt-get install krita-testing krita-testing-dbg</span> </pre>
<pre class="wrap" id="sources-list-entries"></pre>
</li>
</ol>
<div>
<div>
<u><strike>Update:</strike></u> (not needed anymore)<br />
<strike>After installing this package you should restart X-server to get environment variables updated!</strike><br />
<br />
<br />
Of course, being based on
git-master may sometimes result in a bit of instability, so make sure
you report any problems so we can fix them! :)</div>
</div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com28tag:blogger.com,1999:blog-5433088378497538658.post-40897798077516920952013-05-08T22:48:00.000+03:002013-05-09T09:18:05.515+03:00Krita 2.8 (prealpha): New "pseudo-infinite" canvas feature<div dir="ltr" style="text-align: left;" trbidi="on">
— "Darn it! Again no space on my canvas for the feet! What now?"<br />
<br />
Does this sound familiar to you? Does going to the canvas resize dialog break your workflow? Don't be frustrated anymore! Now you can just scroll down, click and... Presto! Add those happy feet to your drawing!<br />
<br />
Now if you scroll the image behind the edge a wide button appears which you can use to expand your image up to the size of your screen!<br />
<br />
A short example:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFShaZSECuNcGUmWAESWF2_pFR4bQI144luQtHwst2PHBHbJAhzaP5HPVR0UlbSNL75BKxn5TdBoOk-ldIk7RdesiNQitlWifOxnscJD2YahDo2iO9bg8WhpeptGkOo02Ge4-eFI3UhvQB/s1600/infcanvas_full.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFShaZSECuNcGUmWAESWF2_pFR4bQI144luQtHwst2PHBHbJAhzaP5HPVR0UlbSNL75BKxn5TdBoOk-ldIk7RdesiNQitlWifOxnscJD2YahDo2iO9bg8WhpeptGkOo02Ge4-eFI3UhvQB/s1600/infcanvas_full.jpeg" /></a></div>
<br /></div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com1tag:blogger.com,1999:blog-5433088378497538658.post-23113494844996153532013-05-08T22:01:00.000+03:002013-05-08T22:07:16.928+03:00Upcoming Krita 2.7: Updated Drag & Drop and Clipboard functionality<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Recently we spent some time on polishing the Drag & Drop and Copy & Paste functionality in Krita. It turned out that these simple things are very important for users, since they allow integrate Krita into user's workflow better. It's a pity we were not able to pay much attention to them for some time, so as time passed they became a bit buggy. Now the bugs are gone and I can say for sure that there is no bugs in these systems! (at least bugzilla and me don't know any :)<br />
<br />
Here is a short list of capabilities you can use to integrate Krita into your workflow (will be publicly available starting from Krita 2.7 Beta 2):<br />
<br />
<ol style="text-align: left;">
<li><i>Clipboard</i>. Now the pasted image always gets centered right. And thank to the patch by our new contributor Sahil Nagpal the Custom Image dialog doesn't go insane when finds something in the Clipboard :)</li>
<li>Drag-and-Drop of <i>Image-objects</i>. You can drop any image (from Gimp or Chromium) to Krita canvas and it will be centered in the image. If you want it to be centered around the mouse position, just press <i>Shift key</i> while dragging. You can also drop an image directly into the Layers docker, which will allow you to choose the position of a newly created layer in the stack.</li>
<li>Drag-and-Drop of <i>a URL</i>. If you drop an image from Firefox (yes, Firefox doesn't wrap images into image objects) or from Dolphin, it will also be added to your image as a layer.</li>
<li>Drag-and-Drop of <i>many images at once</i>. Not many people know about this feature, but Krita will also handle this case =)</li>
<li>And of course, Drag-and-Drop of layers between <i>different instances of Krita app</i>. This feature was a tough one because of some bug in Qt's QTreeView implementation of D&D. It was always generating some spurious MouseMove events which were canceling the incoming drop. But now this finally works.</li>
</ol>
<ol style="text-align: left;">
</ol>
<div style="text-align: center;">
Enrico Guarnieri's beautiful </div>
<div style="text-align: center;">
splash screen for Krita 2.7</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://krita.org/images/splash_big.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="210" src="http://krita.org/images/splash_big.jpg" width="320" /></a></div>
</div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com0tag:blogger.com,1999:blog-5433088378497538658.post-72599436442992165342013-03-21T21:17:00.000+03:002013-03-21T21:17:52.605+03:00New User Interface for Krita Color To Alpha filter<div dir="ltr" style="text-align: left;" trbidi="on">
Hi, all!<br />
<br />
The comments of the artists about my previous <a href="http://dimula73.blogspot.com/2013/03/updated-krita-colortoalpha-filter.html" target="_blank">change to the Color To Alpha filter</a> showed that many of them really need it in their daily work! But most of them agreed that the user interface of the filter was still "not good enough" for many of the use cases: you simply couldn't select the exact color which should be made transparent! So now the problem is gone and you have various ways of doing this:<br />
<br />
Firstly, when you apply a filter directly to the layer with the <b>Filters->Colors->Color To Alpha...</b> menu item, you can just pick the desired color from the image below the dialog! You should also note that while doing this, you can change the options of the color picking tool in the <b>Tool Options</b> docker, like select the Radius used for calculating the average value or to choose whether to pick from the original layer pixels or from the resulting composed image.<br />
<br />
Secondly, you can use the standard KDE Color Dialog where you can select the precise RGB values of the color to remove.<br />
<br />
And lastly, you can use the Color Picking Tool provided by the KDE Color Dialog. The advantage of this tool is that you can pick a pixel not from Krita only, but from the entire monitor screen!<br />
<br />
Just to show you what is now possible with the filter I took a picture that was filmed for some action film... and made it a bit more peaceful :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW3nmXtsue2eB-kxQctvgNXAaWhBlShEaTF120j0Rzg4_Bv4hpyAU1fPD1A7SetrbsbBj73_quUUW208sNODqg71DgxbVO3xY6ujTeRlRxMGA-swSmSAZj423VeW_6yAfLg6dzdzo4Ke-M/s1600/blog3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW3nmXtsue2eB-kxQctvgNXAaWhBlShEaTF120j0Rzg4_Bv4hpyAU1fPD1A7SetrbsbBj73_quUUW208sNODqg71DgxbVO3xY6ujTeRlRxMGA-swSmSAZj423VeW_6yAfLg6dzdzo4Ke-M/s1600/blog3.jpg" /></a></div>
<br />
The changes are going to be merged into Krita-master (aka Krita-2.7pre-alpha) in a day or two, since it needs to go through a short review process. If you want to test it right now, you can get the updated version from 'krita-testing-kazakov' branch!<br />
<br />
<br />
<br />
<br /></div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com1tag:blogger.com,1999:blog-5433088378497538658.post-55459842722072820322013-03-15T18:35:00.001+03:002013-03-15T18:35:31.387+03:00Updated Krita ColorToAlpha filter<div dir="ltr" style="text-align: left;" trbidi="on">
Hey! We've just updated our Color to Alpha filter, so it can now be easily used for removing background from scanned sketches! Our algorithm differs from the one used in Gimp: we use CIE deltaE [0] function to calculate the difference between the image and the base color, so it is more flexible and configurable. You can choose to what extent you want to remove the background by changing threshold value.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbkXejK6NA9hYmjUCtchwz0bSaeVnXmtlfza57FG5P7Q-kVfoCmndh5kjXBaGhyLvWMwxhl-THTiHHj0RIxJZhRhfTpMTm0dzxiNBCJf7UcxHIdVmR-YaXwW342Igewze7Je0xx9VcFgcG/s1600/substitute_bg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbkXejK6NA9hYmjUCtchwz0bSaeVnXmtlfza57FG5P7Q-kVfoCmndh5kjXBaGhyLvWMwxhl-THTiHHj0RIxJZhRhfTpMTm0dzxiNBCJf7UcxHIdVmR-YaXwW342Igewze7Je0xx9VcFgcG/s640/substitute_bg.png" width="640" /></a></div>
<br />
(original painting by David Revoy) <br />
<br />
The filter's algorithm is actually quite simple:<br />
<br />
1) Firstly, we calculate the difference between the image pixel and the base color and decrease the pixel's opacity according this difference. The less the difference, the more opacity is decreased. As I already said we use deltaE function to calculate this difference.<br />
<br />
2) Secondly, we apply an inverse "composite over" to every pixel. Due to that step, if we put a layer filled with a base color below the filtered image, we will get original image!<br />
<br />
<br />
<br />
<br />
[0] - http://en.wikipedia.org/wiki/Color_difference<br />
<br />
<br /></div>
Dmitry Kazakovhttp://www.blogger.com/profile/00589041569298003008noreply@blogger.com3