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

// 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));
}

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));

  SbBlitterSetColor(context, color_b);
  SbBlitterFillRect(context, SbBlitterMakeRect(0, 0, width / 2, height / 2));
  SbBlitterFillRect(
      context, SbBlitterMakeRect(width / 2, height / 2, width / 2, height / 2));

  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()));
}

TEST_F(SbBlitterPixelTest, MagnifyBlitRectToRect) {
  // 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()));
}

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));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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());
}

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 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 < width / 2) ^ (y < height / 2);
      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 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 < width / 2) ^ (y < height / 2);
      *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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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()));
}

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());
}

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)
