/*
 * Copyright (C) 2013 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "core/layout/ImageQualityController.h"

#include "core/frame/FrameView.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/Settings.h"
#include "core/layout/LayoutObject.h"
#include "core/page/ChromeClient.h"
#include "core/page/Page.h"

namespace blink {

const double ImageQualityController::cLowQualityTimeThreshold =
    0.500;                                                            // 500 ms
const double ImageQualityController::cTimerRestartThreshold = 0.250;  // 250 ms

static ImageQualityController* gImageQualityController = nullptr;

ImageQualityController* ImageQualityController::imageQualityController() {
  if (!gImageQualityController)
    gImageQualityController = new ImageQualityController;

  return gImageQualityController;
}

void ImageQualityController::remove(LayoutObject& layoutObject) {
  if (gImageQualityController) {
    gImageQualityController->objectDestroyed(layoutObject);
    if (gImageQualityController->isEmpty()) {
      delete gImageQualityController;
      gImageQualityController = nullptr;
    }
  }
}

bool ImageQualityController::has(const LayoutObject& layoutObject) {
  return gImageQualityController &&
         gImageQualityController->m_objectLayerSizeMap.contains(&layoutObject);
}

InterpolationQuality ImageQualityController::chooseInterpolationQuality(
    const LayoutObject& object,
    Image* image,
    const void* layer,
    const LayoutSize& layoutSize) {
  if (object.style()->imageRendering() == ImageRenderingPixelated)
    return InterpolationNone;

  if (InterpolationDefault == InterpolationLow)
    return InterpolationLow;

  if (shouldPaintAtLowQuality(
          object, image, layer, layoutSize,
          object.frameView()->page()->chromeClient().lastFrameTimeMonotonic()))
    return InterpolationLow;

  // For images that are potentially animated we paint them at medium quality.
  if (image && image->maybeAnimated())
    return InterpolationMedium;

  return InterpolationDefault;
}

ImageQualityController::~ImageQualityController() {
  // This will catch users of ImageQualityController that forget to call cleanUp.
  ASSERT(!gImageQualityController || gImageQualityController->isEmpty());
}

ImageQualityController::ImageQualityController()
    : m_timer(wrapUnique(new Timer<ImageQualityController>(
          this,
          &ImageQualityController::highQualityRepaintTimerFired))),
      m_frameTimeWhenTimerStarted(0.0) {}

void ImageQualityController::setTimer(std::unique_ptr<TimerBase> newTimer) {
  m_timer = std::move(newTimer);
}

void ImageQualityController::removeLayer(const LayoutObject& object,
                                         LayerSizeMap* innerMap,
                                         const void* layer) {
  if (innerMap) {
    innerMap->remove(layer);
    if (innerMap->isEmpty())
      objectDestroyed(object);
  }
}

void ImageQualityController::set(const LayoutObject& object,
                                 LayerSizeMap* innerMap,
                                 const void* layer,
                                 const LayoutSize& size,
                                 bool isResizing) {
  if (innerMap) {
    innerMap->set(layer, size);
    m_objectLayerSizeMap.find(&object)->value.isResizing = isResizing;
  } else {
    ObjectResizeInfo newResizeInfo;
    newResizeInfo.layerSizeMap.set(layer, size);
    newResizeInfo.isResizing = isResizing;
    m_objectLayerSizeMap.set(&object, newResizeInfo);
  }
}

void ImageQualityController::objectDestroyed(const LayoutObject& object) {
  m_objectLayerSizeMap.remove(&object);
  if (m_objectLayerSizeMap.isEmpty()) {
    m_timer->stop();
  }
}

void ImageQualityController::highQualityRepaintTimerFired(TimerBase*) {
  for (auto& i : m_objectLayerSizeMap) {
    // Only invalidate the object if it is animating.
    if (!i.value.isResizing)
      continue;

    // TODO(wangxianzhu): Use LayoutObject::getMutableForPainting().
    const_cast<LayoutObject*>(i.key)->setShouldDoFullPaintInvalidation();
    i.value.isResizing = false;
  }
  m_frameTimeWhenTimerStarted = 0.0;
}

void ImageQualityController::restartTimer(double lastFrameTimeMonotonic) {
  if (!m_timer->isActive() || lastFrameTimeMonotonic == 0.0 ||
      m_frameTimeWhenTimerStarted == 0.0 ||
      (lastFrameTimeMonotonic - m_frameTimeWhenTimerStarted >
       cTimerRestartThreshold)) {
    m_timer->startOneShot(cLowQualityTimeThreshold, BLINK_FROM_HERE);
    m_frameTimeWhenTimerStarted = lastFrameTimeMonotonic;
  }
}

bool ImageQualityController::shouldPaintAtLowQuality(
    const LayoutObject& object,
    Image* image,
    const void* layer,
    const LayoutSize& layoutSize,
    double lastFrameTimeMonotonic) {
  // If the image is not a bitmap image, then none of this is relevant and we just paint at high
  // quality.
  if (!image || !image->isBitmapImage())
    return false;

  if (!layer)
    return false;

  if (object.style()->imageRendering() == ImageRenderingOptimizeContrast)
    return true;

  if (LocalFrame* frame = object.frame()) {
    if (frame->settings() &&
        frame->settings()->useDefaultImageInterpolationQuality())
      return false;
  }

  // Look ourselves up in the hashtables.
  ObjectLayerSizeMap::iterator i = m_objectLayerSizeMap.find(&object);
  LayerSizeMap* innerMap = nullptr;
  bool objectIsResizing = false;
  if (i != m_objectLayerSizeMap.end()) {
    innerMap = &i->value.layerSizeMap;
    objectIsResizing = i->value.isResizing;
  }
  LayoutSize oldSize;
  bool isFirstResize = true;
  if (innerMap) {
    LayerSizeMap::iterator j = innerMap->find(layer);
    if (j != innerMap->end()) {
      isFirstResize = false;
      oldSize = j->value;
    }
  }

  if (layoutSize == image->size()) {
    // There is no scale in effect. If we had a scale in effect before, we can just remove this object from the list.
    removeLayer(object, innerMap, layer);
    return false;
  }

  // If an animated resize is active for this object, paint in low quality and kick the timer ahead.
  if (objectIsResizing) {
    bool sizesChanged = oldSize != layoutSize;
    set(object, innerMap, layer, layoutSize, sizesChanged);
    if (sizesChanged)
      restartTimer(lastFrameTimeMonotonic);
    return true;
  }
  // If this is the first time resizing this image, or its size is the
  // same as the last resize, draw at high res, but record the paint
  // size and set the timer.
  if (isFirstResize || oldSize == layoutSize) {
    restartTimer(lastFrameTimeMonotonic);
    set(object, innerMap, layer, layoutSize, false);
    return false;
  }
  // If the timer is no longer active, draw at high quality and don't
  // set the timer.
  if (!m_timer->isActive()) {
    removeLayer(object, innerMap, layer);
    return false;
  }
  // This object has been resized to two different sizes while the timer
  // is active, so draw at low quality, set the flag for animated resizes and
  // the object to the list for high quality redraw.
  set(object, innerMap, layer, layoutSize, true);
  restartTimer(lastFrameTimeMonotonic);
  return true;
}

}  // namespace blink
