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

[tyndur-devel] [PATCH v2] + libvideo: Header



Signed-off-by: Alexander Siol <alex@xxxxxxxxxx>
---
 src/modules/include/video/commands.h |   80 ++++++++++
 src/modules/include/video/video.h    |  269 ++++++++++++++++++++++++++++++++++
 2 files changed, 349 insertions(+), 0 deletions(-)
 create mode 100644 src/modules/include/video/commands.h
 create mode 100644 src/modules/include/video/video.h

diff --git a/src/modules/include/video/commands.h b/src/modules/include/video/commands.h
new file mode 100644
index 0000000..2ec8c6e
--- /dev/null
+++ b/src/modules/include/video/commands.h
@@ -0,0 +1,80 @@
+/*  
+ * Copyright (c) 2009 The tyndur Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the tyndur Project
+ * by Alexander Siol.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ * ``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 COPYRIGHT HOLDERS OR 
+ * CONTRIBUTORS 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.*/
+
+/// Kommandos
+
+enum video_commands {
+    /// Kontextsteuerung
+
+    /// Erzeugt einen neuen Treiberkontext
+    VIDEO_CMD_CREATE_CONTEXT,
+    /// Setzt den aktiven Treiberkontext
+    VIDEO_CMD_USE_CONTEXT,
+    /// Setzt das Geraet (per Nummer) im aktiven Treiberkontext
+    VIDEO_CMD_USE_DEVICE,
+    /// Setzt das aktive Ziel (Bitmap) im aktiven Treiberkontext
+    VIDEO_CMD_USE_TARGET,
+    /// Setzt die aktive Zeichenfarbe im aktiven Treiberkontext
+    VIDEO_CMD_USE_COLOR,
+    /// Setzt die aktive Raster-OP im aktiven Treiberkontext
+    VIDEO_CMD_USE_ROP,
+    /// Fordert einen Kommandobuffer fuer den Treiberkontext an.
+    VIDEO_CMD_GET_CMD_BUFFER,
+    /// Fordert die Ausfuehrung des Buffers an.
+    VIDEO_CMD_DO_CMD_BUFFER,
+
+    /// Geräteabfrage
+
+    /// Fragt die Anzahl Geraete ab
+    VIDEO_CMD_GET_NUM_DEVICES,
+    /// Fragt die Anzahl der Anzeigen am Geraet ab
+    VIDEO_CMD_GET_NUM_DISPLAYS,
+    /// Fragt die Displaymodi ab
+    VIDEO_CMD_GET_DISPLAY_MODES,
+
+    /// Anderes
+
+    /// Setzt den Modus
+    /// FIXME Umbenennen
+    VIDEO_CMD_SET_RESOLUTION,
+
+    /// Bitmaps
+    /// Erzeugt ein Bitmap
+    VIDEO_CMD_CREATE_BITMAP,
+    /// Zerstoert ein Bitmap
+    VIDEO_CMD_DESTROY_BITMAP,
+    /// Erzeugt eine Bitmap auf den Display-Frontbuffer
+    VIDEO_CMD_CREATE_FRONTBUFFER_BITMAP,
+
+    /// Primitiven Zeichnen
+    VIDEO_CMD_DRAW_PIXEL,
+    VIDEO_CMD_DRAW_RECTANGLE,
+    VIDEO_CMD_DRAW_ELLIPSE,
+    VIDEO_CMD_DRAW_LINE,
+    VIDEO_CMD_DRAW_BITMAP,
+    VIDEO_CMD_DRAW_BITMAP_PART,
+};
\ No newline at end of file
diff --git a/src/modules/include/video/video.h b/src/modules/include/video/video.h
new file mode 100644
index 0000000..b2881d2
--- /dev/null
+++ b/src/modules/include/video/video.h
@@ -0,0 +1,269 @@
+/*  
+ * Copyright (c) 2009 The tyndur Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the tyndur Project
+ * by Alexander Siol.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``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 COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS 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 __LIBVIDEO_VIDEO_H__
+#define __LIBVIDEO_VIDEO_H__
+
+#include <types.h>
+#include <rpc.h>
+
+#define VIDEORPC_GET_DWORD(size, data) \
+    rpc_get_dword(context->driverpid, "VIDEODRV", size, data)
+
+#define REQUIRE_CMD_BUFFER(length) \
+    do { \
+    if (context->cmdbuffer == 0) return -1; \
+    if (context->cmdbufferlen < context->cmdbufferpos + length) \
+        libvideo_do_command_buffer(); \
+    } while (0);
+
+#define REQUIRE_CMD_BUFFER_RETURN_VOID(length) \
+    do { \
+    if (context->cmdbuffer == 0) return; \
+    if (context->cmdbufferlen < context->cmdbufferpos + length) \
+        libvideo_do_command_buffer(); \
+    } while (0);
+
+#define SET_CMD_BUFFER(value) \
+    context->cmdbuffer[context->cmdbufferpos++] = value
+
+
+typedef struct {
+    pid_t driverpid;
+    uint32_t drivercontext;
+    uint32_t* cmdbuffer;
+    uint32_t cmdbufferpos;
+    uint32_t cmdbufferlen;
+    uint32_t cmdbufferid;
+} driver_context_t;
+
+typedef struct {
+    uint32_t id;
+    uint32_t width;
+    uint32_t height;
+} video_bitmap_t;
+
+
+// FIXME: Muss immer mit CDI (cdi/video.h) abgeglichen werden!
+
+typedef enum {
+    VIDEO_ROP_COPY,
+    VIDEO_ROP_OR,
+    VIDEO_ROP_AND,
+    VIDEO_ROP_XOR,
+    // TODO: Erweitern
+} rop_t;
+
+/// Kontextsteuerung
+
+/**
+ * Erstellt einen neuen Kontext fuer den angebenen Treiber
+ * @param driver String, Name des Treibers (= Prozessname)
+ * @return Zeiger auf Kontext. NULL im Fehlerfall.
+ */
+driver_context_t* libvideo_create_driver_context(char* driver);
+
+/**
+ * Setzt den aktuell aktiven Kontext
+ * @param context Zeiger auf den zu aktivierenden Kontext.
+ */
+void libvideo_use_driver_context(driver_context_t* context);
+
+/// Kontextabhaengig
+
+/**
+ * Setzt das aktive Geraet im aktuellen Kontext
+ * @param devicenum Geraetenummer.
+ * @return 0 bei Erfolg, sonst -1
+ */
+int libvideo_change_device(int devicenum);
+
+/**
+ * Setzt das aktive Ziel(bitmap) im aktuellen Kontext
+ * @param bitmap Zeiger auf Bitmap.
+ * @return 0 bei Erfolg, sonst -1
+ */
+int libvideo_change_target(video_bitmap_t *bitmap);
+
+/**
+ * Setzt die Zeichenfarbe im aktuellen Kontext
+ * @param alpha Alpha-Anteil (0-255)
+ * @param red Rot-Anteil (0-255)
+ * @param green Gruen-Anteil (0-255)
+ * @param blue Blau-Anteil (0-255)
+ * @return 0 bei Erfolg, sonst -1
+ */
+int libvideo_change_color(char alpha, char red, char green, char blue);
+
+/**
+ * Setzt die Raster-OP fuer weitere Zeichenvorgaenge im aktuellen Kontext
+ * @param rop Die Raster-OP
+ * @return 0 bei Erfolg, sonst -1
+ */
+int libvideo_change_rop(rop_t rop);
+
+/**
+ * Fordert einen neuen Kommandobuffer fuer den Kontext an.
+ * @param length Die Laenge des Zeichenbuffers in 4 Bytes.
+ * @return 0 bei Erfolg, sonst -1
+ */
+int libvideo_get_command_buffer(size_t length);
+
+/**
+ * Gibt dem Treiber die Anweisung den Buffer auszufuehren.
+ * Achtung, dies wird auch automatisch getan wenn der Buffer voll ist!
+ * Achtung, nicht nach jedem Zeichenvorgang aufrufen - kostet Geschwindigkeit!
+ * @return 0 bei Erfolg, sonst -1
+ */
+int libvideo_do_command_buffer(void);
+
+/// Geraeteabfrage
+
+/**
+ * Gibt die Anzahl der Geraete am Treiber des aktuellen Kontexts zurueck.
+ * @return die Anzahl der Geraete des Treibers.
+ */
+int libvideo_get_num_devices(void);
+
+/**
+ * Gibt die Zahl der Anzeigen am angegebenen Geraete im aktuellen Kontext zurueck
+ * @param device Geraetenummer
+ * @return Anzahl der Anzeigen am Grafikadapter
+ */
+int libvideo_get_num_displays(int device);
+
+/**
+ * Liefert ein Array mit Modusinformationen
+ * @param device Geraetenummer
+ * @param display Anzeigennummer
+ * @return dword[0] enthaelt die Anzahl an Modi. Fuer jeden Modus:
+ *  dword[i + 1] Breite (px), dword[i + 2] Hoehe (px), dword[i + 3] Bits per Pixel,
+ *  dword[i + 4] Bildwiederholrate (VSync Hz), 0 fuer automatische Einstellung.
+ */
+dword* libvideo_get_modes(int device, int display);
+
+/// Bitmaps
+/**
+ * Erzeugt ein Bitmap, laedt ggf. Initialisierungsdaten zum Treiber.
+ * Ohne Initialisierung erhaelt man ein schwarzes Bitmap.
+ * @param width Breite in Pixel
+ * @param height Hoehe in Pixel
+ * @param length Laenge der Nutzdaten, 0 fuer keine.
+ * @param data Zeiger auf Datenbuffer, Pixelformat wird als 32-bit ARGB angenommen
+ */
+video_bitmap_t* libvideo_create_bitmap(int width, int height, 
+    size_t data_length, void* data);
+
+/**
+ * Gibt ein Bitmap wieder frei.
+ * @param bitmap Das Bitmap.
+ */
+void libvideo_destroy_bitmap(video_bitmap_t *bitmap);
+
+/**
+ * Holt ein Bitmap-Objekt fuer den Anzeigenfrontbuffer
+ * @param display Die Anzeige deren Frontbuffer einen interessiert
+ * @return Zeiger auf Bitmap, NULL im Fehlerfall
+ * @note Es kann global nur eine Bitmap fuer Frontbufferzugriff geben!
+ */
+video_bitmap_t* libvideo_get_frontbuffer_bitmap(int display);
+
+/// Primitiven Zeichnen
+
+/**
+ * Zeichnet einen Pixel in der gesetzten Farbe auf das aktuelle Ziel.
+ * @param x X-Koordinate
+ * @param y Y-Koordinate
+ */
+void libvideo_draw_pixel(int x, int y);
+
+/**
+ * Zeichnet einen Rechteck in der gesetzten Farbe auf das aktuelle Ziel.
+ * @param x X-Koordinate
+ * @param y Y-Koordinate
+ * @param width Breite in Pixel
+ * @param height Hoehe in Pixel
+ */
+void libvideo_draw_rectangle(int x, int y, int width, int height);
+
+/**
+ * Zeichnet eine Ellipse (die das spezifizierte Rechteck bestmoeglich ausfuellt)
+ * in der gesetzten Farbe auf das aktuelle Ziel.
+ * @param x X-Koordinate
+ * @param y Y-Koordinate
+ * @param width Breite in Pixel
+ * @param height Hoehe in Pixel
+ */
+void libvideo_draw_ellipse(int x, int y, int width, int height);
+
+
+/**
+ * Zeichnet eine Linie in der gesetzten Farbe auf das aktuelle Ziel.
+ * @param x1 Start-X-Koordinate
+ * @param y1 Start-Y-Koordinate
+ * @param x2 End-X-Koordinate
+ * @param y2 End-Y-Koordinate
+ */
+void libvideo_draw_line(int x1, int y1, int x2, int y2);
+
+/**
+ * Zeichnet eine Bitmap auf das aktuelle Ziel.
+ * @param bitmap die Quell-Bitmap
+ * @param x X-Koordinate
+ * @param y Y-Koordinate
+ */
+void libvideo_draw_bitmap(video_bitmap_t *bitmap, int x, int y);
+
+/**
+ * Zeichnet einen Bitmapausschnitt auf das aktuelle Ziel.
+ * @param bitmap die Quell-Bitmap
+ * @param x Ziel-X-Koordinate
+ * @param y Ziel-Y-Koordinate
+ * @param srcx Start-X-Koordinate des Quellrechtecks
+ * @param srcy Start-Y-Koordinate des Quellrechtecks
+ * @param width Breite des zu kopierenden Rechtecks in Pixel
+ * @param height Hoehe des zu kopierenden Rechtecks in Pixel
+ */
+void libvideo_draw_bitmap_part(video_bitmap_t *bitmap, int x, int y, int srcx,
+    int srcy, int width, int height);
+
+/// Anderes
+
+/**
+ * Setzt die Aufloesung einer Anzeige
+ * @param display Die Anzeige
+ * @param width Breite
+ * @param height Hoehe
+ * @param depth Gewuenschte Farbtiefe (in BPP)
+ * @return 0 bei Erfolg, sonst -1
+ * @note Die Farbtiefe ist nur ein Richtwert - es wird gegebenfalls eine andere
+ *  verwendet, allerdings werden die Farbwerte transparent umgerechnet.
+ */
+int libvideo_change_display_resolution(int display, int width, int height,
+    int depth);
+
+#endif /* __LIBVIDEO_VIDEO_H__ */
-- 
1.6.0.4