// Copyright 2016 The Cobalt Authors. 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.

// All pixel tests here are heavily facilitated by logic in the test fixture,
// |SbBlitterPixelTest| located in blitter_pixel_test_fixture.h.  The fixture
// will setup an environment containing:
//
//   SbBlitterDevice device_;
//   SbBlitterContext context_;
//   SbBlitterSurface surface_;
//   SbBlitterRenderTarget render_target_;
//
// All rendering calls should be made to |render_target_|, which is the render
// target associated with |surface_|.  When the test finishes, the
// |SbBlitterPixelTest| fixture object is destructed at which point |context_|
// will be flushed and the image data downloaded from |surface_| and analyzed
// against an existing expected results PNG image file named after the test.
// See blitter_pixel_test_fixture.cc for a list of command line options that
// can be used to rebaseline the expected results of these tests.  Command line
// options can also be used to have the pixel tests output test failure details
// including image diffs between the actual results and expected results.

#include "starboard/blitter.h"
#include "starboard/nplb/blitter_pixel_tests/fixture.h"
#include "testing/gtest/include/gtest/gtest.h"

#if SB_HAS(BLITTER)

namespace starboard {
namespace nplb {
namespace blitter_pixel_tests {
namespace {

TEST_F(SbBlitterPixelTest, SolidFillRed) {
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
}

TEST_F(SbBlitterPixelTest, SolidFillGreen) {
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(0, 255, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
}

TEST_F(SbBlitterPixelTest, SolidFillBlue) {
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(0, 0, 255, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
}

TEST_F(SbBlitterPixelTest, SolidFillRedBoxOnWhiteBackground) {
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 255, 255, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_,
                    SbBlitterMakeRect(GetWidth() / 4, GetHeight() / 4,
                                      GetWidth() / 2, GetHeight() / 2));
}

// Returns half of a dimension, though it will never round it down to 0.
int HalveDimension(int d) {
  SB_DCHECK(d > 0);
  return std::max(1, d / 2);
}

SbBlitterSurface CreateCheckerImageWithBlits(SbBlitterDevice device,
                                             SbBlitterContext context,
                                             SbBlitterColor color_a,
                                             SbBlitterColor color_b,
                                             int width,
                                             int height) {
  SbBlitterSurface surface = SbBlitterCreateRenderTargetSurface(
      device, width, height, kSbBlitterSurfaceFormatRGBA8);

  SbBlitterRenderTarget render_target =
      SbBlitterGetRenderTargetFromSurface(surface);
  SbBlitterSetRenderTarget(context, render_target);

  SbBlitterSetColor(context, color_a);
  SbBlitterFillRect(context, SbBlitterMakeRect(0, 0, width, height));

  int half_width = HalveDimension(width);
  int half_height = HalveDimension(height);

  SbBlitterSetColor(context, color_b);
  SbBlitterFillRect(context, SbBlitterMakeRect(0, 0, half_width, half_height));
  SbBlitterFillRect(
      context, SbBlitterMakeRect(half_width, half_height, width - half_width,
                                 height - half_height));

  return surface;
}

TEST_F(SbBlitterPixelTest, SimpleNonStretchBlitRectToRect) {
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

#if SB_HAS(BILINEAR_FILTERING_SUPPORT)
TEST_F(SbBlitterPixelTest, MagnifyBlitRectToRectInterpolated) {
#else
TEST_F(SbBlitterPixelTest, MagnifyBlitRectToRectNotInterpolated) {
#endif
  // Create an image with a height and width of 2x2.
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), 2, 2);

  // Now stretch it onto the entire target surface.
  SbBlitterSetRenderTarget(context_, render_target_);
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, 2, 2),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, MinifyBlitRectToRect) {
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterBlitRectToRect(
      context_, checker_image, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
      SbBlitterMakeRect(0, 0, GetWidth() / 8, GetHeight() / 8));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlitRectToRectPartialSourceRect) {
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterBlitRectToRect(
      context_, checker_image,
      SbBlitterMakeRect(GetWidth() / 2, 0, GetWidth() / 2, GetHeight()),
      SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlitRectToRectTiled) {
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), 8, 8);

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterBlitRectToRectTiled(
      context_, checker_image, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
      SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlitRectToRectTiledWithNoTiling) {
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterBlitRectToRectTiled(
      context_, checker_image, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
      SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlitRectToRectTiledNegativeOffset) {
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), 8, 8);

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterBlitRectToRectTiled(
      context_, checker_image,
      SbBlitterMakeRect(-GetWidth(), -GetHeight(), GetWidth(), GetHeight()),
      SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlitRectToRectTiledOffCenter) {
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth() / 2, GetHeight() / 2);

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterBlitRectToRectTiled(
      context_, checker_image,
      SbBlitterMakeRect(-GetWidth() / 2, -GetHeight() / 2, GetWidth(),
                        GetHeight()),
      SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

void DrawRectsWithBatchBlit(SbBlitterSurface texture,
                            SbBlitterContext context,
                            int width,
                            int height) {
  const int kNumRects = 8;

  SbBlitterRect src_rects[kNumRects];
  SbBlitterRect dst_rects[kNumRects];

  for (int i = 0; i < kNumRects; ++i) {
    src_rects[i].x = i * (width / kNumRects);
    src_rects[i].y = 0;
    src_rects[i].width = (width / kNumRects) / 2;
    src_rects[i].height = (i + 1) * (height / kNumRects);

    dst_rects[i].x = i * (width / kNumRects);
    dst_rects[i].y = 0;
    dst_rects[i].width = (width / kNumRects) / 2;
    dst_rects[i].height = (i + 1) * (height / kNumRects);
  }
  SbBlitterBlitRectsToRects(context, texture, src_rects, dst_rects, kNumRects);
}

TEST_F(SbBlitterPixelTest, BlitRectsToRects) {
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 0, 0, 255),
      SbBlitterColorFromRGBA(0, 0, 255, 255), GetWidth(), GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  DrawRectsWithBatchBlit(checker_image, context_, GetWidth(), GetHeight());

  SbBlitterDestroySurface(checker_image);
}

SbBlitterSurface CreateCheckerImageWithPixelData(SbBlitterDevice device,
                                                 SbBlitterColor color_a,
                                                 SbBlitterColor color_b,
                                                 int width,
                                                 int height) {
  SbBlitterPixelDataFormat pixel_data_format;

#if SB_PREFERRED_RGBA_BYTE_ORDER == SB_PREFERRED_RGBA_BYTE_ORDER_RGBA
  pixel_data_format = kSbBlitterPixelDataFormatRGBA8;
#elif SB_PREFERRED_RGBA_BYTE_ORDER == SB_PREFERRED_RGBA_BYTE_ORDER_BGRA
  pixel_data_format = kSbBlitterPixelDataFormatBGRA8;
#elif SB_PREFERRED_RGBA_BYTE_ORDER == SB_PREFERRED_RGBA_BYTE_ORDER_ARGB
  pixel_data_format = kSbBlitterPixelDataFormatARGB8;
#else
#error "Platform's preferred RGBA byte order is not yet supported."
#endif

  // RGBA byte-offsets into each pixel.
  int r, g, b, a;
  switch (pixel_data_format) {
    case kSbBlitterPixelDataFormatRGBA8: {
      r = 0;
      g = 1;
      b = 2;
      a = 3;
    } break;
    case kSbBlitterPixelDataFormatBGRA8: {
      b = 0;
      g = 1;
      r = 2;
      a = 3;
    } break;
    case kSbBlitterPixelDataFormatARGB8: {
      a = 0;
      r = 1;
      g = 2;
      b = 3;
    } break;
    default: { SB_NOTREACHED(); }
  }

  SbBlitterPixelData pixel_data =
      SbBlitterCreatePixelData(device, width, height, pixel_data_format);
  SB_CHECK(SbBlitterIsPixelDataValid(pixel_data));

  int half_width = HalveDimension(width);
  int half_height = HalveDimension(height);

  int pitch = SbBlitterGetPixelDataPitchInBytes(pixel_data);
  uint8_t* current_byte =
      static_cast<uint8_t*>(SbBlitterGetPixelDataPointer(pixel_data));
  for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
      bool use_color_a = (x < half_width) ^ (y < half_height);
      SbBlitterColor color = use_color_a ? color_a : color_b;
      float a_float = SbBlitterAFromColor(color) / 255.0f;
      current_byte[g] = SbBlitterGFromColor(color) * a_float;
      current_byte[r] = SbBlitterRFromColor(color) * a_float;
      current_byte[b] = SbBlitterBFromColor(color) * a_float;
      current_byte[a] = SbBlitterAFromColor(color);

      current_byte += 4;
    }
    current_byte += pitch - width * 4;
  }

