/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "cobalt/renderer/rasterizer/skia/image.h"

#include "base/debug/trace_event.h"
#include "third_party/skia/include/core/SkBitmap.h"

namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace skia {

void Image::DCheckForPremultipliedAlpha(const math::Size& dimensions,
                                        int source_pitch_in_bytes,
                                        render_tree::PixelFormat pixel_format,
                                        const uint8_t* source_pixels) {
  TRACE_EVENT0("cobalt::renderer", "Image::DCheckForPremultipliedAlpha()");
  if (pixel_format == render_tree::kPixelFormatY8 ||
      pixel_format == render_tree::kPixelFormatU8 ||
      pixel_format == render_tree::kPixelFormatV8 ||
      pixel_format == render_tree::kPixelFormatUV8) {
    // These formats don't have alpha, so they are trivially good to go.
    return;
  }

  DCHECK(pixel_format == render_tree::kPixelFormatRGBA8 ||
         pixel_format == render_tree::kPixelFormatBGRA8);
  for (int row = 0; row < dimensions.height(); ++row) {
    const uint8_t* current_pixel = source_pixels + row * source_pitch_in_bytes;
    for (int column = 0; column < dimensions.width(); ++column) {
      uint8_t alpha_value = current_pixel[3];
      DCHECK_LE(current_pixel[0], alpha_value);
      DCHECK_LE(current_pixel[1], alpha_value);
      DCHECK_LE(current_pixel[2], alpha_value);
      current_pixel += 4;
    }
  }
}

}  // namespace skia
}  // namespace rasterizer
}  // namespace renderer
}  // namespace cobalt
