tag:blogger.com,1999:blog-68785152421360455232024-03-05T14:24:56.520+02:00LightningIsMyName's WebsiteMy thoughts about GIMP, digital art and codingLightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.comBlogger65125tag:blogger.com,1999:blog-6878515242136045523.post-45872934456053620512014-03-12T07:30:00.001+02:002014-03-13T19:42:32.301+02:00Activity, Preparing to LGM 2014<p dir=ltr>*Shaking off the dust*</p>
<p dir=ltr>It's been quite a while since I last posted here. Some will smile at the sight of this post, especially those who know why I was absent (a state which should change until October this year).</p>
<p dir=ltr>Not too far ago, I was invited to the <a href="http://libregraphicsmeeting.org/2014/">Libre Graphics Meeting of 2014</a>; one of the largest (if not the largest) annual gatherings of users and developers of Open-Source tools and programs for graphics. After having to turn down the invitation once or twice before due to problematic dates, this year I managed to arrange a "vacation" in the relevant dates and I'll actually be going!</p>
<p dir=ltr>Yesterday I finished all of the arrangements (including setting up ubuntu dual-boot on my laptop, which turned out to be way easier than I thought), and I can start thinking about LGM itself. It's going to be the first time I attend a real convention like this, and the fact that this first time is abroad and far from home does add it's share to my excitement :)</p>
<p dir=ltr>The program sounds very interesting and with a potential to cover many topics which I never had the chance to learn (such as color management and font design). Also meeting people whom I talked to by IRC in the last 4 years but never met in practice should be one of the greatest parts in LGM fromy my point of view.</p>
<p dir=ltr>So, before I depart, it's time for some thanks. The first of them is to the GIMP family - the people who always care, help and greet you with a smile after you were missing for some time. The second thank is to you - the (usually anonymous) supporters of GIMP; donations you make to GIMP, help also to reimbruse the traveling expenses to developer gatherings like LGM.</p>
<p dir=ltr>So, I'll see you there,<br>
~ Barak</p>
LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0tag:blogger.com,1999:blog-6878515242136045523.post-57596199302242350552013-05-15T23:09:00.002+03:002013-05-15T23:09:44.579+03:00GIMP GSoC 2011 - Seamless Cloning Project - Technical Overview & StatusRecently, I was asked by email to help with the status of my GSoC (2011!) project. So before I say anything about that, let me explain a few things about my current situation.<br />
<br />
For those of you who didn't figure it out already from the lack of activity on this website (and the lack of my activity on the web in general), due to my current real-life situation, I barely have any free time except for those few precious hours in the weekend in which I try to run my own life.<br />
<br />
This means that my open-source activity went to a level which is not enough to do anything which requires long sessions (*cough* coding new stuff *cough*), and only translations of open source software are being kept in progress (very slowly, but they are being worked on and I'll commit them when I have enough material).<br />
<br />
Now that I said that, and now that you know why I'm rather unresponsive by email/comments to this site, let us begin a technical overview of the project status. Note that this was originally written as an email, so I'll sometimes write as if I'm addressing someone specific in a conversation, and sometimes I talk in general (3rd person). Please ignore this inconsistency...<br />
<br />
<span style="font-size: large;">Technical Overview & Status</span><br />
<br />
<strong>Proposal</strong><br />
Unfortunately, I failed to find the original proposal. However, you can find the proposal which I recorded in the GIMP wiki. The proposal is located <a href="http://wiki.gimp.org/index.php/Hacking:GSoC/2011/Ideas#Adaptive_Image_Cloning_.28aka_Seamless_Cloning.29">here</a>.<br />
<br />
<strong>Papers</strong><br />
I'm listing them here, it will become clearer once you see the modules listing.<br />
<ul>
<li>The paper behind the seamless cloning algorithm: <a href="http://www.cs.huji.ac.il/~danix/mvclone/">Coordinates for Instant Image Cloning</a></li>
<li>Unfortunately, due to open source licensing issues and some other reasons, I had to implement myself an algorithm for creating fine triangular meshes.</li>
<ul>
<li>The algorithm I used (and implemented!) was the Delaunay Terminator, as described by <a href="http://www.cs.cmu.edu/~jrs/">Jonathan Richard Shewchuk</a> in his paper <a href="http://www.cs.berkeley.edu/~jrs/papers/2dj.pdf">Delaunay Refinement Algorithms for Triangular Mesh Generation</a>.</li>
<li>Some of the code was based on an existing library (<a href="http://code.google.com/p/poly2tri/">poly2tri</a>) which is in turn based on it's own papers</li>
</ul>
</ul>
<br />
<strong>Modules</strong><br />
The project is divided into 3 main modules<br />
<ul>
<li>A library for creating fine triangular meshes - <a href="http://code.google.com/p/poly2tri-c/">poly2tri-c</a></li>
<ul>
<li>The first part of this library is a C port of a library for creating <a href="http://en.wikipedia.org/wiki/Constrained_Delaunay_triangulation">Constrained Delaunay Triangulations</a>, which are basically "nice" triangulations of existing outlines with/without holes.<br />The original library is <a href="http://code.google.com/p/poly2tri/">poly2tri</a>, and the C port I wrote can be found in <a href="http://code.google.com/p/poly2tri-c/">poly2tri-c</a>'s repository under the <a href="http://code.google.com/p/poly2tri-c/source/browse/poly2tri-c/p2t/">poly2tri-c/p2t</a> folder</li>
<li>The second part of this library is an implementation of the <u>Delaunay Terminator</u> algorithm for what we call a Delaunay Refinement.</li>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Delaunay_triangulation">Delaunay Triangulation</a>s are triangulations which are considered "nice", meaning that most triangles are more or less of equal size, without too big or too small angles.</li>
<li>Delaunay refinement is the process of taking a Constrained Delaunay Triangulation (which is not exactly Delaunay due to constraints such as outline that must be respected) and refining it by inserting more and more points. The process terminates when the resulting triangulation is almost Delaunay.</li>
<li>The implementation of the algorithm above was made from scratch and in fact was the biggest part of the GSoC project (the assumption was that there was an existing open source library to do this. Apparently it wasn't so...)</li>
<li>My implementation can be found in <a href="http://code.google.com/p/poly2tri-c/">poly2tri-c</a>'s repository under the <a href="http://code.google.com/p/poly2tri-c/source/browse/poly2tri-c/refine/">poly2tri-c/refine</a> folder</li>
</ul>
<li>The third and final part of this library is an implementation of a triangular mesh render. The render basically takes a mesh created from the refinement process, a buffer to fill and a vertex-to-color function, and creates an image of the mesh in the specified resolution and size.</li>
<ul>
<li>This is another implementation from zero, although quite trivial and could probably be made more efficient</li>
<li><strong>The original article used OpenGL to do this rendering</strong>, resulting an ultra-fast renderer. <strong>Since the project was done when GIMP/GEGL were in an unclear state regarding usage of graphics hardware acceleration, it was done on the CPU purely which is much slower</strong> (yet still almost interactive - less than a second for rendering regular objects)</li>
<li>My implementation can be found in <a href="http://code.google.com/p/poly2tri-c/">poly2tri-c</a>'s repository under the <a href="http://code.google.com/p/poly2tri-c/source/browse/poly2tri-c/render">poly2tri-c/render</a> folder</li>
</ul>
</ul>
</ul>
<br />
<ul>
<li>The second part of the project is a GEGL operation for doing the actual seamless-cloning operation.</li>
<ul>
<li>In brief, here is a description of the process (needed to understand the state of the code):</li>
<ul>
<li>Do a heavy preprocessing step for creating a fine triangular mesh from the outline of the pasted area</li>
<li>Now, for each render attempt, compute the color differences between the edges of the paste and the background image, and use the previously created mesh to interpolate the differences in the colors along the entire area of the pasted image. Add the interpolated color differences on-top of the paste and you get a seamless pasting!</li>
</ul>
<li>The GEGL implementation of the operation can be found under <a href="https://git.gnome.org/browse/gegl/tree/operations/common/seamless-clone?h=soc-2011-seamless-clone">gegl/operations/common/seamless-clone</a> (in the soc-2011-seamless-clone branch): </li>
<ul>
<li>Files beginning with sc-* are part of a "shared library" with the code required to do seamless cloning</li>
<ul>
<li>This library is used using the GeglScContext object (sc-context.h) which manages a seamless cloning operation for a specified buffer to use as a paste.</li>
<li>GeglScContext implements smart logic to notice when a paste doesn't change between rendering sessions (i.e. calls to the process function) in order to avoid re-doing the heavy preprocessing step</li>
<li>Ideally, GIMP would use this "seamless cloning library" to implement seamless cloning with an internal op that does not need to do this check over and over, since the paste can't change when moving it on the canvas in the GIMP UI. However, currently gimp uses the GEGL op which is described below in a rather dumb way...</li>
<li>This library even exposes a pkg-config file to be easily linked against later...</li>
</ul>
<li>seamless-clone.c implements gegl:seamless-clone - A simple seamless cloning operation using the above library.</li>
<li>seamless-clone-compose.c implements gegl:seamless-clone-compose - A simple meta-op for GEGL that composes the seamless paste above a given background...</li>
</ul>
<li>Finally, in order to have the triangulation algorithm included, <strong>a copy of poly2tri-c is included under the libs directory of GEGL</strong>. This is since poly2tri-c has no package that can be installed and it was asked for so that developers won't need to download additional source code from more locations. This is not a desired situation, yet I'm unaware of any package owners for various Linux distributions which would be willing to help with distributing poly2tri-c as it's own package. If any such developer would be found, send them to me and I'll give them any access/help to the repositories (and I'll do any code modifications needed)</li>
</ul>
</ul>
<br />
<ul>
<li>A GIMP tool using the seamless cloning GEGL op</li>
<ul>
<li>The tool is a bit buggy in terms of refreshing the canvas (sometimes, artifacts are left when dragging the paste)</li>
<li>Additionally, it is inefficient since it doesn't use the library directly and so it does the check of whether the paste buffer changes each time</li>
<li>I'm not sure whether the errors regarding non-continuous pastes (with holes and/or composed of several unconnected parts) do find themselves into the GIMP UI in a proper way...</li>
</ul>
</ul>
<br />
<strong>GIMP/GEGL TODO</strong><br />
<ul>
<li>Make GIMP check for the presence of the seamless cloning operation on the startup of the tool</li>
<li>Make GIMP use the library directly (and check for it's presence on compilation time)</li>
<li>Conditional OpenGL for doing the rendering of the triangular mesh!</li>
<ul>
<li>Implementing the OpenGL rendering in poly2tri-c should be very easy for anyone knowing OpenGL. I'll do it if GIMP/GEGL accepts OpenGL (not OpenCL! That's different!) into the pipeline</li>
</ul>
<li>Fix the described bugs in the GIMP tool UI</li>
</ul>
<br />
<strong>Poly2tri-C TODO</strong><br />
<ul>
<li>Code cleanup, prepare for distribution (I'll do that - it requires less coding then the GIMP stuff and does not require a long coding session - so I can do it on my short available time periods)</li>
</ul>
LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0tag:blogger.com,1999:blog-6878515242136045523.post-70401692764499129252012-09-07T13:17:00.000+03:002012-09-07T14:08:15.047+03:00בלנדר בעברית? (Non-English post)<div dir="rtl" style="text-align: right;">
לפני למעלה משנה יצא לי לדבר בערוץ הצ'אט של בלנדר ישראל, כשהייתי סטודנט פוחז עם זמן פנוי.<br />
בזמנו, אמרתי שבמידה ואני אמצא מספיק אנשים שירצו את בלנדר בעברית, אני מוכן לנסות להתחיל לתרגם אותו כמו שבזמנו תרגמתי חלקים מגימפ.<br />
<br />
עבר די הרבה זמן מאז, ולאחרונה התחלתי לקבל מיילים מעוד ועוד אנשים שמבקשים את זה. ואני מאמין שהבטחות צריך לקיים... אז למען הסדר הטוב, הנה מה שהולך לקרות: בסוף השבוע הזה <b>אני אנסה להגיע למצב שאני מקמפל את בלנדר ומריץ אותו עם <i>מעט</i> עברית</b>. רק שצריך להגיד מספר דברים לגבי זה:<br />
<ol>
<li>לפחות לפי ההערה בעמוד התרגום הרשמי, יש צורך שמפתח כלשהו יקמפל את בלנדר עם תמיכה בעברית בשביל שהתרגומים שלי יכנסו לשימוש. אני אנסה לקמפל את בלנדר בעצמי עד שזה יקרה, אך אני לא בטוח שיש לי מחשב מספיק חזק בשביל לעשות את זה (המחשב שלי בן 5 ואני מריץ בתוכו מכונה וירטואלית של לינוקס)</li>
<li>אין לי מושג מה רמת התמיכה של בלנדר כיום בשפות מימין לשמאל. על פניו מעמוד התרגום עושה רושם שיש, אך את זה נחכה ונראה</li>
<li>לאור העובדה שאני כרגע במקום שאליו מגיעים רוב הנערים הישראליים אחרי תיכון (במקרה שלי הייתה גם אוניברסיטה בדרך, אבל זה פרט שולי), אתם יכולים להבין ככל הנראה שזמן רב אין לי - אז ייקח זמן שתראו תוצאות מהותיות מהתרגום.</li>
<li>אחרון חביב - לגבי הרבה מהמונחים בגרפיקה בכלל, ובתלת מימד בפרט, אני לא מכיר הסכמה רחבה לגבי התרגום. אני כן מתכוון לבצע מספר חיפושים עבור תרגומים קיימים לפני שאני "ממציא" מונחים, אבל קיים סיכוי לא קטן שאני אצטרך להמציא מילים או לקחת מילים שרק האקדמיה ללשון מכירה...</li>
</ol>
ואחרי כל מה שאמרתי - אין זו סיבה שלא תמשיכו לשלוח לי מיילים. אני אמרתי הרי שאם ימצאו 10-20 איש שרוצים את בלנדר בעברית, אני אנסה לראות מה אני יכול לעשות. עברנו את המספר הזה מזמן אך זה לא מזיק לקבל עוד מיילים של מוטיבציה.<br />
<br />
אז בהצלחה, ואני באמת מקווה שיצא מזה משהו.<br />
בברכת שנה טובה ושבת שלום,<br />
ברק<br />
<br />
נ.ב.<br />
להלן מילון מונחים בסיסי, בהתאם לתרגומים שמצאתי. אני אציין מראש שחלקם ממש יפים, בעוד שאחרים מזעזעים אותי בתור מי שקודם בא מהרקע האנגלי ורק אז ראה את המונח העברי:<br />
<ul>
<li>Animation - הנפשה (האקדמיה)</li>
<li><span dir="ltr">Diffuse (Reflection)</span></li>
<ul>
<li>החזרה פיזורית (האקדמיה)</li>
<li>החזרה דיפוזית (האקדמיה, כניעה למונחים לועזיים)</li>
</ul>
<li>Edge - מקצוע (האקדמיה)</li>
<li>Face - פאה (האקדמיה)</li>
<li>Lighting - תאורה, הארה (האקדמיה) </li>
<li>Material - חומר (האקדמיה)</li>
<li>Mesh - ?</li>
<ul>
<li>יש תוכנות שמשתמשות ב"רשת". זה נשמע לי איום ונורא למרות שזה התרגום המתבקש</li>
<li>אריג - מעניין, אם כי לא בטוח שהמונח במקום (w3dictionary)</li>
<li>תשזורת - נפלא! אני תוהה אם עוד אנשים מסכימים על זה (w3dictionary)</li>
</ul>
<li>Particle - חלקיק (האקדמיה)</li>
<li> Render - ?</li>
<ul>
<li>צְלִימָה (ש"פ), צָלַם (פ') - מקורי, חביב, אבל ספק אם מישהו שלא מכיר יבין... (האקדמיה)</li>
<li>עיבוד תמונה (ש"פ) - תרגום שמופיע בתוכנות קוד פתוח אחרות. בתור מי שבא מתחום של עיבוד תמונה (Image Processing) אני נאלץ להתנגד למונח הזה!</li>
<li>רנדר (ש"ע), רינדור (פ') - הבריחה מלמצוא תרגום. יש סיכוי שאני אאלץ להשתמש בזה...</li>
</ul>
<li>Shading - הצללה (האקדמיה)</li>
<li><span dir="ltr">Specular (Reflection)</span></li>
<ul>
<li>החזרה אספקלרית (האקדמיה)</li>
<li>אם נתעלם רגע ממונחים אופטיים מדוייקים, הרי שהמשמעות שאנו רגילים לה בתוכנות גרפיקה תהיה כנראה "בוהק" או משהו בסגנון הזה</li>
</ul>
<li>Vertex - קודקוד (האקדמיה)</li>
<li>Volume - נפח (האקדמיה)</li>
<li>Volumetric - ?</li>
<ul>
<li>נפחי (האקדמיה)</li>
<li>וולומטרי (האקדמיה, כניעה למונחים לועזיים)</li>
</ul>
</ul>
<br />
<ul>
</ul>
</div>
LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com3tag:blogger.com,1999:blog-6878515242136045523.post-22123562741636730272012-07-07T22:18:00.000+03:002012-07-07T22:20:57.380+03:00Trying all my GSoC projects (seamless clone, triangulation)It's about time I post this. My work is actually useable enough (I even received my first bug report by email recently) so it's the time to explain how to use this.<br>
<br>
In this post I will explain you how to compile Poly2tri-C (the triangulation and mesh generation library), how to compile GEGL with the seamless cloning operation and GIMP with the seamless clone tool.<br>
<br>
Ready? Then let us begin!<br>
<br>
<a href="http://lightningismyname.blogspot.com/2012/07/trying-all-my-gsoc-projects-seamless.html#more">Read more »</a>LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com1tag:blogger.com,1999:blog-6878515242136045523.post-74893597707734024662012-03-31T23:43:00.000+03:002012-03-31T23:43:09.933+03:00Very big steps towards finishing post GSoC (2011) workIt works!<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdLnaRdQGs18duFUnTetdcHXENq1vyXHEFJVJrw56pDvi3Pyc3k4lR6VdylWmSRdj64-sGI7XGTLgRRsIzAVMkOCqhirBIOQLVvN8mXZf70y46OP7TO4A5ikGF5RJBM-mF1x5SF4AnGZyw/s1600/DelaunayTerminator.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdLnaRdQGs18duFUnTetdcHXENq1vyXHEFJVJrw56pDvi3Pyc3k4lR6VdylWmSRdj64-sGI7XGTLgRRsIzAVMkOCqhirBIOQLVvN8mXZf70y46OP7TO4A5ikGF5RJBM-mF1x5SF4AnGZyw/s400/DelaunayTerminator.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">An outline and it's refinement</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
If you have been tracking my blog, you saw that I was struggling in the last few weeks to implement a constrained delaunay refinement algorithm. It took ages, as I always encountered lack of available materials and/or programming bugs. But I'm here to say that it works now!<br />
This implementation is in C# (easier to prototype algorithms than in C), and I will convert it to C later for usage with GIMP and the rest of the project. It's based on a paper by <a href="http://www.cs.berkeley.edu/~jrs/" target="_blank">Jonathan Shewchuk</a>: <a href="http://www.cs.berkeley.edu/~jrs/papers/2dj.pdf" target="_blank">Delaunay Refinement Algorithms for Triangular Mesh Generation</a>.<br />
<br />
Now, what about the GEGL side of the project?<br />
As you may have all heard, GIMP is progressing onwards to use <a href="http://libregraphicsworld.org/blog/entry/the-goat-sees-gimp-2.7.5-release-invades" target="_blank">GEGL as it's image processing core</a>. My seamless clone tool is not different - it was written as a GEGL operation (meaning you can use it outside of GIMP, in your own programs!). The GEGL operation has received lots of work this week, including:<br />
<ul>
<li>Working in tiles instead of whole at once (reduces memory usage and makes it scalable for images as large as supported by GEGL)</li>
<li>Bug Fixing and Compiler calming (making the warnings disappear)</li>
<li>Removing code duplication</li>
</ul>
The op is pretty much done now! I will need to use the new triangulation algorithm (as mentioned above), but it should be transparent to the rest of the code.<br />
<br />
Now, what about the GIMP side of the project?<br />
Other than a bit nicer looking GUI for tuning some settings, it's already done since the summer.<br />
<br />
Remaining TODO:<br />
<ul>
<li>Make the GEGL operation handle blank images to paste and images with very thin (1 pixel wide) areas. Also make it handle holes (I would probably warn about these and refuse to paste).</li>
<li>Port the triangulation algorithm to C</li>
<ul>
<li>Also finally make it a standalone package...</li>
</ul>
<li>Improve a bit the GIMP user interface for the tool</li>
<li>Bonuses:</li>
<ul>
<li>Implement an OpenGL and/or a OpenCL (I'm unfamiliar with openCL, and this op is actually very easy with OpenGL) version of the seamless clone operations, to speed things up even more.</li>
<li>Code optimizations....</li>
</ul>
</ul>
That's it for now. I'm off to bed...LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com3tag:blogger.com,1999:blog-6878515242136045523.post-89133596658920118362012-03-12T22:19:00.002+02:002012-03-12T22:19:28.466+02:00More progress on poly2tri, Solutions to Linguistic ProblemsTime for another update on the GSoC project:<br />
<br />
My C port of Poly2Tri (part of my Google summer of code project, see my previous post(s)) has
received much work in the last weekend and things start to look pretty good. <br />
<br />
One of the problems I had was
an incorrect understanding of what is an encroached edge. As someone
who don't speak English natively, in university I heard many different
(non-English) terms to describe edges and vertices in graph, since it's
not really formalized what terms should be used in my language.<br />
<br />
When I first came to read about <a href="http://en.wikipedia.org/wiki/Delaunay_Refinement" target="_blank">Delaunay Refinement</a> for generating a triangular mesh from an outline, I was sure that the following terms (marked in bold) are used freely without some rules (meaning you can use each one of them to express the same common meaning as the others):<br />
<ul>
<li><b>Edge</b> - Used to describe a connection between two points(/vertices/nodes) in a <a href="http://en.wikipedia.org/wiki/Graph_%28mathematics%29" target="_blank">Mathematical Graph</a> and also used to describe one of the three lines which from a triangle. This term is used in triangles simple because triangular meshes are indeed a form of a graph.</li>
<li><b>Segment</b> - Used to describe a straight line between two points of a <a href="http://en.wikipedia.org/wiki/Pslg" target="_blank">PSLG</a>.</li>
<li><b>Sub-Segment</b> - The result of splitting a Segment into smaller parts (this happens during the refinement of the mesh produced from the outlines described by the PSLG).<br />
</li>
</ul>
This confusion is partially because I haven't deeply understood the concept of <a href="http://en.wikipedia.org/wiki/Constrained_Delaunay_triangulation" target="_blank">Constrained Delaunay Triangulation</a>. Basically, the source of confusion was lingual, due to conflicting terms in my native language (Hebrew) - there are several words used to describe these terms, and the people who use them aren't always exactly consistent in their usage. Anyway, I believe I got it more or less right now - I read all the material in English from scratch, and now I understand the differences between all the three terms above.<br />
<br />
And a small teaser - I needed to test if I can detect which points are "visible" from a triangle (to test whether an edge is encroached). To do so I wrote a small and quick algorithm, and here is the demo app I wrote to test it:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifXcopSwMdiNjKgkXaqmY18yX-spulbDETH9iLGu3kfjJXrkU0l3AmZr5ty1d6-_PJ-BXSvcX_9FQR0Kw8X6zyj7fHpybmyonUjcLOwTifg2yqHT2kvkgr7av6713jHJQDawr3d6gycS2e/s1600/VisibilityCheck_Demo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifXcopSwMdiNjKgkXaqmY18yX-spulbDETH9iLGu3kfjJXrkU0l3AmZr5ty1d6-_PJ-BXSvcX_9FQR0Kw8X6zyj7fHpybmyonUjcLOwTifg2yqHT2kvkgr7av6713jHJQDawr3d6gycS2e/s320/VisibilityCheck_Demo.png" width="320" /></a></div>
<br />
Another good announcement is that I have been receiving help from my partner in lots of my university coding assignments, and he has worked on the part which is relevant for the GIMP/GEGL side of the project - a better outline finding algorithm. The current algorithm would crash/freeze on selections with thin areas and randomly in some other cases.<br />
<br />
His algorithm finds outlines for every BW image, and it builds an hierarchy of them (so that outlines which actually represent black holes inside of white areas would be associated with the white outline as child outlines). His algorithm also returns points with locations which have sub-pixel accuracy, to prevent the problem that the current algorithm has with thin areas (thin lines would cause a pixel to be marked twice as an edge pixel - one time for each direction that we go around it. This would crash some parts of the library).<br />
<br />
I still haven't integrated it or looked at the code, but he showed me the outcomes and they look pretty awesome. You'll hear more on that as soon as I get to work on it.<br />
<br />That's all for now. Stay tuned for more ;)LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com1tag:blogger.com,1999:blog-6878515242136045523.post-58940145185813950832012-03-04T22:05:00.000+02:002012-03-04T22:05:20.378+02:00Quicky Update on my Post-GSOC workSome people at the GIMP irc said it's rather unwise I work on the post-gsoc work without comitting it to somewhere public. They are probably right :P<br />
Therefor you can see updates on <a href="http://code.google.com/p/poly2tri-c/" target="_blank">Poly2Tri-C</a> - I'll be updating once in a while (starting from a minute ago). During the weekend, I reached a deep understanding of how wrong my implementation was for the triangulation algorithm because of a misunderstanding of some basic terms. I'm implementing a smaller algorithm (Rupert's algorithm) to see if I'm right now, and then I'll update the main algorithm.<br />
<br />
Also, to my few readers: I don't always have enough time to respond to comments because I'm very busy in real life. If you feel it is important, you should be able to find my email on this site - feel free to email me for the important stuff!<br />
<br />
And for all the people who celebrate it (like me!), Happy Purim! (Yes, I know it's only in 4 days, it's just that I probably won't get to this blog before the holiday)LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com1tag:blogger.com,1999:blog-6878515242136045523.post-20929781543837038812012-02-10T23:29:00.000+02:002012-02-11T18:49:52.402+02:00Post-GSoC work, End(?) of UniversityI have done the seamless cloning project for GIMP and finished it in August. So, you may ask, why on earth is it not integrated yet? The answer is short and simple - last university semester combined with real life. But, I'm not here to bring excuses, I'm here to bring results:<br />
<ul>
<li>On Thursday I had my last university exam (Computational Complexity). Unless I fail, and I hope I don't, <strong>I finished university!</strong></li>
<li>In the last two weeks of university, I had more and more free time so I began working again on my GSoC project. The current things that are waiting to happen are:</li>
<ul>
<li>Fix the triangulation refinement implementation. For those who are not familiar with the algorithm behind the scene, the algorithm itself is based on interpolation of image differences in a triangular mesh. Therfor, it is a critical part.<br />The algorithm currently would get stuck in an infinite loop of refining the triangulation, even though it was gauranteed to stop (meaning an implementation bug). <strong>I think I just fixed it now</strong> (now as in 5 minutes ago), more on this below.</li>
<li>Make the algorithm iterate over tiles inside of allocating a big chunk of memory, and thus limiting the maximal image size for the algorithm.</li>
<li>Fix memory leaks (there are several known leaks, and hopefully none unknown).</li>
<li>Improve a small glitch on the borders of the image.</li>
<li>Optimize the speed!</li>
<li>Get it reviewed, and merge back to master.</li>
</ul>
<li>Being free of university, and free from other work (I have a day work on which I don't work "after-hours"), I'm now free from chores on evenings (if I get home at sane hours) and weekends. <em>For the first time in the last 3.5 years, I really have free time with nothing on my mind</em>. So don't worry, I'll get into GIMP :D</li>
</ul>
Now, before I get into details on my GSoC bug, a short "what's going on?".<br />
<ul>
<li>Last time I left the geometry library, I was completly stuck with no idea what was the bug.</li>
<li>When I got to it again, I decided to re-write it in a language which is more type-safe (no pointer bugs), with less memory issues (garbage collection), and much easier to debug (no offense, but gdb isn't always ideal). Eventually I chose C# (and not Java, my favorite language) in order to learn a bit.</li>
<li>I have been spending my free time between the exams, in the last two weekends, to re-write the library. The re-write was something like "look at the code and write it in a different language". Almost no structural changes or anything, so that I'll keep synced with the source.</li>
<li>And then I found the bug...</li>
</ul>
Now for the bug, which made me like C much less than I did before:<br />
<br />
<pre>// Relevant type declarations:
typedef enum
{
INCIRCLE_ON,
INCIRCLE_INSIDE,
INCIRCLE_OUTSIDE
} P2tRInCircle;
// Types from GLib
typedef int gint;
typedef gint gboolean;
// The function I called
P2tRInCircle p2tr_math_incircle (P2tRPoint* a,
P2tRPoint* b,
P2tRPoint* c,
P2tRPoint* d);
// Somewhere in the code, in the function that I knew that
// was deeply related to the problem:
<strong>gboolean</strong> inside = p2tr_math_incircle (p, a, q, b);
if (inside)
{
...
}</pre>
<br />I don't even feel like explaining this. It is so trivial (and if not, go learn C!) Other than feeling <strike>stupid </strike>silly for falling on such a bug for days of debugging, I don't have anything else I can say... So, with all the dislike of some people to high level languages, I like type safety. It saved my here simply since this code, when converted directly to C#, didn't compile and produce an error instead! <br />
<br />So, Hurray for C#, Hurray for end of University (hopefully) at least untill second degree, and just some other random hapiness. And don't worry, I'm not gone yet :)<br />
<br /><em>Edit:</em> More silly bugs found. I'm starting to like re-writing stuff - way better than debugging...<br />
<em>Edit 2 (February 11th, 2012):</em> The geometry library works, at least in C#. Now it's time to re-implement in C.LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com7tag:blogger.com,1999:blog-6878515242136045523.post-16065828536994945252011-10-23T01:06:00.003+02:002011-10-23T01:06:59.540+02:00Quick Update - NGtkTo those of you who have read <a href="http://lightningismyname.blogspot.com/2011/10/teaser-project-ngtk-native-gui-toolkit.html">my previous blog post regarding NGtk</a>, here is a quick status update:<br />
<ul>
<li><strong>NGtk works</strong>. Tested the XLib and NCurses backends on several linux distributions, and tested the WinApi backend on many versions of windows. I have a calculator app working with keyboard and mouse support.</li>
<li><strong>Keyboard focus is crappy, in all backends</strong>. Currently, I just tell all the widgets to listen to keyboard events. This is not something that is hard to fix - an hour or two.</li>
<li><strong>In backends with custom drawings</strong> (XLib, NCurses), the <strong>widget state isn't considered when drawing</strong> (so the widget looks the same all the time (if it's visible)). Not a bug, but could use some fixing. Base code for fixing that is already there.</li>
<li><strong>Clicking on disabled Widgets in the WinApi backend causes the mouse event to pass to the parent container</strong> (instead of being sent to /dev/null). Does anyone actually care about this? Can this do any harm? Anyway, the nice guys at Stackoverflow suggested a solution that should be easy to implement (but it's not top priority at the moment).</li>
<li><strong>Removing widgets from their container isn't tested well enough</strong>. That's not a bug, but I simply can't gaurantee good behaviour</li>
</ul>
Also, here are some good things:<br />
<ul>
<li>It works!</li>
<li>It doesn't crash</li>
<li>It doesn't leak memory (take that Gtk+!)</li>
<li>Valgrind is generally happy</li>
<li>Did I mention that it works? :P</li>
</ul>
I handed in NGtk to my proffessor, which means I'm now on my own with this project. Expect release 1.0 soon (my submission was titled 0.99). For those who want to take a look at the API usage already, you can take a look at the tester program: <a href="http://code.google.com/p/ngtk/source/browse/ngtk-c/src-test/main.c?spec=svn3740702900a489c527a860a1608bd5b08361b5eb">main.c</a> (forgive me for the ugly macro in line 204, there is already a way around it in the code on my computer).<br />
<br />
It is useable already (you can get the link to the project homepage from the main.c link), but I deeply recommend waiting for me to solve the above technical issues.<br />
<br />
<em>By the way, I did 40 km of bicycling in the city last friday (October 14th) in the </em><a href="http://www.shvoong.co.il/minisites/sovevTLV/"><em>Sovev Tel-Aviv</em></a><em> event. It's the first time I participate, and I really enjoyed. Riding the bicycle on the busiest highways in the country and then along the sea shore together with other hundreds of people, is a great experience. So, if you can participate next year, I highly recommend that you do so ;)</em>LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com1tag:blogger.com,1999:blog-6878515242136045523.post-64590078247073960162011-10-12T21:48:00.000+02:002011-10-12T21:48:38.565+02:00Teaser: Project NGtk - Native Gui ToolKitRecently, I wasn't exactly active in GIMP and other projects. The main reason for that is an <u><i>open-source</i></u> university project I am doing as part of my studies, in the course Advanced Topics in Operating Systems. I believe pictures can demonstrate better than words, so take a look:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZU5EycOoMLCeCHClNoCkCvURpLB6OSGpU8WyF_vkqI-LVGjuhQakwqwXvPLUyNZLWXect8vWVoAWDcgeuYrRLNxUmPtQCAO8eymNETD4JHcOzIFnD2c1k8Rhq9los7g7XcLk9YJMVv74j/s1600/NGtkBanner.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZU5EycOoMLCeCHClNoCkCvURpLB6OSGpU8WyF_vkqI-LVGjuhQakwqwXvPLUyNZLWXect8vWVoAWDcgeuYrRLNxUmPtQCAO8eymNETD4JHcOzIFnD2c1k8Rhq9los7g7XcLk9YJMVv74j/s400/NGtkBanner.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Click on the image to view it in fullsize</td></tr>
</tbody></table>
<br />
Project NGtk is an extremly light-weight library for creating GUI's on different platforms. It includes the following features/concepts:<br />
<ul>
<li>Has support for the following widgets and events:</li>
<ul>
<li><b>Button</b> (stable)</li>
<li><b>Labels</b> (stable)</li>
<li><b>Text-Entries</b> (stable on 2 of 3 platforms)</li>
<li><b>Windows</b> (stable)</li>
<li><b>Mouse up/down/click events</b></li>
<li><b>Keyboard key type events</b>, with translation from key code to ascii </li>
</ul>
<li>Works on the following platforms:</li>
<ul>
<li><b>Windows</b> - Uses native Windows widgets via the windows API.<br />For this backend, the only dependancy is the windows libraries which already ship with Windows.</li>
<li><b>Unix/Linux <u>Terminal</u></b> - Any terminal which NCurses works on (which should be most modern terminals). This means you can also use this via SSH without X11-forwarding! Unlike many curses applications, NGtk includes full support for mouse cursor in the terminal.<br />For this backend, the only dependancy is NCurses, which is shipped with most (if not all) modern linux distributions. NCurses supports a large variety of terminals.</li>
<li><b>Xlib</b> - Any operating system which has an Xlib (X11) client library. This means graphical Linux/Unix work environments.<br />The only dependancy for this backend is an Xlib implementation, which is shipped with all modern graphical Linux/Unix environments.</li>
<li><b>Gtk+ wrapper</b> - Support planned for near future. This will practically be a simple API wrapper to give API consistent with other NGtk backends.</li>
</ul>
<li><b>30 KB for the core library + 30 KB for each "adapter"</b> (backend library). Just for comparision, Gtk+-3 is approximatly 4 MB (130 times bigger), not including it's dependancies.</li>
<li><b>Written in C</b></li>
<li><b>Object-Oriented structure</b> - NGtk uses a very small C object system that was written as part of this project to make it easy to rogram, and without requiring C++. The object system is easy to learn and well documented.</li>
<li><b>Display </b><b>"Resolution" Independant</b> - Forget the term pixel, as it doesn't exist in NGtk. Since NGtk is meant for a wide amount of platforms, such as the terminal (where a the smallest unit, a "pixel", can actually be a whole letter), NGtk will handle sizing of widgets itself. You can specify logic layouts, but no need to actually specify a size for widgets. There is a built-in interface for accepting custom made layouts (anything from grids, relative sizings, etc.), and writing new layouts is easy.</li>
</ul>
As you can see, NGtk doesn't have any real dependancy - the only
dependancy it has is the existance of the graphical system that you wish
to use. It is also <i>not a replacement for Gtk+/Qt/etc.</i> - it's targetted only at people who want <i>very light-weight GUIs</i> (both in features and in actual library disk size), and want to acheive <i>maximal support</i>. The NGtk goal is to achieve a state where every platform with a compiler will have an NGtk backend that will work on it without requiring any library which isn't already on the platform.<br />
<br />
The first stable release of NGtk will happen this week when I hand in the project to my university. You can already find the project source by googling it, but I do recommend waiting for the official stable release.<br />
<br />
<i>Regarding my GSoC project: no I haven't forgotten. It won't make it in time for 2.8, but I will work on it as soon as I can hand in NGtk to my proffessor. Sorry to disappoint the people who wanted to see it soon, but it just won't happen...</i>LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com2tag:blogger.com,1999:blog-6878515242136045523.post-23387630770549239882011-09-24T21:19:00.000+03:002011-09-24T21:19:11.434+03:00Saving Vertical space in GNOME 3 (Especially for Firefox)I have been using GNOME 3 for more than a week now. I really like it, and after tweaking my desktop back to show the files and launchers (like in GNOME 2) I really felt at home.<br />
<br />
However, not everything is great with GNOME 3. One of the most irritating features of it, is the gigantic titlebar of windows. I actually like gigantic titlebars, but not when I need to maximize my working area. The web is full of people complaining "Why Firefox on Linux can't be space efficient as it is on Windows 7?" This is even more critical when in the fallback mode, you have two very thick panels that also take additional vertical space (I switch between fallback and regular all the time because of some hardware limitations).<br />
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhET7N-kTNrFY_XEYiSzSeh17gQ02RrsheKVeqH1bQ61JmgR5zqTHRQxkG07MVLhJz17EkSThrUBkXeSZ2zZe6mRD5LQojcOoeQz4hOi9eA1nV6eGlHhIQjvP7mifANZBKCosBmpxU8gASg/s1600/CompactsGood.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhET7N-kTNrFY_XEYiSzSeh17gQ02RrsheKVeqH1bQ61JmgR5zqTHRQxkG07MVLhJz17EkSThrUBkXeSZ2zZe6mRD5LQojcOoeQz4hOi9eA1nV6eGlHhIQjvP7mifANZBKCosBmpxU8gASg/s640/CompactsGood.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Comparision between Firefox titlebar on Windows 7 and GNOME 3 (<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhET7N-kTNrFY_XEYiSzSeh17gQ02RrsheKVeqH1bQ61JmgR5zqTHRQxkG07MVLhJz17EkSThrUBkXeSZ2zZe6mRD5LQojcOoeQz4hOi9eA1nV6eGlHhIQjvP7mifANZBKCosBmpxU8gASg/">fullsize</a>)</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-xGBkNx16fuk/Tn4W6qJVAlI/AAAAAAAAAiQ/bECc_0Z7_cY/s1600/CompactsGood.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
As you can see, the Windows 7 setup takes much less space, by combining the titlebar with the tab area. Very neat!<br />
<br />
Anyway, I'm here to say that you can make Firefox on Linux thinner. I'm not talking about fullscreen mode in firefox - since I do like seeing my tabs and toolbars (Which firefox hides in fulscreen mode).<br />
<br />
In Linux, windows are displayed and managed using a special program called a <i>Window Manager</i>. We are going to request the window manager to display Firefox in full-screen. This is different from firefox's built-in full-screen mode! In the full-screen mode created by the window manager, Firefox will continue to show it's tabs and toolbars like before, but it's titlebar will be gone and it will fill the area that was used by the gnome panels!<br />
<ol>
<li>Open the <i>System Settings</i> dialog (in fallback mode, it's in <i>Applications → System Tools</i>) and Choose <i>Keyboard</i>. (<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeXSJplD5HRaWIIVsaNfpFpWuGnABcEBhS4g2txWuG94XDijMweGauuOGtnAbq_cIFYSRgtPqE9jPoFOMG2aNkcAFr8p7su-uYhuC3EJWUgvOvPV3hsCBGCkqAvtPgeVqk74uX9cp1V9tP/s800/SystemSettings_Keyboard.png">Screenshot</a>)</li>
<li>Switch to the <i>Shortcuts</i> tab and choose <i>Windows</i> from the options on the side. (<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSXCZeq50L78-cU8jsmJ24dtoOQFPR5Ep0qcvVnz1xfekVgkQo0sLNEB5P1o0gIuRT3SDlKzBPGjpXmO75jgG3sgdW-aX0aOsOTfiu1bXjkQUn5DijOOP9uJb6eX2_3rDgDjQAG4sJiiLy/s800/Keyboard_Window_Fullscreen.png">Screenshot</a>)</li>
<li>Find the <i>Toggle fullscreen mode</i> option, and assign a new keyboard shortcut which is easy to remember (I used <i>Ctrl+Alt+F</i>). To assign a new shortcut, click on the area which displays the shortcut (it displays <i>Disabled</i> if no shortcut is set) and type the desired key combination.</li>
</ol>
Now, whenever you open Firefox (or any other program that needs more vertical space, without sacrificing any toolbars that disappear in the built-in fullscreen mode of that program) simply type the shortcut from above to go fullscreen! Type again to get out of the full-screen mode.<br />
You are going to miss the close/un-maximize/minimize buttons in fullscreen mode. However, you can probably live without them (or if you like keyboard shortcuts, configure some for these also!) when working in fullscreen.<br />
<br />
That's it, I hope it helps those of you who need to use more height of their screen and don't like the built-in fullscreen modes (if any) of their programs. If anyone knows any better way (especially for Firefox on GNOME 3), please leave a comment :) LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com3tag:blogger.com,1999:blog-6878515242136045523.post-50644851843879814752011-09-05T22:51:00.001+03:002011-09-05T22:51:26.564+03:00Video demo of my GSoC project<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/pqVMt-ReaDc?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
[If you are reading this from RSS, you may not be able to see the video. Click <a href="http://www.youtube.com/watch?v=pqVMt-ReaDc">here</a> to see it]LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com20tag:blogger.com,1999:blog-6878515242136045523.post-71245043360402280252011-08-29T01:06:00.000+03:002011-08-29T09:52:13.048+03:00[GSoC-2011] Final Results and How to TryI am very glad to announce that I now officially passed the Google-Summer-of-Code 2011 :) The email from Google arrived in the last few days, and the official Google announcements on the GSoC results (of all projects) are supposed to be published tomorrow.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnaTVPllqUJTUoRBoJmF9U9TuHw-YYF0494uilN1EnhINcMTdTMTrhdk-PpUv6ithLdmezSBO_nBmsT4NFKzKN7Dy2EgLPJh_JLT-fLtQ5OFjrr_1xn3kOtmKPc7Jqu7OHUcTHi20QerCj/s1600/Example2_Merge.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnaTVPllqUJTUoRBoJmF9U9TuHw-YYF0494uilN1EnhINcMTdTMTrhdk-PpUv6ithLdmezSBO_nBmsT4NFKzKN7Dy2EgLPJh_JLT-fLtQ5OFjrr_1xn3kOtmKPc7Jqu7OHUcTHi20QerCj/s320/Example2_Merge.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">S/He is eyeing you :)<br />
Sources: <a href="http://commons.wikimedia.org/wiki/File:KF.JPG">background</a>, <a href="http://commons.wikimedia.org/wiki/File:OjoAzul.jpg">paste</a></td></tr>
</tbody></table>
Now, it’s time to publish the instructions on how to get and try it for the people who want to test it. There are some known bugs, and probably some unknown bugs, so be warned.<br />
<br />
<b>Compilation and Set-Up Instructions</b><br />
<ol>
<li>You should know how to build of GIMP and GEGL from Git. A partially outdated guide is available <a href="http://lightningismyname.blogspot.com/p/compiling-gimp.html">here</a>, and some things are explained in more depth <a href="http://wiki.gimp.org/index.php/Hacking:Building">here</a>.</li>
<li>Instead of building the GEGL master (main) branch, switch to the <code>soc-2011-seamless-clone</code> branch. You can do this by running <code>git checkout soc-2011-seamless-clone</code>. Compile it with the regular flags – nothing special is needed.</li>
<li>After building the updated version of GEGL, it’s time to build the updated version of GIMP. Switch to the <code>soc-2011-seamless-clone2</code> branch, and build it.</li>
<li>Before running GIMP, you must set the environment variable <code>p2t_refine_steps</code> to some number defining the maximal amount of points to be used in the mesh (in plain English, more should theoretically produce better result). I know this is annoying, I will get rid of it as soon as I finish debugging a certain code part. The typical number I use is 500 for pastes of around 200x200 pixels, and you should probably increase it if you wish to work on large pastes.
If you are using the bash terminal, do <code>export p2t_refine_steps=500</code> (and change the number as you wish)</li>
<li>Run GIMP.</li>
</ol>
<b>Usage Instructions</b><br />
<div>
<br /></div>
Basically, you can just try copying a part, selecting the Seamless Clone tool (Shift+L) and clicking anywhere on the image to start the tool’s interaction. Click Enter to apply the final result. <i>If this doesn’t work (and/or crash), then the instructions below are for you</i>.<br />
<ol>
<li>Run Gimp :)</li>
<li>Open the image that you wish to use as the background, and open the image you wish to paste into the background.
Copy the part you want to paste. Note that opacity of that part will be treated as if it was binary – parts under 50% opacity will be removed, parts of more than 50% opacity will be completely opaque. The shape can be any shape, as long as it follows the following rules:</li>
<ol>
<li>It must not have holes (Temporary limitation)</li>
<li>It must be continuous, i.e. composed of only one part (Temporary(?) limitation)</li>
<li>It must not have any long thin areas (Temporary(!) limitation).<br />This means that if you have any area which is 1 pixel wide and is 3 pixels long or more (i.e. a thin spike), it will crash. Solution for this was already devised, I just need to code it.
Select the Seamless-Clone Tool (Either by clicking the second tool on the toolbox that has the same icon as the move tool, or by doing Shift+L).</li>
</ol>
<li>Click anywhere on the canvas while the background layer is active. The paste will be centered on the cursor, and so the cursor should be in a place where the entire paste is inside the background boundaries (both inside the rectangle defining the layer, and inside an area where all the background below it is opaque). This limitation will be enforced by the User Interface later.</li>
<li>Move the paste by clicking on it, dragging and releasing. If you move it slow enough (which actually shouldn’t be so slow), you’ll see the preview updating while you are moving.</li>
<li>Click Enter to Apply the effect.</li>
</ol>
<b>Known Bugs</b><br />
<ul>
<li>All the above mentioned crashes and bugs :)</li>
<li>Due to not yet complete memory management, the tool leaks memory from it’s preprocessing.</li>
<li>Converting to tile-based processing is NOT 100% done, so it may crash on large pastes. Don’t ask me how large since I didn’t try anything more than 300x300 on my machine.</li>
</ul>
<b>Other TODO’s</b><br />
<ul>
<li>Integrate the tool with the help system</li>
<li>Test better the interaction when the the active image/display/drawable are switched during the interaction of the tool.</li>
<li>Get a decent tool icon. <b>Anyone with ideas for the visual metaphor to be used by a seamless paste tool, is more than welcome to leave them here as comments!</b> I do design icons, but I don’t have an idea for this one.</li>
</ul>
<div>
</div>
LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com3tag:blogger.com,1999:blog-6878515242136045523.post-44971895061495651682011-08-15T14:50:00.009+03:002011-08-15T22:33:19.191+03:00GSoC 2011 - (Almost) Final results and thanks!The end of Google Summer of Code 2011 is near, and I have failed to post enough updates on my blog. But that does not mean one bit that I failed to make progress. I'm proud to present you with my results:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBZoTGw8meU8byn-YrI0YRcCuj5yQkz4rPbo-e21SJ469upbPG5PfSli-_pDcubw2OfwaObtS3enpUFHJl035GKKUCGH6kwEQPJ_BHMXCHVNBrk7hQqDEZshuyf-8b9Mai-7DxoXWxE69I/s1600/SeamlessCloneGimp.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="111" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBZoTGw8meU8byn-YrI0YRcCuj5yQkz4rPbo-e21SJ469upbPG5PfSli-_pDcubw2OfwaObtS3enpUFHJl035GKKUCGH6kwEQPJ_BHMXCHVNBrk7hQqDEZshuyf-8b9Mai-7DxoXWxE69I/s200/SeamlessCloneGimp.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Result, using <strong><u>my</u></strong> GIMP tool :D</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Vdee5sAJmU0xCFtGwrx0tKgZRccCRUvkCtboXpnAwbjJQtdrVtqMNJOyNc_ATutimlJ1fY2zE0ECkxvLGtQrBSQkmIp7n6vU4-iDpm2X_ZQEnRFz_tTWnPLYHyr9RlZd8J-n_PE_ER31/s1600/SeamlessClonePaste.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Vdee5sAJmU0xCFtGwrx0tKgZRccCRUvkCtboXpnAwbjJQtdrVtqMNJOyNc_ATutimlJ1fY2zE0ECkxvLGtQrBSQkmIp7n6vU4-iDpm2X_ZQEnRFz_tTWnPLYHyr9RlZd8J-n_PE_ER31/s200/SeamlessClonePaste.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The image to paste (<a href="http://commons.wikimedia.org/wiki/File:Ursus_maritimus_Polar_bear_with_cub_2.jpg">source</a>)</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWCXnQthtDbjty_P-E0WImffB5LlXevaKMsQ4-rBE-ERlXyslHm7a3vllzbzmpTEy2mvbsU1grLCFgQQhoYhhPxzpbgm6kxE9sqrwUOxOLbEYwtz-7u8F8DqX-2s0r3tdlc0-9e6s4U9-U/s1600/SeamlessCloneBg.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWCXnQthtDbjty_P-E0WImffB5LlXevaKMsQ4-rBE-ERlXyslHm7a3vllzbzmpTEy2mvbsU1grLCFgQQhoYhhPxzpbgm6kxE9sqrwUOxOLbEYwtz-7u8F8DqX-2s0r3tdlc0-9e6s4U9-U/s200/SeamlessCloneBg.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The image to paste into (<a href="http://commons.wikimedia.org/wiki/File:Adrar_sands.JPG">source</a>)<br />
Licensed under <a class="extiw" href="http://en.wikipedia.org/wiki/en:Creative_Commons" title="w:en:Creative Commons"><span style="color: #3366bb;">Creative Commons</span></a> Attribution-Share Alike <a class="external text" href="http://creativecommons.org/licenses/by-sa/3.0/deed.en" rel="nofollow"><span style="color: #3366bb;">3.0 Unported</span></a></td></tr>
</tbody></table>
<br />
My tool allows you to move the paste on the image and see it update according to it's environment, so that it will paste seamlessly. It's not real-time yet, since I recompute some values that should be cached everytime, but most work to enable caching is done, and I hope to reach that before the final deadline. (Even if it won't be before the deadline, I will do it even after GSoC ends).<br />
<br />
This is also the time to thanks all the people who made this possible:<br />
<ul>
<li>The authors of the <a href="http://www.cs.huji.ac.il/~danix/mvclone/">Coordinates for Seamless Cloning article</a>, who developed this algorithm.</li>
<li><a href="http://www.cs.tau.ac.il/~dcor/">Prof. <strong>Daniel Cohen-Or</strong></a>, the professor who taught me computer graphics at the university, and helped me understanding the article (he is also one of the article authors).</li>
<li>My GSoC mentor, <strong>Michael Natterer</strong> (aka mitch), who agreed to mentor me and assisted me when I was stuck.</li>
<li><strong>Mason Green</strong>, the original author of the <a href="http://code.google.com/p/poly2tri/">poly2tri</a> library, which was heavily used in the project for computing interpolation meshes. I would have never reached the project deadline without his amazing library.</li>
<li><a href="http://www.cs.berkeley.edu/~jrs/">Prof. <strong>Jonathan Richard Shewchuk</strong></a>, who developed some of the geometrical algorithms that were used in this project.</li>
<li>Finally, <strong>special thanks to all the great guys on the GIMP and GEGL irc</strong> who helped a lot - mitch, Bat`O, pippin, Alexia_Death, Mikachu, and more.</li>
</ul>
LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com3tag:blogger.com,1999:blog-6878515242136045523.post-31367274513633050562011-08-07T03:37:00.005+03:002011-08-07T12:22:02.450+03:00Open Devhelp books installed in unusual locationsIf you are a GNOME developer, there are high chances you encountered this problem - you install your beta versions to a seperate prefix (something like <code>/opt/my-beta</code> instead of the regular <code>/usr</code>), and then when you come to browse their documentation in Devhelp, it fails to find them. Some will be tempted to sudo, and then symlink the documentation to <code>/usr/share/gtk-doc</code>. Personally, I'm not a fan of sudo-ing and messing around...<br />
<br />
Today I had enough of this, and decided I'm going to solve this. A quick search in the Devhelp source code found the code that searches for books. The <code><a href="http://git.gnome.org/browse/devhelp/tree/src/dh-book-manager.c?id=5cae21f96bcb4b3f6fde45c250bb886786abd042#n294">book_manager_add_books_in_data_dir ()</a></code> function searches <code>SOME_PREFIX/gtk-doc/html</code> for Devhelp books, and it's called from <code><a href="http://git.gnome.org/browse/devhelp/tree/src/dh-book-manager.c?id=5cae21f96bcb4b3f6fde45c250bb886786abd042#n309">dh_book_manager_populate ()</a></code> with the directories returned by <code><a href="http://developer.gnome.org/glib/2.28/glib-Miscellaneous-Utility-Functions.html#g-get-user-data-dir">g_get_user_data_dir ()</a></code> and by <code><a href="http://developer.gnome.org/glib/2.28/glib-Miscellaneous-Utility-Functions.html#g-get-system-data-dirs">g_get_system_data_dirs ()</a></code>.<br />
<br />
Thanks to some help from Mikachu (from #gimp irc), which matched the much longer description on the <a href="http://standards.freedesktop.org/basedir-spec/latest/">freedesktop basedir-specs</a>, I found out that appending a directory to the environment variable <code>$XDG_DATA_DIRS</code> is enough to make Devhelp search for documentation there.<br />
<br />
Sweet! That was much easier than I thought it would be :D<br />
<br />
So to summarize, this is what you do:<br />
<ol><li>Compile your program, while setting the installation prefix to some prefix <code>$PREFIX</code></li>
<li>Build and install it (make and make install)</li>
<li>Find your installed gtk-doc documentation. Usually it is located on <code>$PREFIX/share/gtk-doc/html/YOUR_PROGRAM</code>. Make sure that directory contains a file with the suffix of <code>.devhelp</code>.</li>
<li>Set the <code>$XDG_DATA_DIRS</code> environment variables, and <b><u>pre</u>pend</b> (don't append!) that directory (usually <code>$PREFIX/share</code>) to that variable. In bash syntax, you should type<br />
<code>export XDG_DATA_DIRS=$PREFIX/share/:$XDG_DATA_DIRS</code></li>
</ol><div>Why prepend and not append? Well, apparently Devhelp doesn't seem to like having two books with the same title, so it takes the first one it finds... Since it follows the directories in that environment variables by their order, it means that we should add our directory to the begining of the search path.<br />
<br />
Note that this method has 2 cons:</div><div><ol><li>You can't view previous versions of the documentation, since as I said Devhelp takes only the first version it finds</li>
<li>You must launch Devhelp with the above environment variable set. So either lunch it from your build console, or create a script to modify the variable and then lunch Devhelp. Note that IDEs that launch Devhelp (like anjuta, and gedit with plugins) must have the variable set for themselves (by launching them with the variable set already).</li>
</ol><div>So, it's not perfect. But way better that symlinking stuff into the <code>/usr/share/gtk-doc</code> directory. This also shows why open source is so good - "If you don't like it, fix it!". Or as I prefer to say "If you don't like it, hack it" :D</div></div>LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0tag:blogger.com,1999:blog-6878515242136045523.post-68729037146389315362011-08-01T06:33:00.001+03:002011-08-01T06:34:56.496+03:00QuickBox–A quick point-in-triangle test, and an example of how algorithm descriptions matter!<p>In this blog post I'm going to post something which is rather unrelated to my usual topics. I'm going to talk about how can minor changes in concept when coding, can have dramatic impact on your code performance. I also introduce a technique that I “developed myself” while coding the problem. When I say “developed myself”, I mean that I actually took time to code all the ways people describe the problem’s solution – although all seem very similar, the performance difference is huge. <p>While working on my GSoC project, I needed a fast predicate to check if a point is inside a polygon (specifically, a triangle). The test doesn't have to be accurate, but it must be sound in the sense that when it states a point is outside, then it must be outside. To do so, I decided to use bounding box testing - see if the point is in the bounding box of the polygon. Computing the bounding box of a group of points should be easy - just keep track of minimal and maximal X and Y and you should be done. So, how much can you screw it up? <p>Well, apparently, you can screw pretty damn hard. By coding without thinking, you can make this twice as inefficient without even noticing! Thinking before you code, to try and merge cases, can apparently be very productive. My solution will be referred to through this post as the QuickBox solution. <p style="font-size: large"><strong>Explanation</strong></p> <p>The QuickBox test uses an improved version of a common idea. The usual checks see if in a point, one of it's components is larger/smaller than the matching component in all of the triangle's points. The implementation here takes this one step further, under the assumption we are willing to say that a triangle made of 3 collinear points contains no point at all (not even it's own points). This is fair for most triangulation libraries, that simply don't accept such triangles. <p>The idea is like this: If all the points of the triangle have the same boolean result for testing order (using <=) against a component of the point (for all i, Pt[i].x <= P.x is the same) then the following cases are possible: <ul> <li>All have the same value of the component. But then all the points of the triangle are collinear so it's practically empty! <li>All triangles points have the component larger than the tested point. So the point is outside! </li></ul> <ul> <li>All triangles points have the component smaller than the tested point. So the point is outside! </li></ul> <p>Note that principle explained above is also applicable for polygons with more than 3 vertices. <p style="font-size: large"><strong>Implementation Analysis </strong> <p>Let the points of the triangle be A, B and C. Let P be the point we are testing. <p><strong>Naïve implementation</strong> <p>This is what people would usually do if they translate directly the description “See if all polygon points are on one side of the input point (check that for each side)” <p>Compute:</p><pre>((Ax <= Px) && (Bx <= Px) && (Cx <= Px)) ||<br>((Ax >= Px) && (Bx >= Px) && (Cx >= Px)) ||<br>((Ay <= Py) && (By <= Py) && (Cy <= Py)) ||<br>((Ay >= Py) && (By >= Py) && (Cy >= Py))</pre><br /><p><u>Total Cost:</u> 12 double boolean operations, 11 binary boolean operations </p><br /><p><strong>Border implementation</strong> <br /><p>This is what people would usually do if they translate directly the description “Find the the border on each side of the box, see if the point is beyond it”<pre> ABx ACx BCx<br />xMin := (Ax <= Bx) ? ((Ax <= Cx) ? Ax : Cx)) : ((Bx <= Cx) ? Bx : Cx))<br />yMin := (Ay <= By) ? ((Ay <= Cy) ? Ay : Cy)) : ((By <= Cy) ? By : Cy))<br /> ABy ACy BCy<br /><br />// OPTION 1 - Requires computing all of ABx, ACx, BCx, ABy, ACy, BCy<br />xMax := (! ABx) ? ((! ACx) ? Ax : Cx)) : ((! BCx) ? Bx : Cx))<br />yMax := (! ABy) ? ((! ACy) ? Ay : Cy)) : ((! BCy) ? By : Cy))<br /><br />// OPTION 2<br />xMax := (Ax >= Bx) ? ((Ax >= Cx) ? Ax : Cx)) : ((Bx >= Cx) ? Bx : Cx))<br />yMax := (Ay >= By) ? ((Ay >= Cy) ? Ay : Cy)) : ((By >= Cy) ? By : Cy))<br /><br />Compute: Px <= xMin || Px >= xMax || Py <= yMin || Py >= yMax</pre><br /><p>I'll assume that a trenary op is just one boolean operation and I will also ignore the need to save the values computed in the process such as ABx, etc. And even with that is still costs a lot!</p><br /><p><u>Total Cost:</u></p><br /><ul><br /><li>Option 1: 6+4 double boolean operations, 15 binary boolean operations. Actually, this method is rather inefficient, unless binary boolean operations are much much cheaper than double ones. <br /><li>Option 2: 8+4 double boolean operations, 11 binary boolean operations. <strong>Exactly the same as the naïve method!</strong></li></ul><br /><p>Note: separating the computation to one coordinate a time, can cut memory consumption by half.</p><br /><p><strong>QuickBox implementation, This is my method!</strong> <br /><p>This is what people would usually do if they translate directly the description - “See if the point is on the <u>same</u> side of all the polygon-points”<pre>xPBorder := Bx <= Px <br />yPBorder := By <= Py<br><br /><br>Compute: (((Ax <= Px) == xPBorder) && ((C->x <= Px) == xPBorder)) || <br /> (((Ay <= Py) == yPBorder) && ((C->y <= Py) == yPBorder))</pre><br /><p><u>Total Cost:</u> 6 double boolean operations (7 if we can’t save values (not 8! see below)), 7 binary boolean operations.</p><br /><p>Note that you can expand this to polygons of much more vertices, using the trick above to avoid repeating computations, while keeping with only 1 variables which is neat :) Work on one coordinate (component each time) and keep an accumulating variable that after it’s initialized with the first comparison, you just compare to it! When done with that coordinate, if indeed you found no proof that it’s outside, pass on to the next coordinate and repeat.</p><br /><p style="font-size: large"><strong>Conclusions</strong></p><br /><p>It’s pretty easy to see that the QuickBox method beats the hell out of the competition! Less memory, less computations, and all because we checked “all points are on the same side” and not “all points are on one side” (and checked that for each side). So, when someone tells you how to implement an algorithm, try to rephrase his sentence. It can be critical!</p><br /><p>Just some context about this post - I’m implementing a geometric algorithm that was given in 55 lines of pseudo code with ambiguous meanings. After passing 2500 lines of implementation (real C code), and after having to actually add many cases which were dealt with because the algorithm was phrased ambiguously enough with no hint to these cases, I started being very picky about how people describe their algorithms :P I spent 1.5 months of my GSoC on this, which is way more than I expected.</p><br /><p>So do us all a favor – if you know how something works, describe it <strong>exactly and clearly</strong>, so other people can implement it correctly and efficiently. <strong>It’s preferable to have 100 lines of code that are readable in 15 minutes, instead of 15 lines of pseudo code which are quickly read but take a 100 minutes to understand!</strong> (But don’t over-do it! Bombarding with details will make people like me fall asleep when they read your article…)</p><br /><p style="font-size: small">[Final note: I don’t have any criticism at the original article author – he did explain it so that people from the field would understand (and eventually, even I understood so it shows he did his job very well). I just came from a different field since this is a side dependency of my project, and not it’s main part… This simply made me aware of how much phrasing of an algorithm can change it’s implementation for people who don’t think exactly like you]</p> LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com1tag:blogger.com,1999:blog-6878515242136045523.post-4865586454356074082011-06-07T18:35:00.001+03:002011-06-07T19:22:56.300+03:00Rescuing data from my dead laptopUnfortunatly, my laptop's sort of "died" yesterday. The usual procedure in such cases is to rescue your data, and then send the laptop to a service laboratory. However, rescuing the data was a bit harder than I expected it be... I'm using a dell laptop with windows 7 x64, and here are the steps I took:<br />
<ol>
<li><a href="http://windows.microsoft.com/en-US/windows7/Create-a-system-repair-disc">Create a Windows 7 system repair disc</a> (using my brother's laptop)</li>
<li>Boot the laptop from the repair disc</li>
<li>Run Startup Repair - didn't help</li>
<li>Run Windows Memory Diagnostic - which produced the lovely warning:<br /><strong>Hardware problems were detected. To identify and repair these problems, you will need to contact the computer manufacturer.</strong></li>
<li>Complain about my crappy luck</li>
<li>Re-boot the laptop, and in the boot options menu choose the Diagnostics tool</li>
<li>After running the diagnostics, I got a more detailed error:<br /><strong>Error Code 0123<br />Msg: Error Code 2000-0123<br />Msg: Memory - integrity test failed</strong></li>
<li>Googling that error shows that it will require reinstalling/replacing of my (RAM?) memory</li>
</ol>
So, that wasn't so bad. The problem is now, how to get the data out? Here is where things became tricky:<br />
<ol>
<li>Boot the laptop from the repair disc</li>
<li>Connect a USB disk on key (8GB, FAT32 file-system)</li>
<li>Open the command prompt supplied in the repair disc and start copying files</li>
<li>After filling the Disc-On-Key each time, I emptied it on my brother's computer</li>
</ol>
And here it all goes wrong:<br />
<ol>
<li>Got an error of a file which is too large for the given file system. I had a 4.35 Gb file of a virtual machine hard disk (VDI file). The maximal file size for FAT32 file system is 4Gb-1b :P</li>
<li>Format the Disc-On-Key, and choose an NTFS file system</li>
<li>Copy the big file and continue happily :)</li>
<li>Got another error - <strong>file is too big</strong>. Got this for a 9Gb file which represents the hard disk of another virtual-machine.</li>
</ol>
Now, we have a problem. The largest USB storage device I had is 8Gb, and in this minimal windows recovery environment I don't have any tool to split files!<br />
<br />
After some thinking, I remembered that <a href="http://www.7-zip.org/">7zip</a> can create a split-zip, i.e. one zip that is split to several small chunks. Even better was the fact that 7zip has a command line portable version! So I quickly downloaded it, and went back to my dead laptop to try it. But, it didn't work... Apparently, in the repair disc, the files required to run 32 bit executables over 64 bit machines are simply not installed, and the command line version came only in 32 bit...<br />
<br />
After scratching my head, I went back to browse my homework folder from the operating-systems folder. I remebered that we wrote a splifile utility in C, which uses only windows commands (for example, CreateFile instead of fopen). But, my version of Visual Studio is the Express edition, and it didn't have the 64 bit compiler...<br />
<br />
So, I downloaded <a href="http://mingw-w64.sourceforge.net/">mingw64-w64</a> and went to compile my program. After some struggles with problems regarding unicode programs (solved <a href="http://sourceforge.net/apps/trac/mingw-w64/wiki/Unicode%20apps">here</a>), and some other problems, I finally managed to get it compile. I went to back to my repair-disc boot, and it worked!<br />
<br />
It took me several hours to solve all this, but I finally managed to do this. I don't have many complaints to microsoft or dell - the diagnostic tools were really easy to use and the repair disc booted without any problems. It's just too bad that the people at microsoft didn't think a split file utility is necessary when trying to rescue data... Overall, I began this procedure with great pesimisem, and I finished with a smile and no lost data :)<br />
<br />
Regarding my GSoC - this will prevent me from working several days this week, since it's still the last week of the semester, so I still can't sit in front of my desktop computer. I'll make up for the lost time later somehow.LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0tag:blogger.com,1999:blog-6878515242136045523.post-47385323822768345612011-06-05T23:34:00.002+03:002011-06-05T23:41:02.721+03:00[GSoC-2011] Bi-Weekly update #1Hi!<br />
<br />
After seeing enough student post of weekly updates, I decided that I should probably also give some progress report. I finished porting the <a href="http://code.google.com/p/poly2tri/">poly2tri</a> library to C! My C port can be found <a href="http://code.google.com/p/poly2tri-c/">here</a>.<br />
<br />
Just compiled it today with gcc and not g++, and it feels great to see it working. And when I say to see, I mean that I created an SVG output tester so that you can see it in any modern browser :D<br />
I still have some optimizations that can be done, including maybe some more documentation of the C api (especially for the constructor-destructor conversion from C++ to C), but it's usable enough for the GSoC as it is. Note that most API changes were simply from <span style="font-family: "Courier New", Courier, monospace;">p2t::SomeClass::GetFoo</span> to <span style="font-family: "Courier New", Courier, monospace;">p2t_someclass_get_foo</span> (where the object itself was added as a first parameter of the functions).<br />
It was in "almost C" state on wednesday, but then memory leaks happened (solved with valgrind) and some stupid compilation errors...<br />
<br />
At the weekend I went to a short vacation on the dead-sea (pictures soon!) and I had 4 people to discuss Chew's second algorithm (which I should implement next) with during the long ride to the hotel. So hopefully with their help it should be quick(er).<br />
<br />
That's all for today :)LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0tag:blogger.com,1999:blog-6878515242136045523.post-30471104023117808002011-05-27T12:45:00.003+03:002011-05-27T15:46:40.158+03:00The end is near, and so is the beginning<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg41lyfbgoZyBu8y1PxmKQ5O7VSTuR-xyvohyphenhyphenyzEAEVuw9v9oKYMXqU36TiAzkM3PtsrQaGBvNQ9dacC8UwNwK01cL-yWf02Upg1T7nXmDx-h4R1-v4Q9QoHbX1XxjY_q_kdIKpn0e35t5B/s1600/StudentDay2011.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg41lyfbgoZyBu8y1PxmKQ5O7VSTuR-xyvohyphenhyphenyzEAEVuw9v9oKYMXqU36TiAzkM3PtsrQaGBvNQ9dacC8UwNwK01cL-yWf02Upg1T7nXmDx-h4R1-v4Q9QoHbX1XxjY_q_kdIKpn0e35t5B/s1600/StudentDay2011.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Pictures from Yehuda Poliker's Concert on the<br />
Student-Day, and a picture of my GSoC kit. Cellphone<br />pictures, so low quality :P</td></tr>
</tbody></table>
There is a feeling of an end in the air. The end of university, another chapter in my life. Yesterday I took part in the Student Day party at our university - there were amazing concerts by fantastic artists, including <a href="http://en.wikipedia.org/wiki/Yehuda_Poliker">Yehuda Poliker</a>, <a href="http://en.wikipedia.org/wiki/Monica_Sex">Monica Sex</a>, <a href="http://en.wikipedia.org/wiki/Hadag_Nahash">Hadag Nachash</a> and more. The Student Day is a known symbol of the end of the year, which happens 2-3 weeks before the end of the semester. The fact that is practically my last year as a student (I will have one last course left for the next semester, but that doesn't really count) does start to get in, and I am gradually getting used to this.<br />
<br />
This week was also the official beginning of the Google Summer of Code coding period! After getting my cool GSoC kit (see the picture) 2 days ago I really felt that I'm a part of this great project - many thanks to google for organizing this! Anyway, I almost finished porting <a href="http://code.google.com/p/poly2tri/">poly2tri</a> to C. Once this is done, I can start coding my project. The milestones for my project are:<br />
<ol>
<li>Port poly2tri to C (from C++), a library for generating <a href="http://en.wikipedia.org/wiki/Constrained_Delaunay_triangulation">Constrained Delaunay triangulation</a>s for given polygons.</li>
<li>Implement <span id="goog_1313457497"></span><a href="http://en.wikipedia.org/wiki/Chew's_second_algorithm">Chew's Second Algorithm</a> to create adaptive meshes from CDT's*</li>
<li>Implement code to create polygons from Black/White (1-bit) channels (The edges where the color differs should be described by polygons)*</li>
<li>Combine all these to create an adaptive mesh from a Black/White channel (which symbolizes a selection area)</li>
<li>Create a triangle mesh renderer with color interpolation between vertices (actually, Cairo may be able to do this!)*</li>
<li>Implement the Mean-Value-Coordinate cloning, using these above, as a GEGL operation*</li>
<li>Add some GUI and put it as a GIMP tool</li>
</ol>
Marked with * are the steps that would require the actual work, most other steps should hopefully be trivial. But again, hopes and reallity don't necessarily agree :) When I applied for this GSoC I knew there was code to do adaptive mesh generation from polygon outlines. It's only too bad that none of the code to do this is small and in a GPL compatiable license :(<br />
<br />I hope to finish everything untill step 4 (and parts of 5 if I'll be able to use Cairo) untill the midterm, but I can't really set the midterm goals yet since I haven't started to seriously code yet because there is still a university semester going on for the next week or two.<br />
<br />To all students out there, good luck in the exam period! And for the GSoC students, good luck with the projects! :DLightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0tag:blogger.com,1999:blog-6878515242136045523.post-9160700574916629232011-04-26T02:27:00.003+03:002011-05-26T10:36:54.905+03:00I’m doing a Google Summer of Code!<p>My application for a Google Summer of Code project for GIMP was accepted! =D<br>After being around the development team for a year or so (and hanging around the IRC even more), and after I couldn’t apply last year for technical reasons, this year I will get my chance.</p> <p>Here is the initial description of the project, taken from my <a href="http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001" target="_blank">project page</a>:</p> <blockquote> <p>The project I intend to implement is something called Adaptive Cloning (aka Seamless cloning). Basically, the idea is that cloning parts from one image to another usually does not end well. This is because of different exposure/white-balance settings, or simply because of different lighting conditions.</p> <p>The idea is to implement an algorithm which would allow to copy a part from one image, and paste it seamlessly into the other; the pasted area will be blended to fit the destination image locally. There are several techniques to do that, and the most known one is called poisson image cloning. The problem with most of these algorithms is that they are expensive (computation-wise) and are not suitable for interactive editing and previewing, unless you use hardware acceleration.</p> <p>The suggested technique for my project is based on <a title="Coordinates for Instant Image Cloning" href="http://www.cs.huji.ac.il/~danix/mvclone/" target="_blank">an article from Siggraph 2009</a> (includes demos and videos), which shows realtime performance (both on the GPU and the CPU*). The user would paste a some area from the clipboard and will then be able to "blend it in" according to it's environment.</p> <p>I'm open for any suggestions regarding usability, ui integration, or anything which relates to the project. Feedback will be more than welcome!</p> <p><em>* Note that I'm not sure for which sizes on the CPU it preforms on realtime, but it's still much more cheap computation-wise than most other techniques and a small lag of few seconds is something which should be acceptable for this sort of workflow.</em></p></blockquote> <p>GIMP has 5 projects for this GSoC – if all these projects succeed, GIMP will gain a major boost in it’s capabilities. This year’s projects are:</p> <ul> <li><a href="http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001" target="_blank">Adaptive Cloning (aka Seamless cloning)</a> <ul> <li>Student: Barak Itkin (IRC nick: LightningIsMyName) <li>Mentor: Michael Natterer (IRC nick: mitch)</li></ul> <li><a href="http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001" target="_blank">Replace GimpSizeEntry widget</a> <ul> <li>Student: Enrico Schröder (IRC nick: enrico(?)) <li>Mentor: Martin Nordholts (IRC nick: Enselic)</li></ul> <li><a href="http://www.google-melange.com/gsoc/project/google/gsoc2011/michael_mure/5001" target="_blank">iWarp like tool for Gimp</a> <ul> <li>Student: Michael Muré (IRC nick: Bat`O) – the same guy who did the GSoC of the cage tool last year! <li>Mentor: Alexia Death (IRC nick: Alexia_Death)</li></ul> <li><a href="http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001" target="_blank">Porting GIMP plugins to GEGL operations</a> <ul> <li>Student: Robert Sasu (IRC nick: robert) <li>Mentor: Mukund Sivaraman (IRC nick: muks)</li></ul> <li><a href="http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001" target="_blank">OpenCL in GEGL</a> <ul> <li>Student: Victor Oliveira (IRC nick: victorm) <li>Mentor: João S. O. Bueno (IRC nick: gwidion)</li></ul></li></ul> <p>I would also like to congratulate Blender (formally, The Blender Foundation) for <strong>an astonishing amount of 17 GSoC projects!</strong> If there is any project who can do anything with 17 students, it’s Blender. Congrats also for Inkscape for 4 GSoC projects.</p> <p>Good luck to my fellow GSoC students, especially the GIMP (and Blender) students. I hope I will finish my project – I already learned from Bat`O last year that it is feasible to code something like this ;)</p> <p>The list of all accepted projects for all organizations for this year’s GSoC can be found <a href="http://www.google-melange.com/gsoc/projects/list/google/gsoc2011" target="_blank">here</a>.</p> <p><strong><font size="+1">Small Help Wanted</font></strong></p> <p>I searched without success for a small GPL compatible library for generating quality triangular meshes (<a href="http://upload.wikimedia.org/wikipedia/commons/6/6c/LakeMichiganMesh.png" target="_blank">example</a>) from a given outline (probably a quality <a href="http://en.wikipedia.org/wiki/Constrained_Delaunay_triangulation">constrained Delaunay triangulations</a> / conforming Delaunay triangulation) - I need this for my project. I haven’t found any library that is both small and GPL compatible. If anyone knows any such library, please tell me - it will save me lots of work and guarantee less bugs in the final result. </p> <p><strong>Edit:</strong> It seems as if <a href="http://code.google.com/p/poly2tri/">poly2tri</a> may do the job of creating a CDT (Constrained Delaunay Triangulation), and on that I can apply <a href="http://en.wikipedia.org/wiki/Chew%27s_second_algorithm">Chew's second algorithm</a>. This is not optimal, but it is feasible since creating the CDT was probably the hard pard. If anyone finds something better, I will still be glad to knkow!</p>LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com1tag:blogger.com,1999:blog-6878515242136045523.post-46907015833728866592011-04-17T14:47:00.001+03:002011-04-17T14:47:32.631+03:00Safe programming - Are universities doing it wrong?<p>In the last 2 week I was unavailable because I had a “monstrous exercise” from university. Everyone indeed complained it was huge, but when other people saw the size of my code (2000 lines) they were shocked – this was because my code was about twice larger than the one of other people. It’s not that I suck at programming, and it’s not that I re-invented the wheel or anything like it. It was simply that my code was safe, where the code of most other people I saw wasn’t because we didn’t have to make it safe.</p> <p>The assignment was to build servers and clients for a <a href="http://en.wikipedia.org/wiki/Nim" target="_blank">Nim</a> game with several players (instead of just 2 like the original version) along with a build-in chat. What was supposed to be the point of the exercise was to make the server non-blocking, i.e. to use <a href="http://linux.die.net/man/2/select" target="_blank">select()</a> with only one thread. For example, this means that if we temporarily can’t read data from one client, we will still check if we can send him data or communicate with other clients. But let’s leave that technical part, since the thing that actually made the code complex was the other “minor” things.</p> <p><strong><u>Note:</u> I have no criticism at all at the course staff of this specific course</strong>, It was simply an example of a university policy.</p> <p>In general, when programming academic tasks, and especially when it’s in C, unless it is a course in security or some other special cases, you are allowed to assume the following assumptions:</p> <ul> <li>Input from the user is valid (Less often than the rest of the assumptions, but still common)</li> <li>We won’t run out of memory (in C, <a href="http://linux.die.net/man/3/malloc" target="_blank">malloc()</a> won’t fail)</li> <li>Data received over the network is in the format we expected</li> <li>No one will try to brake our system maliciously</li></ul> <p>Now, let’s analyze in how many places we can attack the server/client from our exercise:</p> <ul> <li>Entering a wrong move to win the game</li> <ul> <li>Example: Enter “A -5” instead of “A 5” to add 5 cubes to a stack instead of deducing (which is what that should happen)</li> <li>Potential Result: Win the game by cheating</li></ul> <li>Sending large chat messages to attack client/server</li> <ul> <li>Example: The protocol requests to send the size of the message to be read over the network. Most people used a short (16 bits) variable for that = meaning 65Kb message sizes are legal!</li> <li>Potential results:</li> <ul> <li>Buffer Overflows<br>Most people allocated a static buffer of size 1024 bytes (1Kb) for receiving messages since someone asked if 1024 is a valid assumption on input length. Reading 65Kb to a one Kb buffer will crash our program or lead to execution of arbitrary code.</li> <li>Wasting resources<br>Allocating 65Kb for each client (to read chat message progressively until receiving them is done) is a lot of memory</li></ul></ul> <li>Abuse the lack of timeouts on clients</li> <ul> <li>Example: Connect with many clients, and do nothing after the connection was initialized.</li> <li>Result: Can DDoS the system very easily, after finishing the maximal available number of connections, or waste all the resources if no such limit is set.</li></ul> <li>Send messages over the network in invalid format (can happen if client/server are broken)</li> <ul> <li>Example: Send random binary junk</li> <li>Result: see server crash or behave strangely</li></ul> <li>More…</li></ul> <p>Out of the above problems, I tried to take care off most of these problems, and I believe my partner and I took care of 90% of these cases. This is where we made our life harder – <strong>we didn’t have to handle any of these!</strong></p> <p>Now, obviously there were no requirements to handle these cases. <strong>This was done in order to allow students to focus on the subject of the task</strong> – non blocking network communication. And that is indeed something which should be done – otherwise you’d spend most of the time of the exercise (like me) on things which are barely relevant to the current subject.</p> <p>So, after stating that we must take these assumptions, why am I writing this post? Because <strong>there is not even a single course in security and/or secure programming which is mandatory!</strong> Or at least this is how it is in my university (and I’m in a relatively respectable one). This means that a student can finish his entire degree without taking care of these problems even once! The implications of this can be devastating – if we code like we did in university, in the outside world, our programs will have more security holes in them that Swiss cheese!</p> <p>Three weeks ago, I had to give a lecture (in a seminar) about common programming mistakes that make software unsecure. At first I thought most of the mistakes I was going to discuss were ridiculous, but then I saw them pile up in more and more “respectable” places – both in commercial companies (Apple, Microsoft, …) and open-source organizations. And like other programmers, I also do these even though I hate to admit it.</p> <p>So, what can Universities do about it?</p> <ul> <li>Changing the requirements of all exercises to be secure</li> <ul> <li>Bad solution! The amount of work will make all students crash as if someone was DDoSing them :P</li></ul> <li>Mention the risk of each assumption inside each exercise description</li> <ul> <li>Good!</li></ul> <li>Add mandatory courses/lessons in application security and/or safe programming</li> <ul> <li>Better!</li></ul> <li>Instead of a one time experience during your studies (one mandatory course/lesson), have one task that should be safe in each course (where applicable)</li> <ul> <li>Best!</li></ul></ul> <p>And what can we do about it?</p> <ul> <li>Try to show people we know were their code is dangerous, and increase their awareness.</li> <ul> <li>If possible, try to attack their code and show them the actual risks! (because I heard enough people saying “The risk is only theoretical – nothing will happen”)</li></ul> <li>If you are a student, show this to the professors in the department of application security to make them tell the university to change it.</li> <ul> <li>Some of them weren’t aware of the fact the state is so bad, and when they heard they started working to integrate the solutions mentioned above</li> <li>But this is less likely to work…</li></ul> <li>Make our own code safe!</li></ul> <p>That’s all for today. Spread the awareness about security, and if you (as a student/programmer) found this post helpful, please let me know.</p> <p>One last thing – I applied to GSoC (before the deadline), I’ll post my application later :)</p> LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com1tag:blogger.com,1999:blog-6878515242136045523.post-4777456709458936872011-04-08T15:40:00.001+03:002011-04-08T15:40:35.820+03:00Powerful experience<p>Today at 6:40 am, near the <a href="http://en.wikipedia.org/wiki/Jaffa">Jaffa</a> (יפו) clock tower, I began to walk. As I moved towards the <a href="http://en.wikipedia.org/wiki/Charles_Clore_Park">Charles Clore park</a> (גן צ’רלס קלור), people started to pour in from the near-by streets and slowly the stream of people grew to hundreds of people. The sky was low in the sky, hidden by large thin clouds, and rays of light blazed the sky through the clouds. When I finally reached the park, there were already thousands of people waiting.</p> <p>At 7:00 am, I started moving towards the start line, along with many other people. Some ran bit, others stretched, and everyone were preparing. At 7:10 am, we were allowed to enter the gathering area before the start line. Gradually the area was filled, with 5,000 people, and it became pretty crowded. While we were waiting, some electronic music was played in gigantic speakers to get us all pimped up with energy. It drizzled a bit, and after 2 minutes it stopped.</p> <p>At 7:25, a pistol shot into the air, signaling the beginning of the Tel-Aviv Marathon (מרתון תל-אביב) Urban Run Race - A quarter of a Marathon (10 Kilometers) race for people from all ages. Inside the huge “body” of participants, I started to move slowly towards the start line, and when I crossed it I began to run.</p> <p>After several hundred meters, when the speakers were far behind us, there was a magical moment. It was silent, and the only noise that broke the silence was the soft pound of thousands of shows on the road. It was surprisingly silent, I thought that it would be much noisier.</p> <p>After the first few kilometers, in which we went through a sleeping City, we saw people on the sides. Some of them simply stared, some have prepared in advance and stood with cameras and tripods, and some cheered the giant cloud of runners. Many of the cops who blocked the near-by streets were smiling at us, as if signaling us to go on. The city gradually came into life, shaking of the sleepiness that held it previously.</p> <p>When we reached the middle of the race, we reached the first water stop. Many people holding bottles of waters waited for the runners to take & go, some were from the event staff, but some were certainly volunteers (they didn’t wear uniform). They all cheered and gave us motivation to continue. One thing that really made me smile, was one person who set-up a table on his own and gave water to the runners several hundreds of meters later. Every 2-3 kilometers there was a DJ/band playing music to keep us going.</p> <p>Finally, when reaching the final 2 kilometers, we ran near the beach where we saw the deep blue ocean. At that spot, many people already gathered to cheer, photograph and play us music. It was a down-hill part, and everybody accelerated (knowingly or not) towards the finish line which was already in the horizon. On the right, we were passed by people participating in the <a href="http://en.wikipedia.org/wiki/Handcycle">Handcycle</a> race that also took place as part of the event.</p> <p>Hundred meters before the finish line, we already heard the gigantic speakers from the initial gathering area. Then came the urge to sprint forwards, to finish it as fast as you can, proving yourself you can do it.</p> <p>It was the first time I participated in a race, and the feeling was fantastic. For me, like most other people, it was not a competition, but simply a chance to prove yourself that you can do it. So I proved myself I can do it, and I broke my own record and set it to 49 minutes and 20 seconds (previously, I did 9 kilometers in 51 minutes). More important than the record, was the participation, and prooving to myself I can do this and in a good time.</p> <p>I think that one of the things that made this race an important experience for me, was the huge range of participants – ages 16 and up, were many of the people where in their 20’s-40’s (so I was relatively young – only 63 people including me where in the category of 16-19). There were people who ran in pairs or small groups, others ran in teams (including army teams), and some wore shirts in memory of people.</p> <p>One thing that really touched me, was people who wore shirts in memorial of Shneior Cheshin (שניאור חשין). He was an athlete who trained for the <a href="http://en.wikipedia.org/wiki/Ironman_Triathlon">Ironman Triathlon</a> earlier this year, and was ran over by a drunk/drugged driver. That driver left him there to die, and made many excuses for that later when he was caught. It was a very tragic event which symbolized how careless are some people when it comes to driving responsibly and when it comes to ignoring injured people unless you know them.</p> <p>Another thing which wasn’t possible to ignore, were “very big” people that decided that they need a change. I saw 2 like these, that made every possible effort to run, even if slowly. Even if it’s a bit late, I must admit it was impressive to see people who decided to change their life-style and participated in this race. I don’t know these people, but I wish them lots of luck.</p> <p>Many thanks to the person who made me start running last august. They always say you need some motivator to start, and once you are in it it’s easier. She made me start (without knowing she did), and I owe her more thanks than I can describe in this post. Last year I was simply not in-shape, and I barely did 2-3 kilometers. In the last few months I took it seriously and improved to 10 kilometers.</p> <p>Hopefully I’ll see you next year, On March 30 2012. I’ll do the half-marathon track (or if I’ll have <em>enough</em> luck, I’ll do the entire marathon)<br>Have a happy weekend :)</p> LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0tag:blogger.com,1999:blog-6878515242136045523.post-60384651625939897172011-03-18T21:12:00.001+02:002011-03-18T21:14:42.132+02:00GIMP was accepted to GSoC 2011GIMP was accepted to Google Summer of Code 2011!<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqCHAuQ8NxiesL6FuBUO_72XFhNN6tOpzVjmRO2dIjs7mYStSRiCj29B3l-iE3odco_6yEd35nGOx58OvpA-0KJbLmviDbnLJfq3cFwlKWWL3wHTj4RTcKjQTot_yLw4dCKm2RVYJGgEVA/s1600/GSoC_gimp_2011.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="274" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqCHAuQ8NxiesL6FuBUO_72XFhNN6tOpzVjmRO2dIjs7mYStSRiCj29B3l-iE3odco_6yEd35nGOx58OvpA-0KJbLmviDbnLJfq3cFwlKWWL3wHTj4RTcKjQTot_yLw4dCKm2RVYJGgEVA/s320/GSoC_gimp_2011.png" /></a></div><br />
Congrats also for Inkscape, Blender, Scribus for making it to GSoC 2011! For the full list of projects, see <a href="http://www.google-melange.com/gsoc/program/accepted_orgs/google/gsoc2011">GSoC 2011 participating projects</a>.LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0tag:blogger.com,1999:blog-6878515242136045523.post-11759456467047529382011-03-01T00:59:00.002+02:002011-03-02T20:48:22.055+02:00First GIMP Developer Meeting - A success!I worked hard to arrange it, but it paid off - We had a serious gimp developer meeting, with most developers attending it :)<br />
<br />
Thee meeting page, including the agenda and log can be found at:<br />
<a href="http://gimp-wiki.who.ee/index.php/Hacking:Dev_Meeting_28_Feb_2011">http://gimp-wiki.who.ee/index.php/Hacking:Dev_Meeting_28_Feb_2011</a><br />
<br />
Some of the decided actions in the meeting:<br />
<ol><li><b>schumaml and LightningIsMyName fix wgo?</b><br />
wgo is a shortcut for the GIMP main website - we need it to have auto-updates again</li>
<li><b>Alexia and mitch take care of redirecting wiki.gimp.org</b><br />
We need to make the domain point back at a working wiki, the original one died of spam and Alexia Death has a new working one <a href="http://gimp-wiki.who.ee/index.php/">here</a></li>
<li><b>Enselic makes a draft of a GIMP roadmap and sends to gimp-developer</b><br />
Let's get some priorities!</li>
<li><b>everybody subscribe to bug mail and TRIAGE BUGS</b><br />
We get toooooo many bug reports, we need to start filtering them</li>
<li><b>mitch, make a development release soon</b><br />
Yes - that's right! GIMP 2.7.2! Now we just need to define soon :P</li>
<li><b>LightningIsMyName takes care of next meeting</b><br />
Hehe. I'll do that with pleasure :)</li>
<li><b>setting pages on the wiki to discuss changes in different topics</b><br />
Too many changes are done solo and may not be agreed upon by everyone - this is because of lack of places to show plans</li>
<li><b>LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday (March 5th, 2011) is hard dead line for finalizing the project list!</b>We want to get to GSoC, so we must have a list of projects ASAP! I'm going to work on this and try to get this done tomorrow night</li>
<li><b>all devs PM/Email LightningIsMyName username and email</b><br />
Yeah, so if you are a GIMP dev and you don't have an account for the wiki yet, tell me!</li>
</ol><br />
<b>Next meeting:</b> March 14 2011 10:00 PM CET (GMT+1)<br />
<br />
If you want to influence GIMP development, and/or contribute, come and attend the next meeting. Just note that the agenda will be decided by email several days ahead, on the developer mailing list - so submit your ideas there. You can also jump to irc://irc.gimp.org/#gimp and people will help you there if you want to help the GIMP project.LightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0tag:blogger.com,1999:blog-6878515242136045523.post-30210457505633255722011-02-28T11:48:00.000+02:002011-02-28T11:48:02.895+02:00GIMP Developer MeetingToday (February 28th, 2011), at <a href="http://www.timeanddate.com/worldclock/fixedtime.html?month=2&day=28&year=2011&hour=22&min=0&sec=0&p1=48">10pm CET</a> a meeting of GIMP developers is scheduled on the GIMP developer IRC.<br />
<br />
Agenda:<br />
<ul><li>GSoC 2011 - ORG Application deadline is in 11 days!</li>
<li>Bug fixing priorities</li>
<li>Future development?</li>
<li>Make an official wiki working again (i.e. make wiki.gimp.org pointing at it)! Can be done either by making http://gimp-wiki.who.ee/ the official wiki, or potentially using some other available servers (will be discussed in depth on the meeting)</li>
<li>Make a roadmap on the official wiki</li>
<li>Try and decide on clear release policy for beta builds - I personally would like to see more recent beta releases, and the last one was 7 months ago!</li>
<li>Anything else? =)</li>
</ul>If you want to discuss GIMP's future, GSoC this year, and just listen, please come. We will meet on irc://irc.gimp.org/#gimp (Users without IRC client can connect using <a href="http://mibbit.com/?channel=%23gimp&server=irc.gimp.org">this link</a>).<br />
<br />
<b>Edit:</b> The wrong time was displayed - it's february 28th, not the 27thLightningIsMyNamehttp://www.blogger.com/profile/12478732800540872551noreply@blogger.com0