  SbBlitterSurface surface =
      SbBlitterCreateSurfaceFromPixelData(device, pixel_data);
  SB_CHECK(SbBlitterIsSurfaceValid(surface));

  return surface;
}

SbBlitterSurface CreateAlphaCheckerImageWithPixelData(SbBlitterDevice device,
                                                      uint8_t color_a,
                                                      uint8_t color_b,
                                                      int width,
                                                      int height) {
  SbBlitterPixelData pixel_data = SbBlitterCreatePixelData(
      device, width, height, kSbBlitterPixelDataFormatA8);
  SB_CHECK(SbBlitterIsPixelDataValid(pixel_data));

  int half_width = HalveDimension(width);
  int half_height = HalveDimension(height);

  int pitch = SbBlitterGetPixelDataPitchInBytes(pixel_data);
  uint8_t* current_byte =
      static_cast<uint8_t*>(SbBlitterGetPixelDataPointer(pixel_data));
  for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
      bool use_color_a = (x < half_width) ^ (y < half_height);
      *current_byte = use_color_a ? color_a : color_b;
      ++current_byte;
    }
    current_byte += pitch - width;
  }

  SbBlitterSurface surface =
      SbBlitterCreateSurfaceFromPixelData(device, pixel_data);
  SB_CHECK(SbBlitterIsSurfaceValid(surface));

