diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index 39cda66..4044d81 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -47,8 +47,6 @@
     "animation/throb_animation.h",
     "animation/tween.cc",
     "animation/tween.h",
-    "codec/jpeg_codec.cc",
-    "codec/jpeg_codec.h",
     "codec/png_codec.cc",
     "codec/png_codec.h",
     "display.cc",
@@ -94,14 +92,12 @@
 
   deps = [
     ":gfx_export",
-    "//base/third_party/dynamic_annotations",
     "//base:base_static",
     "//base:i18n",
+    "//base/third_party/dynamic_annotations",
     "//skia",
-    "//third_party/libjpeg_turbo:libjpeg",
     "//third_party/libpng",
     "//third_party/zlib",
-    "//third_party:jpeg",
     "//ui/gfx/geometry",
   ]
   public_deps = [
@@ -165,7 +161,6 @@
     "animation/multi_animation_unittest.cc",
     "animation/slide_animation_unittest.cc",
     "animation/tween_unittest.cc",
-    "codec/jpeg_codec_unittest.cc",
     "codec/png_codec_unittest.cc",
     "display_change_notifier_unittest.cc",
     "display_unittest.cc",
@@ -196,10 +191,10 @@
     "//base",
     "//base/test:test_support",
     "//skia",
+    "//testing/gtest",
     "//third_party/icu:icuuc",
     "//third_party/libpng",
     "//third_party/zlib",
-    "//testing/gtest",
     "//ui/base",
     "//ui/gfx/geometry",
   ]
