root/sys/arch/atari/dev/grfabs_reg.h
/*      $NetBSD: grfabs_reg.h,v 1.15 2023/01/06 10:28:28 tsutsui Exp $  */

/*
 * Copyright (c) 1995 Leo Weppelman
 * Copyright (c) 1994 Christian E. Hopps
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by Christian E. Hopps.
 * 4. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _GRFABS_REG_H
#define _GRFABS_REG_H

struct point {
    long        x;
    long        y;
};
typedef struct point point_t;

struct dimension {
    u_long      width;
    u_long      height;
};
typedef struct dimension dimen_t;

struct box {
    long        x;
    long        y;
    u_long      width;
    u_long      height;
};
typedef struct box box_t;

struct rectangle {
    long        left;
    long        top;
    long        right;
    long        bottom;
};
typedef struct rectangle rect_t;

typedef struct bitmap bmap_t;
typedef struct colormap colormap_t;
typedef struct display_mode dmode_t;

/*
 * View stuff.
 */

struct view {
    bmap_t      *bitmap;        /* bitmap.                              */
    box_t       display;        /* viewable area.                       */
    dmode_t     *mode;          /* the mode for this view               */
    colormap_t  *colormap;      /* the colormap for this view           */
    int         flags;
    void        *save_area;     /* Save frame-buffer when not on screen */
};
typedef struct view view_t;

/* View-flags: */
#define VF_DISPLAY      1       /* view is on the air now               */

/*
 * Bitmap stuff.
 */
struct bitmap {
    u_short     bytes_per_row;  /* number of bytes per display row.     */
    u_short     rows;           /* number of display rows.              */
    u_short     depth;          /* depth of bitmap.                     */
    u_char      *plane;         /* plane data for bitmap/vga.           */
    u_char      *hw_address;    /* mappable linear bitplane pointer.    */
    u_char      *vga_address;   /* mappable vga bitplane pointer        */
    u_char      *regs;          /* where the registers are              */
    u_char      *hw_regs;       /* mappable registers                   */
    u_short     reg_size;       /* size of the register area            */
    u_int       phys_mappable;  /* amount of mappable lin. plane mem.   */
    u_int       vga_mappable;   /* amount of mappable vga plane mem.    */
    u_int       lin_base;       /* linear framebuffer card base         */
    u_int       vga_base;       /* vga memory card base                 */
};

/*
 * Colormap stuff.
 */
struct colormap {
    u_char      type;           /* what type of entries these are.      */
    union {
        u_char  grey;           /* CM_GREYSCALE                         */
        struct {                /* CM_COLOR                             */
            u_char      red;
            u_char      green;
            u_char      blue;
        } rgb_mask;
    } valid_mask;
    u_short     first;          /* color register entry[0] refers to    */
    u_short     size;           /* number of entries                    */
    u_long      *entry;         /* the table of actual color values     */
};

/*
 * Mask short-hands
 */
#define grey_mask  valid_mask.grey
#define red_mask   valid_mask.rgb_mask.red
#define green_mask valid_mask.rgb_mask.green
#define blue_mask  valid_mask.rgb_mask.blue

enum colormap_type {
        CM_MONO,                /* only on or off allowed               */
        CM_GREYSCALE,           /* grey values                          */
        CM_COLOR                /* RGB values                           */
};

#define MAX_CENTRIES            256             /* that all there is    */
/*
 * Create a colormap entry
 */
#define MAKE_COLOR_ENTRY(r,g,b) (((r & 0xff)<<16)|((g & 0xff)<<8)|(b & 0xff))
#define MAKE_MONO_ENTRY(x)      ((x) ? 1 : 0)
#define MAKE_GREY_ENTRY(l)      (l & 0xff)

struct grfabs_sw {
        void     (*display_view)(view_t*);
        view_t  * (*alloc_view)(dmode_t *, dimen_t *, u_char);
        void     (*free_view)(view_t *);
        void     (*remove_view)(view_t *);
        void     (*save_view)(view_t *);
        int      (*use_colormap)(view_t *, colormap_t *);
};

/* display mode */
struct display_mode {
    LIST_ENTRY(display_mode)    link;
    const u_char                *name;          /* logical name for mode. */
    dimen_t                     size;           /* screen size            */
    u_char                      depth;          /* screen depth           */
    void                        *data;          /* opaque driver data     */
    struct grfabs_sw            *grfabs_funcs;  /* hardware switch table  */
    view_t                      *current_view;  /* view displaying me     */
};

/*
 * Definition of available graphic mode list.
 */
typedef LIST_HEAD(modelist, display_mode) MODES;

/*
 * Misc draw related macros.
 */
#define INIT_BOX(b,xx,yy,ww,hh)                                         \
        do {                                                            \
                (b)->x = xx;                                            \
                (b)->y = yy;                                            \
                (b)->width = ww;                                        \
                (b)->height = hh;                                       \
        } while(0)


/*
 * Prototype for the probe function
 */
typedef void (*grf_probe_t)(MODES *);

/*
 * Common variables
 */
extern view_t           gra_con_view;
extern colormap_t       gra_con_cmap;
extern long             gra_con_colors[MAX_CENTRIES];
extern u_long           gra_def_color16[16];

/*
 * Prototypes:
 */
int     grfabs_probe(grf_probe_t);
view_t  *grf_alloc_view(dmode_t *d, dimen_t *dim, u_char depth);
dmode_t *grf_get_best_mode(dimen_t *dim, u_char depth);
void    grf_display_view(view_t *v);
void    grf_remove_view(view_t *v);
void    grf_free_view(view_t *v);
int     grf_get_colormap(view_t *, colormap_t *);
int     grf_use_colormap(view_t *, colormap_t *);
void    grf_save_view(view_t *v);

#endif /* _GRFABS_REG_H */