/*
 * Copyright 2019 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "gm/gm.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkImage.h"
#include "include/core/SkPaint.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkScalar.h"
#include "tools/DecodeUtils.h"
#include "tools/Resources.h"

DEF_SIMPLE_GM(skbug_8664, canvas, 830, 550) {
    const struct {
        SkScalar    fSx, fSy, fTx, fTy;
    } xforms[] = {
        { 1, 1, 0, 0 },
        { 0.5f, 0.5f, 530, 0 },
        { 0.25f, 0.25f, 530, 275 },
        { 0.125f, 0.125f, 530, 420 },
    };

    // Must be at least medium to require mipmaps when we downscale the image
    SkSamplingOptions sampling(SkFilterMode::kLinear,
                               SkMipmapMode::kLinear);

    sk_sp<SkImage> image(ToolUtils::GetResourceAsImage("images/mandrill_512.png"));

    SkPaint overlayPaint;
    overlayPaint.setColor(0x80FFFFFF);

    // Make the overlay visible even when the downscaled images fail to render
    canvas->clear(0xFF888888);

    canvas->translate(20, 20);
    for (const auto& xform : xforms) {
        canvas->save();
        canvas->translate(xform.fTx, xform.fTy);
        canvas->scale(xform.fSx, xform.fSy);

        // Draw an image, possibly down sampled, which forces us to generate mipmaps inline
        // on the second iteration.
        canvas->drawImage(image, 0, 0, sampling, nullptr);

        // Draw an overlay that requires the scissor test for its clipping, so that the mipmap
        // generation + scissor interference bug is highlighted in Adreno 330 devices.
        SkRect inner = SkRect::MakeLTRB(32.f, 32.f, 480.f, 480.f);
        SkRect outer = inner.makeOutset(16.f, 16.f);

        // Clip to smaller rectangle
        canvas->save();
        canvas->clipRect(inner);
        // Then apply a rotation and draw a larger rectangle to ensure the clip cannot be dropped
        canvas->rotate(20.f);
        canvas->drawRect(outer, overlayPaint);
        canvas->restore();

        canvas->restore();
    }
}
