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

#include "include/core/SkTypes.h"

#include "include/core/SkPaint.h"
#include "include/core/SkPoint.h"
#include "include/core/SkStream.h"
#include "include/core/SkTextBlob.h"
#include "src/core/SkWriteBuffer.h"
#include "src/text/GlyphRun.h"

#include <cstdint>
#include <vector>

namespace SkTextBlobTrace {

struct Record {
    uint32_t origUniqueID;
    SkPaint paint;
    SkPoint offset;
    sk_sp<SkTextBlob> blob;
};

std::vector<SkTextBlobTrace::Record> CreateBlobTrace(SkStream* stream);

void DumpTrace(const std::vector<SkTextBlobTrace::Record>&);

class Capture {
public:
    Capture();
    ~Capture();
    void capture(const sktext::GlyphRunList&, const SkPaint&);
    // If `dst` is nullptr, write to a file.
    void dump(SkWStream* dst = nullptr) const;

private:
    size_t fBlobCount = 0;
    sk_sp<SkRefCntSet> fTypefaceSet;
    SkBinaryWriteBuffer fWriteBuffer;

    Capture(const Capture&) = delete;
    Capture& operator=(const Capture&) = delete;
};

}  // namespace SkTextBlobTrace
#endif  // SkTextBlobTrace_DEFINED
