[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH 1/6] + cdi: video-Header



On Mon, Sep 21, 2009 at 12:54:08PM +0200, Alexander Siol wrote:
> Signed-off-by: Alexander Siol <alex@xxxxxxxxxx>
> ---
>  src/modules/cdi/include/cdi.h       |    1 +
>  src/modules/cdi/include/cdi/vesa.h  |   92 ++++++++++++
>  src/modules/cdi/include/cdi/video.h |  274 +++++++++++++++++++++++++++++++++++
>  3 files changed, 367 insertions(+), 0 deletions(-)
>  create mode 100644 src/modules/cdi/include/cdi/vesa.h
>  create mode 100644 src/modules/cdi/include/cdi/video.h
> 
> diff --git a/src/modules/cdi/include/cdi.h b/src/modules/cdi/include/cdi.h
> index 7bcf9e4..fee8976 100644
> --- a/src/modules/cdi/include/cdi.h
> +++ b/src/modules/cdi/include/cdi.h
> @@ -26,6 +26,7 @@ typedef enum {
>      CDI_NETWORK         = 1,
>      CDI_STORAGE         = 2,
>      CDI_SCSI            = 3,
> +    CDI_VIDEO           = 4,
>  } cdi_device_type_t;
>  
>  struct cdi_driver;
> diff --git a/src/modules/cdi/include/cdi/vesa.h b/src/modules/cdi/include/cdi/vesa.h
> new file mode 100644
> index 0000000..f8ff636
> --- /dev/null
> +++ b/src/modules/cdi/include/cdi/vesa.h
> @@ -0,0 +1,92 @@
> +/*
> + * Copyright (c) 2008-2009 Mathias Gottschlag, Janosch Graef, Alexander Siol
> + *
> + * This program is free software. It comes without any warranty, to
> + * the extent permitted by applicable law. You can redistribute it 
> + * and/or modify it under the terms of the Do What The Fuck You Want 
> + * To Public License, Version 2, as published by Sam Hocevar. See
> + * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
> + */
> +
> +#ifndef _CDI_VESA_H_
> +#define _CDI_VESA_H_
> +
> +#include <stdint.h>
> +#include <cdi/lists.h>
> +#include <cdi/video.h>
> +
> +/**
> + * VESA information block, used to get information about the card like video
> + * modes
> + */

Kommentare sind deutsch oder zweisprachig (für letzteres müsste man die
doxygen-Regeln noch bauen).

