// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_GL_GL_SURFACE_FORMAT_H_
#define UI_GL_GL_SURFACE_FORMAT_H_

#include "ui/gl/gl_export.h"

namespace gl {

// Expresses surface format properties that may vary depending
// on the underlying gl_surface implementation or specific usage
// scenarios. Intended usage is to support copying formats and
// checking compatibility.
class GL_EXPORT GLSurfaceFormat {
 public:

  // For use with constructor.
  enum SurfacePixelLayout {
    PIXEL_LAYOUT_DONT_CARE = -1,
    PIXEL_LAYOUT_BGRA,
    PIXEL_LAYOUT_RGBA,
  };

  // Default surface format for the underlying gl_surface subtype.
  // Use the setters below to change attributes if needed.
  GLSurfaceFormat();

  // Use a specified pixel layout, cf. GLSurfaceFormatTest.
  GLSurfaceFormat(SurfacePixelLayout layout);

  // Copy constructor from pre-existing format.
  GLSurfaceFormat(const GLSurfaceFormat& other);

  ~GLSurfaceFormat();

  // A given pair of surfaces is considered compatible if glSetSurface
  // can be used to switch between them without generating BAD_MATCH
  // errors, visual errors, or gross inefficiency, and incompatible
  // otherwise. For example, a pixel layout mismatch would be
  // considered incompatible. This comparison only makes sense within
  // the context of a single gl_surface subtype.
  bool IsCompatible(GLSurfaceFormat other_format) const;

  // Default pixel format is RGBA8888. Use this method to select
  // a preference of RGB565. TODO(klausw): use individual setter
  // methods if there's a use case for them.
  void SetRGB565();

  // Other properties for future use.
  void SetDepthBits(int depth_bits);
  int GetDepthBits() const { return depth_bits_; }

  void SetStencilBits(int stencil_bits);
  int GetStencilBits() const { return stencil_bits_; }

  void SetSamples(int samples);
  int GetSamples() const { return samples_; }

  void SetDefaultPixelLayout(SurfacePixelLayout layout);
  SurfacePixelLayout GetPixelLayout() const;

  enum SurfaceColorSpace {
    COLOR_SPACE_UNSPECIFIED = -1,
    COLOR_SPACE_SRGB,
    COLOR_SPACE_DISPLAY_P3,
  };
  void SetColorSpace(SurfaceColorSpace color_space) {
    color_space_ = color_space;
  }
  SurfaceColorSpace GetColorSpace() const { return color_space_; }

  // Compute number of bits needed for storing one pixel, not
  // including any padding. At this point mainly used to distinguish
  // RGB565 (16) from RGBA8888 (32).
  int GetBufferSize() const;

 private:
  SurfacePixelLayout pixel_layout_ = PIXEL_LAYOUT_DONT_CARE;
  SurfaceColorSpace color_space_ = COLOR_SPACE_UNSPECIFIED;
  int red_bits_ = -1;
  int green_bits_ = -1;
  int blue_bits_ = -1;
  int alpha_bits_ = -1;
  int depth_bits_ = -1;
  int samples_ = -1;
  int stencil_bits_ = -1;
};

}  // namespace gl

#endif  // UI_GL_GL_SURFACE_FORMAT_H_
