Fixes for JPEG subset decoding.

Ensure that the stream passed to JPEG for subset decoding is
neither deleted before it is no longer needed nor deleted an
extra time.

src/images/SkJpegUtility.h:
src/images/SkJpegUtility.cpp:
Always ref and unref the stream provided to skjpeg_source_mgr.
Add some comments explaining how skjpeg_source_mgr's members
handle ownership.
Fix a warning comparing signed and unsigned numbers, converting
to size_t which is more appropriate for measuring bytes.
Remove dead code referring to fMemoryBase and fMemoryBaseSize,
which are never used.

src/images/SkImageDecoder_libjpeg.cpp:
Call the new constructor for skjpeg_source_mgr, which no longer
takes a boolean to determine ownership.

include/images/SkBitmapRegionDecoder.h
src/images/SkBitmapRegionDecoder.cpp:
This small shim has been removed, since it is not needed to use
Skia's image decoders. Its functionality will be folded into
Android.

Required for the merge to Android.

R=djsollen@google.com

Review URL: https://codereview.chromium.org/21561002

git-svn-id: http://skia.googlecode.com/svn/trunk@10483 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gyp/images.gyp b/gyp/images.gyp
index 6d3b009..0bc8a76 100644
--- a/gyp/images.gyp
+++ b/gyp/images.gyp
@@ -34,8 +34,6 @@
         '../src/images/bmpdecoderhelper.cpp',
         '../src/images/bmpdecoderhelper.h',
 
-        '../src/images/SkBitmapRegionDecoder.cpp',
-
         '../src/images/SkForceLinking.cpp',
         '../src/images/SkImageDecoder.cpp',
         '../src/images/SkImageDecoder_FactoryDefault.cpp',