  return surface;
}

TEST_F(SbBlitterPixelTest, BlitRectToRectFromPixelData) {
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), GetHeight());

  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlitRedGreenRectToRectFromPixelData) {
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(255, 0, 0, 255),
      SbBlitterColorFromRGBA(0, 255, 0, 255), GetWidth(), GetHeight());

  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlitHalfTransparentRectToRectFromPixelData) {
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(255, 255, 255, 128), GetWidth(), GetHeight());

  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlitCanPunchThrough) {
  // This test ensures that when blending is disabled, rendering with alpha
  // can punch through the red and opaque background.
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(255, 255, 255, 128), GetWidth(), GetHeight());

  SbBlitterSetBlending(context_, false);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlitCanBlend) {
  // This test ensures that when blending is enabled, rendering with alpha
  // will blend with a red and opaque background.
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(255, 255, 255, 128), GetWidth(), GetHeight());

  SbBlitterSetBlending(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, SimpleAlphaBlitWithNoColorModulation) {
  // Tests that alpha-only surfaces blit to white with no color modulation
  // and disabled blending.
  SbBlitterSurface checker_image = CreateAlphaCheckerImageWithPixelData(
      device_, 128, 255, GetWidth(), GetHeight());

  SbBlitterSetBlending(context_, false);
  SbBlitterSetModulateBlitsWithColor(context_, false);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlendedAlphaBlitWithNoColorModulationOnRed) {
  SbBlitterSurface checker_image = CreateAlphaCheckerImageWithPixelData(
      device_, 128, 255, GetWidth(), GetHeight());

  SbBlitterSetBlending(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
  SbBlitterSetModulateBlitsWithColor(context_, false);
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, AlphaBlitWithBlueColorModulation) {
  SbBlitterSurface checker_image = CreateAlphaCheckerImageWithPixelData(
      device_, 128, 255, GetWidth(), GetHeight());

  SbBlitterSetBlending(context_, false);
  SbBlitterSetModulateBlitsWithColor(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(0, 0, 255, 255));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlendedAlphaBlitWithBlueColorModulationOnRed) {
  SbBlitterSurface checker_image = CreateAlphaCheckerImageWithPixelData(
      device_, 128, 255, GetWidth(), GetHeight());

  SbBlitterSetBlending(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
  SbBlitterSetModulateBlitsWithColor(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(0, 0, 255, 255));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlendedAlphaBlitWithAlphaColorModulationOnRed) {
  SbBlitterSurface checker_image = CreateAlphaCheckerImageWithPixelData(
      device_, 0, 255, GetWidth(), GetHeight());

  SbBlitterSetBlending(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
  SbBlitterSetModulateBlitsWithColor(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 255, 255, 128));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlendedColorBlitWithAlphaColorModulationOnRed) {
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(0, 0, 0, 255),
      SbBlitterColorFromRGBA(255, 255, 255, 255), GetWidth(), GetHeight());

  SbBlitterSetBlending(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
  SbBlitterSetModulateBlitsWithColor(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 255, 255, 128));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, BlendedColorBlitWithAlphaColorModulation) {
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(0, 0, 0, 255),
      SbBlitterColorFromRGBA(255, 255, 255, 255), GetWidth(), GetHeight());

  SbBlitterSetBlending(context_, true);
  SbBlitterSetModulateBlitsWithColor(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(0, 0, 255, 128));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, FillRectColorIsNotPremultiplied) {
  // This test checks that the color blending works fine assuming that fill rect
  // colors are specified in unpremultiplied alpha.
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
  SbBlitterSetBlending(context_, true);
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(0, 0, 255, 128));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
}

