[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