<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8964583752416945383</id><updated>2012-01-04T22:29:59.189+02:00</updated><category term='feOffset'/><category term='plush toy'/><category term='Big Buck Bunny'/><category term='documentation'/><category term='feConvolveMatrix'/><category term='machine dance'/><category term='feSpecularLighting'/><category term='soundbox'/><category term='feFlood'/><category term='SPFilter'/><category term='power usage'/><category term='feComposite'/><category term='feDiffuseLighting'/><category term='feTurbulence'/><category term='feGaussian'/><category term='feBlend'/><category term='PuistoBlues'/><category term='atmega'/><category term='background access'/><category term='Blender'/><category term='timetable'/><category term='feDisplacementMap'/><category term='Inkscape'/><category term='plushie'/><category term='blues'/><category term='rant'/><category term='distcc'/><category term='drawing'/><category term='simfile'/><category term='refactoring'/><category term='programming'/><category term='example'/><category term='PowerTOP'/><category term='Openmind'/><category term='Timidity'/><category term='filter effects'/><category term='computer hardware'/><category term='input images'/><category term='microcontroller'/><category term='Assembly'/><category term='computer memory'/><category term='bugbug'/><category term='feMerge'/><category term='Filter Effects Tutorial'/><category term='sign'/><category term='Bubble Bobble'/><category term='festival'/><category term='StepMania'/><category term='LGM'/><category term='feColorMatrix'/><category term='In The Groove'/><category term='markers'/><category term='bounding box'/><category term='Elderly people'/><category term='SMsync'/><category term='filter primitives'/><category term='university'/><title type='text'>Filter Effects Developer</title><subtitle type='html'>Writings and tutorials on Filter Effects in &lt;a href="http://inkscape.org/"&gt;Inkscape&lt;/a&gt; — and sometimes other stuff in field of graphics and open source.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-6396668073150454745</id><published>2012-01-04T22:29:00.002+02:00</published><updated>2012-01-04T22:29:59.204+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soundbox'/><category scheme='http://www.blogger.com/atom/ns#' term='atmega'/><category scheme='http://www.blogger.com/atom/ns#' term='microcontroller'/><title type='text'>Soundbox — The construction</title><content type='html'>The Soundbox device I have built uses some construction techniques I want to share with you readers. I'm mainly talking about the enclosure and the texts on controls.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mdpq8cI1szI/TwSlwXHVKRI/AAAAAAAAAOI/aSk3MJFqypo/s1600/2012-01-04+21.04.03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-mdpq8cI1szI/TwSlwXHVKRI/AAAAAAAAAOI/aSk3MJFqypo/s320/2012-01-04+21.04.03.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The enclosure itself is built from a simple box bought from a craft store. It was unfinished wooden box with two small hinges and a clasp to hold it closed. The lid and bottom parts were quite nicely suitable size for all the parts, I just needed to build the control panel inside this box.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PMFFepbV0Z0/TwSl5vNxROI/AAAAAAAAAOQ/4YulpY-AE10/s1600/2012-01-04+21.13.40.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-PMFFepbV0Z0/TwSl5vNxROI/AAAAAAAAAOQ/4YulpY-AE10/s320/2012-01-04+21.13.40.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The control panel is built from 4 mm plywood that I cut to the correct shape with a coping saw (not the best tool for the job, but that was what I happened to have at hand). Then I drilled the holes for the knobs and such. The speaker hole I cut with the coping saw. To keep the control panel in place, I glued some 9 × 9 mm wood bars to the inside of the box, 4 mm from the top of the bottom box so that the control panel will sit flush with the sides of the bottom part.&lt;br /&gt;&lt;br /&gt;After constructing the box, I removed the hinges and the clasp and painted the box and control panel with several (maybe four) layers of white spray paint. What surprised me was how much that stuff stinks — I had to keep the parts outdoors for a couple days after painting so that my room would not smell of solvents. The finished box had a distinct solvent smell for like a month after it was done.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FiQuJI8XnQg/TwSmA1s-SPI/AAAAAAAAAOY/pnIUe5TdCuM/s1600/2011-06-30+23.05.20.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-FiQuJI8XnQg/TwSmA1s-SPI/AAAAAAAAAOY/pnIUe5TdCuM/s320/2011-06-30+23.05.20.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The two main knobs — pitch and arpeggio — are of my own design. They're seven-sided knobs with friction fit for the usual 6 mm potentiometer axle. I created the model in &lt;a href="http://www.blender.org/"&gt;Blender&lt;/a&gt; and ordered them from a 3D printing company called &lt;a href="http://www.shapeways.com/"&gt;Shapeways&lt;/a&gt;. The design didn't work quite as intended and I had to remove some material from underside of the knob so that the nut that holds the potentiometer in place fits under the knob. I also had to use 6 mm drill bit to widen the centre hole so that the potentiometer axle fits in there.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-095QDXUzeFc/TwSvFk77ZFI/AAAAAAAAAOk/MEOXvCEf7t8/s1600/2011-10-16+14.18.46.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-095QDXUzeFc/TwSvFk77ZFI/AAAAAAAAAOk/MEOXvCEf7t8/s320/2011-10-16+14.18.46.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For the markings on the control panel and the two main knobs I used transfer lettering from &lt;a href="http://www.letraset.com/shopaff.asp?affid=42"&gt;Letraset&lt;/a&gt;. This is rub-down lettering, that is, you write by finding the required letter from the sheet, placing that to its intended place and rubbing down on the letter sheet so that the letter material is transferred from the sheet to your working piece. These are mainly intended to be used on paper, but they appear to work just fine on wood and plastic.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-GGcpna1KFTs/TwSvcxguCOI/AAAAAAAAAOs/nU_Rb5S460I/s1600/2011-10-19+20.40.25_v1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="132" src="http://2.bp.blogspot.com/-GGcpna1KFTs/TwSvcxguCOI/AAAAAAAAAOs/nU_Rb5S460I/s320/2011-10-19+20.40.25_v1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;After writing all the texts I wanted, I coated the control panel, the two red knobs and the box with several (probably three) coats of clear spray lacquer. Before this it would have been possible to rub or scrape the lettering off, though it would have taken some effort. After the lacquer coat the lettering is there to stay. Even though the spray again had quite an amount of solvents, neither the lettering nor the plastic of the two red knobs was adversely affected.&lt;br /&gt;&lt;br /&gt;After this, the rest is rather straightforward. I re-attached the hinges and the clasp I had removed before painting the box white. I installed the potentiometers, buttons, switches and the line jack to the control panel with their supplied nuts. The two LEDs and the speaker I attached with hot glue. Eventually I will have to figure out something more sturdy than hot glue for mounting the speaker, for it did come loose at the &lt;a href="http://www.altparty.org/2011/"&gt;Alternative Party&lt;/a&gt;. The control panel is held in its place by the side walls of the box and the support bars inside the box, but there's nothing stopping you from lifting it upwards to reveal the electronics hidden inside.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-6396668073150454745?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/6396668073150454745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=6396668073150454745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/6396668073150454745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/6396668073150454745'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2012/01/soundbox-construction.html' title='Soundbox — The construction'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-mdpq8cI1szI/TwSlwXHVKRI/AAAAAAAAAOI/aSk3MJFqypo/s72-c/2012-01-04+21.04.03.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-4929933317958610938</id><published>2011-11-20T19:15:00.001+02:00</published><updated>2011-11-21T20:20:16.563+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soundbox'/><category scheme='http://www.blogger.com/atom/ns#' term='atmega'/><category scheme='http://www.blogger.com/atom/ns#' term='microcontroller'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Soundbox — what makes it tick</title><content type='html'>I did have the soundbox device I have built with me at &lt;a href="http://www.altparty.org/2011/"&gt;Alternative Party 2011&lt;/a&gt;. It did attract a fair amount of interest, though nowhere near what my 32×8 LED screen did. I think I'll have to write a post about that LED screen and how it works some time. For quick info, it's built around an ATmega328, can show 16 different shades of green with gamma ramp and shows some classical effects such as plasma and fire.&lt;br /&gt;&lt;br /&gt;Neither one of my projects gained nowhere near the interest that the &lt;a href="http://www.hacklab.fi/2011/10/alt-party-ohi-helsinki-yha-olemassa/"&gt;Chernobyl reactor simulator&lt;/a&gt; by Helsinki Hacklab did, but that is only to be expected. That simulator was awesome, even though they didn't quite manage to get it to a playable state during the event.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qR2zcb-iX2M/TqBzT6aeSMI/AAAAAAAAANw/YPUcXL5XCKY/s1600/soundbox.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://3.bp.blogspot.com/-qR2zcb-iX2M/TqBzT6aeSMI/AAAAAAAAANw/YPUcXL5XCKY/s320/soundbox.jpeg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I'll first describe the high-level workings of the soundbox, then the hardware side and last the software used.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;High-level view&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The device is a looper: it plays a short loop of sounds over and over again and the sounds can be altered while the device is playing. It provides two  channels, each with its own waveform and each separately programmable. The loop is 128 sounds long and the actual length of loop in seconds depends on the setting of tempo knob.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-rj7vkQH3mpk/TslBdqgP_YI/AAAAAAAAAN0/hTXwiVV7AL8/s1600/soundbox-panel.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://3.bp.blogspot.com/-rj7vkQH3mpk/TslBdqgP_YI/AAAAAAAAAN0/hTXwiVV7AL8/s320/soundbox-panel.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The first sound channel plays sine wave and the second channel plays pitched noise. One of the device controls is a pitch knob that can be used to select the frequency of sine wave of noise to be programmed.&lt;br /&gt;&lt;br /&gt;For sine wave there's also second knob — arpeggio — which can be used to alternate between the base pitch and a higher pitch at a high rate. The rate is fixed depending on tempo and the setting of arpeggio knob defines how much higher is the higher pitch.&lt;br /&gt;&lt;br /&gt;Also there's a beat LED that flashes four times during every loop through the sound loop — white at the beginning of loop and red the other three times. This is to help the user see how fast a tempo the device is using.&lt;br /&gt;&lt;br /&gt;The front panel also features a built-in speaker which is mere 5&amp;nbsp;cm across but can produce surprisingly high volumes — even at the active party hall it was able to put out enough volume to be clearly audible at close quarters. I've tried some small commercial speaker devices intended to be attached to portable CD/MP3 players and found that they can't put out nearly enough volume in such situations, so I was somewhat surprised that this simple device could.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The hardware design&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The&amp;nbsp; hearth of this device is Atmel ATmega88 microcontroller running at 16&amp;nbsp;MHz. Sporting 8&amp;nbsp;kB of flash memory and 8&amp;nbsp;kB of RAM, this microcontroller is the little brother of ATmega328 that is used in the popular &lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt; prototyping board.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ejv6aXmG5Fg/Tsld0GpDRJI/AAAAAAAAAN8/qAJ-5GAIE7c/s1600/soundbox-proto.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://2.bp.blogspot.com/-ejv6aXmG5Fg/Tsld0GpDRJI/AAAAAAAAAN8/qAJ-5GAIE7c/s320/soundbox-proto.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;Early version of the hardware&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;With the built-in analog-to-digital converter in ATmega88 it is simple to read the positions of the three 10&amp;nbsp;kΩ linear potentiometers used for pitch, arpeggio and tempo. The potentiometers are connected across device ground and regulated 5&amp;nbsp;V lines, so turning a potentiometer changes the voltage at its middle pin linearly between these two voltages. This voltage is read with the ADC in the microcontroller and used to control the sound generation.&lt;br /&gt;&lt;br /&gt;The microcontroller outputs the sound using &lt;a href="http://en.wikipedia.org/wiki/Pulse-width_modulation"&gt;Pulse-width modulation&lt;/a&gt; and uses a simple resistor-capacitor low-pass filter so that only frequencies below the &lt;a href="http://en.wikipedia.org/wiki/Nyquist_frequency"&gt;Nyquist frequency&lt;/a&gt; of the output are passed to amplifier and eventually to speaker. Or at least this was the idea — I don't know quite exactly the frequency response of the filter I built, especially as I ended up swapping some of the capacitors to different value than the one originally planned, since I didn't have any with correct value and could not be bothered to visit the electronics store to get a couple capacitors. Anyhow, it sounds good and looking at the output with an oscilloscope doesn't show modulation frequency passed through, so I guess it's fine.&lt;br /&gt;&lt;br /&gt;After the low-pass filter is the volume control: a 10&amp;nbsp;kΩ logarithmic potentiometer. After it there's a &lt;a href="http://en.wikipedia.org/wiki/LM386"&gt;LM386&lt;/a&gt; amplifier chip that drives the speaker or the device connected to the line out jack. One notable thing is that this amplifier chip is not connected to the regulated 5&amp;nbsp;V line that is being used to drive the ATmega88, but to the unregulated voltage straight from the batteries. This is done to maximize the voltage available to the amplifier chip — which means more volume — and to ease the load on the regulator, which is simple &lt;a href="http://en.wikipedia.org/wiki/78xx"&gt;7805&lt;/a&gt; linear regulator that can generate considerable amounts of heat if heavily loaded or if the difference between its input and output voltages is large.&lt;br /&gt;&lt;br /&gt;Speaking of batteries and voltage regulation, the power source for this device is six AA size NiMH cells. With nominal voltage of 1.2 V each, the total voltage is 7.2 V — high enough so that the 7805 can produce stable 5 V supply and well inside the operating voltage range for LM386.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The software&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The software for the soundbox is written in C using the&amp;nbsp;&lt;a href="http://www.nongnu.org/avr-libc/"&gt;AVR libc&lt;/a&gt; library.&lt;br /&gt;&lt;br /&gt;The sounds to be played are stored in two 128 bytes long arrays, one for each voice. Each byte in these arrays corresponds to one sound to be played, the value defining the pitch of the sound.&lt;br /&gt;&lt;br /&gt;At the hearth of the sound generation is a&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Numerically_controlled_oscillator"&gt;numerically controlled oscillator&lt;/a&gt; (NCO). The oscillator for sine voice uses 256 samples long phase-to-amplitude converter array that is filled with sine values at device boot up. The noise channel uses similar table filled with random values with Gaussian distribution, creating a table that contains white noise. The oscillator for noise channel  advances in its table 4096 times slower than sine oscillator of same frequency. This value has been chosen experimentally so that sine and noise with same pitch setting would sound like having somewhat similar pitch.&lt;br /&gt;&lt;br /&gt;The sound generation itself is done inside the overflow interrupt of an pulse width modulation timer that's built-in in ATmega88. Each time the timer overflows  — every 256 processor ticks in my configuration — a new sound amplitude is computed from the two NCOs and written in pulse width control register.&lt;br /&gt;&lt;br /&gt;Reading inputs and setting the frequencies of the two NCOs is done in the main program loop. Each loop of the main program moves one step forward in sound arrays, reads inputs, writes new sound values to sound arrays if needed and sets the frequency controls of NCOs according to the values in sound arrays. After this it runs NOP command in a loop a suitable number of times to wait until new sound is to be played.&lt;br /&gt;&lt;br /&gt;That's it for this time. I'm thinking of posting something about how I made the enclosure, especially the labels on the panel and buttons. Maybe some recording of the sounds I get from the device, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-4929933317958610938?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/4929933317958610938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=4929933317958610938' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4929933317958610938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4929933317958610938'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2011/11/soundbox-what-makes-it-tick.html' title='Soundbox — what makes it tick'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-qR2zcb-iX2M/TqBzT6aeSMI/AAAAAAAAANw/YPUcXL5XCKY/s72-c/soundbox.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-8084268764525179712</id><published>2011-10-20T22:45:00.001+03:00</published><updated>2011-10-20T22:49:09.388+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soundbox'/><category scheme='http://www.blogger.com/atom/ns#' term='atmega'/><category scheme='http://www.blogger.com/atom/ns#' term='microcontroller'/><title type='text'>Soundbox project and Alternative party</title><content type='html'>I've been building a digital instrument that has been inspired by the &lt;a href="http://makezine.com/26/lunamod/"&gt;Luna Mod&lt;/a&gt; which was presented in the Make magazine some while ago. It is a two-voice software synthesizer implemented on an Atmel ATmega88, an eight-bit microcontroller. It plays a short loop of sounds which are programmable by selecting suitable pitch and amount of arpeggio and pressing a programming button.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qR2zcb-iX2M/TqBzT6aeSMI/AAAAAAAAANo/QWbiP8o5eJE/s1600/soundbox.jpeg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="358" width="400" src="http://4.bp.blogspot.com/-qR2zcb-iX2M/TqBzT6aeSMI/AAAAAAAAANo/QWbiP8o5eJE/s400/soundbox.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I will present this device for the first time at &lt;a href="http://www.altparty.org/2011/"&gt;Alternative party 2011&lt;/a&gt; which starts in less than 24 hours. It's a festival for many sorts of digital art, especially demos (as in demoscene, not short versions of games) and there have been many electronics enthusiasts &amp;ndash; such as &lt;a href="http://koelse.org"&gt;KOELSE - Association of Experimental Electronics&lt;/a&gt; and &lt;a href="http://hacklab.fi"&gt;Helsinki Hacklab&lt;/a&gt; &amp;ndash; in the last years. I'm confident this project will fit right in there.&lt;br /&gt;&lt;br /&gt;I'll write more about this project soon, at least something about the electronics and software design in this device and about how the control panel was made.&lt;br /&gt;&lt;br /&gt;The source files and an electronics design drawing made in &lt;a href="http://fritzing.org/"&gt;Fritzing&lt;/a&gt; are available at a &lt;a href="https://github.com/kiirala/soundbox"&gt;GitHub repository&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-8084268764525179712?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/8084268764525179712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=8084268764525179712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/8084268764525179712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/8084268764525179712'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2011/10/soundbox-project-and-alternative-party.html' title='Soundbox project and Alternative party'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-qR2zcb-iX2M/TqBzT6aeSMI/AAAAAAAAANo/QWbiP8o5eJE/s72-c/soundbox.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-1533760712924539243</id><published>2011-08-06T17:15:00.000+03:00</published><updated>2011-08-06T17:15:55.380+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Assembly'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><title type='text'>Drawing for Assembly 2011</title><content type='html'>I created this image on Inkscape for the Fast Graphics competition at &lt;a href="http://www.assembly.org"&gt;Assembly&lt;/a&gt; 2011. The theme for this year was &lt;i&gt;Last minute&lt;/i&gt; and there was one and half hours time to make the image, from when the theme was published to submission deadline. Sadly, this didn't make it past jury and thus wasn't show on big screen.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-46NBBliK9JQ/Tj1J1p3mpGI/AAAAAAAAANY/xRukDlPiXp8/s1600/viimeminuutti.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="225" width="400" src="http://4.bp.blogspot.com/-46NBBliK9JQ/Tj1J1p3mpGI/AAAAAAAAANY/xRukDlPiXp8/s400/viimeminuutti.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Not the best of my drawings, I admit. In 2009 I did manage to get my drawing on big screen. That time the theme was "Over the edge" or something like that and time limit again 1½ hours. Here's the result, drawn in Inkscape.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-exwhp9ImaU0/Tj1LJzkXc9I/AAAAAAAAANg/mai5kvVRx9k/s1600/sharp_edges_nosig.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="225" width="400" src="http://2.bp.blogspot.com/-exwhp9ImaU0/Tj1LJzkXc9I/AAAAAAAAANg/mai5kvVRx9k/s400/sharp_edges_nosig.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The SVG source files are available at &lt;a href="https://github.com/kiirala/filters_tutorial/tree/master/drawings"&gt;my GitHub reposistory&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-1533760712924539243?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/1533760712924539243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=1533760712924539243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/1533760712924539243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/1533760712924539243'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2011/08/drawing-for-assembly-2011.html' title='Drawing for Assembly 2011'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-46NBBliK9JQ/Tj1J1p3mpGI/AAAAAAAAANY/xRukDlPiXp8/s72-c/viimeminuutti.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-549980750212088753</id><published>2011-07-13T21:57:00.000+03:00</published><updated>2011-07-13T21:57:07.633+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blender'/><title type='text'>Blender M3G export error</title><content type='html'>I'm attempting to build a game atop &lt;a href="http://kajak3d.com/"&gt;Kajak3D&lt;/a&gt; framework. For that I'm creating models in &lt;a href="http://www.blender.org/"&gt;Blender&lt;/a&gt; and exporting them to M3G format.&lt;br /&gt;&lt;br /&gt;Well, exporting my very first model failed with "Python script error: Check console". After figuring out that this doesn't mean any Blender-internal console, but plain old console output, I closed Blender and started it from a terminal window. So, I received this message:&lt;br /&gt;&lt;pre style="font-size:small"&gt;translate mesh ...[Object "Body"]&lt;br /&gt;1 material(s) found.&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "/usr/share/blender/scripts/export_m3g.py", line 3068, in file_callback_m3g&lt;br /&gt;    exporter.start()&lt;br /&gt;  File "/usr/share/blender/scripts/export_m3g.py", line 2680, in start&lt;br /&gt;    world = Translator.start()&lt;br /&gt;  File "/usr/share/blender/scripts/export_m3g.py", line 2022, in start&lt;br /&gt;    self.translateMesh(obj)&lt;br /&gt;  File "/usr/share/blender/scripts/export_m3g.py", line 2296, in translateMesh&lt;br /&gt;    if material.getMode() &amp; Material.Modes.TEXFACE: createUvs = True;&lt;br /&gt;AttributeError: 'NoneType' object has no attribute 'getMode'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;My first thought of that was that the first "material" is likely typed with wrong capitalization and should have been "Material". But it is not so: both capitalized and non-capitalized version are actually valid in that script at that point...&lt;br /&gt;&lt;br /&gt;Google search didn't find anything on fixing that error, just one unanswered forum post asking how to fix it. Anyhow, I found the solution and decided to post it here, in case anyone else bumps into same issue.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The solution&lt;/b&gt;&lt;br /&gt;Link the object material to object mesh, not to whole object.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-HaB2mmK9CAc/Th3lnM_ZzKI/AAAAAAAAANQ/vseQvGMJSYY/s1600/blender-m3g-trouble.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="125" width="400" src="http://1.bp.blogspot.com/-HaB2mmK9CAc/Th3lnM_ZzKI/AAAAAAAAANQ/vseQvGMJSYY/s400/blender-m3g-trouble.png" /&gt;&lt;/a&gt;&lt;/div&gt;Note the circled area: your settings should look like this. You can click on "OB" to see if there are any materials linked to the object and to remove them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-549980750212088753?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/549980750212088753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=549980750212088753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/549980750212088753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/549980750212088753'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2011/07/blender-m3g-export-error.html' title='Blender M3G export error'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-HaB2mmK9CAc/Th3lnM_ZzKI/AAAAAAAAANQ/vseQvGMJSYY/s72-c/blender-m3g-trouble.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-2661539592656887553</id><published>2011-04-28T12:34:00.000+03:00</published><updated>2011-04-28T12:34:57.378+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='markers'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><title type='text'>Making buttons with Inkscape</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sHUPpat74xI/TbkO_gYLuwI/AAAAAAAAAL8/ZwLZJeh3S_A/s1600/badge_photo.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://1.bp.blogspot.com/-sHUPpat74xI/TbkO_gYLuwI/AAAAAAAAAL8/ZwLZJeh3S_A/s400/badge_photo.jpg"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;During my university studies I&amp;#39;ve made several buttons for TKO-äly, the organization for computer science students at Helsinki University. Here I&amp;#39;ll describe my method for creating these buttons. The usual process is that I first sketch the button on paper, then draw the main image on paper or with Inkscape. Finally I composite the image with background and place several complete images on a single A4 sheet for printing, both using Inkscape. The printed images are then cut out from the paper sheet and made into buttons using a hand-operated button tool.&lt;br&gt;&lt;br&gt;This post will be rather image-heavy, so it&amp;#39;ll continue after the jump.&lt;br&gt;&lt;a href="http://fedev.blogspot.com/2011/04/making-buttons-with-inkscape.html#more"&gt;Read more »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-2661539592656887553?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/2661539592656887553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=2661539592656887553' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/2661539592656887553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/2661539592656887553'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2011/04/making-buttons-with-inkscape.html' title='Making buttons with Inkscape'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-sHUPpat74xI/TbkO_gYLuwI/AAAAAAAAAL8/ZwLZJeh3S_A/s72-c/badge_photo.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-4824127215954536471</id><published>2011-04-19T14:31:00.006+03:00</published><updated>2011-04-19T16:00:23.115+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter Effects Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='feGaussian'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>Filter effects: Gaussian blur</title><content type='html'>&lt;span style="font-style:italic;"&gt;This is part of my Filter effects tutorial series.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gaussian blur makes objects appear softer and less clearly defined. Even by itself it is so useful that it was the first filter effect to be implemented in Inkscape. It also has received an own place in the Fill and Stroke editor:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-YiC8k4eKj8w/Ta18P9r5E8I/AAAAAAAAALM/y24sjBQiq8o/s1600/blur_slider.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 278px;" src="http://4.bp.blogspot.com/-YiC8k4eKj8w/Ta18P9r5E8I/AAAAAAAAALM/y24sjBQiq8o/s400/blur_slider.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5597266525589935042" /&gt;&lt;/a&gt;&lt;br /&gt;When you use that slider, it creates a filter effect that contains a single Gaussian blur primitive and attaches that to selected object.&lt;br /&gt;&lt;br /&gt;There are different kinds of blur. In Gaussian blur the colour from any pixel spreads out according to the Gaussian function (aka. bell curve). That means that the colour of any pixel stays mostly near itself, but some colour spreads out to a large area &amp;ndash; in fact the colour spreads out to an infinitely large area, but in practise the contribution can't be seen quite far away. Another example of blur would be &lt;span style="font-style:italic;"&gt;bokeh&lt;/span&gt;, the depth of field effect seen when some objects in a photo are out-of-focus. It is quite different from Gaussian blur: bokeh depends on the camera lens used, but usually spreads colour evenly to a circular area.&lt;br /&gt;&lt;br /&gt;Gaussian blur is also useful as part of more complex filters. Many of the pre-defined filters in Inkscape distribution include blur. Here I'll show a couple examples. First up is drop shadow:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-5LI90zrtmFo/Ta2ENABpZaI/AAAAAAAAALU/mMgtEzXkEok/s1600/blur_dropshadow.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 277px; height: 400px;" src="http://1.bp.blogspot.com/-5LI90zrtmFo/Ta2ENABpZaI/AAAAAAAAALU/mMgtEzXkEok/s400/blur_dropshadow.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5597275270771467682" /&gt;&lt;/a&gt;&lt;br /&gt;Here the Flood primitive is used to set the shadow colour, Gaussian blur to make the shadow softer and Offset to move the shadow.&lt;br /&gt;&lt;br /&gt;Next up is filter that shows only object edges:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-nZQtaRtLJrY/Ta2EvTkS_VI/AAAAAAAAALc/L3eRL8ypSkw/s1600/blur_only_edge.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 334px; height: 400px;" src="http://3.bp.blogspot.com/-nZQtaRtLJrY/Ta2EvTkS_VI/AAAAAAAAALc/L3eRL8ypSkw/s400/blur_only_edge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5597275860132625746" /&gt;&lt;/a&gt;&lt;br /&gt;The Composite is in mode "out", meaning that we take parts of original image that are not in blurred image.&lt;br /&gt;&lt;br /&gt;Last up is lighting filter, which requires a height map. Gaussian blur can be used to create an easy height map.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-LgKuggkSNE8/Ta2FoaZgm1I/AAAAAAAAALk/K615sY-nYVk/s1600/blur_diffuse_light.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 317px; height: 400px;" src="http://1.bp.blogspot.com/-LgKuggkSNE8/Ta2FoaZgm1I/AAAAAAAAALk/K615sY-nYVk/s400/blur_diffuse_light.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5597276841218972498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The SVG sources for the images are available from my &lt;a href="https://github.com/kiirala/filters_tutorial"&gt;filter tutorials repository&lt;/a&gt; at GitHub.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-4824127215954536471?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/4824127215954536471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=4824127215954536471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4824127215954536471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4824127215954536471'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2011/04/filter-effects-gaussian-blur.html' title='Filter effects: Gaussian blur'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-YiC8k4eKj8w/Ta18P9r5E8I/AAAAAAAAALM/y24sjBQiq8o/s72-c/blur_slider.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-572399310927455661</id><published>2011-04-17T17:33:00.007+03:00</published><updated>2011-04-17T20:05:38.643+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter Effects Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='feFlood'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>Filter effects: Flood</title><content type='html'>&lt;span style="font-style:italic;"&gt;This is part of my Filter effects tutorial series.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Flood may be the most simple filter primitive there is. It simply fills the whole filter area with one colour. By itself it's mostly useless, but it's often handy as part of more complex filters.&lt;br /&gt;&lt;br /&gt;Here's a simple &amp;ndash; almost stupid &amp;ndash; example to show what Flood does by itself:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-QGpmzfWHsp0/Tar7q5j1PGI/AAAAAAAAAKI/lm2HtvXNizM/s1600/flood_simple_editor.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 319px;" src="http://1.bp.blogspot.com/-QGpmzfWHsp0/Tar7q5j1PGI/AAAAAAAAAKI/lm2HtvXNizM/s400/flood_simple_editor.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5596562201385450594" /&gt;&lt;/a&gt;&lt;br /&gt;When you have a filter like this, the result will look like this:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-OjKBwA36uR0/Tar7yG6bhnI/AAAAAAAAAKQ/q_G38B2jqcw/s1600/flood_simple.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 183px;" src="http://4.bp.blogspot.com/-OjKBwA36uR0/Tar7yG6bhnI/AAAAAAAAAKQ/q_G38B2jqcw/s400/flood_simple.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5596562325228979826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Of course, this is probably the most inefficient way of using Inkscape to create a solid-coloured rectangle. So let's take a more interesting example. If you have ever tried to add a thick stroke to a text, you will have noticed that the result doesn't look too good. One way around this problem is to create a filter as follows:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-ItXcoAlipQI/Tar_CHj_y6I/AAAAAAAAAKY/lDERijmyLaY/s1600/flood_text_stroke_editor.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 381px; height: 400px;" src="http://4.bp.blogspot.com/-ItXcoAlipQI/Tar_CHj_y6I/AAAAAAAAAKY/lDERijmyLaY/s400/flood_text_stroke_editor.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5596565898816113570" /&gt;&lt;/a&gt;&lt;br /&gt;Here I use the Morphology filter primitive in Dilate mode to create a thicker version of the text and Flood filter primitive to create the stroke colour. With Composite I do the operation "stroke colour &lt;span style="font-weight:bold;"&gt;in&lt;/span&gt; thick text", essentially colouring the thick text with my intended stroke colour. Finally, I take this thick, coloured text and composite the original text on top of it with Merge.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-ORKAdFmZQ48/TasAliermTI/AAAAAAAAAKg/Y3smN65AS3s/s1600/flood_text_stroke.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 249px;" src="http://3.bp.blogspot.com/-ORKAdFmZQ48/TasAliermTI/AAAAAAAAAKg/Y3smN65AS3s/s400/flood_text_stroke.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5596567606848624946" /&gt;&lt;/a&gt;&lt;br /&gt;As you can see here, the version using stroke paint has certain problems, especially with the small holes in 'a', 'e' and 'f'. The filter produces a much nicer look, preserving the outline shape of the letters.&lt;br /&gt;&lt;br /&gt;In a similar fashion you can use Flood in other filters to add in colours that don't exist in the original image.&lt;br /&gt;&lt;br /&gt;The SVG sources for the images are available from my &lt;a href="https://github.com/kiirala/filters_tutorial"&gt;filter tutorials repository&lt;/a&gt; at GitHub.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-572399310927455661?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/572399310927455661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=572399310927455661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/572399310927455661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/572399310927455661'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2011/04/filter-effects-flood.html' title='Filter effects: Flood'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-QGpmzfWHsp0/Tar7q5j1PGI/AAAAAAAAAKI/lm2HtvXNizM/s72-c/flood_simple_editor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-462420380417896266</id><published>2011-04-14T11:17:00.007+03:00</published><updated>2011-04-14T14:28:12.715+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter Effects Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='feDisplacementMap'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>Filter effects: Displacement map</title><content type='html'>&lt;span style="font-style:italic;"&gt;This is part of my Filter effects tutorial series.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Displacement map is used to warp images in different fashions. For example many of you may have seen a screen saver that warps a small, moving area of the desktop. That warping effect is done with a displacement map.&lt;br /&gt;&lt;br /&gt;The displacement map filter primitive takes two input images: the image to be warped and a displacement map. The colour in displacement map defines, where the colour for this pixel should come from: you can pick one of the red, green, blue and alpha colour channels for vertical displacement and one for horizontal displacement. Light colours in selected channel make the filter take colours from below or right (or moves the image up or left). Likewise dark colours get the filter to pick colours from above and left. Mid-grey means zero displacement.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-2OkgENoxQ_U/TabYCLIMEcI/AAAAAAAAAJ4/cSo-iTuCZdI/s1600/displacement_rendering.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 234px;" src="http://1.bp.blogspot.com/-2OkgENoxQ_U/TabYCLIMEcI/AAAAAAAAAJ4/cSo-iTuCZdI/s400/displacement_rendering.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5595397118912893378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are some examples what filters can do. The top two cases show how solid colour displacement map simply moves the image (Offset filter is better for that, though). Interesting results come from using gradients (3rd example) or noise (4th example, using Turbulence filter)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-nsb6LnkTYvs/Taa5KhdJ6dI/AAAAAAAAAJo/dsS9hXdV0g8/s1600/displacement_example.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 261px; height: 400px;" src="http://4.bp.blogspot.com/-nsb6LnkTYvs/Taa5KhdJ6dI/AAAAAAAAAJo/dsS9hXdV0g8/s400/displacement_example.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5595363177484904914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These examples used filter set up as follows:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-BXpVYLffxsQ/Taa6w-5_h3I/AAAAAAAAAJw/u0MapSHumX0/s1600/displacement_editor.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 377px;" src="http://3.bp.blogspot.com/-BXpVYLffxsQ/Taa6w-5_h3I/AAAAAAAAAJw/u0MapSHumX0/s400/displacement_editor.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5595364937737144178" /&gt;&lt;/a&gt;&lt;br /&gt;The Image filter primitive is used to grab the bunny as source image and then displacement map filters that using its own colours as the displacement map. This is for top two examples, the bottom two are similar but use scale of 28.8.&lt;br /&gt;&lt;br /&gt;The meaning of displacement map setting is as follows:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;First input image specifies the image to warp&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Second input image specifies the displacement map&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Scale specifies how large displacement should be&lt;/li&gt;&lt;br /&gt;&lt;li&gt;X and Y displacement specify the colour channels to use for horizontal and vertical displacement, respectively&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-inLtHzjTTts/TabZ8ANKmPI/AAAAAAAAAKA/bcNDpaHe-E0/s1600/displacement_amount.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 82px;" src="http://3.bp.blogspot.com/-inLtHzjTTts/TabZ8ANKmPI/AAAAAAAAAKA/bcNDpaHe-E0/s400/displacement_amount.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5595399211925018866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are some gotchas in building displacement map filters. It is best to use only completely opaque colours or only different levels of opacity to specify the displacements: on low opacities the colour information may be partially or even completely lost and this'll cause problems. The second thing is that the filter effects editor in Inkscape has occasional problems: on new displacement map primitive it may be needed to explicitly change X and Y displacement to non-default values (and back again, if you want the default)&lt;br /&gt;&lt;br /&gt;The SVG sources for the images are available from my &lt;a href="https://github.com/kiirala/filters_tutorial"&gt;filter tutorials repository&lt;/a&gt; at GitHub.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-462420380417896266?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/462420380417896266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=462420380417896266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/462420380417896266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/462420380417896266'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2011/04/filter-effects-displacement-map.html' title='Filter effects: Displacement map'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-2OkgENoxQ_U/TabYCLIMEcI/AAAAAAAAAJ4/cSo-iTuCZdI/s72-c/displacement_rendering.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-3574711641930457237</id><published>2008-07-28T15:17:00.005+03:00</published><updated>2011-04-28T13:17:01.700+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='markers'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><title type='text'>Never Trust a Smiling Succubus?</title><content type='html'>So, she approaches you, with bright smile and cute-but-curvy looks. Talks sweet nothings to your ear. Why should there be anything to worry about? Horns? What horns?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_Mhj0KrgRVX8/SI27LN9UMNI/AAAAAAAAAF8/kH1Q1hjynzY/s1600-h/cyan_succubus.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_Mhj0KrgRVX8/SI27LN9UMNI/AAAAAAAAAF8/kH1Q1hjynzY/s400/cyan_succubus.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5228040543846805714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.letraset.com/shopaff.asp?affid=42"&gt;Markers&lt;/a&gt; and black pen on paper. Inspiration from one of the greatest webcomics out there, &lt;a href="http://www.sinfest.net"&gt;Sinfest&lt;/a&gt;. That comic's been running for eight years straight and still going strong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-3574711641930457237?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/3574711641930457237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=3574711641930457237' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/3574711641930457237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/3574711641930457237'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/07/never-trust-smiling-succubus.html' title='Never Trust a Smiling Succubus?'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_Mhj0KrgRVX8/SI27LN9UMNI/AAAAAAAAAF8/kH1Q1hjynzY/s72-c/cyan_succubus.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-3212678698280681084</id><published>2008-07-06T18:32:00.004+03:00</published><updated>2008-07-06T18:49:11.393+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plushie'/><category scheme='http://www.blogger.com/atom/ns#' term='Bubble Bobble'/><category scheme='http://www.blogger.com/atom/ns#' term='plush toy'/><title type='text'>Bubblun</title><content type='html'>This project has been unfinished for far too long, so this week I decided to complete it. And now it's finished, at last! So let me present to you: my own super-huggable video game plushie.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_Mhj0KrgRVX8/SHDmy-T5BdI/AAAAAAAAAF0/DkZtq9L5Zm0/s1600-h/bubblun.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_Mhj0KrgRVX8/SHDmy-T5BdI/AAAAAAAAAF0/DkZtq9L5Zm0/s400/bubblun.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5219925731516679634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Made of cotton cloth, fiberfill, a bit felt and plenty of thread, it's my second hand-made plushie. The first was Tux, made to the &lt;a href="http://free-penguin.org"&gt;Free Penguin Project&lt;/a&gt; patterns.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-3212678698280681084?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/3212678698280681084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=3212678698280681084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/3212678698280681084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/3212678698280681084'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/07/bubblun.html' title='Bubblun'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_Mhj0KrgRVX8/SHDmy-T5BdI/AAAAAAAAAF0/DkZtq9L5Zm0/s72-c/bubblun.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-4945083794141425768</id><published>2008-07-02T10:59:00.008+03:00</published><updated>2008-07-02T13:28:40.485+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter Effects Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='feDiffuseLighting'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='feSpecularLighting'/><title type='text'>Filter effects: Lighting effects</title><content type='html'>&lt;span style="font-style:italic;"&gt;This is part of my filter effects tutorial series&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lighting effects can help in creating a feeling of depth in you image. They take in a height map and various light and material parameters and produce a light map. This light map can then be composited with your object to produce a result that looks like light falling on the object.&lt;br /&gt;&lt;br /&gt;There are two lighting filters: Diffuse Lighting and Specular Lighting. This is how lighting is usually created in computer graphics. Diffuse is how the light reflects off a completely matte object, the sides facing light are brighter and sides facing away from light are darker. Specular in turn is how the light reflects off a smooth surface, it creates bright spots where the light reflects towards the viewer.&lt;br /&gt;&lt;br /&gt;There are two other common lighting properteries: ambient lighting and mirror reflection. Ambient is the light that doesn't seem to come from any particular direction. In filter effects, ambient component comes from the original colour of the object. Mirror reflections, as the name states, are reflections that show the image of other objects. Mirror reflections are not supported by this simple lighting model.&lt;br /&gt;&lt;br /&gt;First, before I'll explain these filters more throughly, I'll tell you a bit about height maps. SVG drawings are two-dimensional and as such, they don't actually contain any depth information. Without depth information, everything in the scene is completely flat, and lighting totally flat objects would be rather useless, because everything would be of same brightness. Height maps are used to overcome this problem. Any image can be used as height map, the transparent areas of image are the lowest point and the more opaque a point is, the more it is considered to be above image plane.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_Mhj0KrgRVX8/SGtDC3xyADI/AAAAAAAAAFM/sofaHcTXO04/s1600-h/lighting_heightmap.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_Mhj0KrgRVX8/SGtDC3xyADI/AAAAAAAAAFM/sofaHcTXO04/s400/lighting_heightmap.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218338309850398770" /&gt;&lt;/a&gt;&lt;br /&gt;In this image, the height map here is completely black and lighter shades are more transparent areas. The light comes from top-left. You can see how this height map is used to create the looks of light falling on three-dimensional object.&lt;br /&gt;&lt;br /&gt;For practical uses, it is often useful to create the height map automatically from the filtered object. Gaussian Blur, for example, is handy for this. The next image shows a height map derived from original object by Gaussian Blur&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_Mhj0KrgRVX8/SGtH9B1f1XI/AAAAAAAAAFU/xFkNIIIEpwY/s1600-h/lighting_max_heightmap.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_Mhj0KrgRVX8/SGtH9B1f1XI/AAAAAAAAAFU/xFkNIIIEpwY/s400/lighting_max_heightmap.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218343707029263730" /&gt;&lt;/a&gt;&lt;br /&gt;Again, the white areas in height map are transparent and more dark areas more opaque. The red line shows the original shape of the object, it's not actually part of the height map. The used lighting filter is from examples/lighting-filters.svg from Inkscape distribution. The result looks more like some rat-shaped badge than an actual rat, but I'd guess, it's quite fine for demonstration purposes.&lt;br /&gt;&lt;br /&gt;So, enough of height maps, let's go to the actual effects. I'll start with Diffuse Lighting.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Diffuse Lighting&lt;/span&gt; is, as I stated above, the light reflecting off a completely matte object. In reality, it's hard to find any such object, but cotton cloth, unpolished stones, bricks and other such materials with highly uneven surfaces come close.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_Mhj0KrgRVX8/SGtMFP_O8pI/AAAAAAAAAFc/NwRaD0kZIGM/s1600-h/lighting_diffuse_dialog.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_Mhj0KrgRVX8/SGtMFP_O8pI/AAAAAAAAAFc/NwRaD0kZIGM/s400/lighting_diffuse_dialog.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218348246313661074" /&gt;&lt;/a&gt;&lt;br /&gt;There's a bunch of settings for Diffuse Lighting, so let's go through them.&lt;br /&gt;&lt;br /&gt;Diffuse Color sets the light colour to be used.&lt;br /&gt;Surface Scale determines, how to map the height map to actual height values. The bigger the value, the higher the peaks of height map. Also, you can move this to negative side, to turn the peaks into valleys.&lt;br /&gt;Constant modifies the strength of the light. High constants result in harsh lighting and strong contrasts between the light and dark areas.&lt;br /&gt;Kernel Unit Length is not yet used in Inkscape. It is used to make the result resolution-independent. Now that it isn't used, with high zooms you can see odd plateaus forming. (There's an other way around this, though it requires using XML editor. See examples/lighting-filters.svg in Inkscape distribution)&lt;br /&gt;Light Source determines the type of light used. Available settings below that also depend on type of light used.&lt;br /&gt;&lt;br /&gt;The resulting image from Diffuse Lighting is fully opaque. It is best used by multiplying the colour values with the colour values of original image. This can be accomplished with Composite filter in Arithmetic mode and multipliers set as K1=1.0, K2=0.0, K3=0.0, K4=0.0. (See &lt;a href="http://fedev.blogspot.com/2008/04/filter-effects-composite.html"&gt;Composite tutorial&lt;/a&gt; for more through explanation of these factors)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Specular Lighting&lt;/span&gt; simulates light reflecting off a smooth surface. Plastic and metallic objects often have strong specular reflections, though for really smooth objects mirror reflection can become dominating.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_Mhj0KrgRVX8/SGtR-NvEuVI/AAAAAAAAAFk/qYqIdqOPDuc/s1600-h/lighting_specular_dialog.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_Mhj0KrgRVX8/SGtR-NvEuVI/AAAAAAAAAFk/qYqIdqOPDuc/s400/lighting_specular_dialog.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218354722519693650" /&gt;&lt;/a&gt;&lt;br /&gt;Most settings for Specular Lighting are same as for Diffuse, so I'll just go through the new ones.&lt;br /&gt;&lt;br /&gt;Specular Color is the same as Diffuse Color, it determines the light colour.&lt;br /&gt;Exponent is completely new here: it determines the shininess or smoothness of the object. Low values correspond to not-really-shiny objects, high values to really smooth objects. Essentially, the higher the exponent value is, the smaller and sharper the shiny spots are.&lt;br /&gt;&lt;br /&gt;Specular Lighting filter produces an image, that is filled with Specular Color, but opaque only where the specular highlights should fall. It is best used by adding the colour values with the colour values in the original image, or the colour values of diffuse shaded image, if you're using both lighting modes. This can be done with Composite filter in Arithmetic mode and multipliers set to K1=0.0, K2=1.0, K3=1.0, K4=0.0.&lt;br /&gt;&lt;br /&gt;Although the filters I've shown here have used Gaussian Blur to create the height map, this is by no means a requirement. Any image will do, though preferably one with several shades of opacity. For example, using result of Turbulence filter as height map can create interesting effects. Here, I've used turbulence to create an effect that looks somewhat like crumbled tin foil.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_Mhj0KrgRVX8/SGtXo3T6h9I/AAAAAAAAAFs/B5xxLP63az4/s1600-h/lighting_foil_gina.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_Mhj0KrgRVX8/SGtXo3T6h9I/AAAAAAAAAFs/B5xxLP63az4/s400/lighting_foil_gina.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5218360952792713170" /&gt;&lt;/a&gt;&lt;br /&gt;The filter is available in Inkscape distribution in file examples/turbulence_filters.svg&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-4945083794141425768?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/4945083794141425768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=4945083794141425768' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4945083794141425768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4945083794141425768'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/07/filter-effects-lighting-effects.html' title='Filter effects: Lighting effects'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_Mhj0KrgRVX8/SGtDC3xyADI/AAAAAAAAAFM/sofaHcTXO04/s72-c/lighting_heightmap.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-806427679631264436</id><published>2008-05-31T14:31:00.003+03:00</published><updated>2008-05-31T15:22:24.667+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Big Buck Bunny'/><category scheme='http://www.blogger.com/atom/ns#' term='Blender'/><title type='text'>Big Buck Bunny</title><content type='html'>You may remember the &lt;a href="http://www.elephantsdream.org/"&gt;Elephants Dream&lt;/a&gt;, the open short movie. It was developed as project Orange at the &lt;a href="http://www.blender.org/blenderorg/blender-institute/"&gt;Happy Blender Institute&lt;/a&gt;. Now, a new team working on project Peach at the Blender Institute has published their work: an open short movie &lt;a href="http://www.bigbuckbunny.org/"&gt;Big Buck Bunny&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At &lt;a href="http://www.libregraphicsmeeting.org/"&gt;LGM&lt;/a&gt;, I had the pleasure of watching this great movie on a big movie theatre screen.&lt;br /&gt;&lt;br /&gt;Elephants Dream was a technical masterpiece, showing the quality of graphics that can be accomplished with open source programs, it was somewhat lacking in the area of storytelling. While I'm guessing this dreamlike drifting to different directions was intentional at least to some degree, it just felt somehow odd to me. Maybe I just don't understand the fine art ;)&lt;br /&gt;&lt;br /&gt;Things look quite different in Big Buck Bunny. It's still a technical masterpiece, actually they've bumped the graphics quality up a notch or two with fur, grass and all such natural phenomena. But the bigger difference is in storytelling. This movie tells a simple story in easy to follow manner, with loads of humour. Some might think that it underestimates the mental capacity of viewers, but I digress. It's nice entertainment.&lt;br /&gt;&lt;br /&gt;Other interesting thing from Blender Institute is the &lt;a href="http://apricot.blender.org"&gt;project Apricot&lt;/a&gt;, which is creating an open source game using Blender, CrystalSpace and several other related tools. I've tried the released versions of these tools, and from what I saw at LGM, this project has made huge improvements to them. Already with the release versions, you can edit stuff like models, textures and actions between the player and scenery in Blender and export all that to the game engine. With the development version project Apricot has, it's possible to actually have the game engine running in a blender window while you can edit game data in other windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-806427679631264436?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/806427679631264436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=806427679631264436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/806427679631264436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/806427679631264436'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/05/big-buck-bunny.html' title='Big Buck Bunny'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-476417546571568908</id><published>2008-05-30T12:23:00.008+03:00</published><updated>2011-04-28T12:41:01.962+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='markers'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><title type='text'>Fun with markers 2: Freefall</title><content type='html'>A couple days ago I bumped into a great webcomic &lt;a href="http://freefall.purrsia.com"&gt;Freefall&lt;/a&gt;.  One thing that caught my interest was how well the artist is able to express the characters' moods, reactions etc. in small scale and with just a couple lines. I decided to try and imitate that style.&lt;br /&gt;&lt;br /&gt;So, here's Florence Ambrose, a Bowmans Wolf and a technician, from Freefall:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SD_ooiRIaGI/AAAAAAAAAEs/pkO7pvpL-y8/s1600-h/freefall_florence.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SD_ooiRIaGI/AAAAAAAAAEs/pkO7pvpL-y8/s400/freefall_florence.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5206135477354653794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;While I'm not quite happy with the colours (I need more brown shades!) I think that came out quite well.&lt;br /&gt;&lt;br /&gt;For those who've been following this webcomic, finding the strip with Florence posing like that shouldn't be a hitch.&lt;br /&gt;&lt;br /&gt;Also, I noticed that there are some interesting colours in my palette:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SD_1iSRIaJI/AAAAAAAAAFE/fquOivszL5Y/s1600-h/blender-orange-apricot.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SD_1iSRIaJI/AAAAAAAAAFE/fquOivszL5Y/s400/blender-orange-apricot.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5206149663631632530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blender.org"&gt;Blender&lt;/a&gt;, &lt;a href="http://orange.blender.org"&gt;Orange&lt;/a&gt; and &lt;a href="http://apricot.blender.org"&gt;Apricot&lt;/a&gt;. Too bad, there's no colour &lt;a href="http://peach.blender.org"&gt;Peach&lt;/a&gt; in my palette nor in &lt;a href="http://www.letraset.com/shopaff.asp?affid=42"&gt;ProMarker colour range&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-476417546571568908?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/476417546571568908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=476417546571568908' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/476417546571568908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/476417546571568908'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/05/fun-with-markers-2-freefall.html' title='Fun with markers 2: Freefall'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Mhj0KrgRVX8/SD_ooiRIaGI/AAAAAAAAAEs/pkO7pvpL-y8/s72-c/freefall_florence.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-4358945748023199362</id><published>2008-05-29T15:38:00.009+03:00</published><updated>2008-05-29T16:35:09.599+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter Effects Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='feConvolveMatrix'/><title type='text'>Filter effects: Convolve Matrix</title><content type='html'>&lt;span style="font-style:italic;"&gt;This is part of my filter effects tutorial series&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Convolve Matrix can be used for several different effects like blurring, sharpening, edge detection and embossing. While it's a powerful tool, it can take quite some expertise to create the desired effect.&lt;br /&gt;&lt;br /&gt;Inkscape support for Convolve Matrix filter primitive is not yet quite finished, but it can already be used for some work. The biggest problem is, the results will depend on the rendering resolution.&lt;br /&gt;&lt;br /&gt;The idea of this filter is to apply a convolution on image. Basically, it takes certain amount of pixels around the target pixel, multiplies the colour values of each pixel by its multiplier and sums them up to form new colour value for the target pixel. There also exists common divisor and bias that will be applied after summing pixel values up.&lt;br /&gt;&lt;br /&gt;For more through and mathematical explanations of convolutions, see &lt;a href="http://en.wikipedia.org/wiki/Convolution"&gt;Wikipedia page on Convolutions&lt;/a&gt; or &lt;a href="http://www.gamedev.net/reference/programming/features/imageproc/page2.asp"&gt;article on Matrix convolution filters on GameDev.net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's an graphical example with single target pixel and the 3×3 area surrounding it.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SD6noiRIZ_I/AAAAAAAAAD0/Wx85udqcfhk/s1600-h/convolve_calculation.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SD6noiRIZ_I/AAAAAAAAAD0/Wx85udqcfhk/s400/convolve_calculation.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5205782534122137586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This same filter is specified in Inkscape Filter Effects dialog as follows:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SD6n-CRIaAI/AAAAAAAAAD8/4pzn_sWQUWA/s1600-h/convolve_calculation_screen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SD6n-CRIaAI/AAAAAAAAAD8/4pzn_sWQUWA/s400/convolve_calculation_screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5205782903489325058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Two special notes here: first of all, the bias is specified as 128 in the first image but as 0.5 in second image. These are actually the same thing, the first image just uses colour values in range 0–255, the second image in range 0–1.&lt;br /&gt;&lt;br /&gt;Second, the divisor isn't actually required. I could have specified the kernel with values of -1/8 and 1.0 and left the divisor as one. The divisor just makes specifying the values easier.&lt;br /&gt;&lt;br /&gt;Here are some examples of possible effects:&lt;br /&gt;&lt;br /&gt;Box blur:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SD6uyyRIaBI/AAAAAAAAAEE/66w9EsFYCBo/s1600-h/convolve_boxblur.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SD6uyyRIaBI/AAAAAAAAAEE/66w9EsFYCBo/s400/convolve_boxblur.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5205790406797191186" /&gt;&lt;/a&gt;&lt;br /&gt;(notice though: usually it's better to use the Gaussian Blur filter primitive for blurring)&lt;br /&gt;&lt;br /&gt;Motion blur:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SD6vOyRIaCI/AAAAAAAAAEM/H9z9gmWbUS4/s1600-h/convolve_motionblur.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SD6vOyRIaCI/AAAAAAAAAEM/H9z9gmWbUS4/s400/convolve_motionblur.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5205790887833528354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Edge detection:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SD6vWiRIaDI/AAAAAAAAAEU/ytvwAyumXT8/s1600-h/convolve_edgedetect.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SD6vWiRIaDI/AAAAAAAAAEU/ytvwAyumXT8/s400/convolve_edgedetect.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5205791020977514546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sharpen:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SD6viCRIaEI/AAAAAAAAAEc/FOUtW5f78Ig/s1600-h/convolve_sharpen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SD6viCRIaEI/AAAAAAAAAEc/FOUtW5f78Ig/s400/convolve_sharpen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5205791218546010178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Embossing:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SD6vxCRIaFI/AAAAAAAAAEk/gw5ChuY7D-Q/s1600-h/convolve_emboss.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SD6vxCRIaFI/AAAAAAAAAEk/gw5ChuY7D-Q/s400/convolve_emboss.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5205791476244047954" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-4358945748023199362?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/4358945748023199362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=4358945748023199362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4358945748023199362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4358945748023199362'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/05/filter-effects-convolve-matrix.html' title='Filter effects: Convolve Matrix'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Mhj0KrgRVX8/SD6noiRIZ_I/AAAAAAAAAD0/Wx85udqcfhk/s72-c/convolve_calculation.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-7152633517692391845</id><published>2008-05-22T23:38:00.002+03:00</published><updated>2008-05-23T00:22:39.176+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Rant: Curly Braces</title><content type='html'>I bumped into an writing called &lt;a href="http://www.leepoint.net/notes-java/flow/if/30if-braces.html"&gt;Java: Braces are your friend&lt;/a&gt;. While I can see that there are good reasons to use braces after every if statement (or after for, while, do...), the reasoning seemed a bit off.&lt;br /&gt;&lt;br /&gt;First of all, it states that the following is allowed, but dangerous:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (condition)&lt;br /&gt;    Exactly one statement to execute if condition is true&lt;br /&gt;else&lt;br /&gt;    Exactly one statement to execute if condition is false&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Well, all fine and dandy and I can see where it's aiming to. The thing is, that very form is the only form that exists. The braces just serve to gather several statements up to form a single statement, they're by no means part of 'if' syntax.&lt;br /&gt;&lt;br /&gt;The first actual reason stated, as to why not leave the braces out, is the following situation&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (condition);&lt;br /&gt;    do_something();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Well, OK. I can see how one can accidentally type the semicolon after the if clause. But then again... Hello, it's 2008 calling! You won't believe what cool things our program editors nowadays have. They colour the different parts of code with different colours and you know what: they even indent your code for you! Amazing, ain't it?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (condition);&lt;br /&gt;do_something();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That certainly doesn't look like such a big error anymore. Also, if one can go and write an extra semicolon after the if clause, why couldn't this happen as well?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (condition); {&lt;br /&gt;    do_something();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Even automatic indenting won't save you from that!&lt;br /&gt;&lt;br /&gt;The other reason is one, I think I've seen quoted a few too many times:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (condition)&lt;br /&gt;    do_something();&lt;br /&gt;    do_something_else();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Yes, the old case of "What if someone later on wants to add more functionality to the if block?" Well, 2008 calling again and all that. Try writing that to any even semi-decent programming editor. It becomes this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (condition)&lt;br /&gt;    do_something();&lt;br /&gt;do_something_else();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Not so dangerous error anymore, either. You can clearly see that the second statement doesn't belong to the if block.&lt;br /&gt;&lt;br /&gt;Also, it crossed my mind that both these errors become invalid code, if you have an else block after that if. That's pretty much a corner case though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-7152633517692391845?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/7152633517692391845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=7152633517692391845' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7152633517692391845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7152633517692391845'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/05/rant-curly-braces.html' title='Rant: Curly Braces'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-1870208070446471413</id><published>2008-05-08T11:32:00.002+03:00</published><updated>2008-05-08T11:44:06.471+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LGM'/><title type='text'>LGM has begun</title><content type='html'>The &lt;a href="http://www.libregraphicsmeeting.org"&gt;Libre Graphics Meeting 2008&lt;/a&gt; has now begun and I'm here. I arrived yesterday and it's been a bit of a crash course to life in Poland. Stuffed buses, not having a common language with shop clerks, trying to find a place where to eat and all that. But I am now here at the conference hall and I've already have met several interesting people and heard of some completely new projects.&lt;br /&gt;&lt;br /&gt;For these new projects, it's now nearing to the end of presentation about &lt;a href="http://photobatch.stani.be/"&gt;Phatch&lt;/a&gt;, a patch editing application for images.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-1870208070446471413?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/1870208070446471413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=1870208070446471413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/1870208070446471413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/1870208070446471413'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/05/lgm-has-begun.html' title='LGM has begun'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-3097667361260765163</id><published>2008-05-06T22:46:00.003+03:00</published><updated>2008-05-06T23:30:00.826+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computer hardware'/><title type='text'>When PCI is not PCI</title><content type='html'>This week I bought two new peripherials for my computer: an USB 2.0 controller card and a sound card. Before you ask, yes, neither of those are integrated on the motherboard. Originally it wasn't a desktop machine but a server.&lt;br /&gt;&lt;br /&gt;The first problem I encountered was when I tried to insert the A-Link U2P4 USB 2.0 controller in a PCI slot. It just didn't fit. The PCI connector on the controller had different keying from the PCI slot on my motherboard. While I could have made it fit using a hacksaw or something, that didn't sound like a good idea. I didn't understand the situation at all, so I looked up the &lt;a href="http://en.wikipedia.org/wiki/Peripheral_Component_Interconnect"&gt;PCI&lt;/a&gt; page from Wikipedia. What I learned was, that there are several versions of the PCI bus. The card I had in my hands was built to use 5 volt signalling and my motherboard used 3.3 volt signalling.&lt;br /&gt;&lt;br /&gt;Further looking into different PCI versions revealed that the last version of PCI standard allowing for 5 volt only cards was deprecated already in 2004. It seems, that all new PCI cards should be able to use both 5 and 3.3 volt signalling or even 3.3 volts only.&lt;br /&gt;&lt;br /&gt;The second problem was with the sound card, a Terratec Aureon 5.1 PCI (aka. Fun). I was able to plug that one in, but that's just about how far I got. Whenever I tried to turn the computer on, it would turn the power on for a split second and then power off. Just enough to make the fans twitch a bit. I don't really have a way to tell for sure what's the reason, but it seems that the card was short-circuiting some of the power lines, and thus causing the power supply to cut the power.&lt;br /&gt;&lt;br /&gt;It may have been, that I just had an faulty card at my hands and if I exchanged it for a new one, it would have worked just fine. Also it may have been that the card is faulty by design and assumes that the signal voltage and +5 volt supplies are at the same voltage, thus shorting the +5V and signal voltage pins. What makes me to even suspect the latter is that I found notions that similar things have happened and that the sound card package showed a picture of a 5 volt only card. If the actual electronics hadn't been revised when the board was changed to universal type (both 5V and 3.3V) that's pretty much what would have happened. I already returned that card to the store for refund, so I don't have real evidence to back up that claim, so as I said, it could have just been one faulty card among a bunch of working cards.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-3097667361260765163?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/3097667361260765163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=3097667361260765163' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/3097667361260765163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/3097667361260765163'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/05/when-pci-is-not-pci.html' title='When PCI is not PCI'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-5660042522924645913</id><published>2008-05-02T13:00:00.002+03:00</published><updated>2008-05-02T13:05:35.268+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter Effects Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='feComposite'/><title type='text'>Filter effects: Composite</title><content type='html'>&lt;span style="font-style: italic;"&gt;This is part of my filter effects tutorial series.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Composite is, as the name states, an effect that can composite images together. It uses the Porter-Duff blending modes named after the writers of the paper, where it was published. For those of you with ACM Digital Library access, here's a link to the original paper: &lt;a href="http://portal.acm.org/citation.cfm?id=808606"&gt;Compositing Digital Images: Porter, Duff&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The Porter-Duff blending modes are basically logical operations applied to images. For example, you can go and take an exclusive or of two images. In the original paper there was a table showing an example of each mode and some variation of that has been included in most places, where these modes are explained. Now that I have my two test subjects, Max the rat and Gina the rabbit, I can use them instead of boring triangles.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SBra5VaZEPI/AAAAAAAAADY/IJHj9VMXcCk/s1600-h/composite-modes-porter-duff.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SBra5VaZEPI/AAAAAAAAADY/IJHj9VMXcCk/s400/composite-modes-porter-duff.png" alt="" id="BLOGGER_PHOTO_ID_5195705798660526322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;From this image, one can notice several useful relations between the different modes: over is actually the ordinary alpha compositing, out and atop are complete opposites of each other, as are in and xor.&lt;br /&gt;&lt;br /&gt;There is a gotcha for making this kind of images: whenever you use the Background Image you need to enable it and to remember that the filter output doesn't replace the background but instead is composited over it. So, if you just created composite filter with xor mode, you'd notice that it just seems to change the compositing order. The gotcha is that the area where the both objects are atop each other is transparent and shows through the original background. So, to make these images, I actually created a solid background inside the filter to hide the original background.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SBreu1aZEQI/AAAAAAAAADg/VDZmzk8fUuE/s1600-h/composite_filter_dialog_flood.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SBreu1aZEQI/AAAAAAAAADg/VDZmzk8fUuE/s400/composite_filter_dialog_flood.png" alt="" id="BLOGGER_PHOTO_ID_5195710016318411010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;There is also a sixth mode called Arithmetic. It allows you to specify the result as linear combination of input image colours. Put other way, you can specify four constants K1-K4 for the equation (result colour) = K1 * (input 1 colour) * (input 2 colour) + K2 * (input 1 colour) + K3 * (input 2 colour) + K4. With these, you can take sum of two colours (K1 = 0, K2 = 1, K3 = 1, K4 = 0), product of two colours (K1 = 1, K2 = 0, K3 = 0, K4 = 0) and plethora of other combinations. Here are a couple examples&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SBrk31aZERI/AAAAAAAAADo/FwtZtCw96es/s1600-h/composite-modes-arithmetic.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Mhj0KrgRVX8/SBrk31aZERI/AAAAAAAAADo/FwtZtCw96es/s400/composite-modes-arithmetic.png" alt="" id="BLOGGER_PHOTO_ID_5195716768007000338" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-5660042522924645913?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/5660042522924645913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=5660042522924645913' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/5660042522924645913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/5660042522924645913'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/04/filter-effects-composite.html' title='Filter effects: Composite'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Mhj0KrgRVX8/SBra5VaZEPI/AAAAAAAAADY/IJHj9VMXcCk/s72-c/composite-modes-porter-duff.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-971010288187981319</id><published>2008-04-28T13:39:00.003+03:00</published><updated>2008-04-28T13:46:15.226+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter Effects Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><title type='text'>Animal test subjects</title><content type='html'>I noticed some time ago that using five pointed stars as example material is growing a bit old. I needed something new to test these filters with. So, I came up with the idea of using animal test subjects. Here are the two: Max and Gina.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SBWqR1aZEOI/AAAAAAAAADQ/IOAkHJLXCN8/s1600-h/max_and_gina.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SBWqR1aZEOI/AAAAAAAAADQ/IOAkHJLXCN8/s400/max_and_gina.png" alt="" id="BLOGGER_PHOTO_ID_5194244968614007010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;While animal testing can be cruel and inhumane, I promise to treat my two test subjects kindly. You'll be seeing them in new Filter Effects tutorials shortly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-971010288187981319?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/971010288187981319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=971010288187981319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/971010288187981319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/971010288187981319'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/04/animal-test-subjects.html' title='Animal test subjects'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Mhj0KrgRVX8/SBWqR1aZEOI/AAAAAAAAADQ/IOAkHJLXCN8/s72-c/max_and_gina.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-7610608250008933060</id><published>2008-04-24T20:46:00.005+03:00</published><updated>2011-04-28T12:43:21.025+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='markers'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><title type='text'>Fun with markers</title><content type='html'>Almost two weeks ago I was looking to buy more colour pencils, as my old set of 12 pencils didn't include any skin tones. Well, I found me a nice 24 piece set, which still doesn't contain many skin tones and actually I already had half of those colours.  I would probably been better off finding a retailer with loose pencils and buying a couple skin tones.&lt;br /&gt;&lt;br /&gt;Well nevertheless, colour pencils weren't what I was going to blog about. Markers are. At the same trip, I noticed some sets of markers next to the colour pencils. There were sets in different styles: bright colours, grays, skin tones... Wait, that's what I wanted, wasn't it? Well, I ended up buying a comic art set with one skin tone, brown, blue, red and black so I could test them out.&lt;br /&gt;&lt;br /&gt;I tested those five markers out and I totally liked them. They're rather fast to work with and they produce strong and brilliant colours. But, five colours is rather limiting. So, after weekend I went and bought some more and now I'm a happy owner of some twenty &lt;a href="http://www.letraset.com/shopaff.asp?affid=42"&gt;Letraset ProMarkers&lt;/a&gt;. Nothing too much, but as even those cost a bit much for my budget, they'll have to do for now.&lt;br /&gt;&lt;br /&gt;But, let's cut the long story short, here's a picture I drew with those markers:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SBDOO1aZENI/AAAAAAAAADI/inzzngvAVBA/s1600-h/diner.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SBDOO1aZENI/AAAAAAAAADI/inzzngvAVBA/s400/diner.jpg" alt="" id="BLOGGER_PHOTO_ID_5192877124609446098" border="0" /&gt;&lt;/a&gt;Well, ok. I did use a bit more than markers: black ink pen for the lines and colour pencil to smooth out the background somewhat.&lt;br /&gt;&lt;br /&gt;One thing I can't seem to figure out, is how to draw areas of flat colour. Look at the floor in previous image, for example. While using special paper meant for marker drawing alleviates this problem somewhat, it's still really easy to get visible stripes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-7610608250008933060?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/7610608250008933060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=7610608250008933060' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7610608250008933060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7610608250008933060'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/04/fun-with-markers.html' title='Fun with markers'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Mhj0KrgRVX8/SBDOO1aZENI/AAAAAAAAADI/inzzngvAVBA/s72-c/diner.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-8242399154682826178</id><published>2008-04-20T18:25:00.007+03:00</published><updated>2008-04-21T19:21:03.183+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter Effects Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='feColorMatrix'/><title type='text'>Filter effects: Color Matrix</title><content type='html'>&lt;span style="font-style: italic;"&gt;This is part of my filter effects tutorial series.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Color Matrix is an interesting filter, that can mix up the colours in your image in many ways. Blanc and white images, sepia toning, hue rotation and removing one of the basic colours from image are a couple examples, what kind of modifications this filter can do.&lt;br /&gt;&lt;br /&gt;The mathematical idea behind Color Matrix is, that it multiplies the colour of each pixel by a 5×5 matrix. SVG won't let you to specify the whole matrix, but only the first four rows. The last row is always "0 0 0 0 1", which means that the imagined fifth colour value will always be one. (red, green, blue and alpha are the four actual colour values)&lt;br /&gt;&lt;br /&gt;Nevertheless, you don't need to know much about the mathematics to be able to use this filter. Let's take an example image from Inkscape Filter Effects user interface:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Mhj0KrgRVX8/SAttX6B9n9I/AAAAAAAAACo/V7HrlyEXKvs/s1600-h/color_matrix_sepia_matrix.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Mhj0KrgRVX8/SAttX6B9n9I/AAAAAAAAACo/V7HrlyEXKvs/s400/color_matrix_sepia_matrix.png" alt="" id="BLOGGER_PHOTO_ID_5191363252956536786" border="0" /&gt;&lt;/a&gt;Here I've specified an sepia tone filter. Not too good one, but it'll make for an good example about how these work.&lt;br /&gt;&lt;br /&gt;So, what are all these numbers?&lt;br /&gt;The basic concept here, is that each column represents an input colour: red, green, blue, alpha and constant addition. Each row in turn represents an output colour: red, green, blue and alpha. For example, the first row means "Take 0.14 times the red value of a pixel, 0.45 times the green value a pixel, 0.05 times the blue value of a pixel and zero times the alpha value of a pixel, sum these and add zero. The result is the red value of output pixel"&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SAtxnaB9n-I/AAAAAAAAACw/QCO8YPN6A5Y/s1600-h/color_matrix_red_calculation.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SAtxnaB9n-I/AAAAAAAAACw/QCO8YPN6A5Y/s400/color_matrix_red_calculation.png" alt="" id="BLOGGER_PHOTO_ID_5191367917291020258" border="0" /&gt;&lt;/a&gt;This same process is applied to all primary colours of a pixel for every pixel in the filtered area.&lt;br /&gt;&lt;br /&gt;The fourth row of this example filter is also noteworthy. Not only it defines the modification applied on the alpha channel, it also is an &lt;span style="font-style: italic;"&gt;identity modification&lt;/span&gt;. Here on the alpha row, alpha is multiplied by one and all other inputs by zero, thus preserving the original alpha channel. With the same idea, you could for example swap the contents of green and blue channels:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SAt13KB9n_I/AAAAAAAAAC4/Fp5IjP6DuRo/s1600-h/color_matrix_colour_swap.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SAt13KB9n_I/AAAAAAAAAC4/Fp5IjP6DuRo/s400/color_matrix_colour_swap.png" alt="" id="BLOGGER_PHOTO_ID_5191372585920471026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Besides the matrix mode, the Color Matrix filter provides also three convenience modes, so you won't have to create the whole matrix every time:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Saturate:&lt;/span&gt; this is a bit funny name, as this Saturate actually desaturates the image. You are provided with a slider allowing you to choose from full scale between full saturation and zero saturation (black and white).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hue Rotate:&lt;/span&gt; this does just what it says, it rotates the hues of your image. If you rotated the colour wheel in Fill and Stroke dialog same amount for every colour in filtered object, the effect would be just about the same.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Luminance to Alpha:&lt;/span&gt; this can be handy as part of bigger filter, it turns the luminance of input image as opacity of output image. White areas become totally opaque, black areas totally transparent and everything other becomes something in between.&lt;br /&gt;&lt;br /&gt;I've found Color Matrix especially handy for adjusting the output from Turbulence filter, as Color Matrix can change the colour of an  image, make areas with low alpha values completely transparent etc. The following examples are from turbulence_effects.svg included in Inkscape distribution and they use both Color Matrix and Turbulence:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Mhj0KrgRVX8/SAt3q6B9oAI/AAAAAAAAADA/MdAwiHFwqzg/s1600-h/color_matrix_turbulence_stars.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Mhj0KrgRVX8/SAt3q6B9oAI/AAAAAAAAADA/MdAwiHFwqzg/s400/color_matrix_turbulence_stars.png" alt="" id="BLOGGER_PHOTO_ID_5191374574490329090" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-8242399154682826178?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/8242399154682826178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=8242399154682826178' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/8242399154682826178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/8242399154682826178'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/04/filter-effects-color-matrix.html' title='Filter effects: Color Matrix'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Mhj0KrgRVX8/SAttX6B9n9I/AAAAAAAAACo/V7HrlyEXKvs/s72-c/color_matrix_sepia_matrix.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-2803543807157662708</id><published>2008-04-20T16:50:00.007+03:00</published><updated>2008-04-20T18:22:58.989+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter Effects Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='feBlend'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>Filter effects: Blend</title><content type='html'>&lt;span style="font-style: italic;"&gt;This is part one of my filter effects tutorials, where I'll describe the filter effects existing  in Inkscape and general information about using and creating filter effects.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The blend filter composites two images pixel by pixel. It provides four compositing modes common in raster graphics editors: multiply, screen, darken and lighten. Also, it can be used to do the normal alpha compositing used in SVG.&lt;br /&gt;&lt;br /&gt;Blend is also other one of the filters, that can be used without going to filter effects dialog in Inkscape: it is used to provide the layer blending modes.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SAtMzaB9n5I/AAAAAAAAACE/4ondwpoFVS8/s1600-h/layer_blend_modes.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SAtMzaB9n5I/AAAAAAAAACE/4ondwpoFVS8/s400/layer_blend_modes.png" alt="" id="BLOGGER_PHOTO_ID_5191327441519222674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The different blending modes work as follows:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Multiply:&lt;/span&gt; works like mixing pigments. Magenta and yellow make red, red and cyan make black etc.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screen:&lt;/span&gt; works like mixing lights. Red and blue make magenta, magenta and green make white etc.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Darken:&lt;/span&gt; works like normal compositing, but composites both first image on top of second and second image on top of first and takes the darker result for each pixel and each colour channel, efficiently making the resulting image darker than either of source images.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lighten:&lt;/span&gt; like darken, but takes the lighter results.&lt;br /&gt;&lt;br /&gt;For multiply and screen, the following image might explain this better than I can:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SAtQFaB9n6I/AAAAAAAAACM/nAuwsk3RJrY/s1600-h/blend_circles.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/SAtQFaB9n6I/AAAAAAAAACM/nAuwsk3RJrY/s400/blend_circles.png" alt="" id="BLOGGER_PHOTO_ID_5191331049291751330" border="0" /&gt;&lt;/a&gt;On left: red, green and blue (RGB) circles composited with Screen.&lt;br /&gt;On right: cyan, magenta and yellow circles (CMY) composited with Multiply.&lt;br /&gt;&lt;br /&gt;For more complex effects, blend can be a handy tool when collecting several parts of the filter effects chain together.&lt;br /&gt;&lt;br /&gt;There are a couple gotchas with blend filter in Inkscape and in general:&lt;br /&gt;First, while Inkscape provides you with layer blending modes, such a concept doesn't actually exist in SVG 1.1. When you specify a layer blending mode, Inkscape creates a blend filter, that takes everything with lower z-index as your layer and composites that with your layer contents. This is the filter result. The filter result is then composited on the canvas, on top of everything with lower z-index. If your drawing has a solid background, this is just fine. If the background is not solid, it will be drawn twice. You may end up with funny looking results like in the following image:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SAtUZKB9n8I/AAAAAAAAACc/dRXjZofmXno/s1600-h/blend_darkening_glitch.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/SAtUZKB9n8I/AAAAAAAAACc/dRXjZofmXno/s400/blend_darkening_glitch.png" alt="" id="BLOGGER_PHOTO_ID_5191335786640678850" border="0" /&gt;&lt;/a&gt;On the top, over solid white background, everything works just fine. But on the bottom over transparent background, you can see a box appearing around the small star.&lt;br /&gt;&lt;br /&gt;The other gotcha is the enable-background property. If you want to use background image as part of any filter, that property must be set. Some parent node of the object, you are applying the filter to, has to have this so that SVG renderers know, what part of background you want to use for compositing. This only applies to hand-made filter effects, if you use the layer blending mode combo box, Inkscape will take care of setting this property for you. For now, the easiest way to set enable-background so that you can use background in your filters, is to set some blending mode from layers palette.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-2803543807157662708?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/2803543807157662708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=2803543807157662708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/2803543807157662708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/2803543807157662708'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/04/filter-effects-blend.html' title='Filter effects: Blend'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Mhj0KrgRVX8/SAtMzaB9n5I/AAAAAAAAACE/4ondwpoFVS8/s72-c/layer_blend_modes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-4671096318248891400</id><published>2008-03-25T14:02:00.003+02:00</published><updated>2008-04-15T22:23:14.969+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>Inkscape 0.46</title><content type='html'>I'm a bit late with this blog post, but now that Inkscape 0.46 is out, all these nice features I've worked on are available in a release version of Inkscape, not just in SVN and nightly builds.&lt;br /&gt;&lt;br /&gt;Of course there's also plenty of other great features: paint bucket tool, 3D box tool, new grids... Way too many to describe here, so check out &lt;a href="http://wiki.inkscape.org/wiki/index.php/ReleaseNotes046"&gt;release notes&lt;/a&gt; for more info.&lt;br /&gt;&lt;br /&gt;Inkscape 0.46 is available at your nearest package management system (well, hopefully) or at &lt;a href="http://inkscape.org/"&gt;inkscape.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-4671096318248891400?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/4671096318248891400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=4671096318248891400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4671096318248891400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4671096318248891400'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/03/inkscape-046.html' title='Inkscape 0.46'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-594522594652671632</id><published>2008-03-20T20:38:00.005+02:00</published><updated>2008-03-20T21:07:36.732+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='machine dance'/><category scheme='http://www.blogger.com/atom/ns#' term='In The Groove'/><category scheme='http://www.blogger.com/atom/ns#' term='SMsync'/><category scheme='http://www.blogger.com/atom/ns#' term='simfile'/><category scheme='http://www.blogger.com/atom/ns#' term='StepMania'/><title type='text'>Timing tool</title><content type='html'>Since getting myself a copy of In The Groove and a carrying bag for my dance mats, I've played dance games quite a lot. Both at my home by myself and at university with some friends.&lt;br /&gt;&lt;br /&gt;A couple days ago, while listening to a song, I felt that I had an idea, what kind of steps it should have. I tried making those steps with the StepMania editor. Well, it proved to be nearly impossible to sync the arrows with the music, as the song was recorded by a live band and thus the beat rate wasn't exactly constant. So, I built a program to make the synching easier. It took around ten to fifteen hours to make a fairly usable program, and that time included plenty of testing and playing around with different versions.&lt;br /&gt;&lt;br /&gt;So, if anyone wants to give it a shot, the  program is available here: &lt;a href="http://cs.helsinki.fi/u/kiirala/smsync.tar.gz"&gt;smsync.tar.gz&lt;/a&gt;. It's a source package, so you'll have to compile it yourself. I've built it on Linux, but I'd believe, it could be usable on other platforms, too.&lt;br /&gt;&lt;br /&gt;And the stepfile I wanted to create? Well, it din't turn out nearly as good as this program, so I don't think I'll be publishing it any time soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-594522594652671632?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/594522594652671632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=594522594652671632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/594522594652671632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/594522594652671632'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/03/timing-tool.html' title='Timing tool'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-7387603188581336161</id><published>2008-01-12T23:01:00.000+02:00</published><updated>2008-01-12T23:10:03.112+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><title type='text'>Maybe I could claim this as modern art</title><content type='html'>I was &lt;del&gt;goofing around with&lt;/del&gt; testing Inkscape today. This one is brought to you by filter effects and tweak tool.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/R4ksPV9bbmI/AAAAAAAAAB8/wyIjx8kNODg/s1600-h/acid-star.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/R4ksPV9bbmI/AAAAAAAAAB8/wyIjx8kNODg/s400/acid-star.png" alt="" id="BLOGGER_PHOTO_ID_5154699890606698082" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-7387603188581336161?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/7387603188581336161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=7387603188581336161' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7387603188581336161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7387603188581336161'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/01/maybe-i-could-claim-this-as-modern-art.html' title='Maybe I could claim this as modern art'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Mhj0KrgRVX8/R4ksPV9bbmI/AAAAAAAAAB8/wyIjx8kNODg/s72-c/acid-star.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-9004962580474652804</id><published>2008-01-11T18:33:00.000+02:00</published><updated>2008-01-11T18:50:50.207+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='feTurbulence'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='filter effects'/><title type='text'>New Filter Effects Examples</title><content type='html'>I've created a couple more examples of using Filter Effects in Inkscape or in SVG generally. This time I focused on feTurbulence filter primitive, which fills the filter effects area with &lt;a href="http://en.wikipedia.org/wiki/Perlin_noise"&gt;Perlin noise&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Perlin noise is often used for texture generation and modeling natural phenomena like clouds and smoke. In SVG drawings it can provide uneveness and noisiness, that is otherwise hard to create.&lt;br /&gt;&lt;br /&gt;Each of these six stars has a different feTurbulence based filter applied:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/R4ecpl9bblI/AAAAAAAAAB0/9p1EyNCi7NQ/s1600-h/turbulence_effects.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/R4ecpl9bblI/AAAAAAAAAB0/9p1EyNCi7NQ/s400/turbulence_effects.png" alt="" id="BLOGGER_PHOTO_ID_5154260536927153746" border="0" /&gt;&lt;/a&gt;(click on the image for nice &amp;amp; large version)&lt;br /&gt;&lt;br /&gt;This example file will be available in SVG format in examples directory in Inkscape 0.46 release. Should you want it already, or you don't want to download all of Inkscape, it's already available in &lt;a href="http://inkscape.svn.sourceforge.net/viewvc/inkscape/inkscape/trunk/share/examples/turbulence_effects.svg?view=log"&gt;SVN&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-9004962580474652804?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/9004962580474652804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=9004962580474652804' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/9004962580474652804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/9004962580474652804'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2008/01/new-filter-effects-examples.html' title='New Filter Effects Examples'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Mhj0KrgRVX8/R4ecpl9bblI/AAAAAAAAAB0/9p1EyNCi7NQ/s72-c/turbulence_effects.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-6516524110555495384</id><published>2007-11-13T14:11:00.000+02:00</published><updated>2007-11-13T14:26:20.472+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Elderly people'/><category scheme='http://www.blogger.com/atom/ns#' term='sign'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><title type='text'>It's a Sign!</title><content type='html'>A couple days ago, I was browsing the &lt;a href="http://www.flickr.com/groups/stickfiguresinperil/"&gt;Stick Figures in Peril&lt;/a&gt; group on flickr. It's a great group, totally worth a look. There I spotted this lovely British "Elderly People" warning sign. There was much speculation, what the lady on the sign was doing, maybe she was picking the mans pockets? For me it was obvious: they were dancing &lt;a href="http://en.wikipedia.org/wiki/Letkajenkka"&gt;Letkajenkka&lt;/a&gt;, they just were a bit lonely.&lt;br /&gt;&lt;br /&gt;So, I got them a couple friends and here they go:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Mhj0KrgRVX8/RzmWagYgJvI/AAAAAAAAABs/niuTCTXc1tY/s1600-h/elderly_dance_small.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Mhj0KrgRVX8/RzmWagYgJvI/AAAAAAAAABs/niuTCTXc1tY/s400/elderly_dance_small.gif" alt="" id="BLOGGER_PHOTO_ID_5132298632478861042" border="0" /&gt;&lt;/a&gt;(Click on the image to see the animated version)&lt;br /&gt;&lt;br /&gt;Original picture from theCallowQueen from flickr. Licensed under Creative Commons Attribution-Noncommercial-Sharealike 2.0 license.&lt;br /&gt;&lt;br /&gt;I traced the figures and created a couple new poses in Inkscape, after which I composited the image using GIMP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-6516524110555495384?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/6516524110555495384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=6516524110555495384' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/6516524110555495384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/6516524110555495384'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/11/its-sign.html' title='It&apos;s a Sign!'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Mhj0KrgRVX8/RzmWagYgJvI/AAAAAAAAABs/niuTCTXc1tY/s72-c/elderly_dance_small.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-1613151372250678233</id><published>2007-10-25T10:38:00.000+03:00</published><updated>2007-10-25T11:16:30.294+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='Openmind'/><title type='text'>Openmind 2007</title><content type='html'>Looks like I'm a bit late blogging this, as &lt;a href="http://openmind.fi/"&gt;Openmind&lt;/a&gt; was held already on 2. - 3. October and now it's end of the month.&lt;br /&gt;&lt;br /&gt;Nevertheless, Openmind is an conference focusing on open source. It was held in Tampere, Finland. There were several interesting speakers. Most memorable for me were probably the talks on &lt;a href="http://www.openmoko.org/"&gt;OpenMoko&lt;/a&gt; and &lt;a href="http://wiki.openmoko.org/wiki/Neo1973"&gt;Neo1973&lt;/a&gt;. Oh boy, I want one of those gadgets myself...&lt;br /&gt;&lt;br /&gt;So, what I was doing there? Well, this conference is organized by COSS, the very same organisation that organizes Kesäkoodi. So, there was a session where every Finnish summer coder – or at least those who had reached the conference venue in time – presented their projects.&lt;br /&gt;&lt;br /&gt;I gave my presentation on Inkscape there, too. It was a short talk, some ten minutes or so, covering what is Inkscape, what are filter effects and what improvements I made to Inkscape during summer. If you'd like to see this presentation, the slides are available at the &lt;a href="http://www.mindtrek.org/presentations"&gt;Mindtrek website&lt;/a&gt;. They are also planning to post recordings of the sessions there. I don't know if these Kesäkoodi presentations were filmed, at least the camera was there. I'm now quite sure, if I want to see myself on video, though...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/RyBOUier_PI/AAAAAAAAABk/4pb2hckWqC0/s1600-h/openmind_img_2454.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/RyBOUier_PI/AAAAAAAAABk/4pb2hckWqC0/s400/openmind_img_2454.jpg" alt="" id="BLOGGER_PHOTO_ID_5125182490707492082" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-1613151372250678233?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/1613151372250678233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=1613151372250678233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/1613151372250678233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/1613151372250678233'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/10/openmind-2007.html' title='Openmind 2007'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Mhj0KrgRVX8/RyBOUier_PI/AAAAAAAAABk/4pb2hckWqC0/s72-c/openmind_img_2454.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-339101929739313928</id><published>2007-08-18T14:00:00.000+03:00</published><updated>2007-08-18T14:48:05.359+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='input images'/><category scheme='http://www.blogger.com/atom/ns#' term='bounding box'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>Large improvements in filtering framework</title><content type='html'>I've been rather busy lately, and it's been cutting into time, I can spend developing Inkscape. Nevertheless, I've now committed a big filtering framework update. The filtering code can now access the bounding box as defined in SVG standard, not only the visual bounding box, that's used in many parts of display code. Also, the filtering code can now handle many more different situations involving rotated and/or skewed objects. This update has been needed for some time already, but I thought it might be too big to fit in this summer.&lt;br /&gt;&lt;br /&gt;The most visible problem this fixes is a crash when trying to use blending modes on a rotated or skewed object. It transformed the object to a coordinate system, where the object's x- and y-axis were paraller to bitmap axis. Then it tried to blend that with the background image, that was still in display coordinates. The blending code then tried to fit these in same buffer, which became really huge and couldn't be reserved.&lt;br /&gt;&lt;br /&gt;This also fixes several less visible bugs. If an object was rotated/skewed and the resolution for filter was specified, the specified resolution was discarded and automatic resolution used instead. Filter area calculations are more correct, because they can be made in correct coordinate system.&lt;br /&gt;&lt;br /&gt;This also opens new parts, that should be improved. The filters, for which it makes a difference, what direction the object's axis point, should be tagged as such. Cutting the filter result to filter effects area should be implemented. A better sampling than nearest neighbour should be implemented for pixel block transformations. Probably several others too.&lt;br /&gt;&lt;br /&gt;This modification isn't all good, though. In some cases with rotation or skewing, the image quality is visibly detoriated. Also there's a rather interesting effect with low-resolution filters. In the following images, first has a slight blur applied with 16x16 resolution. Second is same image, but with a slight rotation applied. This is caused by the fact, that for scaling there exists a bicubic scaler, but for more complex transformations there is only nearest neighbour filtering available. Actually, this behaviour doesn't even violate SVG standard, but it definitely is rather unintuitive. (also, if you look closely, you can notice an off-by-one bug with the resolution)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/Rsbb8w1jjhI/AAAAAAAAABc/UB_4oilubbQ/s1600-h/star-low-res.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/Rsbb8w1jjhI/AAAAAAAAABc/UB_4oilubbQ/s320/star-low-res.png" alt="" id="BLOGGER_PHOTO_ID_5100005464991829522" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-339101929739313928?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/339101929739313928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=339101929739313928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/339101929739313928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/339101929739313928'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/08/large-improvements-in-filtering.html' title='Large improvements in filtering framework'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Mhj0KrgRVX8/Rsbb8w1jjhI/AAAAAAAAABc/UB_4oilubbQ/s72-c/star-low-res.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-8124855650324835243</id><published>2007-08-08T20:04:00.000+03:00</published><updated>2007-08-08T20:25:35.903+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Assembly'/><title type='text'>Assembly 2007</title><content type='html'>Once again, the Finnish demoparty Assembly has ended. Well, actually it ended already on Sunday, but anyhow.&lt;br /&gt;&lt;br /&gt;It was really great to meet all those friends who were there, watch the demos and other compos, check out the booths etc. This year I had again created a intro to be shown at Assembly. Well, it was shown. The entries in 4k compo were of really good quality, and my style is obviously a bit odd, so it ended up on 10th place out of 11 entries shown. For those, who are interested, grab the intro: &lt;a href="http://cs.helsinki.fi/u/kiirala/tsunami.tar.bz2"&gt;tsunami.tar.bz2&lt;/a&gt;, complete with source code. It's under GPL, naturally ;)&lt;br /&gt;&lt;br /&gt;On the not-so-nice sides of this years Assembly, I caught some flu there and because of it, I wasn't feeling too well for the time of the party.&lt;br /&gt;&lt;br /&gt;And for the rest... Well, I don't know what I should write. And of course, it may not always be the best to write everything for the whole world to see.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-8124855650324835243?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/8124855650324835243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=8124855650324835243' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/8124855650324835243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/8124855650324835243'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/08/assembly-2007.html' title='Assembly 2007'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-5553412237518244039</id><published>2007-07-26T14:39:00.000+03:00</published><updated>2007-07-26T14:59:05.889+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feMerge'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>It's alive!</title><content type='html'>I just a while ago committed feMerge support in Inkscape SVN. Now, we have all the parts required to render the &lt;a href="http://www.w3.org/TR/SVG11/images/filters/filters01.svg"&gt;example image&lt;/a&gt; in SVG specification!&lt;br /&gt;&lt;br /&gt;Several other example files are now rendered correctly, too. This filter primitive doesn't bring anything really new, because everything it does, can be done with feComposite, feBlend or even with the simple alpha compositing used in SVG outside filters. It's just an easy way for filter creators to composite several images into one.&lt;br /&gt;&lt;br /&gt;Also, check out the &lt;a href="http://wiki.inkscape.org/wiki/index.php/Filter_Effects"&gt;Filter effects&lt;/a&gt; page in Inkscape wiki. There's a nice listing, which filters work and which don't. There really is a good amount of filters that already work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-5553412237518244039?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/5553412237518244039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=5553412237518244039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/5553412237518244039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/5553412237518244039'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/07/its-alive.html' title='It&apos;s alive!'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-4943302215261363822</id><published>2007-07-24T15:40:00.000+03:00</published><updated>2007-07-24T15:44:44.271+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>Lighting examples</title><content type='html'>Well, I got around and made an example image with lighting. This utilizes gaussian blur, diffuse and specular lighting and feCompose modes arithmetic and in.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Mhj0KrgRVX8/RqX0BC6HFRI/AAAAAAAAABU/hZb8I_DT26o/s1600-h/complex-lighting.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Mhj0KrgRVX8/RqX0BC6HFRI/AAAAAAAAABU/hZb8I_DT26o/s320/complex-lighting.png" alt="" id="BLOGGER_PHOTO_ID_5090743252609864978" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-4943302215261363822?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/4943302215261363822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=4943302215261363822' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4943302215261363822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4943302215261363822'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/07/lighting-examples.html' title='Lighting examples'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Mhj0KrgRVX8/RqX0BC6HFRI/AAAAAAAAABU/hZb8I_DT26o/s72-c/complex-lighting.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-2307267455893125973</id><published>2007-07-24T13:17:00.000+03:00</published><updated>2007-07-24T14:06:26.863+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Assembly'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='filter primitives'/><title type='text'>New Inkscape developers</title><content type='html'>I haven't gotten much code done for Inkscape lately. Small bugfixes here and there, but nothing big really. Most of my time has gone into developing a 4k intro for &lt;a href="http://assembly.org"&gt;Assembly 2007&lt;/a&gt; and helping out new Inkscape developers.&lt;br /&gt;&lt;br /&gt;Yes, indeed. There are two new guys, who have jumped into developing filters for Inkscape. Thanks to them, we have three new filter primitives implemented in Inkscape: feConvolveMatrix, feDiffuseLighting and feSpecularLighting. Once again, these open up new possibilities for artists using Inkscape.&lt;br /&gt;&lt;br /&gt;Now I propably should toss in some examples using these new filters. I don't have any, so I'll toss in the &lt;a href="http://www.w3.org/TR/SVG11/filters.html#AnExample"&gt;Filter effects example&lt;/a&gt; from SVG specification. It shows one possible use for these lighting effects. Actually, Inkscape is almost able to render that one correctly, only feMerge filter primitive is missing.&lt;br /&gt;&lt;br /&gt;For feConvolveMatrix then, it can be used for effects like blur, edge detection, embossing, sharpening.&lt;br /&gt;&lt;br /&gt;That 4k intro even has a connection to Inkscape: the engine is able to render bezier shapes and I've used Inkscape for designing those shapes. More of that later, so I don't spoil it for anyone ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-2307267455893125973?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/2307267455893125973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=2307267455893125973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/2307267455893125973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/2307267455893125973'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/07/new-inkscape-developers.html' title='New Inkscape developers'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-7338156494438016532</id><published>2007-07-09T15:06:00.000+03:00</published><updated>2007-07-09T15:34:43.928+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><category scheme='http://www.blogger.com/atom/ns#' term='feComposite'/><title type='text'>Introducing feComposite</title><content type='html'>I decided to postpone turbulence filter for a while and go ahead with my original plans. So now, Inkscape has a new filter primitive, feComposite.&lt;br /&gt;&lt;br /&gt;Composite in this case refers to Porter-Duff compositing operators, introduced in a paper "Compositing Digital Images" by T. Porter and T. Duff. These compositing operators can provide quite interesting results, though I'm yet to come up with a example where they could be used. Well, one thing useful could be cutting holes to objects, for which using boolean operations would not be feasible.&lt;br /&gt;&lt;br /&gt;Reading that paper, so I could implement the filter, a strange feeling of perspective crossed my mind. Even though computer graphics is a rather new area of study, this paper has been written before I was even born. Only a year before, but still.&lt;br /&gt;&lt;br /&gt;Creating this filter I came upon several parts of filtering code, that should be simpler to use. Especially handling temporary images requires too much boilerplate code. So next, I will look into improving handling temporary images.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-7338156494438016532?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/7338156494438016532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=7338156494438016532' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7338156494438016532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7338156494438016532'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/07/introducing-fecomposite.html' title='Introducing feComposite'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-7514932005263122138</id><published>2007-07-05T10:36:00.000+03:00</published><updated>2007-07-05T11:03:54.176+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PowerTOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Timidity'/><category scheme='http://www.blogger.com/atom/ns#' term='power usage'/><title type='text'>Timidity power usage</title><content type='html'>A while ago, I tried profiling my computer power usage with &lt;a href="http://www.linuxpowertop.org/"&gt;PowerTOP&lt;/a&gt;. This showed, that &lt;a href="http://timidity.sourceforge.net/"&gt;Timidity&lt;/a&gt; was waking up 100 times per second. As I wasn't using midi for anything at the time, this seemed rather odd. Tracing running Timidity with strace, I noticed that the alsa sequencer interface was polling something.&lt;br /&gt;&lt;br /&gt;Digging Timidity cvs tree, I noticed this polling was introduced, when stream tracing support was added to alsa interface. Stream tracing allows for displaying Timidity state in real time, so it can't just sleep until something happens. For normal usage as software midi interface, this is useless. Before this tracing support was added, Timidity did sleep until some event occurred.&lt;br /&gt;&lt;br /&gt;So, this patch makes Timidity alsa sequencer interface poll at 100 Hz only, when stream tracing is used. Otherwise, it just sleeps until something happens. This doesn't seem to break anything and considering that it doesn't actually add new functionality, I believe it's safe to use.&lt;br /&gt;&lt;br /&gt;The patch: &lt;a href="http://cs.helsinki.fi/u/kiirala/nopoll.diff"&gt;nopoll.diff&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-7514932005263122138?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/7514932005263122138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=7514932005263122138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7514932005263122138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7514932005263122138'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/07/timidity-power-usage.html' title='Timidity power usage'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-893833331783126956</id><published>2007-07-03T21:34:00.000+03:00</published><updated>2007-07-03T22:04:17.350+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feTurbulence'/><category scheme='http://www.blogger.com/atom/ns#' term='bounding box'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>I can has turbulence?</title><content type='html'>feTurbulence is a rather problematic filter to create. It would be certainly be useful for same reasons gaussian blur is useful: it's hard to achieve the same result with only vector shapes.&lt;br /&gt;&lt;br /&gt;Well, the first problem is, that the description of this effect in the SVG standard is rather vague. It mostly consists of C-source, which implements this effect. Well, this code doesn't even compile with gcc. It has only a couple useful comments and they describe the simple RNG used for this effect. What I have, is code that presumably calculates the colour value for single pixel, if I manage to figure out, what exactly I should pass it as parameters.&lt;br /&gt;&lt;br /&gt;The second problem is a long-time PIA. The filters rendering code receives a bounding box, which is almost but not quite what SVG standard defines as bounding box. Well, for non-rotated and non-skewed object coordinate systems at least. With this effect, one fills the whole filter effects area, which is usually specified relative to the bounding box. (default is to expand the bounding box by 10% to every direction) As feTurbulence fills this whole area, it's really important to have correct size for this area. Otherwise, this will result in inconsistency between different SVG viewers, potentially also between different Inkscape releases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-893833331783126956?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/893833331783126956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=893833331783126956' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/893833331783126956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/893833331783126956'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/07/i-can-has-turbulence.html' title='I can has turbulence?'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-5455002155744481799</id><published>2007-07-02T17:33:00.000+03:00</published><updated>2007-07-02T19:01:28.756+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='festival'/><category scheme='http://www.blogger.com/atom/ns#' term='PuistoBlues'/><category scheme='http://www.blogger.com/atom/ns#' term='blues'/><title type='text'>In the Mood</title><content type='html'>This weekend, I was at the PuistoBlues blues festival in Järvenpää, Finland. Not only as a visitor, either. A couple days before the main concert I was building the tents - one for the VIP persons, a couple for serving beer, the backstage etc. On the day after the main concert, I was then tearing those same tents down.&lt;br /&gt;&lt;br /&gt;I'm not too big a fan of blues, though I've become more interested in it in the last couple of months, as I've been learning to play harmonica. For me, this has more to it than only blues. It's a big festival in my former hometown and the artists there are world-class. The best thing still is the atmosphere on days before and after the main concert, as most people there creating the festival are volunteers. They (or actually, we) are not building the festival for money but because of the ambitions towards blues or the festival.&lt;br /&gt;&lt;br /&gt;Well, the bands there were good. Once again, I didn't like the biggest stars Johnny Winter and Keb Mo so much as those playing before them. Or maybe at that point I was already too tired to pay attention. Well, anyhow. A Finnish band J. Karjalainen Lännen-Jukka was really good, though some people nearby me were pondering, if it was blues at all. It wasn't anything anything too polished, but more like simple country style music. J. Karjalainen himself was playing banjo along with a violinist, guitarist and a mandolin player.&lt;br /&gt;&lt;br /&gt;Jody Williams &amp;amp; Billy Boy Arnold played more regular blues. Before their show, what caught my attention was, that Billy Boy Arnold is a harmonica player. This was a big point for me, I wanted to hear and see how he played. And were they ever good! I liked especially their pianist, in red shirt and hammering away on a grand piano.&lt;br /&gt;&lt;br /&gt;There was also a local group, the Super Blues Band, who had also played at the first PuistoBlues thirty years ago. Quite a feat, I have to say.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-5455002155744481799?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/5455002155744481799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=5455002155744481799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/5455002155744481799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/5455002155744481799'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/07/in-mood.html' title='In the Mood'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-9094266746015810289</id><published>2007-06-25T19:16:00.000+03:00</published><updated>2007-06-25T19:41:56.344+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>A quick update</title><content type='html'>Just a quick update this time, I haven't finished anything especially noteworthy lately, so I haven't blogged about them either. The bugs mentioned in my last post have been ironed out, as well as some others. I did make the blur slider such that it didn't create a full new filter every time it was invoked, but as I committed that change, it became apparent that Nicholas Bishop had been working on the same code for his GSoC project on filter effects UI. So, that my code was obsoleted in a matter of hours. Re-implementing it, so it can work with this new blur &amp;amp; blending mode UI, could be useful though.&lt;br /&gt;&lt;br /&gt;My plans now are to implement new filter primitives. My original plan states feMerge and feComposite, but as turbulence and lighting effects were considered really useful, when I discussed this on Inkscape Jabber channel, I might implement them first.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-9094266746015810289?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/9094266746015810289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=9094266746015810289' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/9094266746015810289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/9094266746015810289'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/06/quick-update.html' title='A quick update'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-6321621219464508998</id><published>2007-06-12T22:26:00.000+03:00</published><updated>2007-06-12T23:36:41.314+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='input images'/><category scheme='http://www.blogger.com/atom/ns#' term='university'/><category scheme='http://www.blogger.com/atom/ns#' term='bugbug'/><category scheme='http://www.blogger.com/atom/ns#' term='Inkscape'/><title type='text'>Dropshadows with filters</title><content type='html'>Today I had my last exam this semester. Well, sort of. Actually this semester ended already in the beginning of May and this was just a chance to retake exams. Anyhow, the test was on Design of Algorithms. In itself, this is really an interesting area of computing science and I'm planning to do my master's studies in the algorithms sub-programme. For this course then, I'm getting a bit frustrated with it. In the first exam I had no idea, how to do operations on binomial heaps, and since that would have given one third of the points, it didn't go well. For this exam then, a quarter of points would have come from remembering an approximate solution to traveling salesman problem, giving at most double the length of ideal solution in polynomial time, and how to prove it won't give longer answers than that. I didn't remember that solution, so this time it won't go too well either. (and I didn't quite have the time to build the solution from scratch... ;)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/Rm7_MW4SQ4I/AAAAAAAAABM/AboeAhJ4Ank/s1600-h/dropshadow.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/Rm7_MW4SQ4I/AAAAAAAAABM/AboeAhJ4Ank/s400/dropshadow.png" alt="" id="BLOGGER_PHOTO_ID_5075274417858298754" border="0" /&gt;&lt;/a&gt;In coding Inkscape, I had a lot more success. Today I committed code that allows for using SourceAlpha and BackgroundAlpha as input images in filter effects rendering. These are the image of filtered object and its background, but with all colour information stripped out.&lt;br /&gt;&lt;br /&gt;I really have no idea, what I could do with BackgroundAlpha, but SourceAlpha at least gives me nice dropshadows. This star here, for example (can you tell, I like using stars as example material?-). It is just a green star, with a filter that takes the BackgroundAlpha image, offsets it by 10 units in both x and y directions, blurs the result and finally blends that image with the original green star.&lt;br /&gt;&lt;br /&gt;There are still some oddities with that offset filter. I tried this first without blur, and it resulted in white gaps in the whole shape, which was a known bug for the offset filter. Not good. For my amazement, everything went just fine, when I added the blur. No banding, no spurious messages about trying to reserve almost 16 EiB of memory. I really need to take a better look into what's wrong with that feOffset renderer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-6321621219464508998?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/6321621219464508998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=6321621219464508998' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/6321621219464508998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/6321621219464508998'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/06/dropshadows-with-filters.html' title='Dropshadows with filters'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Mhj0KrgRVX8/Rm7_MW4SQ4I/AAAAAAAAABM/AboeAhJ4Ank/s72-c/dropshadow.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-423454558445908612</id><published>2007-06-06T19:41:00.000+03:00</published><updated>2007-06-07T21:45:48.257+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='input images'/><category scheme='http://www.blogger.com/atom/ns#' term='background access'/><category scheme='http://www.blogger.com/atom/ns#' term='feOffset'/><title type='text'>Simple filter, big problems</title><content type='html'>feOffset is a rather simple filter primitive: it just moves the given image a given distance. If we don't go into sub-pixel rendering accuracy, the framework in Inkscape makes it possible to implement a renderer for this filter by merely updating image location info. So far so good.&lt;br /&gt;&lt;br /&gt;What's the problem then? Well, even for simple images rendering this filter requires us to actually render another part of the picture: suppose we wanted to render the rectangle from (x0, y0) to (x1, y1). When we have a feOffset filter with distance (dx, dy), we actually need to render area (x0+dx, y0+dy) (x1+dx, y1+dy) and then apply the filter.&lt;br /&gt;&lt;br /&gt;This can be accomplished, rendering blur needs similar functionality and it works quite OK. The bigger problem is, when feOffset is used on background image. In this case, at the time when background is drawn, it's not known, that some filter later on will try to use background outside this area. All the ways to remedy this I can think of, are rather complex. Still, this whole background access functionality is a rather complex subject. It will likely require some kind of re-entrant rendering, that can go back to rendering background when this kind of situation arises.&lt;br /&gt;&lt;br /&gt;Also I've spent a way too much time trying to fix background access functionality, that wasn't broken in the first place. Obviously it's dangerous to modify one's own old code, because it's easy to assume remembering its workings. If that was someone else's code, I would have first taken a good look at how it works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-423454558445908612?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/423454558445908612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=423454558445908612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/423454558445908612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/423454558445908612'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/06/simple-filter-big-problems.html' title='Simple filter, big problems'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-1905893554905973228</id><published>2007-05-31T12:47:00.000+03:00</published><updated>2007-05-31T14:03:53.087+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feBlend'/><category scheme='http://www.blogger.com/atom/ns#' term='bugbug'/><category scheme='http://www.blogger.com/atom/ns#' term='drawing'/><title type='text'>Making use of Inkscape</title><content type='html'>I'm spending plenty of time developing a drawing program, so I decided to draw something for change.&lt;br /&gt;&lt;br /&gt;This drawing is based on a photograph, but only to get the anatomy correct. I started with ordinary A4 copier parer and pencil for the first sketches. For the outline drawing I used heavier A4 drawing paper, on which I first drew the subject with pencil and then inked with a brush pen and 0.20 mm pen.&lt;br /&gt;&lt;br /&gt;Scanning was a bit of a problem, as my scanner seems to be breaking down. The scanned image was full of horizontal colored lines. Luckily all those lines were bright colours, so I was able to open the image up in GIMP, take a CMYK separation of the image and discard all but the K (black) channel.&lt;br /&gt;&lt;br /&gt;From this on, I used Inkscape for the work. Tracing the inked line drawing gave me a nice vector representation. This was actually surprisingly simple, as in GIMP - which I have used for drawing, too - separating these lines from background would have taken many steps and still wouldn't have yielded as well-defined lines.&lt;br /&gt;&lt;br /&gt;The new paint bucket tool is a godsend for colouring drawings. Filling areas of drawing with the basic colour is only a mouse click away. With default settings, the filled area is not quite correct, as white lines show up between the area and bounding line, but this is easily remedied by increasing the value of "Grow / shrink by".&lt;br /&gt;&lt;br /&gt;For adding shadows, I got to use the new featured I had created myself (Yay!). For this drawing I had though, that the lighting is quite warm, like summer day light, so I picked a cold color for the shadows - dark blue to be exact. Simple alpha blending with this kind of colour leaves a bit to be desired, so I used feBlend with multiply mode. Each shadow shape has an opacity of 20% instead of the whole shadow layer having that opacity - this way stacking shadows on top of each other will create darker shadows.&lt;br /&gt;&lt;br /&gt;The few brighter spots are also created by using feBlend, this time with screen as mode. I feel that bright spots are really easy to overdo, so they are quite subtle here - some maybe even too subtle.&lt;br /&gt;&lt;br /&gt;Well, for the bubbles and background I used plenty of gradients - probably not hard to tell ;) The bubbles are all clones, so it was easy to edit their appearance, when they didn't seem quite correct.&lt;br /&gt;&lt;br /&gt;The pier planks are all unique, the tops are created by duplicating one plank, though. Also, lots of guidelines were used here. This is a place, where I wished that the 3D tool wasn't still in planning, but an usable tool.&lt;br /&gt;&lt;br /&gt;And yes, the result:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Mhj0KrgRVX8/Rl6o6YbcnKI/AAAAAAAAAA0/GWJoJIHQLeA/s1600-h/kuplat-5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Mhj0KrgRVX8/Rl6o6YbcnKI/AAAAAAAAAA0/GWJoJIHQLeA/s400/kuplat-5.png" alt="" id="BLOGGER_PHOTO_ID_5070675951409208482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I was also thinking, that I might create some kind of tutorial about this, too. I did take screenshots and save several copies of the image along the way. This might be a bit too large subject for a tutorial, though.&lt;br /&gt;&lt;br /&gt;And yes, I haven't totally forgotten coding. As pointed out in inkscape-devel mailing list my last changes to codebase broke the about screen... Mixing these C and C++ objects is tricky sometimes. This time problem was that a C++ object inside a C object wasn't getting initialized. If both objects were of C++ style, this initialization would have happened automatically.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-1905893554905973228?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/1905893554905973228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=1905893554905973228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/1905893554905973228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/1905893554905973228'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/05/making-use-of-inkscape.html' title='Making use of Inkscape'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Mhj0KrgRVX8/Rl6o6YbcnKI/AAAAAAAAAA0/GWJoJIHQLeA/s72-c/kuplat-5.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-9079744740329936469</id><published>2007-05-29T13:49:00.000+03:00</published><updated>2007-05-29T14:30:26.728+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='input images'/><category scheme='http://www.blogger.com/atom/ns#' term='feBlend'/><category scheme='http://www.blogger.com/atom/ns#' term='feGaussian'/><category scheme='http://www.blogger.com/atom/ns#' term='timetable'/><title type='text'>Filtering the image background</title><content type='html'>It's beginning to seem, that my planned timetable for this summer project is way off. Luckily it seems, that I've overestimated the time I need instead of underestimating. So what does this mean exactly? Well, now it's been a full two weeks since I started the project but I had planned five weeks for doing what I've done up to this point. Also, I've planned two weeks for creating renderer support for BackgroundImage and BackgroundAlpha input images. Well, it seems that support for BackgroundImage exists already, it just needed these changes I committed today to enable it.&lt;br /&gt;&lt;br /&gt;Well then, about this commit today: support for in-parameter in filter primitives. This means, that now we aren't limited to filtering only the image itself and building linear filter chains. The background image can be taken into account when filtering and building complex filters should be possible too.&lt;br /&gt;&lt;br /&gt;There are lots of possibilities that this enables. Next picture shows one of them: frost glass effect. Here I've got an ordinary gaussian blur, but instead of applying it to the object itself, I apply it to the background image. The object itself disappears, all we see is that a square area of the image is blurred.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Mhj0KrgRVX8/RlwMDYbcnJI/AAAAAAAAAAs/AvpyRCNQqi4/s1600-h/blur-plate.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Mhj0KrgRVX8/RlwMDYbcnJI/AAAAAAAAAAs/AvpyRCNQqi4/s320/blur-plate.png" alt="" id="BLOGGER_PHOTO_ID_5069940532749048978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This support for different input images isn't without problems, though. One really annoying one is with blend filter: it sometimes doesn't use the specified blending mode, but seems to apply normal alpha blending. I don't know yet, if this is a bug in input images support, in blend filter or even in some seemingly unrelated part of code.&lt;br /&gt;&lt;br /&gt;To help debugging this, I think I'll reorder my timetable and implement feOffset filter next. This will allow me to use some example images W3C has published and compare renderings from Inkscape to them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-9079744740329936469?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/9079744740329936469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=9079744740329936469' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/9079744740329936469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/9079744740329936469'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/05/its-beginning-to-seem-that-my-planned.html' title='Filtering the image background'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Mhj0KrgRVX8/RlwMDYbcnJI/AAAAAAAAAAs/AvpyRCNQqi4/s72-c/blur-plate.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-4759486502815736263</id><published>2007-05-21T12:41:00.000+03:00</published><updated>2007-05-21T13:18:05.582+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='SPFilter'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><title type='text'>Refactoring work</title><content type='html'>First planned work for this summer was to refactor filter renderer initialization. The old initialization code was a monolithic piece of code copy-pasted in three places in codebase. (nr-arena-shape.cpp, nr-arena-group.cpp and nr-arena-image.cpp) While not bad in itself, each new filter primitive implemented would have grown that code by a dozen lines or so. It would soon have grown to an unmaintainable size.&lt;br /&gt;&lt;br /&gt;So, the new approach: SPFilter has a single method sp_filter_build_renderer, which will initialize given renderer object (NR::Filter) to a correct state. Calling this method is all that needs to be done in those three nr-arena-* classes to set the correct filter renderer state.&lt;br /&gt;&lt;br /&gt;The inside workings of sp_filter_build_renderer are as follows: each filter primitive (SPFilterPrimitive subclasses) has a build_renderer virtual function that will add the correct NR::FilterPrimitive object in the filter renderer. This function in turn calls sp_filter_primitive_renderer_common, which will do the part of initialization, which is common for all filter primitives.&lt;br /&gt;&lt;br /&gt;Also, I looked into how modification messages are handles in document level filter objects. This actually took more time than the actual refactoring work, as it required me quite a few recompiles and plenty debugging to figure out, how these messages are propagated. Well, now these messages are propagated from SPGaussianBlur and SPFeBlend. This means that updating the underlying xml nodes for these two filters will cause the image on screen be updated. This will allow for further improvements, for example making the blur slider update the existing filter instead of creating a new filter every time the slider is changed.&lt;br /&gt;&lt;br /&gt;Now that I've done this refactoring work, I will look into making in-parameter for filter primitives work. There is now the single method sp_filter_primitive_renderer_common where I should make this change to, so it will be somewhat simpler than it would have been before this refactoring work.&lt;br /&gt;&lt;br /&gt;Also, I probably should write documentation, telling basically the same things about this refactored initialization routine, I've told in this blog post, just more detailed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-4759486502815736263?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/4759486502815736263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=4759486502815736263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4759486502815736263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/4759486502815736263'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/05/refactoring-work.html' title='Refactoring work'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-925523519059205062</id><published>2007-05-16T14:11:00.000+03:00</published><updated>2007-05-31T14:05:07.655+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feBlend'/><category scheme='http://www.blogger.com/atom/ns#' term='bugbug'/><category scheme='http://www.blogger.com/atom/ns#' term='computer memory'/><title type='text'>Rather odd blending bugs</title><content type='html'>Not long after committing the feBlend renderer, ScislaC found some rather odd bugs in it. Well, I'll show you the pictures:&lt;br /&gt;&lt;br /&gt;What it looked like:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Mhj0KrgRVX8/Rkrv-IbcnHI/AAAAAAAAAAc/5xD2uhEwwk0/s1600-h/blend-before.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Mhj0KrgRVX8/Rkrv-IbcnHI/AAAAAAAAAAc/5xD2uhEwwk0/s320/blend-before.png" alt="" id="BLOGGER_PHOTO_ID_5065124581625076850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;What it should have looked like:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Mhj0KrgRVX8/RkrwLYbcnII/AAAAAAAAAAk/Msik12xQ1DE/s1600-h/blend-after.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Mhj0KrgRVX8/RkrwLYbcnII/AAAAAAAAAAk/Msik12xQ1DE/s320/blend-after.png" alt="" id="BLOGGER_PHOTO_ID_5065124809258343554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;So, what was up with this? Well, due to roundoff errors, under some circumstances feBlend renderer would output colours with more than 100% of some RGB components. The image compositing code didn't take such colours nicely...&lt;br /&gt;&lt;br /&gt;Well, now this should be fixed in SVN.&lt;br /&gt;&lt;br /&gt;On other topic, today I was looking for prices of new memory modules, so I could make this computer run smoother. It seems that increasingly often 512 MB just won't do it and the hard disk trashing begins. Now then, SO-DIMM memory is a bit on the expensive side, but for a bit less than 150 € / GB it would likely be worth the money...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-925523519059205062?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/925523519059205062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=925523519059205062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/925523519059205062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/925523519059205062'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/05/rather-odd-blending-bugs.html' title='Rather odd blending bugs'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Mhj0KrgRVX8/Rkrv-IbcnHI/AAAAAAAAAAc/5xD2uhEwwk0/s72-c/blend-before.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-7044930395893394074</id><published>2007-05-14T21:59:00.000+03:00</published><updated>2007-05-14T22:41:07.110+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distcc'/><category scheme='http://www.blogger.com/atom/ns#' term='feBlend'/><title type='text'>Setup phaze and feBlend</title><content type='html'>Today I finally wrapped up some modifications I had lying on my hard disk and committed feBlend renderer into Inkscape codebase. The codebase surely changes fast, as testing those changes with latest code required a full recompile. (and that does take quite a while)&lt;br /&gt;&lt;br /&gt;That feBlend renderer isn't much of use yet, as it needs some features, I'm planning to develop over the summer - for example, changing the input image. Blending the filtered image with itself isn't too useful a feature...&lt;br /&gt;&lt;br /&gt;Recompiling Inkscape will hopefully take significantly less time in future though, as I installed &lt;a href="http://distcc.samba.org/"&gt;distcc&lt;/a&gt;, which allows me to offload part of the compilation effort onto my other computer. It's quite nice a tool, as it works nice even though that other computer doesn't have all the libraries Inkscape requires, different versions of some and even a different processor architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-7044930395893394074?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/7044930395893394074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=7044930395893394074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7044930395893394074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/7044930395893394074'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/05/setup-phaze-and-feblend.html' title='Setup phaze and feBlend'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8964583752416945383.post-6129668365995899016</id><published>2007-05-14T17:45:00.000+03:00</published><updated>2007-05-14T18:15:49.050+03:00</updated><title type='text'>Inkscape and I</title><content type='html'>A bit over a year ago, I noticed I could apply for Google's Summer of Code program. Browsing their list of projects, for which I could apply, I bumped upon Inkscape website. Graphics programming has been one of my interests for a long time and Inkscape was a program that I was using already now and then. After discussion with Inkscape developers, I ended up submitting my proposal on creating infrastructure for SVG filter effects support.&lt;br /&gt;&lt;br /&gt;So, the proposal got accepted and during the summer I worked on developing filter effects support in Inkscape. Soon it was fall and I returned to my studies at the university. I did commit some code during the winter, too, but not really much. When the spring came and I noticed ads promoting Kesäkoodi - a Finnish program similar to Google's Summer of Code - in our student's room, I thought it would be great to continue what I did last summer.&lt;br /&gt;&lt;br /&gt;So here I am, beginning another summer filled with reading code, planning, writing documentation - and of course, writing code, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8964583752416945383-6129668365995899016?l=fedev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fedev.blogspot.com/feeds/6129668365995899016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8964583752416945383&amp;postID=6129668365995899016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/6129668365995899016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8964583752416945383/posts/default/6129668365995899016'/><link rel='alternate' type='text/html' href='http://fedev.blogspot.com/2007/05/inkscape-and-i.html' title='Inkscape and I'/><author><name>Niko Kiirala</name><uri>http://www.blogger.com/profile/01546970908443209152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-Nrw64oqqHIk/TascgZmI0PI/AAAAAAAAAKs/lFAEYDoGhsM/s1600/41ac4995a89867ab5548abf84b51d12b'/></author><thr:total>0</thr:total></entry></feed>
