reverting to 3437

git-svn-id: http://skia.googlecode.com/svn/trunk@3439 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/gm.cpp b/gm/gm.cpp
index b6f21f8..f9c0e66 100644
--- a/gm/gm.cpp
+++ b/gm/gm.cpp
@@ -8,8 +8,6 @@
 #include "gm.h"
 using namespace skiagm;
 
-SkString GM::gResourcePath;
-
 GM::GM() {
     fBGColor = SK_ColorWHITE;
 }
diff --git a/gm/gm.h b/gm/gm.h
index d75a1c1..b0de922 100644
--- a/gm/gm.h
+++ b/gm/gm.h
@@ -18,18 +18,18 @@
 #include "SkTRegistry.h"
 
 namespace skiagm {
-        
-        static inline SkISize make_isize(int w, int h) {
-                SkISize sz;
-                sz.set(w, h);
-                return sz;
-        }
+	
+	static inline SkISize make_isize(int w, int h) {
+		SkISize sz;
+		sz.set(w, h);
+		return sz;
+	}
 
     class GM {
     public:
         GM();
         virtual ~GM();
-                
+		
         enum Flags {
             kSkipPDF_Flag       = 1 << 0,
             kSkipPicture_Flag   = 1 << 1
@@ -39,7 +39,7 @@
         void drawBackground(SkCanvas*);
         void drawContent(SkCanvas*);
         
-        SkISize getISize() { return this->onISize(); }
+		SkISize getISize() { return this->onISize(); }
         const char* shortName();
 
         uint32_t getFlags() const {
@@ -53,16 +53,10 @@
         // GM's getISize bounds.
         void drawSizeBounds(SkCanvas*, SkColor);
 
-        static void SetResourcePath(const char* resourcePath) { 
-            gResourcePath = resourcePath; 
-        }
-
-    protected:
-        static SkString gResourcePath;
-
-        virtual void onDraw(SkCanvas*) = 0;
-        virtual void onDrawBackground(SkCanvas*);
-        virtual SkISize onISize() = 0;
+	protected:
+		virtual void onDraw(SkCanvas*) = 0;
+		virtual void onDrawBackground(SkCanvas*);
+		virtual SkISize onISize() = 0;
         virtual SkString onShortName() = 0;
         virtual uint32_t onGetFlags() const { return 0; }
         
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index 61095e1..6f53ce8 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -589,9 +589,9 @@
 
 static void usage(const char * argv0) {
     SkDebugf(
-        "%s [-w writePath] [-r readPath] [-d diffPath] [-i resourcePath]\n"
-        "    [--noreplay] [--serialize] [--forceBWtext] [--nopdf] \n"
-        "    [--nodeferred] [--match substring] [--notexturecache]"
+        "%s [-w writePath] [-r readPath] [-d diffPath] [--noreplay]\n"
+        "    [--serialize] [--forceBWtext] [--nopdf] [--nodeferred]\n"
+        "    [--match substring] [--notexturecache]"
 #if SK_MESA
         " [--mesagl]"
 #endif
@@ -601,7 +601,6 @@
 "    readPath: directory to read reference images from;\n"
 "        reports if any pixels mismatch between reference and new images\n");
     SkDebugf("    diffPath: directory to write difference images in.\n");
-    SkDebugf("    resourcePath: directory that stores image resources.\n");
     SkDebugf("    --noreplay: do not exercise SkPicture replay.\n");
     SkDebugf(
 "    --serialize: exercise SkPicture serialization & deserialization.\n");
@@ -661,7 +660,6 @@
     const char* writePath = NULL;   // if non-null, where we write the originals
     const char* readPath = NULL;    // if non-null, were we read from to compare
     const char* diffPath = NULL;    // if non-null, where we write our diffs (from compare)
-    const char* resourcePath = NULL;// if non-null, where we read from for image resources
 
     SkTDArray<const char*> fMatches;
 
@@ -690,11 +688,6 @@
             if (argv < stop && **argv) {
                 diffPath = *argv;
             }
-        } else if (strcmp(*argv, "-i") == 0) {
-            argv++;
-            if (argv < stop && **argv) {
-                resourcePath = *argv;
-            }
         } else if (strcmp(*argv, "--forceBWtext") == 0) {
             gForceBWtext = true;
         } else if (strcmp(*argv, "--noreplay") == 0) {
@@ -716,19 +709,17 @@
             useMesa = true;
 #endif
         } else if (strcmp(*argv, "--notexturecache") == 0) {
-            disableTextureCache = true;
+          disableTextureCache = true;
         } else {
-            usage(commandName);
-            return -1;
+          usage(commandName);
+          return -1;
         }
     }
     if (argv != stop) {
-        usage(commandName);
-        return -1;
+      usage(commandName);
+      return -1;
     }
 
-    GM::SetResourcePath(resourcePath);
-
     int maxW = -1;
     int maxH = -1;
     Iter iter;
@@ -772,10 +763,6 @@
         fprintf(stderr, "writing to %s\n", writePath);
     }
 
-    if (resourcePath) {
-        fprintf(stderr, "reading resources from %s\n", resourcePath);
-    }
-
     // Accumulate success of all tests.
     int testsRun = 0;
     int testsPassed = 0;
@@ -841,10 +828,10 @@
 
             if (doDeferred && !testErrors &&
                 (kGPU_Backend == gRec[i].fBackend ||
-                 kRaster_Backend == gRec[i].fBackend)) {
+                kRaster_Backend == gRec[i].fBackend)) {
                 testErrors |= test_deferred_drawing(gm, gRec[i],
-                                                    forwardRenderedBitmap,
-                                                    diffPath, gGrContext, rt.get());
+                                    forwardRenderedBitmap,
+                                    diffPath, gGrContext, rt.get());
             }
 
             if ((ERROR_NONE == testErrors) && doReplay &&
diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi
index 601aa88..ec223fb 100644
--- a/gyp/gmslides.gypi
+++ b/gyp/gmslides.gypi
@@ -9,7 +9,6 @@
     '../gm/bitmapfilters.cpp',
     '../gm/bitmapscroll.cpp',
     '../gm/blurs.cpp',
-    '../gm/cmykjpeg.cpp',
     '../gm/colormatrix.cpp',
     '../gm/complexclip.cpp',
     '../gm/complexclip2.cpp',
diff --git a/gyp/images.gyp b/gyp/images.gyp
index d0b5c1a..a93ba06 100644
--- a/gyp/images.gyp
+++ b/gyp/images.gyp
@@ -5,7 +5,6 @@
       'type': 'static_library',
       'dependencies': [
         'utils.gyp:utils',
-        'libjpeg.gyp:libjpeg',
       ],
       'include_dirs': [
         '../include/config',
@@ -34,7 +33,6 @@
         '../src/images/SkImageDecoder_libgif.cpp',
         '../src/images/SkImageDecoder_libico.cpp',
         '../src/images/SkImageDecoder_libpng.cpp',
-        '../src/images/SkImageDecoder_libjpeg.cpp',
         '../src/images/SkImageDecoder_wbmp.cpp',
         '../src/images/SkImageEncoder.cpp',
         '../src/images/SkImageEncoder_Factory.cpp',
@@ -55,11 +53,14 @@
       'conditions': [
         [ 'skia_os == "win"', {
           'sources!': [
+            '../include/images/SkJpegUtility.h',
+
             '../src/images/SkFDStream.cpp',
             '../src/images/SkImageDecoder_Factory.cpp',
             '../src/images/SkImageDecoder_libgif.cpp',
             '../src/images/SkImageDecoder_libpng.cpp',
             '../src/images/SkImageEncoder_Factory.cpp',
+            '../src/images/SkJpegUtility.cpp',
             '../src/images/SkMovie_gif.cpp',
           ],
           'link_settings': {
@@ -74,10 +75,13 @@
         }],
         [ 'skia_os == "mac"', {
           'sources!': [
+            '../include/images/SkJpegUtility.h',
+
             '../src/images/SkImageDecoder_Factory.cpp',
             '../src/images/SkImageDecoder_libpng.cpp',
             '../src/images/SkImageDecoder_libgif.cpp',
             '../src/images/SkImageEncoder_Factory.cpp',
+            '../src/images/SkJpegUtility.cpp',
             '../src/images/SkMovie_gif.cpp',
           ],
         },{ #else if skia_os != mac
@@ -87,7 +91,10 @@
         }],
         [ 'skia_os in ["linux", "freebsd", "openbsd", "solaris"]', {
           'sources!': [
+            '../include/images/SkJpegUtility.h',
+
             '../src/images/SkImageDecoder_libgif.cpp',
+            '../src/images/SkJpegUtility.cpp',
             '../src/images/SkMovie_gif.cpp',
           ],
           # libpng stuff:
@@ -106,6 +113,7 @@
         }],
         [ 'skia_os == "android"', {
           'sources!': [
+            '../src/images/SkJpegUtility.cpp',
           ],
           'dependencies': [
              'android_system.gyp:gif',
diff --git a/gyp/libjpeg.gyp b/gyp/libjpeg.gyp
index d628f66..4826f48 100644
--- a/gyp/libjpeg.gyp
+++ b/gyp/libjpeg.gyp
@@ -13,19 +13,6 @@
       'dependencies': [
         '../third_party/externals/libjpeg/libjpeg.gyp:libjpeg',
       ],
-
-    'conditions': [
-      [ 'os_posix != 1 or OS == "mac"', {
-        # need to set include path when using our own version
-        'direct_dependent_settings': {
-          'include_dirs': [
-            '../third_party/externals/libjpeg',
-          ],
-         },
-      },],
-    ],
-
-
     },
   ],
 }
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index c93bae8..d40a670 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -590,44 +590,7 @@
     return gCT[ct];
 }
 
-static void usage(const char * argv0) {
-    SkDebugf("%s [sampleName] [-i resourcePath]\n", argv0);
-    SkDebugf("    sampleName: sample at which to start.\n");
-    SkDebugf("    resourcePath: directory that stores image resources.\n");
-}
-
 SampleWindow::SampleWindow(void* hwnd, int argc, char** argv, DeviceManager* devManager) : INHERITED(hwnd) {
-
-    const char* resourcePath = NULL;
-    fCurrIndex = -1;
-
-    const char* const commandName = argv[0];
-    char* const* stop = argv + argc;
-    for (++argv; argv < stop; ++argv) {
-        if (strcmp(*argv, "-i") == 0) {
-            argv++;
-            if (argv < stop && **argv) {
-                resourcePath = *argv;
-            }
-        } else {
-            fCurrIndex = findByTitle(*argv);
-            if (fCurrIndex < 0) {
-                fprintf(stderr, "Unknown sample \"%s\"\n", *argv);
-            }
-        }
-    }
-
-    if (fCurrIndex < 0) {
-        SkString title;
-        if (readTitleFromPrefs(&title)) {
-            fCurrIndex = findByTitle(title.c_str());
-        }
-    }
-
-    if (fCurrIndex < 0) {
-        fCurrIndex = 0;
-    }
-
     gSampleWindow = this;
 
 #ifdef  PIPE_FILE
@@ -731,8 +694,6 @@
     this->setVisibleP(true);
     this->setClipToBounds(false);
 
-    skiagm::GM::SetResourcePath(resourcePath);
-
     SkGMRegistyToSampleRegistry();
     {
         const SkViewRegister* reg = SkViewRegister::Head();
@@ -741,7 +702,22 @@
             reg = reg->next();
         }
     }
+    fCurrIndex = 0;
+    if (argc > 1) {
+        fCurrIndex = findByTitle(argv[1]);
+        if (fCurrIndex < 0) {
+            fprintf(stderr, "Unknown sample \"%s\"\n", argv[1]);
+        }
+    } else {
+        SkString title;
+        if (readTitleFromPrefs(&title)) {
+            fCurrIndex = findByTitle(title.c_str());
+        }
+    }
 
+    if (fCurrIndex < 0) {
+        fCurrIndex = 0;
+    }
     this->loadView((*fSamples[fCurrIndex])());
     
     fPDFData = NULL;
diff --git a/src/images/SkImageDecoder_Factory.cpp b/src/images/SkImageDecoder_Factory.cpp
index 048ed21..f3cb120 100644
--- a/src/images/SkImageDecoder_Factory.cpp
+++ b/src/images/SkImageDecoder_Factory.cpp
@@ -12,37 +12,6 @@
 #include "SkStream.h"
 #include "SkTRegistry.h"
 
-//extern SkImageDecoder* sk_libbmp_dfactory(SkStream*);
-//extern SkImageDecoder* sk_libgif_dfactory(SkStream*);
-//extern SkImageDecoder* sk_libico_dfactory(SkStream*);
-extern SkImageDecoder* sk_libjpeg_dfactory(SkStream*);
-//extern SkImageDecoder* sk_libpng_dfactory(SkStream*);
-//extern SkImageDecoder* sk_wbmp_dfactory(SkStream*);
-
-// To get the various image decoding classes to register themselves
-// pre-main we need to ensure they are linked into the application.
-// Ultimately we need to move to using DLLs rather than tightly
-// coupling the factory with the file format classes.
-void ForceLinking()
-{
-    SkImageDecoder* codec = NULL;
-
-    // TODO: rather than force the linking here expose a
-    // "Sk*ImageDecoderCreate" function for each codec
-    // and let the app add these calls to force the linking.
-    // Besides decoupling the codecs from the factory this
-    // will also give the app the ability to circumvent the
-    // factory and explicitly create a decoder w/o reaching
-    // into Skia's guts
-
-//    codec = sk_libbmp_dfactory(NULL);
-//    codec = sk_libgif_dfactory(NULL);
-//    codec = sk_libico_dfactory(NULL);
-    codec = sk_libjpeg_dfactory(NULL);
-//    codec = sk_libpng_dfactory(NULL);
-//    codec = sk_wbmp_dfactory(NULL);
-}
-
 typedef SkTRegistry<SkImageDecoder*, SkStream*> DecodeReg;
 
 // N.B. You can't use "DecodeReg::gHead here" due to complex C++
diff --git a/src/images/SkImageDecoder_libbmp.cpp b/src/images/SkImageDecoder_libbmp.cpp
index 8683e21..b5e49e8 100644
--- a/src/images/SkImageDecoder_libbmp.cpp
+++ b/src/images/SkImageDecoder_libbmp.cpp
@@ -27,7 +27,7 @@
     virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode mode);
 };
 
-SkImageDecoder* sk_libbmp_dfactory(SkStream* stream) {
+static SkImageDecoder* Factory(SkStream* stream) {
     static const char kBmpMagic[] = { 'B', 'M' };
     
     size_t len = stream->getLength();
@@ -41,7 +41,7 @@
     return NULL;
 }
 
-static SkTRegistry<SkImageDecoder*, SkStream*> gReg(sk_libbmp_dfactory);
+static SkTRegistry<SkImageDecoder*, SkStream*> gReg(Factory);
 
 ///////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/images/SkImageDecoder_libgif.cpp b/src/images/SkImageDecoder_libgif.cpp
index 3bc33c3..7a451a0 100644
--- a/src/images/SkImageDecoder_libgif.cpp
+++ b/src/images/SkImageDecoder_libgif.cpp
@@ -330,7 +330,7 @@
 
 #include "SkTRegistry.h"
 
-static SkImageDecoder* sk_libgif_dfactory(SkStream* stream) {
+static SkImageDecoder* Factory(SkStream* stream) {
     char buf[GIF_STAMP_LEN];
     if (stream->read(buf, GIF_STAMP_LEN) == GIF_STAMP_LEN) {
         if (memcmp(GIF_STAMP,   buf, GIF_STAMP_LEN) == 0 ||
@@ -342,4 +342,4 @@
     return NULL;
 }
 
-static SkTRegistry<SkImageDecoder*, SkStream*> gReg(sk_libgif_dfactory);
+static SkTRegistry<SkImageDecoder*, SkStream*> gReg(Factory);
diff --git a/src/images/SkImageDecoder_libico.cpp b/src/images/SkImageDecoder_libico.cpp
index 226c84a..bb6bc95 100644
--- a/src/images/SkImageDecoder_libico.cpp
+++ b/src/images/SkImageDecoder_libico.cpp
@@ -24,6 +24,7 @@
     virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode);
 };
 
+SkImageDecoder* SkCreateICOImageDecoder();
 SkImageDecoder* SkCreateICOImageDecoder() {
     return new SkICOImageDecoder;
 }
@@ -370,7 +371,7 @@
 
 #include "SkTRegistry.h"
 
-SkImageDecoder* sk_libico_dfactory(SkStream* stream) {
+static SkImageDecoder* Factory(SkStream* stream) {
     // Check to see if the first four bytes are 0,0,1,0
     // FIXME: Is that required and sufficient?
     SkAutoMalloc autoMal(4);
@@ -385,5 +386,5 @@
     return SkNEW(SkICOImageDecoder);
 }
 
-static SkTRegistry<SkImageDecoder*, SkStream*> gReg(sk_libico_dfactory);
+static SkTRegistry<SkImageDecoder*, SkStream*> gReg(Factory);
 
diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp
index 5cb45a2..77d383a 100644
--- a/src/images/SkImageDecoder_libjpeg.cpp
+++ b/src/images/SkImageDecoder_libjpeg.cpp
@@ -146,29 +146,6 @@
     return false;   // must always return false
 }
 
-// Convert a scanline of CMYK samples to RGBX in place. Note that this
-// method moves the "scanline" pointer in its processing
-static void convert_CMYK_to_RGB(uint8_t* scanline, unsigned int width) {
-    // At this point we've received CMYK pixels from libjpeg. We
-    // perform a crude conversion to RGB (based on the formulae 
-    // from easyrgb.com):
-    //  CMYK -> CMY
-    //    C = ( C * (1 - K) + K )      // for each CMY component
-    //  CMY -> RGB
-    //    R = ( 1 - C ) * 255          // for each RGB component
-    // Unfortunately we are seeing inverted CMYK so all the original terms
-    // are 1-. This yields:
-    //  CMYK -> CMY
-    //    C = ( (1-C) * (1 - (1-K) + (1-K) ) -> C = 1 - C*K
-    // The conversion from CMY->RGB remains the same
-    for (unsigned int x = 0; x < width; ++x, scanline += 4) {
-        scanline[0] = SkMulDiv255Round(scanline[0], scanline[3]);
-        scanline[1] = SkMulDiv255Round(scanline[1], scanline[3]);
-        scanline[2] = SkMulDiv255Round(scanline[2], scanline[3]);
-        scanline[3] = 255;
-    }
-}
-
 bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
 #ifdef TIME_DECODE
     AutoTimeMillis atm("JPEG Decode");
@@ -179,7 +156,7 @@
 
     jpeg_decompress_struct  cinfo;
     skjpeg_error_mgr        sk_err;
-    skjpeg_source_mgr       sk_stream(stream, this, false);
+    skjpeg_source_mgr       sk_stream(stream, this);
 
     cinfo.err = jpeg_std_error(&sk_err);
     sk_err.error_exit = skjpeg_error_exit;
@@ -224,14 +201,7 @@
     cinfo.do_block_smoothing = 0;
 
     /* default format is RGB */
-    if (cinfo.jpeg_color_space == JCS_CMYK) {
-        // libjpeg cannot convert from CMYK to RGB - here we set up
-        // so libjpeg will give us CMYK samples back and we will
-        // later manually convert them to RGB
-        cinfo.out_color_space = JCS_CMYK;
-    } else {
-        cinfo.out_color_space = JCS_RGB;
-    }
+    cinfo.out_color_space = JCS_RGB;
 
     SkBitmap::Config config = this->getPrefConfig(k32Bit_SrcDepth, false);
     // only these make sense for jpegs
@@ -243,9 +213,9 @@
 
 #ifdef ANDROID_RGB
     cinfo.dither_mode = JDITHER_NONE;
-    if (SkBitmap::kARGB_8888_Config == config && JCS_CMYK != cinfo.out_color_space) {
+    if (config == SkBitmap::kARGB_8888_Config) {
         cinfo.out_color_space = JCS_RGBA_8888;
-    } else if (SkBitmap::kRGB_565_Config == config && JCS_CMYK != cinfo.out_color_space) {
+    } else if (config == SkBitmap::kRGB_565_Config) {
         cinfo.out_color_space = JCS_RGB_565;
         if (this->getDitherImage()) {
             cinfo.dither_mode = JDITHER_ORDERED;
@@ -330,13 +300,10 @@
         return true;
     }
 #endif
-
+    
     // check for supported formats
     SkScaledBitmapSampler::SrcConfig sc;
-    if (JCS_CMYK == cinfo.out_color_space) {
-        // In this case we will manually convert the CMYK values to RGB
-        sc = SkScaledBitmapSampler::kRGBX;
-    } else if (3 == cinfo.out_color_components && JCS_RGB == cinfo.out_color_space) {
+    if (3 == cinfo.out_color_components && JCS_RGB == cinfo.out_color_space) {
         sc = SkScaledBitmapSampler::kRGB;
 #ifdef ANDROID_RGB
     } else if (JCS_RGBA_8888 == cinfo.out_color_space) {
@@ -355,7 +322,7 @@
                                   sampleSize);
 
     bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight());
-    // jpegs are always opaque (i.e. have no per-pixel alpha)
+    // jpegs are always opauqe (i.e. have no per-pixel alpha)
     bm->setIsOpaque(true);
 
     if (SkImageDecoder::kDecodeBounds_Mode == mode) {
@@ -365,13 +332,12 @@
         return return_false(cinfo, *bm, "allocPixelRef");
     }
 
-    SkAutoLockPixels alp(*bm);
+    SkAutoLockPixels alp(*bm);                          
     if (!sampler.begin(bm, sc, this->getDitherImage())) {
         return return_false(cinfo, *bm, "sampler.begin");
     }
 
-    // The CMYK work-around relies on 4 components per pixel here
-    uint8_t* srcRow = (uint8_t*)srcStorage.reset(cinfo.output_width * 4);
+    uint8_t* srcRow = (uint8_t*)srcStorage.alloc(cinfo.output_width * 4);
 
     //  Possibly skip initial rows [sampler.srcY0]
     if (!skip_src_rows(&cinfo, srcRow, sampler.srcY0())) {
@@ -388,11 +354,7 @@
         if (this->shouldCancelDecode()) {
             return return_false(cinfo, *bm, "shouldCancelDecode");
         }
-
-        if (JCS_CMYK == cinfo.out_color_space) {
-            convert_CMYK_to_RGB(srcRow, cinfo.output_width);
-        }
-
+        
         sampler.next(srcRow);
         if (bm->height() - 1 == y) {
             // we're done
@@ -631,7 +593,7 @@
         jpeg_start_compress(&cinfo, TRUE);
 
         const int       width = bm.width();
-        uint8_t*        oneRowP = (uint8_t*)oneRow.reset(width * 3);
+        uint8_t*        oneRowP = (uint8_t*)oneRow.alloc(width * 3);
 
         const SkPMColor* colors = ctLocker.lockColors(bm);
         const void*      srcRow = bm.getPixels();
@@ -656,7 +618,7 @@
 
 #include "SkTRegistry.h"
 
-SkImageDecoder* sk_libjpeg_dfactory(SkStream* stream) {
+static SkImageDecoder* DFactory(SkStream* stream) {
     static const char gHeader[] = { 0xFF, 0xD8, 0xFF };
     static const size_t HEADER_SIZE = sizeof(gHeader);
 
@@ -672,11 +634,9 @@
     return SkNEW(SkJPEGImageDecoder);
 }
 
-static SkImageEncoder* sk_libjpeg_efactory(SkImageEncoder::Type t) {
+static SkImageEncoder* EFactory(SkImageEncoder::Type t) {
     return (SkImageEncoder::kJPEG_Type == t) ? SkNEW(SkJPEGImageEncoder) : NULL;
 }
 
-
-static SkTRegistry<SkImageDecoder*, SkStream*> gDReg(sk_libjpeg_dfactory);
-static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(sk_libjpeg_efactory);
-
+static SkTRegistry<SkImageDecoder*, SkStream*> gDReg(DFactory);
+static SkTRegistry<SkImageEncoder*, SkImageEncoder::Type> gEReg(EFactory);
diff --git a/src/images/SkImageDecoder_wbmp.cpp b/src/images/SkImageDecoder_wbmp.cpp
index 262cf54..a7d910f 100644
--- a/src/images/SkImageDecoder_wbmp.cpp
+++ b/src/images/SkImageDecoder_wbmp.cpp
@@ -151,7 +151,7 @@
 
 #include "SkTRegistry.h"
 
-SkImageDecoder* sk_wbmp_dfactory(SkStream* stream) {
+static SkImageDecoder* Factory(SkStream* stream) {
     wbmp_head   head;
 
     if (head.init(stream)) {
@@ -160,5 +160,5 @@
     return NULL;
 }
 
-static SkTRegistry<SkImageDecoder*, SkStream*> gReg(sk_wbmp_dfactory);
+static SkTRegistry<SkImageDecoder*, SkStream*> gReg(Factory);
 
diff --git a/src/images/SkJpegUtility.cpp b/src/images/SkJpegUtility.cpp
index e28c512..aa5237f 100644
--- a/src/images/SkJpegUtility.cpp
+++ b/src/images/SkJpegUtility.cpp
@@ -14,9 +14,26 @@
     skjpeg_source_mgr*  src = (skjpeg_source_mgr*)cinfo->src;
     src->next_input_byte = (const JOCTET*)src->fBuffer;
     src->bytes_in_buffer = 0;
+    src->current_offset = 0;
     src->fStream->rewind();
 }
 
+static boolean sk_seek_input_data(j_decompress_ptr cinfo, long byte_offset) {
+    skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src;
+
+    if (byte_offset > src->current_offset) {
+        (void)src->fStream->skip(byte_offset - src->current_offset);
+    } else {
+        src->fStream->rewind();
+        (void)src->fStream->skip(byte_offset);
+    }
+
+    src->current_offset = byte_offset;
+    src->next_input_byte = (const JOCTET*)src->fBuffer;
+    src->bytes_in_buffer = 0;
+    return TRUE;
+}
+
 static boolean sk_fill_input_buffer(j_decompress_ptr cinfo) {
     skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src;
     if (src->fDecoder != NULL && src->fDecoder->shouldCancelDecode()) {
@@ -29,6 +46,7 @@
         return FALSE;
     }
 
+    src->current_offset += bytes;
     src->next_input_byte = (const JOCTET*)src->fBuffer;
     src->bytes_in_buffer = bytes;
     return TRUE;
@@ -46,6 +64,7 @@
                 cinfo->err->error_exit((j_common_ptr)cinfo);
                 return;
             }
+            src->current_offset += bytes;
             bytesToSkip -= bytes;
         }
         src->next_input_byte = (const JOCTET*)src->fBuffer;
@@ -77,7 +96,9 @@
 static void skmem_init_source(j_decompress_ptr cinfo) {
     skjpeg_source_mgr*  src = (skjpeg_source_mgr*)cinfo->src;
     src->next_input_byte = (const JOCTET*)src->fMemoryBase;
+    src->start_input_byte = (const JOCTET*)src->fMemoryBase;
     src->bytes_in_buffer = src->fMemoryBaseSize;
+    src->current_offset = src->fMemoryBaseSize;
 }
 
 static boolean skmem_fill_input_buffer(j_decompress_ptr cinfo) {
@@ -106,6 +127,8 @@
                                      bool ownStream) : fStream(stream) {
     fDecoder = decoder;
     const void* baseAddr = stream->getMemoryBase();
+    size_t bufferSize = 4096;
+    size_t len;
     fMemoryBase = NULL;
     fUnrefStream = ownStream;
     fMemoryBaseSize = 0;
@@ -115,6 +138,7 @@
     skip_input_data = sk_skip_input_data;
     resync_to_restart = sk_resync_to_restart;
     term_source = sk_term_source;
+    seek_input_data = sk_seek_input_data;
 //    SkDebugf("**************** use memorybase %p %d\n", fMemoryBase, fMemoryBaseSize);
 }