blob: 6ba90dbdda059877e706756fd437b9730c6bb79e [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_QR_CODE_GENERATOR_QR_CODE_GENERATOR_H_
#define COMPONENTS_QR_CODE_GENERATOR_QR_CODE_GENERATOR_H_
#include <stddef.h>
#include <stdint.h>
#include <optional>
#include <vector>
#include "base/containers/span.h"
#include "base/types/expected.h"
#include "components/qr_code_generator/error.h"
namespace qr_code_generator {
// Contains output data from Generate().
// The default state contains no data.
struct GeneratedCode {
public:
GeneratedCode();
GeneratedCode(GeneratedCode&&);
GeneratedCode& operator=(GeneratedCode&&);
GeneratedCode(const GeneratedCode&) = delete;
GeneratedCode& operator=(const GeneratedCode&) = delete;
~GeneratedCode();
// Pixel data. The least-significant bit of each byte is set if that
// tile/module should be "black".
//
// Clients should ensure four tiles/modules of padding when rendering the
// code.
//
// On error, will not be populated, and will contain an empty vector.
std::vector<uint8_t> data;
// Width and height (which are equal) of the generated data, in
// tiles/modules.
//
// The following invariant holds: `qr_size * qr_size == data.size()`.
//
// On error, will not be populated, and will contain 0.
int qr_size = 0;
};
// Generates a QR code containing the given data.
// The generator will attempt to choose a version that fits the data and which
// is >= |min_version|, if given. The returned span's length is
// input-dependent and not known at compile-time.
base::expected<GeneratedCode, Error> GenerateCode(
base::span<const uint8_t> in,
std::optional<int> min_version = std::nullopt);
} // namespace qr_code_generator
#endif // COMPONENTS_QR_CODE_GENERATOR_QR_CODE_GENERATOR_H_