/**
 * Looking Glass
 * Copyright © 2017-2026 The Looking Glass Authors
 * https://looking-glass.io
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc., 59
 * Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#ifndef _H_I_OVERLAY_
#define _H_I_OVERLAY_

#include <stdbool.h>

#include "common/types.h"

#define TICK_RATE 25

struct LG_OverlayOps
{
  /* internal name of the overlay for debugging */
  const char * name;

  /* called very early to allow for option registration, optional */
  void (*earlyInit)(void);

  /* called when the overlay is registered */
  bool (*init)(void ** udata, const void * params);

  /* final free; must be safe if init was not called or returned false */
  void (*free)(void * udata);

  /* return true if realtime rendering is required
   * optional, if omitted assumes false */
  bool (*needs_render)(void * udata, bool interactive);

  /* return true if the overlay must be drawn over a fully restored frame
   * optional, if omitted assumes false */
  bool (*needs_full_render)(void * udata);

  /* return true if the overlay currently requires overlay mode
   * optional, if omitted assumes false */
  bool (*needs_overlay)(void * udata);

  /* perform the actual drawing/rendering
   *
   * `interactive` is true if the application is currently in overlay interaction
   * mode.
   *
   * `windowRects` is an array of window rects that were rendered using screen
   * coordinates. Will be `NULL` if the information is not required.
   *
   * `maxRects` is the length of `windowRects`, or 0 if `windowRects` is `NULL`
   *
   * returns the number of rects written to `windowRects`, or -1 if there is not
   * enough room left.
   */
  int (*render)(void * udata, bool interactive, struct Rect * windowRects,
      int maxRects);

  /* called TICK_RATE times a second by the application
   *
   * Note: This may not run in the same context as `render`!
   *
   * return true if the frame needs to be rendered
   * optional, if omitted assumes false
   */
  bool (*tick)(void * udata, unsigned long long tickCount);

  /* TODO: add load/save settings capabillity */
};

#define ASSERT_LG_OVERLAY_VALID(x) \
  DEBUG_ASSERT((x)->name  ); \
  DEBUG_ASSERT((x)->init  ); \
  DEBUG_ASSERT((x)->free  ); \
  DEBUG_ASSERT((x)->render);

#endif