diff --git a/ui/gfx/codec/jpeg_codec.cc b/ui/gfx/codec/jpeg_codec.cc
deleted file mode 100644
index 8a08fe0..0000000
--- a/ui/gfx/codec/jpeg_codec.cc
+++ /dev/null
@@ -1,622 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/gfx/codec/jpeg_codec.h"
-
-#include <setjmp.h>
-
-#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "third_party/skia/include/core/SkColorPriv.h"
-
-extern "C" {
-#if defined(USE_SYSTEM_LIBJPEG)
-#include <jpeglib.h>
-#elif defined(USE_LIBJPEG_TURBO)
-#include "third_party/libjpeg_turbo/jpeglib.h"
-#else
-#include "third_party/libjpeg/jpeglib.h"
-#endif
-}
-
-namespace gfx {
-
-// Encoder/decoder shared stuff ------------------------------------------------
-
-namespace {
-
-// used to pass error info through the JPEG library
-struct CoderErrorMgr {
-  jpeg_error_mgr pub;
-  jmp_buf setjmp_buffer;
-};
-
-void ErrorExit(jpeg_common_struct* cinfo) {
-  CoderErrorMgr *err = reinterpret_cast<CoderErrorMgr*>(cinfo->err);
-
-  // Return control to the setjmp point.
-  longjmp(err->setjmp_buffer, false);
-}
-
-}  // namespace
-
-// This method helps identify at run time which library chromium is using.
-JPEGCodec::LibraryVariant JPEGCodec::JpegLibraryVariant() {
-#if defined(USE_SYSTEM_LIBJPEG)
-  return SYSTEM_LIBJPEG;
-#elif defined(USE_LIBJPEG_TURBO)
-  return LIBJPEG_TURBO;
-#else
-  return IJG_LIBJPEG;
-#endif
-}
-
-// Encoder ---------------------------------------------------------------------
-//
-// This code is based on nsJPEGEncoder from Mozilla.
-// Copyright 2005 Google Inc. (Brett Wilson, contributor)
-
-namespace {
-
-// Initial size for the output buffer in the JpegEncoderState below.
-static const int initial_output_buffer_size = 8192;
-
-struct JpegEncoderState {
-  explicit JpegEncoderState(std::vector<unsigned char>* o)
-      : out(o),
-        image_buffer_used(0) {
-  }
-
-  // Output buffer, of which 'image_buffer_used' bytes are actually used (this
-  // will often be less than the actual size of the vector because we size it
-  // so that libjpeg can write directly into it.
-  std::vector<unsigned char>* out;
-
-  // Number of bytes in the 'out' buffer that are actually used (see above).
-  size_t image_buffer_used;
-};
-
-// Initializes the JpegEncoderState for encoding, and tells libjpeg about where
-// the output buffer is.
-//
-// From the JPEG library:
-//  "Initialize destination. This is called by jpeg_start_compress() before
-//   any data is actually written. It must initialize next_output_byte and
-//   free_in_buffer. free_in_buffer must be initialized to a positive value."
-void InitDestination(jpeg_compress_struct* cinfo) {
-  JpegEncoderState* state = static_cast<JpegEncoderState*>(cinfo->client_data);
-  DCHECK(state->image_buffer_used == 0) << "initializing after use";
-
-  state->out->resize(initial_output_buffer_size);
-  state->image_buffer_used = 0;
-
-  cinfo->dest->next_output_byte = &(*state->out)[0];
-  cinfo->dest->free_in_buffer = initial_output_buffer_size;
-}
-
-// Resize the buffer that we give to libjpeg and update our and its state.
-//
-// From the JPEG library:
-//  "Callback used by libjpeg whenever the buffer has filled (free_in_buffer
-//   reaches zero). In typical applications, it should write out the *entire*
-//   buffer (use the saved start address and buffer length; ignore the current
-//   state of next_output_byte and free_in_buffer). Then reset the pointer &
-//   count to the start of the buffer, and return TRUE indicating that the
-//   buffer has been dumped. free_in_buffer must be set to a positive value
-//   when TRUE is returned. A FALSE return should only be used when I/O
-//   suspension is desired (this operating mode is discussed in the next
-//   section)."
-boolean EmptyOutputBuffer(jpeg_compress_struct* cinfo) {
-  JpegEncoderState* state = static_cast<JpegEncoderState*>(cinfo->client_data);
-
-  // note the new size, the buffer is full
-  state->image_buffer_used = state->out->size();
-
-  // expand buffer, just double size each time
-  state->out->resize(state->out->size() * 2);
-
-  // tell libjpeg where to write the next data
-  cinfo->dest->next_output_byte = &(*state->out)[state->image_buffer_used];
-  cinfo->dest->free_in_buffer = state->out->size() - state->image_buffer_used;
-  return 1;
-}
-
-// Cleans up the JpegEncoderState to prepare for returning in the final form.
-//
-// From the JPEG library:
-//  "Terminate destination --- called by jpeg_finish_compress() after all data
-//   has been written. In most applications, this must flush any data
-//   remaining in the buffer. Use either next_output_byte or free_in_buffer to
-//   determine how much data is in the buffer."
-void TermDestination(jpeg_compress_struct* cinfo) {
-  JpegEncoderState* state = static_cast<JpegEncoderState*>(cinfo->client_data);
-  DCHECK(state->out->size() >= state->image_buffer_used);
-
-  // update the used byte based on the next byte libjpeg would write to
-  state->image_buffer_used = cinfo->dest->next_output_byte - &(*state->out)[0];
-  DCHECK(state->image_buffer_used < state->out->size()) <<
-    "JPEG library busted, got a bad image buffer size";
-
-  // update our buffer so that it exactly encompases the desired data
-  state->out->resize(state->image_buffer_used);
-}
-
-#if !defined(JCS_EXTENSIONS)
-// Converts RGBA to RGB (removing the alpha values) to prepare to send data to
-// libjpeg. This converts one row of data in rgba with the given width in
-// pixels the the given rgb destination buffer (which should have enough space
-// reserved for the final data).
-void StripAlpha(const unsigned char* rgba, int pixel_width, unsigned char* rgb)
-{
-  for (int x = 0; x < pixel_width; x++)
-    memcpy(&rgb[x * 3], &rgba[x * 4], 3);
-}
-
-// Converts BGRA to RGB by reordering the color components and dropping the
-// alpha. This converts  one row of data in rgba with the given width in
-// pixels the the given rgb destination buffer (which should have enough space
-// reserved for the final data).
-void BGRAtoRGB(const unsigned char* bgra, int pixel_width, unsigned char* rgb)
-{
-  for (int x = 0; x < pixel_width; x++) {
-    const unsigned char* pixel_in = &bgra[x * 4];
-    unsigned char* pixel_out = &rgb[x * 3];
-    pixel_out[0] = pixel_in[2];
-    pixel_out[1] = pixel_in[1];
-    pixel_out[2] = pixel_in[0];
-  }
-}
-#endif  // !defined(JCS_EXTENSIONS)
-
-// This class destroys the given jpeg_compress object when it goes out of
-// scope. It simplifies the error handling in Encode (and even applies to the
-// success case).
-class CompressDestroyer {
- public:
-  CompressDestroyer() : cinfo_(NULL) {
-  }
-  ~CompressDestroyer() {
-    DestroyManagedObject();
-  }
-  void SetManagedObject(jpeg_compress_struct* ci) {
-    DestroyManagedObject();
-    cinfo_ = ci;
-  }
-  void DestroyManagedObject() {
-    if (cinfo_) {
-      jpeg_destroy_compress(cinfo_);
-      cinfo_ = NULL;
-    }
-  }
- private:
-  jpeg_compress_struct* cinfo_;
-};
-
-}  // namespace
-
-bool JPEGCodec::Encode(const unsigned char* input, ColorFormat format,
-                       int w, int h, int row_byte_width,
-                       int quality, std::vector<unsigned char>* output) {
-  jpeg_compress_struct cinfo;
-  CompressDestroyer destroyer;
-  destroyer.SetManagedObject(&cinfo);
-  output->clear();
-#if !defined(JCS_EXTENSIONS)
-  unsigned char* row_buffer = NULL;
-#endif
-
-  // We set up the normal JPEG error routines, then override error_exit.
-  // This must be done before the call to create_compress.
-  CoderErrorMgr errmgr;
-  cinfo.err = jpeg_std_error(&errmgr.pub);
-  errmgr.pub.error_exit = ErrorExit;
-
-  // Establish the setjmp return context for ErrorExit to use.
-  if (setjmp(errmgr.setjmp_buffer)) {
-    // If we get here, the JPEG code has signaled an error.
-    // MSDN notes: "if you intend your code to be portable, do not rely on
-    // correct destruction of frame-based objects when executing a nonlocal
-    // goto using a call to longjmp."  So we delete the CompressDestroyer's
-    // object manually instead.
-    destroyer.DestroyManagedObject();
-#if !defined(JCS_EXTENSIONS)
-    delete[] row_buffer;
-#endif
-    return false;
-  }
-
-  // The destroyer will destroy() cinfo on exit.
-  jpeg_create_compress(&cinfo);
-
-  cinfo.image_width = w;
-  cinfo.image_height = h;
-  cinfo.input_components = 3;
-#ifdef JCS_EXTENSIONS
-  // Choose an input colorspace and return if it is an unsupported one. Since
-  // libjpeg-turbo supports all input formats used by Chromium (i.e. RGB, RGBA,
-  // and BGRA), we just map the input parameters to a colorspace used by
-  // libjpeg-turbo.
-  if (format == FORMAT_RGB) {
-    cinfo.input_components = 3;
-    cinfo.in_color_space = JCS_RGB;
-  } else if (format == FORMAT_RGBA ||
-             (format == FORMAT_SkBitmap && SK_R32_SHIFT == 0)) {
-    cinfo.input_components = 4;
-    cinfo.in_color_space = JCS_EXT_RGBX;
-  } else if (format == FORMAT_BGRA ||
-             (format == FORMAT_SkBitmap && SK_B32_SHIFT == 0)) {
-    cinfo.input_components = 4;
-    cinfo.in_color_space = JCS_EXT_BGRX;
-  } else {
-    // We can exit this function without calling jpeg_destroy_compress() because
-    // CompressDestroyer automaticaly calls it.
-    NOTREACHED() << "Invalid pixel format";
-    return false;
-  }
-#else
-  cinfo.in_color_space = JCS_RGB;
-#endif
-  cinfo.data_precision = 8;
-
-  jpeg_set_defaults(&cinfo);
-  jpeg_set_quality(&cinfo, quality, 1);  // quality here is 0-100
-
-  // set up the destination manager
-  jpeg_destination_mgr destmgr;
-  destmgr.init_destination = InitDestination;
-  destmgr.empty_output_buffer = EmptyOutputBuffer;
-  destmgr.term_destination = TermDestination;
-  cinfo.dest = &destmgr;
-
-  JpegEncoderState state(output);
-  cinfo.client_data = &state;
-
-  jpeg_start_compress(&cinfo, 1);
-
-  // feed it the rows, doing necessary conversions for the color format
-#ifdef JCS_EXTENSIONS
-  // This function already returns when the input format is not supported by
-  // libjpeg-turbo and needs conversion. Therefore, we just encode lines without
-  // conversions.
-  while (cinfo.next_scanline < cinfo.image_height) {
-    const unsigned char* row = &input[cinfo.next_scanline * row_byte_width];
-    jpeg_write_scanlines(&cinfo, const_cast<unsigned char**>(&row), 1);
-  }
-#else
-  if (format == FORMAT_RGB) {
-    // no conversion necessary
-    while (cinfo.next_scanline < cinfo.image_height) {
-      const unsigned char* row = &input[cinfo.next_scanline * row_byte_width];
-      jpeg_write_scanlines(&cinfo, const_cast<unsigned char**>(&row), 1);
-    }
-  } else {
-    // get the correct format converter
-    void (*converter)(const unsigned char* in, int w, unsigned char* rgb);
-    if (format == FORMAT_RGBA ||
-        (format == FORMAT_SkBitmap && SK_R32_SHIFT == 0)) {
-      converter = StripAlpha;
-    } else if (format == FORMAT_BGRA ||
-               (format == FORMAT_SkBitmap && SK_B32_SHIFT == 0)) {
-      converter = BGRAtoRGB;
-    } else {
-      NOTREACHED() << "Invalid pixel format";
-      return false;
-    }
-
-    // output row after converting
-    row_buffer = new unsigned char[w * 3];
-
-    while (cinfo.next_scanline < cinfo.image_height) {
-      converter(&input[cinfo.next_scanline * row_byte_width], w, row_buffer);
-      jpeg_write_scanlines(&cinfo, &row_buffer, 1);
-    }
-    delete[] row_buffer;
-  }
-#endif
-
-  jpeg_finish_compress(&cinfo);
-  return true;
-}
-
-// Decoder --------------------------------------------------------------------
-
-namespace {
-
-struct JpegDecoderState {
-  JpegDecoderState(const unsigned char* in, size_t len)
-      : input_buffer(in), input_buffer_length(len) {
-  }
-
-  const unsigned char* input_buffer;
-  size_t input_buffer_length;
-};
-
-// Callback to initialize the source.
-//
-// From the JPEG library:
-//  "Initialize source. This is called by jpeg_read_header() before any data is
-//   actually read. May leave bytes_in_buffer set to 0 (in which case a
-//   fill_input_buffer() call will occur immediately)."
-void InitSource(j_decompress_ptr cinfo) {
-  JpegDecoderState* state = static_cast<JpegDecoderState*>(cinfo->client_data);
-  cinfo->src->next_input_byte = state->input_buffer;
-  cinfo->src->bytes_in_buffer = state->input_buffer_length;
-}
-
-// Callback to fill the buffer. Since our buffer already contains all the data,
-// we should never need to provide more data. If libjpeg thinks it needs more
-// data, our input is probably corrupt.
-//
-// From the JPEG library:
-//  "This is called whenever bytes_in_buffer has reached zero and more data is
-//   wanted. In typical applications, it should read fresh data into the buffer
-//   (ignoring the current state of next_input_byte and bytes_in_buffer), reset
-//   the pointer & count to the start of the buffer, and return TRUE indicating
-//   that the buffer has been reloaded. It is not necessary to fill the buffer
-//   entirely, only to obtain at least one more byte. bytes_in_buffer MUST be
-//   set to a positive value if TRUE is returned. A FALSE return should only
-//   be used when I/O suspension is desired."
-boolean FillInputBuffer(j_decompress_ptr cinfo) {
-  return false;
-}
-
-// Skip data in the buffer. Since we have all the data at once, this operation
-// is easy. It is not clear if this ever gets called because the JPEG library
-// should be able to do the skip itself (it has all the data).
-//
-// From the JPEG library:
-//  "Skip num_bytes worth of data. The buffer pointer and count should be
-//   advanced over num_bytes input bytes, refilling the buffer as needed. This
-//   is used to skip over a potentially large amount of uninteresting data
-//   (such as an APPn marker). In some applications it may be possible to
-//   optimize away the reading of the skipped data, but it's not clear that
-//   being smart is worth much trouble; large skips are uncommon.
-//   bytes_in_buffer may be zero on return. A zero or negative skip count
-//   should be treated as a no-op."
-void SkipInputData(j_decompress_ptr cinfo, long num_bytes) {
-  if (num_bytes > static_cast<long>(cinfo->src->bytes_in_buffer)) {
-    // Since all our data should be in the buffer, trying to skip beyond it
-    // means that there is some kind of error or corrupt input data. A 0 for
-    // bytes left means it will call FillInputBuffer which will then fail.
-    cinfo->src->next_input_byte += cinfo->src->bytes_in_buffer;
-    cinfo->src->bytes_in_buffer = 0;
-  } else if (num_bytes > 0) {
-    cinfo->src->bytes_in_buffer -= static_cast<size_t>(num_bytes);
-    cinfo->src->next_input_byte += num_bytes;
-  }
-}
-
-// Our source doesn't need any cleanup, so this is a NOP.
-//
-// From the JPEG library:
-//  "Terminate source --- called by jpeg_finish_decompress() after all data has
-//   been read to clean up JPEG source manager. NOT called by jpeg_abort() or
-//   jpeg_destroy()."
-void TermSource(j_decompress_ptr cinfo) {
-}
-
-#if !defined(JCS_EXTENSIONS)
-// Converts one row of rgb data to rgba data by adding a fully-opaque alpha
-// value.
-void AddAlpha(const unsigned char* rgb, int pixel_width, unsigned char* rgba) {
-  for (int x = 0; x < pixel_width; x++) {
-    memcpy(&rgba[x * 4], &rgb[x * 3], 3);
-    rgba[x * 4 + 3] = 0xff;
-  }
-}
-
-// Converts one row of RGB data to BGRA by reordering the color components and
-// adding alpha values of 0xff.
-void RGBtoBGRA(const unsigned char* bgra, int pixel_width, unsigned char* rgb)
-{
-  for (int x = 0; x < pixel_width; x++) {
-    const unsigned char* pixel_in = &bgra[x * 3];
-    unsigned char* pixel_out = &rgb[x * 4];
-    pixel_out[0] = pixel_in[2];
-    pixel_out[1] = pixel_in[1];
-    pixel_out[2] = pixel_in[0];
-    pixel_out[3] = 0xff;
-  }
-}
-#endif  // !defined(JCS_EXTENSIONS)
-
-// This class destroys the given jpeg_decompress object when it goes out of
-// scope. It simplifies the error handling in Decode (and even applies to the
-// success case).
-class DecompressDestroyer {
- public:
-  DecompressDestroyer() : cinfo_(NULL) {
-  }
-  ~DecompressDestroyer() {
-    DestroyManagedObject();
-  }
-  void SetManagedObject(jpeg_decompress_struct* ci) {
-    DestroyManagedObject();
-    cinfo_ = ci;
-  }
-  void DestroyManagedObject() {
-    if (cinfo_) {
-      jpeg_destroy_decompress(cinfo_);
-      cinfo_ = NULL;
-    }
-  }
- private:
-  jpeg_decompress_struct* cinfo_;
-};
-
-}  // namespace
-
-bool JPEGCodec::Decode(const unsigned char* input, size_t input_size,
-                       ColorFormat format, std::vector<unsigned char>* output,
-                       int* w, int* h) {
-  jpeg_decompress_struct cinfo;
-  DecompressDestroyer destroyer;
-  destroyer.SetManagedObject(&cinfo);
-  output->clear();
-
-  // We set up the normal JPEG error routines, then override error_exit.
-  // This must be done before the call to create_decompress.
-  CoderErrorMgr errmgr;
-  cinfo.err = jpeg_std_error(&errmgr.pub);
-  errmgr.pub.error_exit = ErrorExit;
-  // Establish the setjmp return context for ErrorExit to use.
-  if (setjmp(errmgr.setjmp_buffer)) {
-    // If we get here, the JPEG code has signaled an error.
-    // See note in JPEGCodec::Encode() for why we need to destroy the cinfo
-    // manually here.
-    destroyer.DestroyManagedObject();
-    return false;
-  }
-
-  // The destroyer will destroy() cinfo on exit.  We don't want to set the
-  // destroyer's object until cinfo is initialized.
-  jpeg_create_decompress(&cinfo);
-
-  // set up the source manager
-  jpeg_source_mgr srcmgr;
-  srcmgr.init_source = InitSource;
-  srcmgr.fill_input_buffer = FillInputBuffer;
-  srcmgr.skip_input_data = SkipInputData;
-  srcmgr.resync_to_restart = jpeg_resync_to_restart;  // use default routine
-  srcmgr.term_source = TermSource;
-  cinfo.src = &srcmgr;
-
-  JpegDecoderState state(input, input_size);
-  cinfo.client_data = &state;
-
-  // fill the file metadata into our buffer
-  if (jpeg_read_header(&cinfo, true) != JPEG_HEADER_OK)
-    return false;
-
-  // we want to always get RGB data out
-  switch (cinfo.jpeg_color_space) {
-    case JCS_GRAYSCALE:
-    case JCS_RGB:
-    case JCS_YCbCr:
-#ifdef JCS_EXTENSIONS
-      // Choose an output colorspace and return if it is an unsupported one.
-      // Same as JPEGCodec::Encode(), libjpeg-turbo supports all input formats
-      // used by Chromium (i.e. RGB, RGBA, and BGRA) and we just map the input
-      // parameters to a colorspace.
-      if (format == FORMAT_RGB) {
-        cinfo.out_color_space = JCS_RGB;
-        cinfo.output_components = 3;
-      } else if (format == FORMAT_RGBA ||
-                 (format == FORMAT_SkBitmap && SK_R32_SHIFT == 0)) {
-        cinfo.out_color_space = JCS_EXT_RGBX;
-        cinfo.output_components = 4;
-      } else if (format == FORMAT_BGRA ||
-                 (format == FORMAT_SkBitmap && SK_B32_SHIFT == 0)) {
-        cinfo.out_color_space = JCS_EXT_BGRX;
-        cinfo.output_components = 4;
-      } else {
-        // We can exit this function without calling jpeg_destroy_decompress()
-        // because DecompressDestroyer automaticaly calls it.
-        NOTREACHED() << "Invalid pixel format";
-        return false;
-      }
-#else
-      cinfo.out_color_space = JCS_RGB;
-#endif
-      break;
-    case JCS_CMYK:
-    case JCS_YCCK:
-    default:
-      // Mozilla errors out on these color spaces, so I presume that the jpeg
-      // library can't do automatic color space conversion for them. We don't
-      // care about these anyway.
-      return false;
-  }
-#ifndef JCS_EXTENSIONS
-  cinfo.output_components = 3;
-#endif
-
-  jpeg_calc_output_dimensions(&cinfo);
-  *w = cinfo.output_width;
-  *h = cinfo.output_height;
-
-  jpeg_start_decompress(&cinfo);
-
-  // FIXME(brettw) we may want to allow the capability for callers to request
-  // how to align row lengths as we do for the compressor.
-  int row_read_stride = cinfo.output_width * cinfo.output_components;
-
-#ifdef JCS_EXTENSIONS
-  // Create memory for a decoded image and write decoded lines to the memory
-  // without conversions same as JPEGCodec::Encode().
-  int row_write_stride = row_read_stride;
-  output->resize(row_write_stride * cinfo.output_height);
-
-  for (int row = 0; row < static_cast<int>(cinfo.output_height); row++) {
-    unsigned char* rowptr = &(*output)[row * row_write_stride];
-    if (!jpeg_read_scanlines(&cinfo, &rowptr, 1))
-      return false;
-  }
-#else
-  if (format == FORMAT_RGB) {
-    // easy case, row needs no conversion
-    int row_write_stride = row_read_stride;
-    output->resize(row_write_stride * cinfo.output_height);
-
-    for (int row = 0; row < static_cast<int>(cinfo.output_height); row++) {
-      unsigned char* rowptr = &(*output)[row * row_write_stride];
-      if (!jpeg_read_scanlines(&cinfo, &rowptr, 1))
-        return false;
-    }
-  } else {
-    // Rows need conversion to output format: read into a temporary buffer and
-    // expand to the final one. Performance: we could avoid the extra
-    // allocation by doing the expansion in-place.
-    int row_write_stride;
-    void (*converter)(const unsigned char* rgb, int w, unsigned char* out);
-    if (format == FORMAT_RGBA ||
-        (format == FORMAT_SkBitmap && SK_R32_SHIFT == 0)) {
-      row_write_stride = cinfo.output_width * 4;
-      converter = AddAlpha;
-    } else if (format == FORMAT_BGRA ||
-               (format == FORMAT_SkBitmap && SK_B32_SHIFT == 0)) {
-      row_write_stride = cinfo.output_width * 4;
-      converter = RGBtoBGRA;
-    } else {
-      NOTREACHED() << "Invalid pixel format";
-      jpeg_destroy_decompress(&cinfo);
-      return false;
-    }
-
-    output->resize(row_write_stride * cinfo.output_height);
-
-    scoped_ptr<unsigned char[]> row_data(new unsigned char[row_read_stride]);
-    unsigned char* rowptr = row_data.get();
-    for (int row = 0; row < static_cast<int>(cinfo.output_height); row++) {
-      if (!jpeg_read_scanlines(&cinfo, &rowptr, 1))
-        return false;
-      converter(rowptr, *w, &(*output)[row * row_write_stride]);
-    }
-  }
-#endif
-
-  jpeg_finish_decompress(&cinfo);
-  jpeg_destroy_decompress(&cinfo);
-  return true;
-}
-
-// static
-SkBitmap* JPEGCodec::Decode(const unsigned char* input, size_t input_size) {
-  int w, h;
-  std::vector<unsigned char> data_vector;
-  if (!Decode(input, input_size, FORMAT_SkBitmap, &data_vector, &w, &h))
-    return NULL;
-
-  // Skia only handles 32 bit images.
-  int data_length = w * h * 4;
-
-  SkBitmap* bitmap = new SkBitmap();
-  bitmap->allocN32Pixels(w, h);
-  memcpy(bitmap->getAddr32(0, 0), &data_vector[0], data_length);
-
-  return bitmap;
-}
-
-}  // namespace gfx
diff --git a/ui/gfx/codec/jpeg_codec.h b/ui/gfx/codec/jpeg_codec.h
deleted file mode 100644
index 8219221..0000000
--- a/ui/gfx/codec/jpeg_codec.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GFX_CODEC_JPEG_CODEC_H_
-#define UI_GFX_CODEC_JPEG_CODEC_H_
-
-#include <stddef.h>
-#include <vector>
-
-#include "ui/gfx/gfx_export.h"
-
-class SkBitmap;
-
-namespace gfx {
-
-// Interface for encoding/decoding JPEG data. This is a wrapper around libjpeg,
-// which has an inconvenient interface for callers. This is only used for UI
-// elements, WebKit has its own more complicated JPEG decoder which handles,
-// among other things, partially downloaded data.
-class GFX_EXPORT JPEGCodec {
- public:
-  enum ColorFormat {
-    // 3 bytes per pixel (packed), in RGB order regardless of endianness.
-    // This is the native JPEG format.
-    FORMAT_RGB,
-
-    // 4 bytes per pixel, in RGBA order in mem regardless of endianness.
-    FORMAT_RGBA,
-
-    // 4 bytes per pixel, in BGRA order in mem regardless of endianness.
-    // This is the default Windows DIB order.
-    FORMAT_BGRA,
-
-    // 4 bytes per pixel, it can be either RGBA or BGRA. It depends on the bit
-    // order in kARGB_8888_Config skia bitmap.
-    FORMAT_SkBitmap
-  };
-
-  enum LibraryVariant {
-    SYSTEM_LIBJPEG = 0,
-    LIBJPEG_TURBO,
-    IJG_LIBJPEG,
-  };
-
-  // This method helps identify at run time which library chromium is using.
-  static LibraryVariant JpegLibraryVariant();
-
-  // Encodes the given raw 'input' data, with each pixel being represented as
-  // given in 'format'. The encoded JPEG data will be written into the supplied
-  // vector and true will be returned on success. On failure (false), the
-  // contents of the output buffer are undefined.
-  //
-  // w, h: dimensions of the image
-  // row_byte_width: the width in bytes of each row. This may be greater than
-  //   w * bytes_per_pixel if there is extra padding at the end of each row
-  //   (often, each row is padded to the next machine word).
-  // quality: an integer in the range 0-100, where 100 is the highest quality.
-  static bool Encode(const unsigned char* input, ColorFormat format,
-                     int w, int h, int row_byte_width,
-                     int quality, std::vector<unsigned char>* output);
-
-  // Decodes the JPEG data contained in input of length input_size. The
-  // decoded data will be placed in *output with the dimensions in *w and *h
-  // on success (returns true). This data will be written in the'format'
-  // format. On failure, the values of these output variables is undefined.
-  static bool Decode(const unsigned char* input, size_t input_size,
-                     ColorFormat format, std::vector<unsigned char>* output,
-                     int* w, int* h);
-
-  // Decodes the JPEG data contained in input of length input_size. If
-  // successful, a SkBitmap is created and returned. It is up to the caller
-  // to delete the returned bitmap.
-  static SkBitmap* Decode(const unsigned char* input, size_t input_size);
-};
-
-}  // namespace gfx
-
-#endif  // UI_GFX_CODEC_JPEG_CODEC_H_
diff --git a/ui/gfx/codec/jpeg_codec_unittest.cc b/ui/gfx/codec/jpeg_codec_unittest.cc
deleted file mode 100644
index 7a8756a..0000000
--- a/ui/gfx/codec/jpeg_codec_unittest.cc
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <math.h>
-
-#include "base/basictypes.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/codec/jpeg_codec.h"
-
-namespace {
-
-// A JPEG image used by TopSitesMigrationTest, whose size is 1x1.
-// This image causes an invalid-read error to libjpeg-turbo 1.0.1.
-const uint8 kTopSitesMigrationTestImage[] =
-    "\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x00\x00\x01"
-    "\x00\x01\x00\x00\xff\xdb\x00\x43\x00\x03\x02\x02\x03\x02\x02\x03"
-    "\x03\x03\x03\x04\x03\x03\x04\x05\x08\x05\x05\x04\x04\x05\x0a\x07"
-    "\x07\x06\x08\x0c\x0a\x0c\x0c\x0b\x0a\x0b\x0b\x0d\x0e\x12\x10\x0d"
-    "\x0e\x11\x0e\x0b\x0b\x10\x16\x10\x11\x13\x14\x15\x15\x15\x0c\x0f"
-    "\x17\x18\x16\x14\x18\x12\x14\x15\x14\xff\xdb\x00\x43\x01\x03\x04"
-    "\x04\x05\x04\x05\x09\x05\x05\x09\x14\x0d\x0b\x0d\x14\x14\x14\x14"
-    "\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14"
-    "\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14"
-    "\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\xff\xc0"
-    "\x00\x11\x08\x00\x01\x00\x01\x03\x01\x22\x00\x02\x11\x01\x03\x11"
-    "\x01\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00"
-    "\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09"
-    "\x0a\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05"
-    "\x05\x04\x04\x00\x00\x01\x7d\x01\x02\x03\x00\x04\x11\x05\x12\x21"
-    "\x31\x41\x06\x13\x51\x61\x07\x22\x71\x14\x32\x81\x91\xa1\x08\x23"
-    "\x42\xb1\xc1\x15\x52\xd1\xf0\x24\x33\x62\x72\x82\x09\x0a\x16\x17"
-    "\x18\x19\x1a\x25\x26\x27\x28\x29\x2a\x34\x35\x36\x37\x38\x39\x3a"
-    "\x43\x44\x45\x46\x47\x48\x49\x4a\x53\x54\x55\x56\x57\x58\x59\x5a"
-    "\x63\x64\x65\x66\x67\x68\x69\x6a\x73\x74\x75\x76\x77\x78\x79\x7a"
-    "\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99"
-    "\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7"
-    "\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5"
-    "\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1"
-    "\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03"
-    "\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01"
-    "\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\xff\xc4\x00\xb5\x11\x00"
-    "\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\x00\x01\x02\x77\x00"
-    "\x01\x02\x03\x11\x04\x05\x21\x31\x06\x12\x41\x51\x07\x61\x71\x13"
-    "\x22\x32\x81\x08\x14\x42\x91\xa1\xb1\xc1\x09\x23\x33\x52\xf0\x15"
-    "\x62\x72\xd1\x0a\x16\x24\x34\xe1\x25\xf1\x17\x18\x19\x1a\x26\x27"
-    "\x28\x29\x2a\x35\x36\x37\x38\x39\x3a\x43\x44\x45\x46\x47\x48\x49"
-    "\x4a\x53\x54\x55\x56\x57\x58\x59\x5a\x63\x64\x65\x66\x67\x68\x69"
-    "\x6a\x73\x74\x75\x76\x77\x78\x79\x7a\x82\x83\x84\x85\x86\x87\x88"
-    "\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6"
-    "\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4"
-    "\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2"
-    "\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9"
-    "\xfa\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00\x3f\x00\xf9"
-    "\xd2\x8a\x28\xaf\xc3\x0f\xf5\x4c\xff\xd9";
-
-}  // namespace
-
-namespace gfx {
-
-// out of 100, this indicates how compressed it will be, this should be changed
-// with jpeg equality threshold
-// static int jpeg_quality = 75;  // FIXME(brettw)
-static int jpeg_quality = 100;
-
-// The threshold of average color differences where we consider two images
-// equal. This number was picked to be a little above the observed difference
-// using the above quality.
-static double jpeg_equality_threshold = 1.0;
-
-// Computes the average difference between each value in a and b. A and b
-// should be the same size. Used to see if two images are approximately equal
-// in the presence of compression.
-static double AveragePixelDelta(const std::vector<unsigned char>& a,
-                                const std::vector<unsigned char>& b) {
-  // if the sizes are different, say the average difference is the maximum
-  if (a.size() != b.size())
-    return 255.0;
-  if (a.empty())
-    return 0;  // prevent divide by 0 below
-
-  double acc = 0.0;
-  for (size_t i = 0; i < a.size(); i++)
-    acc += fabs(static_cast<double>(a[i]) - static_cast<double>(b[i]));
-
-  return acc / static_cast<double>(a.size());
-}
-
-static void MakeRGBImage(int w, int h, std::vector<unsigned char>* dat) {
-  dat->resize(w * h * 3);
-  for (int y = 0; y < h; y++) {
-    for (int x = 0; x < w; x++) {
-      unsigned char* org_px = &(*dat)[(y * w + x) * 3];
-      org_px[0] = x * 3;      // r
-      org_px[1] = x * 3 + 1;  // g
-      org_px[2] = x * 3 + 2;  // b
-    }
-  }
-}
-
-TEST(JPEGCodec, EncodeDecodeRGB) {
-  int w = 20, h = 20;
-
-  // create an image with known values
-  std::vector<unsigned char> original;
-  MakeRGBImage(w, h, &original);
-
-  // encode, making sure it was compressed some
-  std::vector<unsigned char> encoded;
-  EXPECT_TRUE(JPEGCodec::Encode(&original[0], JPEGCodec::FORMAT_RGB, w, h,
-                                w * 3, jpeg_quality, &encoded));
-  EXPECT_GT(original.size(), encoded.size());
-
-  // decode, it should have the same size as the original
-  std::vector<unsigned char> decoded;
-  int outw, outh;
-  EXPECT_TRUE(JPEGCodec::Decode(&encoded[0], encoded.size(),
-                                JPEGCodec::FORMAT_RGB, &decoded,
-                                &outw, &outh));
-  ASSERT_EQ(w, outw);
-  ASSERT_EQ(h, outh);
-  ASSERT_EQ(original.size(), decoded.size());
-
-  // Images must be approximately equal (compression will have introduced some
-  // minor artifacts).
-  ASSERT_GE(jpeg_equality_threshold, AveragePixelDelta(original, decoded));
-}
-
-TEST(JPEGCodec, EncodeDecodeRGBA) {
-  int w = 20, h = 20;
-
-  // create an image with known values, a must be opaque because it will be
-  // lost during compression
-  std::vector<unsigned char> original;
-  original.resize(w * h * 4);
-  for (int y = 0; y < h; y++) {
-    for (int x = 0; x < w; x++) {
-      unsigned char* org_px = &original[(y * w + x) * 4];
-      org_px[0] = x * 3;      // r
-      org_px[1] = x * 3 + 1;  // g
-      org_px[2] = x * 3 + 2;  // b
-      org_px[3] = 0xFF;       // a (opaque)
-    }
-  }
-
-  // encode, making sure it was compressed some
-  std::vector<unsigned char> encoded;
-  EXPECT_TRUE(JPEGCodec::Encode(&original[0], JPEGCodec::FORMAT_RGBA, w, h,
-                                w * 4, jpeg_quality, &encoded));
-  EXPECT_GT(original.size(), encoded.size());
-
-  // decode, it should have the same size as the original
-  std::vector<unsigned char> decoded;
-  int outw, outh;
-  EXPECT_TRUE(JPEGCodec::Decode(&encoded[0], encoded.size(),
-                                JPEGCodec::FORMAT_RGBA, &decoded,
-                                &outw, &outh));
-  ASSERT_EQ(w, outw);
-  ASSERT_EQ(h, outh);
-  ASSERT_EQ(original.size(), decoded.size());
-
-  // Images must be approximately equal (compression will have introduced some
-  // minor artifacts).
-  ASSERT_GE(jpeg_equality_threshold, AveragePixelDelta(original, decoded));
-}
-
-// Test that corrupted data decompression causes failures.
-TEST(JPEGCodec, DecodeCorrupted) {
-  int w = 20, h = 20;
-
-  // some random data (an uncompressed image)
-  std::vector<unsigned char> original;
-  MakeRGBImage(w, h, &original);
-
-  // it should fail when given non-JPEG compressed data
-  std::vector<unsigned char> output;
-  int outw, outh;
-  ASSERT_FALSE(JPEGCodec::Decode(&original[0], original.size(),
-                                 JPEGCodec::FORMAT_RGB, &output,
-                                 &outw, &outh));
-
-  // make some compressed data
-  std::vector<unsigned char> compressed;
-  ASSERT_TRUE(JPEGCodec::Encode(&original[0], JPEGCodec::FORMAT_RGB, w, h,
-                                w * 3, jpeg_quality, &compressed));
-
-  // try decompressing a truncated version
-  ASSERT_FALSE(JPEGCodec::Decode(&compressed[0], compressed.size() / 2,
-                                 JPEGCodec::FORMAT_RGB, &output,
-                                 &outw, &outh));
-
-  // corrupt it and try decompressing that
-  for (int i = 10; i < 30; i++)
-    compressed[i] = i;
-  ASSERT_FALSE(JPEGCodec::Decode(&compressed[0], compressed.size(),
-                                 JPEGCodec::FORMAT_RGB, &output,
-                                 &outw, &outh));
-}
-
-// Test that we can decode JPEG images without invalid-read errors on valgrind.
-// This test decodes a 1x1 JPEG image and writes the decoded RGB (or RGBA) pixel
-// to the output buffer without OOB reads.
-TEST(JPEGCodec, InvalidRead) {
-  std::vector<unsigned char> output;
-  int outw, outh;
-  JPEGCodec::Decode(kTopSitesMigrationTestImage,
-                    arraysize(kTopSitesMigrationTestImage),
-                    JPEGCodec::FORMAT_RGB, &output,
-                    &outw, &outh);
-
-  JPEGCodec::Decode(kTopSitesMigrationTestImage,
-                    arraysize(kTopSitesMigrationTestImage),
-                    JPEGCodec::FORMAT_RGBA, &output,
-                    &outw, &outh);
-}
-
-}  // namespace gfx
