// Copyright 2024 The Pigweed Authors
//
// 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
//
//     https://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 "public/pw_framebuffer/framebuffer.h"

#include <cstddef>

#include "pw_assert/assert.h"

namespace pw::framebuffer {

Framebuffer::Framebuffer()
    : pixel_data_(nullptr),
      pixel_format_(PixelFormat::None),
      size_{0, 0},
      row_bytes_(0) {}

Framebuffer::Framebuffer(void* data,
                         PixelFormat pixel_format,
                         pw::geometry::Size<uint16_t> size,
                         uint16_t row_bytes)
    : pixel_data_(data),
      pixel_format_(pixel_format),
      size_(size),
      row_bytes_(row_bytes) {
  PW_ASSERT(data != nullptr);
  PW_ASSERT(pixel_format != PixelFormat::None);
}

Framebuffer::Framebuffer(Framebuffer&& other)
    : pixel_data_(other.pixel_data_),
      pixel_format_(other.pixel_format_),
      size_(other.size_),
      row_bytes_(other.row_bytes_) {
  other.pixel_data_ = nullptr;
  other.pixel_format_ = PixelFormat::None;
}

Framebuffer& Framebuffer::operator=(Framebuffer&& rhs) {
  pixel_data_ = rhs.pixel_data_;
  pixel_format_ = rhs.pixel_format_;
  size_ = rhs.size_;
  row_bytes_ = rhs.row_bytes_;
  rhs.pixel_data_ = nullptr;
  rhs.pixel_format_ = PixelFormat::None;
  return *this;
}

}  // namespace pw::framebuffer