diff --git a/include/images/SkBitmapRegionDecoder.h b/include/images/SkBitmapRegionDecoder.h
deleted file mode 100644
index 5633234..0000000
--- a/include/images/SkBitmapRegionDecoder.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2011 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-
-#ifndef SkBitmapRegionDecoder_DEFINED
-#define SkBitmapRegionDecoder_DEFINED
-
-#include "SkBitmap.h"
-#include "SkImageDecoder.h"
-#include "SkStream.h"
-
-struct SkIRect;
-
-/**
- * SkBitmapRegionDecoder can be used to decode a specified rect from an image.
- * This is particularly useful when the original image is large and you only
- * need parts of the image.
- *
- * However, not all image codecs on all platforms support this feature so be
- * prepared to fallback to standard decoding if decodeRegion(...) returns false.
- */
-class SkBitmapRegionDecoder {
-public:
-    SkBitmapRegionDecoder(SkImageDecoder* decoder, SkStream* stream,
-                          int width, int height) {
-        fDecoder = decoder;
-        fStream = stream;
-        fWidth = width;
-        fHeight = height;
-    }
-    ~SkBitmapRegionDecoder() {
-        SkDELETE(fDecoder);
-        SkSafeUnref(fStream);
-    }
-
-    bool decodeRegion(SkBitmap* bitmap, const SkIRect& rect,
-                      SkBitmap::Config pref, int sampleSize);
-
-    SkImageDecoder* getDecoder() const { return fDecoder; }
-    int getWidth() const { return fWidth; }
-    int getHeight() const { return fHeight; }
-
-private:
-    SkImageDecoder* fDecoder;
-    SkStream* fStream;
-    int fWidth;
-    int fHeight;
-};
-
-#endif
diff --git a/src/images/SkBitmapRegionDecoder.cpp b/src/images/SkBitmapRegionDecoder.cpp
deleted file mode 100644
index 4cf1cca..0000000
--- a/src/images/SkBitmapRegionDecoder.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright 2011 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "SkBitmapRegionDecoder.h"
-
-bool SkBitmapRegionDecoder::decodeRegion(SkBitmap* bitmap, const SkIRect& rect,
-                                         SkBitmap::Config pref, int sampleSize) {
-    fDecoder->setSampleSize(sampleSize);
-    return fDecoder->decodeRegion(bitmap, rect, pref);
-}
diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp
index e0783c9..81904ae 100644
--- a/src/images/SkImageDecoder_libjpeg.cpp
+++ b/src/images/SkImageDecoder_libjpeg.cpp
@@ -65,7 +65,7 @@
 class SkJPEGImageIndex {
 public:
     SkJPEGImageIndex(SkStream* stream, SkImageDecoder* decoder)
-        : fSrcMgr(stream, decoder, true) {}
+        : fSrcMgr(stream, decoder) {}
 
     ~SkJPEGImageIndex() {
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
@@ -238,7 +238,7 @@
 
     jpeg_decompress_struct  cinfo;
     skjpeg_error_mgr        errorManager;
-    skjpeg_source_mgr       srcManager(stream, this, false);
+    skjpeg_source_mgr       srcManager(stream, this);
 
     cinfo.err = jpeg_std_error(&errorManager);
     errorManager.error_exit = skjpeg_error_exit;
diff --git a/src/images/SkJpegUtility.cpp b/src/images/SkJpegUtility.cpp
index 89a0472..1f426f2 100644
--- a/src/images/SkJpegUtility.cpp
+++ b/src/images/SkJpegUtility.cpp
@@ -29,15 +29,16 @@
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
 static boolean sk_seek_input_data(j_decompress_ptr cinfo, long byte_offset) {
     skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src;
+    size_t bo = (size_t) byte_offset;
 
-    if (byte_offset > src->current_offset) {
-        (void)src->fStream->skip(byte_offset - src->current_offset);
+    if (bo > src->current_offset) {
+        (void)src->fStream->skip(bo - src->current_offset);
     } else {
         src->fStream->rewind();
-        (void)src->fStream->skip(byte_offset);
+        (void)src->fStream->skip(bo);
     }
 
-    src->current_offset = byte_offset;
+    src->current_offset = bo;
     src->next_input_byte = (const JOCTET*)src->fBuffer;
     src->bytes_in_buffer = 0;
     return true;
@@ -109,12 +110,9 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-skjpeg_source_mgr::skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder,
-                                     bool ownStream) : fStream(stream) {
-    fDecoder = decoder;
-    fMemoryBase = NULL;
-    fUnrefStream = ownStream;
-    fMemoryBaseSize = 0;
+skjpeg_source_mgr::skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder)
+    : fStream(SkRef(stream))
+    , fDecoder(decoder) {
 
     init_source = sk_init_source;
     fill_input_buffer = sk_fill_input_buffer;
@@ -128,12 +126,7 @@
 }
 
 skjpeg_source_mgr::~skjpeg_source_mgr() {
-    if (fMemoryBase) {
-        sk_free(fMemoryBase);
-    }
-    if (fUnrefStream) {
-        fStream->unref();
-    }
+    SkSafeUnref(fStream);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/src/images/SkJpegUtility.h b/src/images/SkJpegUtility.h
index 74f1a21..69092ef 100644
--- a/src/images/SkJpegUtility.h
+++ b/src/images/SkJpegUtility.h
@@ -34,13 +34,13 @@
 /* Our source struct for directing jpeg to our stream object.
 */
 struct skjpeg_source_mgr : jpeg_source_mgr {
-    skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder, bool ownStream);
+    skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder);
     ~skjpeg_source_mgr();
 
-    SkStream*   fStream;
-    void*       fMemoryBase;
-    size_t      fMemoryBaseSize;
-    bool        fUnrefStream;
+    // fStream is ref'ed and unref'ed
+    SkStream*       fStream;
+    // Unowned pointer to the decoder, used to check if the decoding process
+    // has been cancelled.
     SkImageDecoder* fDecoder;
     enum {
         kBufferSize = 1024