// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/flow/testing/mock_texture.h"
#include "flutter/flow/layers/layer.h"
#include "flutter/testing/display_list_testing.h"

namespace flutter {
namespace testing {

sk_sp<DlImage> MockTexture::MakeTestTexture(int w, int h, int checker_size) {
  sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(w, h);
  SkCanvas* canvas = surface->getCanvas();
  SkPaint p0, p1;
  p0.setStyle(SkPaint::kFill_Style);
  p0.setColor(SK_ColorGREEN);
  p1.setStyle(SkPaint::kFill_Style);
  p1.setColor(SK_ColorBLUE);
  p1.setAlpha(128);
  for (int y = 0; y < w; y += checker_size) {
    for (int x = 0; x < h; x += checker_size) {
      SkPaint& cellp = ((x + y) & 1) == 0 ? p0 : p1;
      canvas->drawRect(SkRect::MakeXYWH(x, y, checker_size, checker_size),
                       cellp);
    }
  }
  return DlImage::Make(surface->makeImageSnapshot());
}

MockTexture::MockTexture(int64_t textureId, const sk_sp<DlImage>& texture)
    : Texture(textureId), texture_(texture) {}

void MockTexture::Paint(PaintContext& context,
                        const SkRect& bounds,
                        bool freeze,
                        const DlImageSampling sampling) {
  // MockTexture objects that are not painted are allowed to have a null
  // texture, but when we get to this method we must have a non-null texture.
  FML_DCHECK(texture_ != nullptr);
  SkRect src = SkRect::Make(texture_->bounds());
  if (freeze) {
    FML_DCHECK(src.width() > 2.0f && src.height() > 2.0f);
    src = src.makeInset(1.0f, 1.0f);
  }
  context.canvas->DrawImageRect(texture_, src, bounds, sampling, context.paint);
}

}  // namespace testing
}  // namespace flutter
