Backed out changeset 9e4626f6062b (bug 1045929)
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Mon, 12 Jan 2015 15:35:12 +0100
changeset 249186 48028fd5c776f176701445fa927004ed2b4f8ae8
parent 249185 6a80f8abd749faea0ab28cdb3ed8bf6098573360
child 249187 2adce13cb838fcaba2e401de85cb461199a4ba2a
push id4489
push userraliiev@mozilla.com
push dateMon, 23 Feb 2015 15:17:55 +0000
treeherdermozilla-beta@fd7c3dc24146 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1045929
milestone37.0a1
backs out9e4626f6062b21a3760b96998a41b64458a295ea
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changeset 9e4626f6062b (bug 1045929)
image/src/Downscaler.cpp
image/src/Downscaler.h
image/src/moz.build
deleted file mode 100644
--- a/image/src/Downscaler.cpp
+++ /dev/null
@@ -1,221 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "Downscaler.h"
-
-#include <algorithm>
-#include <ctime>
-#include "gfxPrefs.h"
-#include "image_operations.h"
-#include "convolver.h"
-#include "skia/SkTypes.h"
-
-using std::max;
-using std::swap;
-
-namespace mozilla {
-namespace image {
-
-Downscaler::Downscaler(const nsIntSize& aTargetSize)
-  : mTargetSize(aTargetSize)
-  , mOutputBuffer(nullptr)
-  , mXFilter(MakeUnique<skia::ConvolutionFilter1D>())
-  , mYFilter(MakeUnique<skia::ConvolutionFilter1D>())
-  , mWindowCapacity(0)
-  , mHasAlpha(true)
-{
-  MOZ_ASSERT(gfxPrefs::ImageDownscaleDuringDecodeEnabled(),
-             "Downscaling even though downscale-during-decode is disabled?");
-  MOZ_ASSERT(mTargetSize.width > 0 && mTargetSize.height > 0,
-             "Invalid target size");
-}
-
-Downscaler::~Downscaler()
-{
-  ReleaseWindow();
-}
-
-void
-Downscaler::ReleaseWindow()
-{
-  if (!mWindow) {
-    return;
-  }
-
-  for (int32_t i = 0; i < mWindowCapacity; ++i) {
-    delete[] mWindow[i];
-  }
-
-  mWindow = nullptr;
-  mWindowCapacity = 0;
-}
-
-nsresult
-Downscaler::BeginFrame(const nsIntSize& aOriginalSize,
-                       uint8_t* aOutputBuffer,
-                       bool aHasAlpha)
-{
-  MOZ_ASSERT(aOutputBuffer);
-  MOZ_ASSERT(mTargetSize != aOriginalSize,
-             "Created a downscaler, but not downscaling?");
-  MOZ_ASSERT(mTargetSize.width <= aOriginalSize.width,
-             "Created a downscaler, but width is larger");
-  MOZ_ASSERT(mTargetSize.height <= aOriginalSize.height,
-             "Created a downscaler, but height is larger");
-  MOZ_ASSERT(aOriginalSize.width > 0 && aOriginalSize.height > 0,
-             "Invalid original size");
-
-  mOriginalSize = aOriginalSize;
-  mOutputBuffer = aOutputBuffer;
-  mHasAlpha = aHasAlpha;
-
-  ResetForNextProgressivePass();
-  ReleaseWindow();
-
-  auto resizeMethod = skia::ImageOperations::RESIZE_LANCZOS3;
-
-  skia::resize::ComputeFilters(resizeMethod, mOriginalSize.width,
-                               mTargetSize.width, 0,
-                               mTargetSize.width, mXFilter.get());
-
-  skia::resize::ComputeFilters(resizeMethod, mOriginalSize.height,
-                               mTargetSize.height, 0,
-                               mTargetSize.height, mYFilter.get());
-
-  // Allocate the buffer, which contains scanlines of the original image.
-  mRowBuffer = MakeUnique<uint8_t[]>(mOriginalSize.width * sizeof(uint32_t));
-  if (MOZ_UNLIKELY(!mRowBuffer)) {
-    return NS_ERROR_OUT_OF_MEMORY;
-  }
-
-  // Allocate the window, which contains horizontally downscaled scanlines. (We
-  // can store scanlines which are already downscale because our downscaling
-  // filter is separable.)
-  mWindowCapacity = mYFilter->max_filter();
-  mWindow = MakeUnique<uint8_t*[]>(mWindowCapacity);
-  if (MOZ_UNLIKELY(!mWindow)) {
-    return NS_ERROR_OUT_OF_MEMORY;
-  }
-
-  bool anyAllocationFailed = false;
-  const int rowSize = mTargetSize.width * sizeof(uint32_t);
-  for (int32_t i = 0; i < mWindowCapacity; ++i) {
-    mWindow[i] = new uint8_t[rowSize];
-    anyAllocationFailed = anyAllocationFailed || mWindow[i] == nullptr;
-  }
-
-  if (MOZ_UNLIKELY(anyAllocationFailed)) {
-    // We intentionally iterate through the entire array even if an allocation
-    // fails, to ensure that all the pointers in it are either valid or nullptr.
-    // That in turn ensures that ReleaseWindow() can clean up correctly.
-    return NS_ERROR_OUT_OF_MEMORY;
-  }
-
-  printf("*** Downscaler::mWindowCapacity = %u\n", mWindowCapacity);
-
-  return NS_OK;
-}
-
-void
-Downscaler::ResetForNextProgressivePass()
-{
-  mPrevInvalidatedLine = 0;
-  mCurrentOutLine = 0;
-  mCurrentInLine = 0;
-  mLinesInBuffer = 0;
-}
-
-void
-Downscaler::CommitRow()
-{
-  MOZ_ASSERT(mOutputBuffer, "Should have a current frame");
-  MOZ_ASSERT(mCurrentInLine < mOriginalSize.height, "Past end of input");
-  MOZ_ASSERT(mCurrentOutLine < mTargetSize.height, "Past end of output");
-
-  int32_t filterOffset = 0;
-  int32_t filterLength = 0;
-  mYFilter->FilterForValue(mCurrentOutLine, &filterOffset, &filterLength);
-
-  int32_t inLineToRead = filterOffset + mLinesInBuffer;
-  MOZ_ASSERT(mCurrentInLine <= inLineToRead, "Reading past end of input");
-  if (mCurrentInLine == inLineToRead) {
-    skia::ConvolveHorizontally(mRowBuffer.get(), *mXFilter,
-                               mWindow[mLinesInBuffer++], mHasAlpha,
-                               /* use_sse2 = */ true);
-  }
-
-  while (mLinesInBuffer == filterLength &&
-         mCurrentOutLine < mTargetSize.height) {
-    DownscaleInputLine();
-    mYFilter->FilterForValue(mCurrentOutLine, &filterOffset, &filterLength);
-  }
-
-  mCurrentInLine += 1;
-}
-
-bool
-Downscaler::HasInvalidation() const
-{
-  return mCurrentOutLine > mPrevInvalidatedLine;
-}
-
-nsIntRect
-Downscaler::TakeInvalidRect()
-{
-  if (MOZ_UNLIKELY(!HasInvalidation())) {
-    return nsIntRect();
-  }
-
-  nsIntRect invalidRect(0, mPrevInvalidatedLine,
-                        mTargetSize.width,
-                        mCurrentOutLine - mPrevInvalidatedLine);
-  mPrevInvalidatedLine = mCurrentOutLine;
-  return invalidRect;
-}
-
-void
-Downscaler::DownscaleInputLine()
-{
-  typedef skia::ConvolutionFilter1D::Fixed FilterValue;
-
-  MOZ_ASSERT(mOutputBuffer);
-  MOZ_ASSERT(mCurrentOutLine < mTargetSize.height, "Writing past end of output");
-
-  int32_t filterOffset = 0;
-  int32_t filterLength = 0;
-  auto filterValues =
-    mYFilter->FilterForValue(mCurrentOutLine, &filterOffset, &filterLength);
-
-  uint8_t* outputLine =
-    &mOutputBuffer[mCurrentOutLine * mTargetSize.width * sizeof(uint32_t)];
-  skia::ConvolveVertically(static_cast<const FilterValue*>(filterValues),
-                           filterLength, mWindow.get(), mXFilter->num_values(),
-                           outputLine, mHasAlpha, /* use_sse2 = */ true);
-
-  mCurrentOutLine += 1;
-
-  if (mCurrentOutLine == mTargetSize.height) {
-    // We're done.
-    return;
-  }
-
-  int32_t newFilterOffset = 0;
-  int32_t newFilterLength = 0;
-  mYFilter->FilterForValue(mCurrentOutLine, &newFilterOffset, &newFilterLength);
-
-  int diff = newFilterOffset - filterOffset;
-  MOZ_ASSERT(diff >= 0, "Moving backwards in the filter?");
-
-  // Shift the buffer. We're just moving pointers here, so this is cheap.
-  mLinesInBuffer -= diff;
-  mLinesInBuffer = max(mLinesInBuffer, 0);
-  for (int32_t i = 0; i < mLinesInBuffer; ++i) {
-    swap(mWindow[i], mWindow[filterLength - mLinesInBuffer + i]);
-  }
-}
-
-} // namespace image
-} // namespace mozilla
deleted file mode 100644
--- a/image/src/Downscaler.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/**
- * Downscaler is a high-quality, streaming image downscaler based upon Skia's
- * scaling implementation.
- */
-
-#ifndef MOZILLA_IMAGELIB_DOWNSCALER_H_
-#define MOZILLA_IMAGELIB_DOWNSCALER_H_
-
-#include "mozilla/UniquePtr.h"
-#include "nsRect.h"
-
-#ifdef MOZ_ENABLE_SKIA
-
-namespace skia {
-  class ConvolutionFilter1D;
-} // namespace skia
-
-namespace mozilla {
-namespace image {
-
-/**
- * Downscaler is a high-quality, streaming image downscaler based upon Skia's
- * scaling implementation.
- *
- * Decoders can construct a Downscaler once they know their target size, then
- * call BeginFrame() for each frame they decode. They should write a decoded row
- * into the buffer returned by RowBuffer(), and then call CommitRow() to signal
- * that they have finished.
- *
-
- * Because invalidations need to be computed in terms of the scaled version of
- * the image, Downscaler also tracks them. Decoders can call HasInvalidation()
- * and TakeInvalidRect() instead of tracking invalidations themselves.
- */
-class Downscaler
-{
-public:
-  /// Constructs a new Downscaler which to scale to size @aTargetSize.
-  explicit Downscaler(const nsIntSize& aTargetSize);
-  ~Downscaler();
-
-  const nsIntSize& OriginalSize() const { return mOriginalSize; }
-  const nsIntSize& TargetSize() const { return mTargetSize; }
-
-  /**
-   * Begins a new frame and reinitializes the Downscaler.
-   *
-   * @param aOriginalSize The original size of this frame, before scaling.
-   * @param aOutputBuffer The buffer to which the Downscaler should write its
-   *                      output; this is the same buffer where the Decoder
-   *                      would write its output when not downscaling during
-   *                      decode.
-   * @param aHasAlpha Whether or not this frame has an alpha channel.
-   *                  Performance is a little better if it doesn't have one.
-   */
-  nsresult BeginFrame(const nsIntSize& aOriginalSize,
-                      uint8_t* aOutputBuffer,
-                      bool aHasAlpha);
-
-  /// Retrieves the buffer into which the Decoder should write each row.
-  uint8_t* RowBuffer() { return mRowBuffer.get(); }
-
-  /// Signals that the decoder has finished writing a row into the row buffer.
-  void CommitRow();
-
-  /// Returns true if there is a non-empty invalid rect available.
-  bool HasInvalidation() const;
-
-  /// Takes the Downscaler's current invalid rect and resets it.
-  nsIntRect TakeInvalidRect();
-
-  /**
-   * Resets the Downscaler's position in the image, for a new progressive pass
-   * over the same frame. Because the same data structures can be reused, this
-   * is more efficient than calling BeginFrame.
-   */
-  void ResetForNextProgressivePass();
-
-private:
-  void DownscaleInputLine();
-  void ReleaseWindow();
-
-  nsIntSize mOriginalSize;
-  nsIntSize mTargetSize;
-
-  uint8_t* mOutputBuffer;
-
-  UniquePtr<uint8_t[]> mRowBuffer;
-  UniquePtr<uint8_t*[]> mWindow;
-
-  UniquePtr<skia::ConvolutionFilter1D> mXFilter;
-  UniquePtr<skia::ConvolutionFilter1D> mYFilter;
-
-  int32_t mWindowCapacity;
-
-  int32_t mLinesInBuffer;
-  int32_t mPrevInvalidatedLine;
-  int32_t mCurrentOutLine;
-  int32_t mCurrentInLine;
-
-  bool mHasAlpha;
-};
-
-} // namespace image
-} // namespace mozilla
-
-
-#else
-
-
-/**
- * Downscaler requires Skia to work, so we provide a dummy implementation if
- * Skia is disabled that asserts if constructed.
- */
-
-namespace mozilla {
-namespace image {
-
-class Downscaler
-{
-public:
-  explicit Downscaler(const nsIntSize&)
-  {
-    MOZ_RELEASE_ASSERT("Skia is not enabled");
-  }
-
-  const nsIntSize& OriginalSize() const { return nsIntSize(); }
-  const nsIntSize& TargetSize() const { return nsIntSize(); }
-  uint8_t* Buffer() { return nullptr; }
-
-  nsresult BeginFrame(const nsIntSize&, uint8_t*, bool)
-  {
-    return NS_ERROR_FAILURE;
-  }
-
-  void CommitRow() { }
-  bool HasInvalidation() const { return false; }
-  nsIntRect TakeInvalidRect() { return nsIntRect(); }
-  void ResetForNextProgressivePass() { }
-};
-
-
-} // namespace image
-} // namespace mozilla
-
-#endif
-
-#endif // MOZILLA_IMAGELIB_DOWNSCALER_H_
--- a/image/src/moz.build
+++ b/image/src/moz.build
@@ -14,17 +14,16 @@ EXPORTS += [
     'Orientation.h',
     'SurfaceCache.h',
 ]
 
 UNIFIED_SOURCES += [
     'ClippedImage.cpp',
     'DecodePool.cpp',
     'Decoder.cpp',
-    'Downscaler.cpp',
     'DynamicImage.cpp',
     'FrameAnimator.cpp',
     'FrozenImage.cpp',
     'Image.cpp',
     'ImageFactory.cpp',
     'ImageMetadata.cpp',
     'ImageOps.cpp',
     'ImageWrapper.cpp',
@@ -54,18 +53,16 @@ FAIL_ON_WARNINGS = True
 include('/ipc/chromium/chromium-config.mozbuild')
 
 FINAL_LIBRARY = 'xul'
 
 LOCAL_INCLUDES += [
     # Because SVGDocumentWrapper.cpp includes "mozilla/dom/SVGSVGElement.h"
     '/dom/base',
     '/dom/svg',
-    # Access to Skia headers for Downscaler
-    '/gfx/2d',
     # We need to instantiate the decoders
     '/image/decoders',
     # Because VectorImage.cpp includes nsSVGUtils.h and nsSVGEffects.h
     '/layout/svg',
     # For URI-related functionality
     '/netwerk/base/src',
 ]