TEST_F(SbBlitterPixelTest, ScissoredFillRect) {
  // This test checks whether SbBlitterFillRect() works with scissor rectangles.
  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));
  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
}

TEST_F(SbBlitterPixelTest, ScissoredBlitRectToRect) {
  // This test checks whether SbBlitterBlitRectToRect() works with scissor
  // rectangles.
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, ScissoredBlitRectToRectWithSourceWidthOf1) {
  // This is a common scenario for rendering vertical linear gradients.
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), 1, GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, 1, GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, ScissoredBlitRectToRectWithSourceHeightOf1) {
  // This is a common scenario for rendering horizontal linear gradients.
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), 1);

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), 1),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, ScissoredBlitRectToRectPixelDataWithSourceWidthOf1) {
  // This is a common scenario for rendering vertical linear gradients.
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), 1, GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, 1, GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest,
       ScissoredBlitRectToRectPixelDataWithBlitSourceWidthOf1) {
  // This is a common scenario for rendering vertical linear gradients.
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), 8, GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(4, 0, 1, GetHeight()),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest,
       ScissoredBlitRectToRectPixelDataWithSourceHeightOf1) {
  // This is a common scenario for rendering horizontal linear gradients.
  SbBlitterSurface checker_image = CreateCheckerImageWithPixelData(
      device_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), 1);

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, GetWidth(), 1),
                          SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, ScissoredBlitRectToRectWithSourceWidthOf1AtTopLeft) {
  // This is a common scenario for rendering vertical linear gradients.  This
  // test exercises a bug that was found when rendering outside the top-left
  // corner of the render surface and scissor rectangle.
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), 1, GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(-10, -10, GetWidth(), GetHeight()));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, 1, GetHeight()),
                          SbBlitterMakeRect(-12, -12, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest,
       ScissoredBlitRectToRectWithSourceWidthOf1AtBottomRight) {
  // This is a common scenario for rendering vertical linear gradients.  This
  // test exercises a bug that was found when rendering outside the bottom-right
  // corner of the render surface and scissor rectangle.
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), 1, GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(10, 10, GetWidth() + 10, GetHeight() + 10));
  SbBlitterBlitRectToRect(context_, checker_image,
                          SbBlitterMakeRect(0, 0, 1, GetHeight()),
                          SbBlitterMakeRect(20, 20, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, ScissoredBlitRectToRectTiled) {
  // This test checks whether SbBlitterBlitRectToRectTiled() works with scissor
  // rectangles.
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));
  SbBlitterBlitRectToRectTiled(
      context_, checker_image,
      SbBlitterMakeRect(0, 0, GetWidth() * 2, GetHeight() * 2),
      SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, ScissoredBlitRectToRects) {
  // This test checks whether DrawRectsWithBatchBlit() works with scissor
  // rectangles.
  SbBlitterSurface checker_image = CreateCheckerImageWithBlits(
      device_, context_, SbBlitterColorFromRGBA(255, 255, 255, 255),
      SbBlitterColorFromRGBA(0, 0, 0, 255), GetWidth(), GetHeight());

  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));
  DrawRectsWithBatchBlit(checker_image, context_, GetWidth(), GetHeight());

  SbBlitterDestroySurface(checker_image);
}

TEST_F(SbBlitterPixelTest, ScissorResetsWhenSetRenderTargetIsCalled) {
  // This test checks that the scissor rectangle is reset whenever
  // SbBlitterSetRenderTarget() is called.
  SbBlitterSetScissor(
      context_, SbBlitterMakeRect(32, 32, GetWidth() - 48, GetHeight() - 48));

  // This call should reset the scissor rectangle to the extents of the render
  // target.
  SbBlitterSetRenderTarget(context_, render_target_);

  SbBlitterSetColor(context_, SbBlitterColorFromRGBA(255, 0, 0, 255));
  SbBlitterFillRect(context_, SbBlitterMakeRect(0, 0, GetWidth(), GetHeight()));
}

}  // namespace
}  // namespace blitter_pixel_tests
}  // namespace nplb
}  // namespace starboard

#endif  // SB_HAS(BLITTER)
