Cyotek Development Bloghttps://devblog.cyotek.com/tag/opensource/atom.xml2015-05-24T16:56:47ZQuick and simple sprite sheet packer sourceurn:uuid:09c11be3-04fb-406e-803c-fe92fe2b6f9e2015-05-24T16:56:47Z2015-05-24T16:56:47Z<p>For some time now, I've started moving away from monolithic and
complex GUI tools in favour of more streamlined command line
interfaces, generally using text based inputs like JSON or YAML.</p>
<p>While there is still a need for GUI tools for performing complex
actions, sometimes you just want something simple without a load
of bells and whistles. I especially make use of CLI tools in
build processes, and it is so much easier when such tools are
simple <code>exe</code> files that can be deployed via the package manager
of your choice, rather than requiring dozens of DLL's, registry
settings and who knows what.</p>
<p>While my own tools are certainly guilty of some of the above,
they do at least include CLI tools, some of which are powerful
in their own right (and perhaps some not powerful enough).
Sometimes though, even that is too much - such tools generally
have dependencies of their own (although much fewer than the GUI
versions), and there's no easy way to just get CLI versions
without the extra components.</p>
<p>Recently I had need of generating some sprite sheets for use
with HTML pages as part of a build process, but installing
<a href="https://cyotek.com/cyotek-spriter">Spriter</a> was going to be overkill as I didn't
need anything it offers bar the absolute core - pack some images
together and generate some usable CSS. So I opted to create a
small console tool to do just that, and have released the
source.</p>
<h3 id="about-the-tool">About the tool</h3>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/devblog/sprpack.png" class="gallery" title="A simple example using simple codes" ><img src="https://images.cyotek.com/image/thumbnail/devblog/sprpack.png" alt="A simple example using simple codes" decoding="async" loading="lazy" /></a><figcaption>A simple example using simple codes</figcaption></figure>
<p>The tool, <code>sprpack.exe</code>, is a stand alone (well, it needs
Microsoft .NET 4, so as stand alone as you can get with that
involved) tool that you can point at a given directory and it
will suck in the image files and spit out a sprite sheet
containing all the images neatly laid out to take the least
amount of space possible. It will also create some basic CSS if
required.</p>
<p>However, there's obviously a big caveat - it will do that one
job and it will do it well enough. But it doesn't include any
form of advanced functionality, for example templates to control
output CSS, advanced file patterns for including only specify
files, layout options, in fact pretty much no options at all. It
has one(ish) job.</p>
<h3 id="options">Options</h3>
<p>The following list details the arguments that <code>sprpack.exe</code>
accepts. All are optional.</p>
<ul>
<li><code>path</code> - specifies the path to process. Defaults to the
current directory</li>
<li><code>mask</code> - comma separated list of file masks to search.
Defaults to <code>*.png</code></li>
<li><code>out</code> - the file name of the sprite sheet graphic. Defaults to
<code>sheet.png</code></li>
<li><code>css</code> - the file name where the CSS will be written. If not
specified, CSS will not be generated</li>
<li><code>class</code> - the base CSS class name. Ignored if <code>/css</code> is not
set</li>
</ul>
<p>As you can see, it is a very simple affair!</p>
<blockquote>
<p><strong>Note!</strong> The tool will overwrite output files without
prompting</p>
</blockquote>
<h3 id="source-code">Source Code</h3>
<p>The source code for the simple packer can be found on the
<a href="https://github.com/cyotek/SpriteSheetPacker" rel="external nofollow noopener">project page</a>.</p>
<p>I haven't done it yet, but I'll probably add a NuGet package so
I can more easily drop it into a build process. At this point I
don't know if I'll expand the source to include any more options
but I suppose I'll build a few extra ones in over time.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2015-05-24 - First published</li>
<li>2020-11-21 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://devblog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> or its respective writers. Permission to reproduce news and web log entries and other RSS feed content in unmodified form without notice is granted provided they are not used to endorse or promote any products or opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://devblog.cyotek.com/post/quick-and-simple-sprite-sheet-packer-source .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comColorPicker Controls 1.0.4.0 Updateurn:uuid:54c0656a-d653-421f-bd59-b8bb0a12286c2014-04-13T09:48:03Z2014-04-13T09:48:03Z<p>The <a href="https://github.com/cyotek/Cyotek.Windows.Forms.ColorPicker" rel="external nofollow noopener">ColorPicker Controls</a> have been updated to version
1.0.4.0.</p>
<p>This is a fairly substantial update, with quite a few bug fixes
and enhancements to the code.</p>
<h2 id="whats-next-for-the-library">What's next for the library?</h2>
<p>I feel the code is starting to get a little bloated as the
library is trying to serve two purposes - the primary purpose is
for the selection of colours. However, it also provides the
ability to load and save colour swatches in various formats,
some of which has been the subject of posts on this blog.</p>
<p>Internally, we link to the individual files from the library in
our core product assemblies - all the UI stuff is in
<code>Cyotek.Windows.Forms</code>, and everything else is in
<code>Cyotek.Drawing</code>. I think it would probably be a good idea to
properly split up this library too. If you just want the UI, use
one library, if you want the extended palette serialisation
support, use the other. There is some overlap though so this
will need to be considered a bit first.</p>
<p>Of course splitting the library is a massive breaking change. I
think future versions of our open source libraries will change
to use <a href="http://semver.org/spec/v2.0.0.html" rel="external nofollow noopener">Semantic Versioning</a> so that it will be much clearer
when things are being broken. Of course, it would be preferable
if breaking changes <em>weren't</em> introduced all the time! This is
also why I haven't added a NuGet package yet, when you update a
package you don't expect to have to change your source code too.</p>
<h2 id="changes-and-new-features">Changes and new features</h2>
<ul>
<li>Added new <code>AdobePhotoShopColorSwatchSerializer</code> serializer for
reading and writing Adobe PhotoShop colour swatches (both
version 1 and version 2)</li>
<li>You can now set the <code>Columns</code> property of a <code>ColorGrid</code>
control to <code>0</code>, which will then internally calculate columns
based on the size of the control, the cell size, and the
spacing. A new read-only <code>ActualColumns</code> property has been
added which will allow you to get the real number of columns
if required. The <code>AutoSize</code> behaviour has been changed so that
only the vertical height of the control is adjusted when
<code>Columns</code> is zero</li>
<li><strong>Save Palette</strong> button in the <code>ColorPickerDialog</code> now obtains
the serializer to use based on the selected filter index,
allowing correct saving if multiple serializers use the same
extension.</li>
<li>Added <code>CanReadFrom</code> method to <code>IPaletteSerializer</code>.</li>
<li><code>PaletteSerializer.GetSerializer</code> now makes use of the above
new method to access the relevant serializer rather than just
matching extensions. This means if you have two serializers
that support different .pal formatted files, these can now be
loaded successfully, instead of one loading and one failing.</li>
<li>Added new <code>RawPaletteSerializer</code> which reads and writes
palettes that are simply RGB triplets in byte form</li>
<li>Added new <code>ShowAlphaChannel</code> property to <code>ColorEditor</code> and
<code>ColorPickerDialog</code>. This property allows the alpha channel
editing controls to be hidden, for when working with 8-bit
colours.</li>
<li>The rendering of the selected cell in a <code>ColorGrid</code> control
who's <code>SelectedCellStyle</code> is <code>Zoomed</code> now uses <code>Padding.Left</code>
and <code>Padding.Top</code> to determine the size of the zoom box,
avoiding massive boxes the larger the <code>CellSize</code> gets.</li>
<li>Added a new standard 256 colour palette. You can use this in
the <code>ColorGrid</code> by setting the <code>Palette</code> property to
<code>ColorPalette.Standard256</code> or obtain the array of colours by
calling <code>ColorPalettes.StandardPalette</code></li>
<li><code>ColorGrid</code> and <code>RgbaColorSlider</code> controls now only create
transparency brushes when required. A new virtual method
<code>SupportsTransparentBackColor</code> allows inheritors to create
their own brushes if required.</li>
<li>Added <code>EditingColor</code> event to <code>ColorGrid</code>, allowing the edit
colour action to be cancelled, or replaced with a custom
editor</li>
<li>Added <code>CurrentCell</code> property and <code>GetCellOffset</code> methods to
the <code>ColorGrid</code>.</li>
<li><code>ColorCollection</code> now implements <code>IEquatable</code></li>
<li>Added more tests</li>
<li>Added new <code>Navigate</code> method to <code>ColorGrid</code> for easier moving
within the cells of the grid</li>
</ul>
<h2 id="bug-fixes">Bug Fixes</h2>
<ul>
<li>The <code>ColorGrid</code> control now tries to be smarter with painting,
and only paints cells that intersect with the clip rectangle.
In addition, where possible only individual cells are
invalidated rather than the entire control.</li>
<li>Corrected invalid error messages from the <strong>Save Palette</strong>
button in the <code>ColorPickerDialog</code>.</li>
<li><strong>Load Palette</strong> and <strong>Save Palette</strong> buttons in the
<code>ColorPickerDialog</code> now check the <code>CanRead</code> and <code>CanWrite</code>
properties of the serializer.</li>
<li>Double clicking with any button other than the left in
<code>ColorGrid</code> control no longer attempts to initiate colour
editing</li>
<li>Setting the <code>Color</code> property of the <code>ColorGrid</code> control to
<code>Color.Empty</code> no longer treats the value as a valid colour</li>
<li>The <code>ColorGrid</code> control no longer defines custom colour
regions when the <code>ShowCustomColors</code> property was <code>false</code>. This
manifested in hover and selection effects working if you moved
your mouse over the bottom of a resized grid.</li>
<li>Clicking &quot;white space&quot; areas of a <code>ColorWheel</code> control will no
longer incorrectly set the colour to the closest matching
point on the wheel itself. However, starting to select a
colour within the wheel and then moving outside the bounds
will continue to select the closest match as usual.</li>
<li>Fixed a crash that occurred when creating controls that
inherited from <code>ColorGrid</code> or <code>RgbaColorSlider</code></li>
<li>When the <code>AutoAddColors</code> and <code>ShowCustomColors</code> properties are
<code>false</code>, unmatched colours will no longer be silently added to
the <code>ColorGrid</code> custom palette unexpectedly. This also
resolves various crashes after the colour regions fix above
was applied.</li>
<li>The <code>ColorWheel</code> control now makes use of
<code>ButtonRenderer.DrawParentBackground</code> to draw itself, to avoid
ugly blocks of solid colours when hosted in containers such as
the <code>TabControl</code></li>
<li>The <code>ColorEditorManager</code> control's <code>ColorChanged</code> event has
now been marked as the default event, so when you double click
the component in the designer, a code window now correctly
opens.</li>
<li>If the underlying entry in a <code>ColorCollection</code> bound to a
<code>ColorGrid</code> control was modified, and this particular entry
was the selected colour, the <code>ColorGrid</code> would not keep its
<code>Color</code> property in sync and would clear the selected index.</li>
<li>Attempting to set the <code>Columns</code> property to less than zero now
throws an <code>ArgumentOutOfRange</code> exception rather than setting
it, then crashing later on</li>
<li>Double clicking a colour in the grid of the
<code>ColorPickerDialog</code> no longer opens another copy of the
<code>ColorPickerDialog</code></li>
<li>Fixed problems in the <code>ColorGrid</code> with keyboard navigation and
initial focus if no valid colour index was set.</li>
<li>The <code>ColorCollection.Find</code> method now correctly works when
adding named colours (e.g. <code>Color.CornflowerBlue</code>) to the
collection, but searching by ARGB value (e.g.
<code>Color.FromArgb(100, 149, 237)</code>)</li>
<li>Fixed an issue where if the internal dictionary lookup in
<code>ColorCollection</code> class had been created and the collection
was then updated, in some cases the lookup wasn't correctly
modified.</li>
</ul>
<h2 id="update-history">Update History</h2>
<ul>
<li>2014-04-13 - First published</li>
<li>2020-11-21 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://devblog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> or its respective writers. Permission to reproduce news and web log entries and other RSS feed content in unmodified form without notice is granted provided they are not used to endorse or promote any products or opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://devblog.cyotek.com/post/colorpicker-controls-1-0-4-0-update .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comColorPicker Controls Update 1.0.2.0urn:uuid:2cd07bf2-c75a-4edf-a79f-8f501f9ab5f12013-07-14T08:48:08Z2013-07-13T18:06:56Z<p>I've been pretty busy recently pushing out updates to
<a href="https://www.cyotek.com/cyotek-webcopy">WebCopy</a>, a pending update to <a href="https://www.cyotek.com/cyotek-spriter">Spriter</a> and working on a
game project so blog posts have suffered a bit. While I work to
correct that, we've just pushed an update to the ColorPicker
controls.</p>
<h2 id="important">Important</h2>
<p>This update contains breaking changes due to a number of renamed
classes and enum members.</p>
<h2 id="so-whats-new">So what's new?</h2>
<ul>
<li>All the <code>*PaletteReader</code> classes have been replaced with
<code>*PaletteSerializer</code>. As the new names imply, palettes can now
be written as well as read. This is a breaking change and may
require some reworking of any code that used to use the old
readers.</li>
<li>The <code>ColorEditor</code> now supports selecting of named colors as
the hex editor is now a dropdown list. As well as being able
to select named colors from the list, you can now also type
names directly into the hex editor and they will be processed
accordingly.</li>
<li>The <code>ColorPickerDialog</code> now can load and save palette files</li>
<li>Palette support has been reworked to allow the saving of
palettes as well as loading. Unfortunately due to the initial
names of these classes this is a breaking change, albeit a
minor one.</li>
<li>Added a bit more documentation</li>
<li>Corrected some grammatical errors in existing documentation
and headers</li>
<li>Added additional tests to ensure palettes are written
correctly</li>
</ul>
<h2 id="new-from-1.0.1.0">New from 1.0.1.0</h2>
<ul>
<li>GIMP Palette support</li>
<li>Some unit tests to make sure palettes are read correctly</li>
</ul>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/devblog/cp-1020-editor.png" class="gallery" title="Named color support" ><img src="https://images.cyotek.com/image/thumbnail/devblog/cp-1020-editor.png" alt="Named color support" decoding="async" loading="lazy" /></a><figcaption>Named color support</figcaption></figure><figure class="screenshot" ><a href="https://images.cyotek.com/image/devblog/cp-1020-dialog.png" class="gallery" title="Support for loading and saving palettes" ><img src="https://images.cyotek.com/image/thumbnail/devblog/cp-1020-dialog.png" alt="Support for loading and saving palettes" decoding="async" loading="lazy" /></a><figcaption>Support for loading and saving palettes</figcaption></figure><h2 id="downloads">Downloads</h2>
<p>Grab the update from the link below or from the <a href="https://www.cyotek.com/cyotek-spriter">GitHub</a>
page.</p>
<p>We hope you enjoy these improvements!</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2013-07-13 - First published</li>
<li>2020-11-21 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://devblog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> or its respective writers. Permission to reproduce news and web log entries and other RSS feed content in unmodified form without notice is granted provided they are not used to endorse or promote any products or opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://devblog.cyotek.com/post/colorpicker-controls-update-1-0-2-0 .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comColorPicker Controls for Windows Formsurn:uuid:25ad5918-b209-45fa-b2a2-5d19e328ef372013-07-13T18:10:06Z2013-04-04T16:09:52Z<p>Back at the start of the new millennium, I had a publishing
agreement with another company to publish our components under
their branding. The first of these components was the
ColorPicker ActiveX control. Roll on 13 years later and that
publishing agreement is long expired, ActiveX is dead, and yet
here I am again writing a color picker control. Except this time
losing money rather than making it. There's probably a life
lesson buried in there somewhere.</p>
<p>All of our current products ask for a color at least once
(mostly buried in an options dialog), and some of the prototype
products we are working on ask for more. Currently, we just wrap
around the <code>System.Drawing.Design.ColorEditor</code> class, which
overtime has identified a few problems:</p>
<ul>
<li>Keyboard support is iffy (this is more to do with how it's
implemented at our end I suspect)</li>
<li>You can't choose alpha channels, or enter custom values</li>
<li>The dependency on <code>System.Design</code> prevents us from targeting
the Client Profile, and indeed will cause a crash if deployed
to a system with only the Client Profile installed</li>
</ul>
<p>The other option briefly considered was just to replace with the
standard color common dialog. But this dialog looks and operates
the same as it did back in Windows 3, and while that is pretty
good from a consistent UI standpoint, it does mean it hasn't
kept up with changing times - such as entering colors as hex
values. I took a look at some other third party libraries but
none of them were flexible enough for what I wanted.</p>
<p>In the end I went with writing my own set of C# based color
picker controls which we're providing here as open source - we
hope you find them useful. As there's quite a lot of code, I'm
not going to describe them line by line as I've done in the
past, but just provide an overview of each component.</p>
<h2 id="colorgrid-control">ColorGrid Control</h2>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/devblog/cp-colorgridcontrol.png" class="gallery" title="ColorGrid control demonstration" ><img src="https://images.cyotek.com/image/thumbnail/devblog/cp-colorgridcontrol.png" alt="ColorGrid control demonstration" decoding="async" loading="lazy" /></a><figcaption>ColorGrid control demonstration</figcaption></figure>
<p>This control displays a grid of colors, and supports both a
primary palette, and a custom color palette. Several properties
are available for configuring the appearing of the control, and
there are behaviour options too, such as built in editing of
colors.</p>
<h2 id="colorwheel-control">ColorWheel Control</h2>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/devblog/cp-colorwheelcontrol.png" class="gallery" title="ColorWheel control demonstration" ><img src="https://images.cyotek.com/image/thumbnail/devblog/cp-colorwheelcontrol.png" alt="ColorWheel control demonstration" decoding="async" loading="lazy" /></a><figcaption>ColorWheel control demonstration</figcaption></figure>
<p>This control displays a radial wheel of colors and allows
selection from any point in the wheel. Not much in the way of
customisation for this control!</p>
<h2 id="colorslider-controls">ColorSlider Controls</h2>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/devblog/cp-colorslidercontrols.png" class="gallery" title="ColorSlider controls demonstration" ><img src="https://images.cyotek.com/image/thumbnail/devblog/cp-colorslidercontrols.png" alt="ColorSlider controls demonstration" decoding="async" loading="lazy" /></a><figcaption>ColorSlider controls demonstration</figcaption></figure>
<p>A bunch of controls (inheriting from a single base) that allow
selection of values via a colourful bar. Similar to the
<code>TrackBar</code> control you have a few options for specifying the
drag handle's position and bar orientation.</p>
<h2 id="coloreditor-control">ColorEditor Control</h2>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/devblog/cp-coloreditorcontrol.png" class="gallery" title="ColorEditor control demonstration" ><img src="https://images.cyotek.com/image/thumbnail/devblog/cp-coloreditorcontrol.png" alt="ColorEditor control demonstration" decoding="async" loading="lazy" /></a><figcaption>ColorEditor control demonstration</figcaption></figure>
<p>This control allows you enter/select a color using RGB/HSL or
hex formats.</p>
<h2 id="screencolorpicker-control">ScreenColorPicker Control</h2>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/devblog/cp-screencolorpickercontrol.png" class="gallery" title="ScreenColorPicker control demonstration" ><img src="https://images.cyotek.com/image/thumbnail/devblog/cp-screencolorpickercontrol.png" alt="ScreenColorPicker control demonstration" decoding="async" loading="lazy" /></a><figcaption>ScreenColorPicker control demonstration</figcaption></figure>
<p>This control allows the user to pick a color from any pixel
displayed on the screen.</p>
<h2 id="colorpickerdialog-form">ColorPickerDialog Form</h2>
<figure class="screenshot" ><a href="https://images.cyotek.com/image/devblog/cp-colorpickerdialog.png" class="gallery" title="ColorPickerDialog demonstration" ><img src="https://images.cyotek.com/image/thumbnail/devblog/cp-colorpickerdialog.png" alt="ColorPickerDialog demonstration" decoding="async" loading="lazy" /></a><figcaption>ColorPickerDialog demonstration</figcaption></figure>
<p>This form puts together the previous controls in a ready to use
dialog.</p>
<h2 id="coloreditormanager">ColorEditorManager</h2>
<p>This is a non-GUI component that you can drop onto a form, and
bind to other controls in this library. When the <code>Color</code>
property of one control changes, it is reflected in the others
without having to lift a finger. Useful if you're creating
composite displays from multiple controls.</p>
<h2 id="color-palettes">Color Palettes</h2>
<p>The <code>ColorGrid</code> control has <code>Colors</code> and <code>CustomColors</code>
properties which return a <code>ColorCollection</code>. These two
properties make it easier as a developer to keep separate a
primary palette whilst having the flexibility of custom colors,
although it does complicate the control's internal logic a bit!
The grid will automatically populate custom colors if you try
and set the control's <code>Color</code> to a value not currently defined.</p>
<p>As well as manually populating <code>ColorCollection</code> instances, you
can also load in external palette files. Paint.NET and the age
old JASC 1.0 formats are currently supported.</p>
<h2 id="keyboard-support">Keyboard Support</h2>
<p>All GUI components, with the exception of the
<code>ScreenColorPicker</code> include full keyboard/focus support. Many
controls support <code>SmallChange</code> and <code>LargeChange</code> properties
which influence how navigation keys are processed. Although in
the case of the <code>ColorWheel</code> it's not really a bonus... but
that's what the <code>ColorEditor</code> control is best suited for!</p>
<h2 id="known-issues">Known Issues</h2>
<ul>
<li>XML documentation comments are incomplete</li>
<li>The <code>ColorEditorManager</code> control currently allows you to bind
to the <code>LightnessColorSlider</code> control, but doesn't fully
support it yet</li>
</ul>
<h2 id="acknowledgements">Acknowledgements</h2>
<ul>
<li>Inspiration (and some code!) was taken from <a href="http://www.codeproject.com/Articles/21965/Color-Picker-with-Color-Wheel-and-Eye-Dropper" rel="external nofollow noopener">Color Picker with
Color Wheel and Eye Dropper</a></li>
<li>The icon used by the demonstration is from the [Crystal
Project Icons<a href="http://www.iconfinder.com/icondetails/17937/128/color_color_scheme_icons_renk_icon" rel="external nofollow noopener">2</a></li>
<li>The eye dropper png graphic is from the <a href="http://www.iconfinder.com/icondetails/84569/32/eyedropper_icon" rel="external nofollow noopener">Momentum Glossy
Icons</a></li>
</ul>
<h2 id="source-code">Source Code</h2>
<p>Download the source code from the link below, or from the
<a href="https://github.com/cyotek/Cyotek.Windows.Forms.ColorPicker/" rel="external nofollow noopener">GitHub</a> page.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2013-04-04 - First published</li>
<li>2020-11-21 - Updated formatting, corrected some spelling
errors</li>
</ul>

<p><small>
All content <a href="https://devblog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> or its respective writers. Permission to reproduce news and web log entries and other RSS feed content in unmodified form without notice is granted provided they are not used to endorse or promote any products or opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://devblog.cyotek.com/post/colorpicker-controls-for-windows-forms .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.comImporting a SourceSafe database into Subversionurn:uuid:3772b868-449c-4b8d-a266-8762f54e02072011-07-03T12:59:37Z2011-07-03T12:59:37Z<p>In my <a href="/post/migrating-from-visual-sourcesafe-to-subversion">previous article</a> on migrating a VSS database into
SVN, I hadn't tried importing a VSS database into an existing
repository, which is something I found the original code
couldn't handle.</p>
<p>I rewrote the original tool to have a GUI front end in addition
to a console version, updated to allow importing into existing
repositories, and fixed a crash which would occur when trying to
import a file which couldn't be retrieved from SourceSafe. The
updated tool worked enough for my purposes, but hasn't been
extensively tested. However, as my three VSS databases are now
in SVN it's unlikely I'll be making further updates to the code.</p>
<p>The source code for the tool has therefore been uploaded as
<a href="http://vsstosvn.codeplex.com/" rel="external nofollow noopener">Open Source on CodePlex.com</a> in the hope that someone else
finds it useful. Some limited documentation is also available on
the CodePlex site, but if anyone has questions, please leave a
comment or <a href="https://cyotek.com/contact">contact us</a>.</p>
<h2 id="update-history">Update History</h2>
<ul>
<li>2011-07-03 - First published</li>
<li>2020-11-21 - Updated formatting</li>
</ul>

<p><small>
All content <a href="https://devblog.cyotek.com/copyright-and-trademarks">Copyright (c) by Cyotek Ltd</a> or its respective writers. Permission to reproduce news and web log entries and other RSS feed content in unmodified form without notice is granted provided they are not used to endorse or promote any products or opinions (other than what was expressed by the author) and without taking them out of context. Written permission from the copyright owner must be obtained for everything else.<br />Original URL of this content is https://devblog.cyotek.com/post/importing-a-sourcesafe-database-into-subversion .
</small></p>Richard Mosshttps://www.cyotek.com/richard.moss@cyotek.com