diff --git a/coders/sfw.c b/coders/sfw.c
new file mode 100644
index 0000000..0555c52
--- /dev/null
+++ b/coders/sfw.c
@@ -0,0 +1,413 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%                            SSSSS  FFFFF  W   W                              %
+%                            SS     F      W   W                              %
+%                             SSS   FFF    W   W                              %
+%                               SS  F      W W W                              %
+%                            SSSSS  F       W W                               %
+%                                                                             %
+%                                                                             %
+%                    Read/Write ImageMagick Image Format                      %
+%                                                                             %
+%                              Software Design                                %
+%                                John Cristy                                  %
+%                                 July 1992                                   %
+%                                                                             %
+%                                                                             %
+%  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization      %
+%  dedicated to making software imaging solutions freely available.           %
+%                                                                             %
+%  You may not use this file except in compliance with the License.  You may  %
+%  obtain a copy of the License at                                            %
+%                                                                             %
+%    http://www.imagemagick.org/script/license.php                            %
+%                                                                             %
+%  Unless required by applicable law or agreed to in writing, software        %
+%  distributed under the License is distributed on an "AS IS" BASIS,          %
+%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
+%  See the License for the specific language governing permissions and        %
+%  limitations under the License.                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+*/
+
+/*
+  Include declarations.
+*/
+#include "magick/studio.h"
+#include "magick/blob.h"
+#include "magick/blob-private.h"
+#include "magick/constitute.h"
+#include "magick/exception.h"
+#include "magick/exception-private.h"
+#include "magick/image.h"
+#include "magick/image-private.h"
+#include "magick/list.h"
+#include "magick/magick.h"
+#include "magick/memory_.h"
+#include "magick/resource_.h"
+#include "magick/quantum-private.h"
+#include "magick/static.h"
+#include "magick/string_.h"
+#include "magick/module.h"
+#include "magick/transform.h"
+#include "magick/utility.h"
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   I s S F W                                                                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  IsSFW() returns MagickTrue if the image format type, identified by the
+%  magick string, is SFW.
+%
+%  The format of the IsSFW method is:
+%
+%      MagickBooleanType IsSFW(const unsigned char *magick,const size_t length)
+%
+%  A description of each parameter follows:
+%
+%    o magick: compare image format pattern against these bytes.
+%
+%    o length: Specifies the length of the magick string.
+%
+*/
+static MagickBooleanType IsSFW(const unsigned char *magick,const size_t length)
+{
+  if (length < 5)
+    return(MagickFalse);
+  if (LocaleNCompare((const char *) magick,"SFW94",5) == 0)
+    return(MagickTrue);
+  return(MagickFalse);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e a d S F W I m a g e                                                   %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  ReadSFWImage() reads a Seattle Film Works image file and returns it.
+%  It allocates the memory necessary for the new Image structure and returns a
+%  pointer to the new image.
+%
+%  The format of the ReadSFWImage method is:
+%
+%      Image *ReadSFWImage(const ImageInfo *image_info,ExceptionInfo *exception)
+%
+%  A description of each parameter follows:
+%
+%    o image_info: the image info.
+%
+%    o exception: return any errors or warnings in this structure.
+%
+*/
+
+static unsigned char *SFWScan(unsigned char *p,const unsigned char *q,
+  const unsigned char *target,const int length)
+{
+  register long
+    i;
+
+  for ( ; p < q; p++)
+  {
+    if (*p != *target)
+      continue;
+    if (length == 1)
+      return(p);
+    for (i=1; i < length; i++)
+      if (*(p+i) != *(target+i))
+        break;
+    if (i == length)
+      return(p);
+  }
+  return((unsigned char *) NULL);
+}
+
+static void TranslateSFWMarker(unsigned char *marker)
+{
+  switch (marker[1])
+  {
+    case 0xc8: marker[1]=0xd8; break;  /* soi */
+    case 0xd0: marker[1]=0xe0; break;  /* app */
+    case 0xcb: marker[1]=0xdb; break;  /* dqt */
+    case 0xa0: marker[1]=0xc0; break;  /* sof */
+    case 0xa4: marker[1]=0xc4; break;  /* sof */
+    case 0xca: marker[1]=0xda; break;  /* sos */
+    case 0xc9: marker[1]=0xd9; break;  /* eoi */
+    default: break;
+  }
+}
+
+static Image *ReadSFWImage(const ImageInfo *image_info,ExceptionInfo *exception)
+{
+  static unsigned char
+    HuffmanTable[] =
+    {
+      0xFF, 0xC4, 0x01, 0xA2, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01,
+      0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
+      0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+      0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
+      0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x10, 0x00, 0x02, 0x01,
+      0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00,
+      0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21,
+      0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32,
+      0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1,
+      0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18,
+      0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36,
+      0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+      0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64,
+      0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77,
+      0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A,
+      0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3,
+      0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5,
+      0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+      0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9,
+      0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA,
+      0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0x11,
+      0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04,
+      0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
+      0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13,
+      0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09,
+      0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24,
+      0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28,
+      0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45,
+      0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+      0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73,
+      0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85,
+      0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+      0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9,
+      0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2,
+      0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4,
+      0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
+      0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
+      0xF9, 0xFA
+    };
+
+  FILE
+    *file;
+
+  Image
+    *flipped_image,
+    *image;
+
+  ImageInfo
+    *read_info;
+
+  int
+    unique_file;
+
+  MagickBooleanType
+    status;
+
+  register unsigned char
+    *header,
+    *data;
+
+  ssize_t
+    count;
+
+  unsigned char
+    *buffer,
+    *offset;
+
+  /*
+    Open image file.
+  */
+  assert(image_info != (const ImageInfo *) NULL);
+  assert(image_info->signature == MagickSignature);
+  if (image_info->debug != MagickFalse)
+    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
+      image_info->filename);
+  assert(exception != (ExceptionInfo *) NULL);
+  assert(exception->signature == MagickSignature);
+  image=AcquireImage(image_info);
+  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
+  if (status == MagickFalse)
+    {
+      image=DestroyImageList(image);
+      return((Image *) NULL);
+    }
+  /*
+    Read image into a buffer.
+  */
+  buffer=(unsigned char *) AcquireQuantumMemory((size_t) GetBlobSize(image),
+    sizeof(*buffer));
+  if (buffer == (unsigned char *) NULL)
+    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+  count=ReadBlob(image,(size_t) GetBlobSize(image),buffer);
+  if ((count == 0) || (LocaleNCompare((char *) buffer,"SFW",3) != 0))
+    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
+  (void) CloseBlob(image);
+  image=DestroyImage(image);
+  /*
+    Find the start of the JFIF data
+  */
+  header=SFWScan(buffer,buffer+count-1,(const unsigned char *)
+    "\377\310\377\320",4);
+  if (header == (unsigned char *) NULL)
+    {
+      buffer=(unsigned char *) RelinquishMagickMemory(buffer);
+      ThrowReaderException(CorruptImageError,"ImproperImageHeader");
+    }
+  TranslateSFWMarker(header);  /* translate soi and app tags */
+  TranslateSFWMarker(header+2);
+  (void) CopyMagickMemory(header+6,"JFIF\0\001\0",7);  /* JFIF magic */
+  /*
+    Translate remaining markers.
+  */
+  offset=header+2;
+  offset+=(offset[2] << 8)+offset[3]+2;
+  for ( ; ; )
+  {
+    TranslateSFWMarker(offset);
+    if (offset[1] == 0xda)
+      break;
+    offset+=(offset[2] << 8)+offset[3]+2;
+  }
+  offset--;
+  data=SFWScan(offset,buffer+count-1,(const unsigned char *) "\377\311",2);
+  if (data == (unsigned char *) NULL)
+    {
+      buffer=(unsigned char *) RelinquishMagickMemory(buffer);
+      ThrowReaderException(CorruptImageError,"ImproperImageHeader");
+    }
+  TranslateSFWMarker(data++);  /* translate eoi marker */
+  /*
+    Write JFIF file.
+  */
+  read_info=CloneImageInfo(image_info);
+  read_info->blob=(void *) NULL;
+  read_info->length=0;
+  file=(FILE *) NULL;
+  unique_file=AcquireUniqueFileResource(read_info->filename);
+  if (unique_file != -1)
+    file=OpenMagickStream(read_info->filename,"wb");
+  if ((unique_file == -1) || (file == (FILE *) NULL))
+    {
+      buffer=(unsigned char *) RelinquishMagickMemory(buffer);
+      read_info=DestroyImageInfo(read_info);
+      (void) CopyMagickString(image->filename,read_info->filename,
+        MaxTextExtent);
+      ThrowFileException(exception,FileOpenError,"UnableToCreateTemporaryFile",
+        image->filename);
+      image=DestroyImageList(image);
+      return((Image *) NULL);
+    }
+  (void) fwrite(header,(size_t) (offset-header+1),1,file);
+  (void) fwrite(HuffmanTable,1,sizeof(HuffmanTable)/sizeof(*HuffmanTable),file);
+  (void) fwrite(offset+1,(size_t) (data-offset),1,file);
+  status=ferror(file) == -1 ? MagickFalse : MagickTrue;
+  (void) fclose(file);
+  buffer=(unsigned char *) RelinquishMagickMemory(buffer);
+  if (status == MagickFalse)
+    {
+      char
+        *message;
+
+      (void) remove(read_info->filename);
+      read_info=DestroyImageInfo(read_info);
+      message=GetExceptionMessage(errno);
+      (void) ThrowMagickException(&image->exception,GetMagickModule(),
+        FileOpenError,"UnableToWriteFile","`%s': %s",image->filename,message);
+      message=DestroyString(message);
+      image=DestroyImageList(image);
+      return((Image *) NULL);
+    }
+  /*
+    Read JPEG image.
+  */
+  image=ReadImage(read_info,exception);
+  (void) RelinquishUniqueFileResource(read_info->filename);
+  read_info=DestroyImageInfo(read_info);
+  if (image == (Image *) NULL)
+    return(GetFirstImageInList(image));
+  /*
+    Correct image orientation.
+  */
+  flipped_image=FlipImage(image,exception);
+  if (flipped_image == (Image *) NULL)
+    return(GetFirstImageInList(image));
+  DuplicateBlob(flipped_image,image);
+  image=DestroyImage(image);
+  return(flipped_image);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   R e g i s t e r S F W I m a g e                                           %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  RegisterSFWImage() adds attributes for the SFW image format to
+%  the list of supported formats.  The attributes include the image format
+%  tag, a method to read and/or write the format, whether the format
+%  supports the saving of more than one frame to the same file or blob,
+%  whether the format supports native in-memory I/O, and a brief
+%  description of the format.
+%
+%  The format of the RegisterSFWImage method is:
+%
+%      unsigned long RegisterSFWImage(void)
+%
+*/
+ModuleExport unsigned long RegisterSFWImage(void)
+{
+  MagickInfo
+    *entry;
+
+  entry=SetMagickInfo("SFW");
+  entry->decoder=(DecodeImageHandler *) ReadSFWImage;
+  entry->magick=(IsImageFormatHandler *) IsSFW;
+  entry->adjoin=MagickFalse;
+  entry->description=ConstantString("Seattle Film Works");
+  entry->module=ConstantString("SFW");
+  (void) RegisterMagickInfo(entry);
+  return(MagickImageCoderSignature);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%   U n r e g i s t e r S F W I m a g e                                       %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  UnregisterSFWImage() removes format registrations made by the
+%  SFW module from the list of supported formats.
+%
+%  The format of the UnregisterSFWImage method is:
+%
+%      UnregisterSFWImage(void)
+%
+*/
+ModuleExport void UnregisterSFWImage(void)
+{
+  (void) UnregisterMagickInfo("SFW");
+}