summaryrefslogtreecommitdiff
path: root/include/xine/osd.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/xine/osd.h')
-rw-r--r--include/xine/osd.h302
1 files changed, 302 insertions, 0 deletions
diff --git a/include/xine/osd.h b/include/xine/osd.h
new file mode 100644
index 000000000..44471534b
--- /dev/null
+++ b/include/xine/osd.h
@@ -0,0 +1,302 @@
+/*
+ * Copyright (C) 2000-2003 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+ * xine 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.
+ *
+ * xine 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * OSD stuff (text and graphic primitives)
+ */
+
+#ifndef HAVE_OSD_H
+#define HAVE_OSD_H
+
+#ifdef HAVE_ICONV
+# include <iconv.h>
+#endif
+
+#include <xine/video_overlay.h>
+
+typedef struct osd_object_s osd_object_t;
+typedef struct osd_renderer_s osd_renderer_t;
+typedef struct osd_font_s osd_font_t;
+typedef struct osd_ft2context_s osd_ft2context_t;
+
+struct osd_object_s {
+ osd_object_t *next;
+ osd_renderer_t *renderer;
+
+ int width, height; /* work area dimentions */
+ uint8_t *area; /* work area */
+ int area_touched; /* work area was used for painting */
+ int display_x,display_y; /* where to display it in screen */
+
+ /* video output area within osd extent */
+ int video_window_x, video_window_y;
+ int video_window_width, video_window_height;
+
+ /* extent of reference coordinate system */
+ int extent_width, extent_height;
+
+ /* clipping box inside work area */
+ int x1, y1;
+ int x2, y2;
+
+ uint32_t color[OVL_PALETTE_SIZE]; /* color lookup table */
+ uint8_t trans[OVL_PALETTE_SIZE]; /* mixer key table */
+
+#ifdef HAVE_ICONV
+ iconv_t cd; /* iconv handle of encoding */
+ char *encoding; /* name of encoding */
+#endif
+
+ osd_font_t *font;
+ osd_ft2context_t *ft2;
+
+
+ /* this holds an optional ARGB overlay, which
+ * is only be used by supported video_out modules.
+ * right now this is only vdpau */
+ argb_layer_t *argb_layer;
+
+ int32_t handle;
+};
+
+/* this one is public */
+struct xine_osd_s {
+ osd_object_t osd;
+};
+
+struct osd_renderer_s {
+
+ xine_stream_t *stream;
+
+ /*
+ * open a new osd object. this will allocated an empty (all zero) drawing
+ * area where graphic primitives may be used.
+ * It is ok to specify big width and height values. The render will keep
+ * track of the smallest changed area to not generate too big overlays.
+ * A default palette is initialized (i sugest keeping color 0 as transparent
+ * for the sake of simplicity)
+ */
+ osd_object_t* (*new_object) (osd_renderer_t *this, int width, int height);
+
+ /*
+ * free osd object
+ */
+ void (*free_object) (osd_object_t *osd_to_close);
+
+
+ /*
+ * send the osd to be displayed at given pts (0=now)
+ * the object is not changed. there may be subsequent drawing on it.
+ */
+ int (*show) (osd_object_t *osd, int64_t vpts );
+
+ /*
+ * send event to hide osd at given pts (0=now)
+ * the object is not changed. there may be subsequent drawing on it.
+ */
+ int (*hide) (osd_object_t *osd, int64_t vpts );
+
+ /*
+ * draw point.
+ */
+ void (*point) (osd_object_t *osd, int x, int y, int color);
+
+ /*
+ * Bresenham line implementation on osd object
+ */
+ void (*line) (osd_object_t *osd,
+ int x1, int y1, int x2, int y2, int color );
+
+ /*
+ * filled rectangle
+ */
+ void (*filled_rect) (osd_object_t *osd,
+ int x1, int y1, int x2, int y2, int color );
+
+ /*
+ * set palette (color and transparency)
+ */
+ void (*set_palette) (osd_object_t *osd, const uint32_t *color, const uint8_t *trans );
+
+ /*
+ * set on existing text palette
+ * (-1 to set used specified palette)
+ *
+ * color_base specifies the first color index to use for this text
+ * palette. The OSD palette is then modified starting at this
+ * color index, up to the size of the text palette.
+ *
+ * Use OSD_TEXT1, OSD_TEXT2, ... for some preasssigned color indices.
+ */
+ void (*set_text_palette) (osd_object_t *osd, int palette_number,
+ int color_base );
+
+ /*
+ * get palette (color and transparency)
+ */
+ void (*get_palette) (osd_object_t *osd, uint32_t *color,
+ uint8_t *trans);
+
+ /*
+ * set position were overlay will be blended
+ */
+ void (*set_position) (osd_object_t *osd, int x, int y);
+
+ /*
+ * set the font of osd object
+ */
+
+ int (*set_font) (osd_object_t *osd, const char *fontname, int size);
+
+ /*
+ * set encoding of text
+ *
+ * NULL ... no conversion (iso-8859-1)
+ * "" ... locale encoding
+ */
+ int (*set_encoding) (osd_object_t *osd, const char *encoding);
+
+ /*
+ * render text in current encoding on x,y position
+ * no \n yet
+ *
+ * The text is assigned the colors starting at the index specified by
+ * color_base up to the size of the text palette.
+ *
+ * Use OSD_TEXT1, OSD_TEXT2, ... for some preasssigned color indices.
+ */
+ int (*render_text) (osd_object_t *osd, int x1, int y1,
+ const char *text, int color_base);
+
+ /*
+ * get width and height of how text will be renderized
+ */
+ int (*get_text_size) (osd_object_t *osd, const char *text,
+ int *width, int *height);
+
+ /*
+ * close osd rendering engine
+ * loaded fonts are unloaded
+ * osd objects are closed
+ */
+ void (*close) (osd_renderer_t *this);
+
+ /*
+ * clear an osd object (empty drawing area)
+ */
+ void (*clear) (osd_object_t *osd );
+
+ /*
+ * paste a bitmap with optional palette mapping
+ */
+ void (*draw_bitmap) (osd_object_t *osd, uint8_t *bitmap,
+ int x1, int y1, int width, int height,
+ uint8_t *palette_map);
+
+ /*
+ * send the osd to be displayed (unscaled) at given pts (0=now)
+ * the object is not changed. there may be subsequent drawing on it.
+ * overlay is blended at output (screen) resolution.
+ */
+ int (*show_unscaled) (osd_object_t *osd, int64_t vpts );
+
+ /*
+ * see xine.h for defined XINE_OSD_CAP_ values.
+ */
+ uint32_t (*get_capabilities) (osd_object_t *osd);
+
+ /*
+ * define extent of reference coordinate system for video
+ * resolution independent osds. both sizes must be > 0 to
+ * take effect. otherwise, video resolution will be used.
+ */
+ void (*set_extent) (osd_object_t *osd, int extent_width, int extent_height);
+
+ /*
+ * set an argb buffer to be blended into video
+ * the buffer must exactly match the osd dimensions
+ * and stay valid while the osd is on screen. pass
+ * a NULL pointer to safely remove the buffer from
+ * the osd layer. only the dirty area will be
+ * updated on screen. for convinience the whole
+ * osd object will be considered dirty when setting
+ * a different buffer pointer.
+ * see also XINE_OSD_CAP_ARGB_LAYER
+ */
+ void (*set_argb_buffer) (osd_object_t *osd, uint32_t *argb_buffer,
+ int dirty_x, int dirty_y, int dirty_width, int dirty_height);
+
+ /*
+ * osd video window defines an area withing osd extent where the
+ * video shall be scaled to while an osd is displayed on screen.
+ * both width and height must be > 0 to take effect.
+ */
+ void (*set_video_window) (osd_object_t *osd,
+ int window_x, int window_y, int window_width, int window_height);
+
+ /* private stuff */
+
+ pthread_mutex_t osd_mutex;
+ video_overlay_event_t event;
+ osd_object_t *osds; /* instances of osd */
+ osd_font_t *fonts; /* loaded fonts */
+ int textpalette; /* default textpalette */
+
+};
+
+/*
+ * initialize the osd rendering engine
+ */
+osd_renderer_t *_x_osd_renderer_init( xine_stream_t *stream ) XINE_MALLOC;
+
+
+/*
+ * The size of a text palette
+ */
+
+#define TEXT_PALETTE_SIZE 11
+
+/*
+ * Preassigned color indices for rendering text
+ * (more can be added, not exceeding OVL_PALETTE_SIZE)
+ */
+
+#define OSD_TEXT1 (0 * TEXT_PALETTE_SIZE)
+#define OSD_TEXT2 (1 * TEXT_PALETTE_SIZE)
+#define OSD_TEXT3 (2 * TEXT_PALETTE_SIZE)
+#define OSD_TEXT4 (3 * TEXT_PALETTE_SIZE)
+#define OSD_TEXT5 (4 * TEXT_PALETTE_SIZE)
+#define OSD_TEXT6 (5 * TEXT_PALETTE_SIZE)
+#define OSD_TEXT7 (6 * TEXT_PALETTE_SIZE)
+#define OSD_TEXT8 (7 * TEXT_PALETTE_SIZE)
+#define OSD_TEXT9 (8 * TEXT_PALETTE_SIZE)
+#define OSD_TEXT10 (9 * TEXT_PALETTE_SIZE)
+
+/*
+ * Defined palettes for rendering osd text
+ * (more can be added later)
+ */
+
+#define NUMBER_OF_TEXT_PALETTES 4
+#define TEXTPALETTE_WHITE_BLACK_TRANSPARENT 0
+#define TEXTPALETTE_WHITE_NONE_TRANSPARENT 1
+#define TEXTPALETTE_WHITE_NONE_TRANSLUCID 2
+#define TEXTPALETTE_YELLOW_BLACK_TRANSPARENT 3
+
+#endif
+