#pragma once
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <guest/libs/legacy_framebuffer/vsoc_framebuffer.h>

#include <vector>
#include <array>
#include <utility>
#include <cstdint>

#include "common/libs/tcp_socket/tcp_socket.h"

#undef D
#ifdef VSOC_VNC_DEBUG
#define D(...) ALOGD(__VA_ARGS__)
#else
#define D(...) ((void)0)
#endif

namespace cvd {
namespace vnc {

// TODO(haining) when the hwcomposer gives a sequence number type, use that
// instead. It might just work to replace this class with a type alias
// using StripeSeqNumber = whatever_the_hwcomposer_uses;
class StripeSeqNumber {
 public:
  StripeSeqNumber() = default;
  explicit StripeSeqNumber(std::uint64_t t) : t_{t} {}
  bool operator<(const StripeSeqNumber& other) const {
    return t_ < other.t_;
  }

  bool operator<=(const StripeSeqNumber& other) const {
    return t_ <= other.t_;
  }

 private:
  std::uint64_t t_{};
};

constexpr int32_t kJpegMaxQualityEncoding = -23;
constexpr int32_t kJpegMinQualityEncoding = -32;

enum class ScreenOrientation { Portrait, Landscape };
constexpr int kNumOrientations = 2;

struct Stripe {
  int index = -1;
  std::uint64_t frame_id{};
  std::uint16_t x{};
  std::uint16_t y{};
  std::uint16_t width{};
  std::uint16_t height{};
  Message raw_data{};
  Message jpeg_data{};
  StripeSeqNumber seq_number{};
  ScreenOrientation orientation{};
};

inline constexpr int BytesPerPixel() {
  return sizeof(VSoCFrameBuffer::Pixel);
}

// The width of the screen regardless of orientation. Does not change.
inline int ActualScreenWidth() {
  return VSoCFrameBuffer::getInstance().x_res();
}

// The height of the screen regardless of orientation. Does not change.
inline int ActualScreenHeight() {
  return VSoCFrameBuffer::getInstance().y_res();
}

inline int ScreenSizeInBytes() {
  return ActualScreenWidth() * ActualScreenHeight() * BytesPerPixel();
}

}  // namespace vnc
}  // namespace cvd