> +struct cdi_video_vesa_info_block {
> +    char signature[4];
> +    char version[2];
> +    uint32_t oemname;
> +    uint32_t capabilities;
> +    uint32_t modeptr;
> +    uint16_t videomem;
> +    // VBE 2.0
> +    uint16_t oemversion;
> +    uint32_t vendornameptr;
> +    uint32_t productnameptr;
> +    uint32_t revisionptr;
> +    uint16_t modes[111];
> +    uint8_t  oem[256];
> +} __attribute__ ((packed));
> +
> +struct cdi_video_vesa_mode_info {
> +    uint16_t modeattr;
> +    uint8_t  windowattra;
> +    uint8_t  windowattrb;
> +    uint16_t windowgran;
> +    uint16_t windowsize;
> +    uint16_t startsega;
> +    uint16_t startsegb;
> +    uint32_t posfunc;
> +    uint16_t scanline;
> +    
> +    uint16_t width;
> +    uint16_t height;
> +    uint8_t  charwidth;
> +    uint8_t  charheight;
> +    uint8_t  planecount;
> +    uint8_t  depth;
> +    uint8_t  banks;
> +    uint8_t  type;
> +    uint8_t  banksize;
> +    uint8_t  imagepages;
> +    uint8_t  reserved;
> +    // VBE v1.2+
> +    uint8_t  redmasksize;
> +    uint8_t  redfieldpos;
> +    uint8_t  greenmasksize;
> +    uint8_t  greenfieldpos;
> +    uint8_t  bluemasksize;
> +    uint8_t  bluefieldpos;
> +    uint8_t  resmasksize;
> +    uint8_t  resfieldsize;
> +    uint8_t  dircolormode;
> +    // VBE v2.0
> +    uint32_t linearfb;
> +    uint32_t offscreenmem;
> +    uint32_t offscreensize;
> +    
> +    char reserved2[206];
> +} __attribute__ ((packed));
> +
> +struct cdi_video_vesa_mode {
> +    struct cdi_video_displaymode mode;
> +    uint16_t vesamode;
> +};
> +
> +struct cdi_video_vesa_info_block cdi_vesa_infoblock;
> +
> +int cdi_video_vesa_initialize
> +    (struct cdi_video_vesa_info_block **vesainfo,
> +    void (*mode_callback)(int modenum, struct cdi_video_vesa_mode_info *mode));
> +
> +struct cdi_video_vesa_mode_info* cdi_video_vesa_get_mode(int modenum);
> +int cdi_video_vesa_change_mode(int modenum);
> +
> +#endif
> diff --git a/src/modules/cdi/include/cdi/video.h b/src/modules/cdi/include/cdi/video.h
> new file mode 100644
> index 0000000..c42dbfe
> --- /dev/null
> +++ b/src/modules/cdi/include/cdi/video.h
> @@ -0,0 +1,274 @@
> +/*
> + * Copyright (c) 2007-2009 Mathias Gottschlag, Janosch Graef, Alexander Siol
> + *
> + * This program is free software. It comes without any warranty, to
> + * the extent permitted by applicable law. You can redistribute it 
> + * and/or modify it under the terms of the Do What The Fuck You Want 
> + * To Public License, Version 2, as published by Sam Hocevar. See
> + * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
> + */
> +
> +#ifndef _CDI_VIDEO_H_
> +#define _CDI_VIDEO_H_
> +
> +#include "cdi.h"
> +#include "cdi/lists.h"
> +
> +struct cdi_video_displaymode {
> +    unsigned int width;
> +    unsigned int height;
> +    unsigned int depth;
> +    int refreshrate; // 0 f??r Irrelevant

Bei depth und refreshrate wäre ein Kommentar hilfreich, der angibt, in
welcher Einheit das denn sein soll.

> +};
> +
> +enum cdi_video_bitmap_usage_hint {
> +  CDI_VIDEO_PRIO_HIGH,
> +  CDI_VIDEO_PRIO_NORMAL,
> +  CDI_VIDEO_PRIO_LOW,
> +};
> +
> +struct cdi_video_pixel_format {
> +    char bpp;

char oder uint8_t?

> +    uint32_t red_bits, red_offset;
> +    uint32_t green_bits, green_offset;
> +    uint32_t blue_bits, blue_offset;
> +    uint32_t alpha_bits, alpha_offset;

Eine Variable pro Zeile macht die Sache übersichtlicher.

> +};
> +
> +struct cdi_video_bitmap {
> +    int width;
> +    int height;
> +    struct cdi_video_pixel_format format;
> +    int pitch;
> +
> +    struct cdi_video_device *device;

Der Stern gehört zum Typen (wiederholt sich einige Male).

> +
> +    /// 1 wenn im VRAM, 0 wenn im RAM
> +    int in_vram;
> +
> +    /// Addresse
> +    int *pixeldata;
> +};
> +
> +enum cdi_video_raster_op {
> +    CDI_VIDEO_ROP_COPY,
> +    CDI_VIDEO_ROP_OR,
> +    CDI_VIDEO_ROP_AND,
> +    CDI_VIDEO_ROP_XOR,
> +    // TODO: Erweitern
> +};
> +
> +struct cdi_video_device {
> +    /// CDI-Geraet
> +    struct cdi_device dev;
> +
> +    /// Liste der Bildschirme
> +    cdi_list_t displays;
> +
> +    /// Aktuelle RasterOP (fuer Software-Helfer noetig)
> +    enum cdi_video_raster_op raster_op;
> +
> +    /// Daten zur Moduswiederherstellung
> +    void* restore_data;
> +
> +    /// Pointer zum Beginn des (gemappten) VRAM
> +    void* vram;
> +
> +    /// Groesse des VRAM
> +    size_t vram_size;
> +};
> +
> +struct cdi_video_display {
> +    /// Videogeraet, dem dieser Bildschirm angehoert
> +    struct cdi_video_device *device;
> +
> +    /// Momentaner Modus
> +    struct cdi_video_displaymode *mode;
> +
> +    /// Liste mit verfuegbaren Modi
> +    cdi_list_t modes;
> +
> +    /// Zeichenbuffer fuer Display
> +    struct cdi_video_bitmap *frontbuffer;
> +};
> +
> +struct cdi_video_color {
> +    uint8_t alpha;
> +    uint8_t red;
> +    uint8_t green;
> +    uint8_t blue;
> +};
> +
> +struct cdi_video_driver {
> +    /// CDI-Treiber
> +    struct cdi_driver drv;
> +
> +    // Basis-Funktionen
> +    /**
> +    * Sichert die aktiven Modi der Displays zur spaeteren Wiederherstellung
> +    *  @param device Das zu sichernde Device
> +    *  @return 0 = Erfolg; -1 = Fehlschlag
> +    */

Bei diesem und den folgenden Kommentaren sind die Sterne verrutscht

> +    int (*driver_save)(struct cdi_video_device *device);
> +
> +    /**
> +    * Stellt den gesicherten Zustand wieder her.
> +    *  @param device Das Device das wiederherstellen soll
> +    *  @return 0 = Erfolg; -1 = Fehlschlag
> +    */
> +    int (*driver_restore)(struct cdi_video_device *device);

Geht es da wirklich nur um den Modus? In dem Fall ist der Name
driver_save/restore vielleicht etwas hochgegriffen. mode_save/restore
wäre dann wohl passender.

> +
> +
> +
> +    // Anzeigenkontrolle
> +
> +    /**
> +    * Setzt die Aufloesung eines Bildschirms
> +    *  @param display Bildschirm
> +    *  @param mode Modus
> +    *  @return 0 = Erfolg; -1 = Fehlschlag
> +    */
> +    int (*display_set_mode) 
> +        (struct cdi_video_device *device, struct cdi_video_display *display, 
> +        struct cdi_video_displaymode *mode);
> +
> +
> +
> +    // Bitmap-Funktionen
> +
> +    /**
> +    * Erstellt ein Bitmap
> +    * @param width Breite des Bitmaps
> +    * @param height Hoehe des Bitmaps
> +    * @param data Pixeldaten, oder 0, wenn das Bitmap vom Treiber beschrieben wird
> +    */
> +    struct cdi_video_bitmap* (*bitmap_create)
> +        (struct cdi_video_device *device, unsigned int width, 
> +        unsigned int height, void *data);
> +
> +    /**
> +    * Loescht ein Bitmap
> +    * @param bitmap Zu loeschendes Bitmap
> +    */
> +    void (*bitmap_destroy)
> +        (struct cdi_video_device *device, struct cdi_video_bitmap *bitmap);
> +
> +    /**
> +    * Setzt den Gebrauchsmodus eines Bitmaps (bestimmt zB, ob ein Bitmap gecacht wird)
> +    * @param device Videogeraet
> +    * @param bitmap Betroffenes Bitmap
> +    * @param hint Hinweis auf die Priorit??t des Bitmaps
> +    */
> +    void (*bitmap_set_usage_hint)
> +        (struct cdi_video_device *device, struct cdi_video_bitmap *bitmap, 
> +        enum cdi_video_bitmap_usage_hint hint);
> +
> +
> +
> +    // Zeichen-Funktionen
> +
> +    /**
> +    * Setzt den Raster-Op f??r die folgenden Zeichenfunktionen.

Umlaut im Kommentar

> +    * Der Raster-Op bestimmt, auf welche Art Grafik gezeichnet wird.
> +    * @param display Display, auf das gezeichnet wird
> +    * @param rop Raster-Op
> +    * @note Kann nur angewendet werden wenn der Bildschirm aktiviert ist
> +    */
> +    void (*set_raster_op)
> +        (struct cdi_video_device *device, enum cdi_video_raster_op rop);
> +
> +    /**
> +    * Zeichnet eine Linie
> +    * @param display Display, auf das gezeichnet wird
> +    * @param x1 X-Koordinate des Anfangs
> +    * @param y1 Y-Koordinate des Anfangs
> +    * @param x1 X-Koordinate des Endpunktes
> +    * @param y1 Y-Koordinate des Endpunktes
> +    * @param color Farbe der Linie
> +    * @note Kann nur angewendet werden wenn der Bildschirm aktiviert ist
> +    */
> +
> +    void (*draw_line)
> +        (struct cdi_video_bitmap *target, unsigned int x1, unsigned int y1, 
> +        unsigned int x2, unsigned int y2, struct cdi_video_color color);

Übergibt man structs wie color nicht normal als Pointer? (Wiederholt
sich)

> +    /**
> +    * Zeichnet ein Rechteck
> +    * @param display Display, auf das gezeichnet wird
> +    * @param x X-Koordinate
> +    * @param y Y-Koordinate
> +    * @param width Breite
> +    * @param height Hoehe
> +    * @param color Farbe des Rechtecks
> +    */
> +    void (*draw_rectangle)
> +        (struct cdi_video_bitmap *target, unsigned int x, unsigned int y,
> +        unsigned int width, unsigned int height, struct cdi_video_color color);
> +
> +    /**
> +    * Zeichnet eine Ellipse
> +    * @param display Display, auf das gezeichnet wird
> +    * @param x X-Koordinate
> +    * @param y Y-Koordinate
> +    * @param width Breite
> +    * @param height Hoehe
> +    * @param color Farbe der Ellipse
> +    */
> +    void (*draw_ellipse)
> +        (struct cdi_video_bitmap *target, unsigned int x, unsigned int y,
> +        unsigned int width, unsigned int height, struct cdi_video_color color);
> +
> +    /**
> +    * Zeichnet ein Bitmap
> +    * @param display Display, auf das gezeichnet wird
> +    * @param bitmap Zu zeichnendes Bitmap
> +    * @param x X-Koordinate
> +    * @param y Y-Koordinate
> +    * @note Es wird nur so viel kopiert wie das Zielbitmap aufnehmen kann
> +    */
> +    void (*draw_bitmap)
> +        (struct cdi_video_bitmap *target, struct cdi_video_bitmap *bitmap,
> +        unsigned int x, unsigned int y);
> +
> +    /**
> +    * Zeichnet einen Teil einer Bitmap
> +    * @param display Display, auf das gezeichnet wird
> +    * @param bitmap Zu zeichnendes Bitmap
> +    * @param x X-Koordinate (Ziel)
> +    * @param y Y-Koordinate (Ziel)
> +    * @param srcx X-Koordinate (Quelle)
> +    * @param srcy Y-Koordinate (Quelle)
> +    * @param width Breite
> +    * @param height Hoehe
> +    */
> +    void (*draw_bitmap_part)
> +        (struct cdi_video_bitmap *target, struct cdi_video_bitmap *bitmap,
> +        unsigned int x, unsigned int y, unsigned int srcx, unsigned int srcy,
> +        unsigned int width, unsigned int height);
> +
> +    /**
> +    * Zeichnet einen Punkt
> +    *  @param display Display, auf dem gezeichnet wird
> +    * @param x X-Koordinate (Ziel)
> +    * @param y Y-Koordinate (Ziel)
> +    * @note Kann nur angewendet werden wenn der Bildschirm aktiviert ist
> +    */
> +    void (*draw_dot)
> +        (struct cdi_video_bitmap *target, unsigned int x, unsigned int y, 
> +        struct cdi_video_color color);
> +};
> +
> +/**
> + * Initialisiert die Datenstrukturen fuer einen Grafikkartentreiber
> + */
> +void cdi_video_driver_init(struct cdi_video_driver* driver);
> +/**
> + * Deinitialisiert die Datenstrukturen fuer einen Grafikkartentreiber
> + */
> +void cdi_video_driver_destroy(struct cdi_video_driver* driver);
> +/**
> + * Registiert einen Grafikkartentreiber
> + */
> +void cdi_video_driver_register(struct cdi_video_driver* driver);
> +
> +
> +#endif
> -- 
> 1.6.0.4
> 

> _______________________________________________
> tyndur-devel mailing list
> tyndur-devel@xxxxxxxxxx
> http://list.tyndur.org/mailman/listinfo/tyndur-devel