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

#ifndef SkDebugUtils_DEFINED
#define SkDebugUtils_DEFINED

#include "include/core/SkFourByteTag.h"
#include "include/core/SkTileMode.h"
#include "include/private/SkAssert.h"
#include "include/private/SkDebug.h"

#include <array>
#include <cstdint>

static constexpr const char* SkTileModeToStr(SkTileMode tm) {
    switch (tm) {
        case SkTileMode::kClamp:  return "Clamp";
        case SkTileMode::kRepeat: return "Repeat";
        case SkTileMode::kMirror: return "Mirror";
        case SkTileMode::kDecal:  return "Decal";
    }
    SkUNREACHABLE;
}

#if defined(SK_DEBUG)
inline void SkDumpBuffer(uint8_t const* const buffer, int w, int h, int rowBytes,
                         bool dumpActualValues = false) {
    SkASSERT(buffer);

    static constexpr auto shades = std::to_array<char>({
        '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
    });

    for (int y = 0; y < h; ++y) {
        for (int x = 0; x < w; ++x) {
            uint8_t pixelValue = buffer[y * rowBytes + x];
            if (dumpActualValues) {
                SkDebugf("%u\t", pixelValue);
            } else {
                int idx = static_cast<int>(pixelValue * std::size(shades) / 256);
                SkASSERT(idx >= 0 && idx < (int)std::size(shades));
                SkDebugf("%c", shades[idx]);
            }
        }
        SkDebugf("\n");
    }
}
#else
inline void SkDumpBuffer(uint8_t*, int, int, int) {}
#endif

static inline void SkDumpTag(SkFourByteTag tag) {
    SkDebugf("%c%c%c%c", (char)(tag >> 24), (char)(tag >> 16) & 0xFF, (char)(tag >> 8) & 0xFF, (char)tag & 0xFF);
}


#endif // SkDebugUtils_DEFINED
