<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>No, I am better than that! &#187; batik</title>
	<atom:link href="http://rickosborne.org/blog/tag/batik/feed/" rel="self" type="application/rss+xml" />
	<link>http://rickosborne.org/blog</link>
	<description>Striving to subdue the mediocrity.</description>
	<lastBuildDate>Sun, 21 Aug 2011 23:27:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Generating scalable, stretchy, and smart graphics with ColdFusion &#8211; Part 4</title>
		<link>http://rickosborne.org/blog/2008/01/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-4/</link>
		<comments>http://rickosborne.org/blog/2008/01/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-4/#comments</comments>
		<pubDate>Thu, 31 Jan 2008 13:00:12 +0000</pubDate>
		<dc:creator>Rick Osborne</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[batik]]></category>
		<category><![CDATA[svg]]></category>
		<guid isPermaLink="false">http://rickosborne.org/blog/index.php/2008/01/31/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-4/</guid>
		<description><![CDATA[In yesterday&#8217;s post, we built a renderer for our SVG files. That&#8217;s all fine and good, but there&#8217;s not much point to having a renderer for static files. What we really want to do is render dynamic files, where the data inside the file is manipulated somehow by ColdFusion. Of course, this is a pretty [...]]]></description>
			<content:encoded><![CDATA[<p>In yesterday&#8217;s post, we built a renderer for our SVG files.  That&#8217;s all fine and good, but there&#8217;s not much point to having a renderer for static files.  What we really want to do is render dynamic files, where the data inside the file is manipulated somehow by ColdFusion.  Of course, this is a pretty nebulous request, as your data manipulation needs are only limited by your imagination.  But for today, I&#8217;ll be going through a few things that I&#8217;ve needed to do.</p>
<p>To do all of this, we&#8217;re going to build what I&#8217;ve called an &ldquo;SVGmunger&rdquo;.  At its heart, it&#8217;s straightforward:</p>
<ol>
<li>
<p>Load an SVG template file.</p>
</li>
<li>
<p>Iterate through a series of modifications to the XML document.</p>
</li>
<li>
<p>Save your changes to a new file.</p>
</li>
</ol>
<p>My SVGmunger has gotten more complex as I&#8217;ve used it in more applications, but there are a few core functions: <kbd>load</kbd>, <kbd>saveAs</kbd>, <kbd>setText</kbd>, <kbd>setAttribute</kbd>.</p>
<p>The <kbd>load</kbd> function is exactly what you would expect it to be, as is the <kbd>saveAs</kbd> function:</p>
<pre class="coldfusion">&lt;cffunction name="load" access="public" output="false"&gt;
  &lt;cfargument name="Filename" type="string" required="true"&gt;
  &lt;cfset var FileContent=""&gt;
  &lt;cffile action="read" variable="FileContent" file="#Arguments.Filename#"&gt;
  &lt;cfset Variables.XML=XMLParse(FileContent)&gt;
  &lt;cfset Variables.Filename=Arguments.Filename&gt;
&lt;/cffunction&gt;
&lt;cffunction name="SaveAs" access="public" output="false"&gt;
  &lt;cfargument name="Filename" type="string" required="true"&gt;
  &lt;cfset var XmlAsString=Replace(ToString(Variables.XML),"UTF-8","ISO-8859-1","ONE")&gt;
  &lt;cffile action="write" output="#XmlAsString#" file="#Arguments.FileName#" charset="iso-8859-1"&gt;
&lt;/cffunction&gt;</pre>
<p>You&#8217;ll notice that there&#8217;s a little extra magic in the <kbd>saveAs</kbd> function having to do with character encoding.  CF and Batik don&#8217;t quite see eye-to-eye on XML character encoding, especially not when you start adding international characters into the mix.  Beyond that, there&#8217;s nothing outrageous, right?</p>
<p>Now that we can load and save our SVG file, we need to be able to make changes to it, which is where our <kbd>setText</kbd> and <kbd>setAttribute</kbd> functions come in handy.  The first, <kbd>setText</kbd>, replaces the text part of an element (between the tags), while the second, <kbd>setAttribute</kbd>, replaces the content of a single attribute.  If you think about it, these are the two primary operations you&#8217;ll be needing.  If you want to change some of the text in a graphic, such as to put in a person&#8217;s name, you&#8217;ll be changing an element&#8217;s text.  If you want to modify the look of a graphic, such as to change a color or transform a layer, you&#8217;ll be changing an element&#8217;s attributes.</p>
<p>Sure, you could do both of those by hand in code, but why?</p>
<pre class="coldfusion">&lt;cffunction name="setText" access="public" output="false"&gt;
  &lt;cfargument name="id" type="string" required="true"&gt;
  &lt;cfargument name="NewText" type="string" required="false"&gt;
  &lt;cfset var el=XmlSearch(Variables.XML,"/descendant::*[attribute::id='#Arguments.id#']")&gt;
  &lt;cfset var i=0&gt;
  &lt;cfif Arguments.NewText EQ ""&gt;&lt;cfset Arguments.NewText=" "&gt;&lt;/cfif&gt;
  &lt;cfloop from="1" to="#ArrayLen(el)#" index="i"&gt;
    &lt;cfset el[i].XmlText=Arguments.NewText&gt;
    &lt;cfset ArrayClear(el[i].XmlChildren)&gt;
  &lt;/cfloop&gt;
&lt;/cffunction&gt;</pre>
<p>First, we use <kbd>XmlSearch</kbd> to pick out the element we&#8217;re looking for.  Second, we do a bit of cleanup on the <kbd>NewText</kbd> argument&mdash;setting it to a single space means that the XML handler won&#8217;t collapse the tag, which we may not want to happen.  (You are welcome to take out that line if it doesn&#8217;t suit your needs.)  I&#8217;ve managed, via dumb copy-n-paste, to have more than one element with the same ID, so I use a loop to get all of them instead of just a single <kbd>cfset</kbd> statement.  Within the loop we set the new text, then we clear out any child elements.  Again, if you don&#8217;t need to clear out any child elements then you can eliminate that line.</p>
<p>As you can imagine, <kbd>setAttribute</kbd> is the same thing:</p>
<pre class="coldfusion">&lt;cffunction name="setAttribute" access="public" output="false"&gt;
  &lt;cfargument name="id" type="string" required="true"&gt;
  &lt;cfargument name="AttributeName" type="string" required="true"&gt;
  &lt;cfargument name="NewContent" type="string" required="true"&gt;
  &lt;cfset var el=XmlSearch(Variables.XML,"/descendant::*[attribute::id='#Arguments.id#']")&gt;
  &lt;cfset var i=0&gt;
  &lt;cfloop from="1" to="#ArrayLen(el)#" index="i"&gt;
    &lt;cfset el[i].XmlAttributes[Arguments.AttributeName]=Arguments.NewContent&gt;
  &lt;/cfloop&gt;
&lt;/cffunction&gt;</pre>
<p>The only thing different from <kbd>setText</kbd> is what we do in the loop&mdash;this time we set the attribute to the new value, and don&#8217;t have to worry about mucking around with child elements.</p>
<p>You&#8217;ve probably noticed that both of my functions depend on knowing the ID of the element you want to modify.  You could, of course, write functions that operate on XPath instructions instead of IDs.  But, really, why not just take a moment and add some IDs to the SVG file?  It&#8217;ll certainly make your code, and the SVG file, easier to read.</p>
<p>Congratulations, you can now muck about in your SVG internals without having to write a bunch of nasty code:</p>
<pre class="coldfusion">&lt;cfset svg=createObject("component","SVGMunger")&gt;
&lt;cfset svg.load("template.svg")&gt;
&lt;cfset svg.setText("message", "Rick O was here!")&gt;
&lt;cfset svg.setAttribute("message", "style", "fill-color: red;")&gt;
&lt;cfset svg.saveAs("ricko.svg")&gt;
&lt;cfset rend=createObject("component","SVGRenderer")&gt;
&lt;cfset rend.RenderFile("ricko.svg", "ricko.png")&gt;</pre>
<p>Once you have these basics, you&#8217;ll quickly find that you want more.  I&#8217;ve got a function that takes a query full of modifications and iterates through it, making each modification in turn.  This is great for the progress graphs on NoWrists.com, as I can make a bunch of extensive changes to a template without having to write much code.  You might prefer a function that takes a list or array or another XML document or whatever.</p>
<p>As you really start getting into it, you might find yourself in a position when you want to do more than just modifying a template.  In my running graphs, for example, I have a series of mile markers.  Logically, I should have just one &ldquo;Marker&rdquo; element/layer in my SVG template, then I can clone that element/layer any number of times to create as many markers as I need.  However, I know that I&#8217;m not going to run an infinite number of miles, so it was just as easy for me to have 20 markers in my template, then only show and move the ones I need.  It&#8217;s cheating, sure, I admit it.  If you want to make more sophisticated functions for your <kbd>SVGmunger</kbd>, you go right ahead.</p>
<p>In the next post I&#8217;ll go through and make some eye-candy to show off some of the things we can now do with our new <kbd>SVGmunger</kbd> and <kbd>SVGrenderer</kbd> components.</p>
]]></content:encoded>
			<wfw:commentRss>http://rickosborne.org/blog/2008/01/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-4/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Generating scalable, stretchy, and smart graphics with ColdFusion &#8211; Part 2</title>
		<link>http://rickosborne.org/blog/2008/01/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-2/</link>
		<comments>http://rickosborne.org/blog/2008/01/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-2/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 13:00:01 +0000</pubDate>
		<dc:creator>Rick Osborne</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[batik]]></category>
		<category><![CDATA[svg]]></category>
		<guid isPermaLink="false">http://rickosborne.org/blog/index.php/2008/01/29/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-2/</guid>
		<description><![CDATA[This post will be a really basic intro to SVG graphics&#8212;how they are structured, and how you can generate and manipulate them, primarily with ColdFusion. But you don&#8217;t have to wade through my prose, you are welcome to skip straight to the SVG Spec by W3. Let&#8217;s start with a really basic SVG image. The [...]]]></description>
			<content:encoded><![CDATA[<p>This post will be a really basic intro to SVG graphics&mdash;how they are structured, and how you can generate and manipulate them, primarily with ColdFusion.  But you don&#8217;t have to wade through my prose, you are welcome to skip straight to the <a href="http://www.w3.org/Graphics/SVG/">SVG Spec by W3</a>.</p>
<p>Let&#8217;s start with a really basic SVG image.  The image below is a PNG rendered from the SVG, but if you click through you can see the source file.  Depending on your browser&#8217;s support for SVG (almost every browser other then IE supports SVG natively), you might see the raw XML or a rendering of the graphic.</p>
<p align="center"><a href="/images/vector-web20-hand.xml"><img src="/images/vector-web20.png" width="500" height="64" border="0" alt="Vector images are so Web2.0"/></a></p>
<p>SVG source files are XML before they get rendered into GIF, JPEG, or PNG formats.  The source for this graphic is straightforward:</p>
<pre class="xml">&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt;
&lt;svg version="1.2" width="500" height="64" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"&gt;
  &lt;defs&gt;
    &lt;linearGradient id="Fade"&gt;
      &lt;stop style="stop-color: #000000; stop-opacity: 1;" offset="0"/&gt;
      &lt;stop style="stop-color: #000000; stop-opacity: 0;" offset="1"/&gt;
    &lt;/linearGradient&gt;
    &lt;linearGradient id="Tropical"&gt;
      &lt;stop style="stop-color: #ff0000; stop-opacity: 1;" offset="0"/&gt;
      &lt;stop style="stop-color: #ff9900; stop-opacity: 1;" offset="0.33"/&gt;
      &lt;stop style="stop-color: #ffcc00; stop-opacity: 1;" offset="0.5"/&gt;
      &lt;stop style="stop-color: #ff9900; stop-opacity: 1;" offset="0.66"/&gt;
      &lt;stop style="stop-color: #ff0000; stop-opacity: 1;" offset="1"/&gt;
    &lt;/linearGradient&gt;
    &lt;linearGradient xlink:href="#Tropical" id="TropicalGrad" gradientUnits="userSpaceOnUse" x1="230" y1="4" x2="230" y2="20"/&gt;
    &lt;linearGradient xlink:href="#Tropical" id="StarGrad" gradientUnits="userSpaceOnUse" x1="466" y1="0" x2="492" y2="28"/&gt;
    &lt;linearGradient xlink:href="#Fade" id="FadeGrad" x1="0" y1="54" x2="0" y2="14" gradientUnits="userSpaceOnUse"/&gt;
  &lt;/defs&gt;
  &lt;rect x="0" y="0" width="500" height="64" style="fill: #000000;"/&gt;
  &lt;g id="TopHalf" style="font-family: Arial Black; font-size: 26px; text-align: center; text-anchor: middle; fill-opacity: 1;"&gt;
    &lt;text x="230" y="24" width="460" height="64" style="fill: url(#TropicalGrad);"&gt;Vector graphics are so Web2.0&lt;/text&gt;
    &lt;path d="M492,21 L483,20 L477,28 L475,19 L466,15 L474,10 L474,1 L482,7 L490,5 L487,13 L492,21 z" style="fill: url(#StarGrad); stroke: none;"/&gt;
  &lt;/g&gt;
  &lt;use xlink:href="#TopHalf" transform="scale(1, -1) translate(0, -64)"/&gt;
  &lt;rect style="fill: url(#FadeGrad); stroke: none;" width="500" height="32" x="0" y="32"/&gt;
&lt;/svg&gt;</pre>
<p>At the top of the file you can see typical XML stuff: an XML declaration, then a root node.  The root node references two namespaces: one for the SVG format (duh), and the other for links within the file.  The latter allows for things like gradients and stock text, which are accomplished by referencing definitions in other parts of the document.  Beyond that, there&#8217;s a <kbd>version</kbd> corresponding to the version of the SVG spec, and basic <kbd>height</kbd> and <kbd>width</kbd> attributes.  No big deal so far, right?</p>
<p>The <kbd>defs</kbd> section defines stock things like gradients.  Gradients come in two parts: the first gradient defines the colors, while a second gradient references the first and maps those colors onto the canvas with specific coordinates.  This way, you can use the same gradient in different places without having to redefine the colors.  I&#8217;ve done this here, where <kbd>#Tropical</kbd> defines the orange and red colors, then <kbd>#TropicalGrad</kbd> and <kbd>#StarGrad</kbd> place those colors on different parts of the canvas.</p>
<p>The rest of the file is just drawing instructions.  As you can guess, the <kbd>rect</kbd> element defines a rectangle.  You can also see that SVG uses CSS for styling elements.  Styles can be broken out into XML attributes, such as <kbd>fill="#000000"</kbd>, if you like.</p>
<p>The <kbd>g</kbd> element defines a group, or a layer.  Just like container elements in HTML, group elements are good for holding styles that the inner elements can use.</p>
<p>Text is &#8230; tricky.  The v1.0 and v1.2 SVG specs handle text slightly differently, depending on if the text is a single line or multiple lines.  Wrapping text blocks were not around until the v1.2 specs, and use a different set of elements: <kbd>flowText</kbd>, <kbd>flowDiv</kbd>, <kbd>flowPara</kbd>, and <kbd>flowRoot</kbd>.  The v1.0 element is much simpler: <kbd>text</kbd>.  On the one hand it&#8217;s much less flexible, but on the other hand support for it is much more uniform in various viewers and web browsers and renderers.  I&#8217;ll have an entire post about handling text in SVG.</p>
<p>Drawable things are handled with the <kbd>path</kbd> element.  Remember the old LOGO language with the turtle?  Same thing.  The <kbd>d</kbd> attribute handles the drawing instructions, most of which are very easy to remember.</p>
<p>The <kbd>use</kbd> element is similar to a <kbd>#include</kbd> or <kbd>cfinclude</kbd>, except that you will generally use it to clone an element from the same document.  In this example, we clone the layer/group containing the text and star, then use a series of <kbd>transform</kbd> commands on it to pull the thing down, flip it, but not reverse it.  Sorry.</p>
<p>The last <kbd>rect</kbd> is cheating a bit&mdash;instead of masking out the cloned content, I put an alpha gradient on top of it that starts transparent and fades to opaque.  Masking is a little trickier, but not all that much, and it really comes in handy when you&#8217;re doing 32-bit alpha PNG files.</p>
<p>So there you have it, the basics of SVG: structure, basic shapes, text, groups, and transforms.  There&#8217;s plenty more fine detail, but those are the broad strokes.</p>
<p>As a thought exercise, <strong>how much would we have to change if we wanted to put the graphic on a white background?</strong>  Or a blue background?</p>
<p>Not much, actually:</p>
<ol>
<li>
<p>The <kbd>#Fade</kbd> gradient has black stops.</p>
</li>
<li>
<p>The first <kbd>rect</kbd> has a black fill.</p>
</li>
</ol>
<p>How could we modify it with ColdFusion?  Presumably, we&#8217;d load the file as an XML document.  Finding the specific places to modify should be as simple as using a couple of XPath queries.  Something like &ldquo;<kbd>id('Fade')/stop</kbd>&rdquo; would work, and you could add <kbd>id</kbd> elements to the stops if you wanted to.  Finding the first <kbd>rect</kbd> would be similar, and again easier if an <kbd>id</kbd> was added.</p>
<p>I&#8217;m sure you can see where I&#8217;m going with this&mdash;generating and modifying SVG with ColdFusion is wicked easy.  In my next post, we&#8217;ll build an SVG renderer using Batik and ColdFusion so we can get some actual image files.</p>
]]></content:encoded>
			<wfw:commentRss>http://rickosborne.org/blog/2008/01/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generating scalable, stretchy, and smart graphics with ColdFusion &#8211; Part 1</title>
		<link>http://rickosborne.org/blog/2008/01/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-1/</link>
		<comments>http://rickosborne.org/blog/2008/01/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-1/#comments</comments>
		<pubDate>Mon, 28 Jan 2008 13:00:32 +0000</pubDate>
		<dc:creator>Rick Osborne</dc:creator>
				<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[batik]]></category>
		<category><![CDATA[svg]]></category>
		<guid isPermaLink="false">http://rickosborne.org/blog/index.php/2008/01/28/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-1/</guid>
		<description><![CDATA[This is the first part in a series of posts about an alternate method of generating graphics with ColdFusion. By alternate, I mean not based on cfimage. Since they are based on the Apache Batik Java library, you can do everything I&#8217;m going to show you on any Java-based version of ColdFusion. (I&#8217;d wager that [...]]]></description>
			<content:encoded><![CDATA[<p>This is the first part in a series of posts about an alternate method of generating graphics with ColdFusion.  By alternate, I mean not based on <kbd>cfimage</kbd>.  Since they are based on the <a href="http://xmlgraphics.apache.org/batik/">Apache Batik Java library</a>, you can do everything I&#8217;m going to show you on any Java-based version of ColdFusion.  (I&#8217;d wager that you could probably do everything on versions of CF going even further back.)</p>
<p>First, the obigatory eye-candy to convince you that I&#8217;m not a crackpot:</p>
<ol>
<li>
<p><a href="/blog/index.php/2006/10/28/cant-wait-for-image-manipulation-in-cfmx8scorpio-do-it-now/">My original post in Fall 2006 about image manipulation without CF8</a></p>
<p style="text-align:center;"><a href="http://nowrists.com/worldmap.cfm/worldmap.png" ><img src="/images/screenshots/worldmap.png" width="391" height="254" alt="nowrists.com global traffic" border="0" /></a></p>
</li>
<li>
<p><a href="/blog/index.php/2006/10/30/preview-of-photo-image-resizing-without-cfmx8scorpio/">Another post, 2 days later, with more graphics</a></p>
<p align="center"><img src="http://rickosborne.org/images/screenshots/resizer.png" width="469" height="242" border="0" /></p>
</li>
<li>
<p>And, of course, the graphs I make for my runs are all done via SVG:</p>
<p align="center"><img src="/images/fitness/run-20080126.png" width="500" height="202" alt="Run for Saturday, 2008-01-26" border="0"/></p>
</li>
</ol>
<p><strong>Why would you want to generate images with SVG instead of the more traditional way</strong> &mdash; with <kbd>cfimage</kbd> or a similar raster-canvas-based approach?</p>
<ol>
<li>
<p>Existing vector tools, such as <a href="http://www.inkscape.org/">Inkscape</a> and Adobe Illustrator, can help you get a base template graphic up and going significantly faster than generating one through code.  The exported SVG file can then be tweaked by hand as needed.</p>
</li>
<li>
<p>Similarly, you can have a graphic artist, someone who is paid to come up with pretty and swooshy things, do almost all of the work.  In the best case, a programmer might have only a few minutes worth of work to do.</p>
</li>
<li>
<p>Dynamically-sized, stretchy, and &ldquo;smart&rdquo; images can be done with an absolute minimum of work and manual coding of complex layout logic.  Almost all of the heavy lifting, like transformation math, is done for you.</p>
</li>
<li>
<p>Translating from a Flash file, or to a Flash file, is going to be significantly easier than with the traditional approach.</p>
</li>
<li>
<p>SVG images can do everything raster-canvas images can do, and much, much more.</p>
</li>
</ol>
<p>But, of course, I&#8217;m going to try to be fair.  There are a few down-sides to using SVG with ColdFusion:</p>
<ol>
<li>
<p>Complex graphics <strong>can</strong> be server-intensive to render.  I&#8217;d bet that an equivalent raster image would only render slightly faster in most cases, but an unoptimized SVG can certainly chew up the processor.  I&#8217;ve personally run a graphics service on nowrists.com that has handled dozens of image requests per second on a 1GHz machine, so it&#8217;s not as hopeless as some might think.</p>
</li>
<li>
<p>Memory requirements are almost certainly going to be larger than raster equivalents.</p>
</li>
<li>
<p>If you want to really break out of the box and start doing advanced stuff, you need to be very comfortable with geometry.  I think doing such things by hand with a raster canvas would be even harder to do than with SVG, but it&#8217;s still not for the faint of heart.</p>
</li>
</ol>
<p>Having said all of that, <strong>what will you need to do this wonderful, magical stuff that I&#8217;m talking about here?</strong></p>
<p>Exactly one thing: a Java version of ColdFusion.  The default install will work for most things&mdash;you won&#8217;t run into problems until you need Unicode characters in your graphics.  Even then, the fix is a 5-minute one.  I&#8217;ll have a post on how to upgrade the default version of Batik later on in the series.</p>
<p>I would also recommend, but it is certainly not required, that you get familiar with a vector graphics editing program, such as Inkscape or Illustrator.  The next post will introduce SVG and won&#8217;t use an editor at all, but eventually you&#8217;re going to want the rapid-development that an editor provides.  I&#8217;m going to use Inkscape in all of my examples and screenshots throughout this series, but if you&#8217;ve got the the money and time for Illustrator, I don&#8217;t imagine you&#8217;ll have too hard of a time translating.</p>
<p>That&#8217;s it for now.  I estimate there will be a total of 6 to 10 posts in this series, and that it&#8217;ll take me about 2 weeks to get through.</p>
]]></content:encoded>
			<wfw:commentRss>http://rickosborne.org/blog/2008/01/generating-scalable-stretchy-and-smart-graphics-with-coldfusion-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

