--- /dev/null
+/* DirectFB presentation app
+ *
+ * Copyright (C) 2001 convergence integrated media
+ * Authors: Sven Neumann <sven@convergence.de>
+ *
+ * This program 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.
+ *
+ * This program 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <directfb.h>
+
+#include <glib-object.h>
+
+#include "apptypes.h"
+
+#include "action.h"
+#include "context.h"
+#include "header.h"
+#include "image.h"
+#include "listitem.h"
+#include "render.h"
+#include "resources.h"
+#include "slides.h"
+#include "slide.h"
+#include "text.h"
+#include "video.h"
+
+
+static void render_bullet (Context *context,
+ gint *offx,
+ gint offy);
+
+void
+render_bg (Context *context)
+{
+ guchar *color;
+
+ color = context_get_bgcolor (context);
+ context->surface->SetColor (context->surface,
+ color[0], color[1], color[2], color[3]);
+ context->surface->FillRectangle (context->surface,
+ 0, 0, context->w, context->h);
+}
+
+void
+render_bgimage (Context *context)
+{
+ gchar *image;
+
+ image = context_get_bgimage (context);
+ if (image)
+ {
+ IDirectFBSurface *src;
+ gint w, h;
+
+ src = resources_get_surface (image);
+ if (!src)
+ return;
+
+ src->GetSize (src, &w, &h);
+
+ if (w == context->w && h == context->h)
+ {
+ context->surface->Blit (context->surface, src, NULL, 0, 0);
+ }
+ else
+ {
+ DFBRectangle rect = { 0, 0, context->w, context->h };
+
+ context->surface->StretchBlit (context->surface,
+ src, NULL, &rect);
+ }
+
+ resources_release_surface (image);
+ }
+}
+
+void
+render_image (Context *context,
+ Image *image)
+{
+ Item *item;
+ IDirectFBSurface *src;
+ DFBRectangle rect;
+ DFBSurfacePixelFormat format;
+ gint w, h, ratio;
+
+ if (IS_VIDEO (image))
+ {
+ Video *video;
+
+ video = (Video *) image;
+ video->dest_surface = context->surface;
+
+ return;
+ }
+
+ src = resources_get_surface (ITEM (image)->value);
+
+ if (!src)
+ return;
+
+ src->GetSize (src, &w, &h);
+ src->GetPixelFormat (src, &format);
+
+ if (format == DSPF_ARGB)
+ context->surface->SetBlittingFlags (context->surface,
+ DSBLIT_BLEND_ALPHACHANNEL);
+
+ ratio = (w * 1024) / h;
+ item = (Item *) image;
+
+ rect.w = item->flags & WIDTH ?
+ item->width : (item->flags & HEIGHT ? (item->height * ratio) / 1024 : w);
+ rect.h = item->flags & HEIGHT ?
+ item->height : (item->flags & WIDTH ? (item->width * 1024) / ratio : h);
+
+ rect.x = item->flags & XOFFSET ? item->x : 0;
+ rect.y = item->flags & YOFFSET ? item->y : 0;
+
+ if (format == DSPF_ARGB)
+ context->surface->SetBlittingFlags (context->surface,
+ DSBLIT_BLEND_ALPHACHANNEL);
+
+ if (w == rect.w || h == rect.h)
+ context->surface->Blit (context->surface, src, NULL, rect.x, rect.y);
+ else
+ context->surface->StretchBlit (context->surface, src, NULL, &rect);
+
+ context->surface->SetBlittingFlags (context->surface, DSBLIT_NOFX);
+
+ resources_release_surface (ITEM (image)->value);
+}
+
+void
+render_text (Context *context,
+ Text *text,
+ gint *offy)
+{
+ guchar *color;
+ gchar *face;
+ gint size;
+ gint offx;
+ IDirectFBFont *font;
+
+ context_push (context, (Item *) text);
+
+ color = context_get_fgcolor (context);
+ context->surface->SetColor (context->surface,
+ color[0], color[1], color[2], color[3]);
+
+ face = context_get_face (context);
+ size = context_get_size (context);
+
+ g_return_if_fail (face != NULL);
+ g_return_if_fail (size > 0);
+
+ offx = 10;
+
+ if (IS_HEADER (text))
+ size = (size * 64) / 52;
+ else if (IS_LISTITEM (text))
+ size = (size * 48) / 64;
+ else
+ offx+=40;
+
+ font = resources_get_font (face, size);
+
+ if (IS_LISTITEM (text))
+ {
+ gint asc;
+
+ font->GetAscender (font, &asc);
+ render_bullet (context, &offx, *offy + asc);
+ }
+
+ context->surface->SetFont (context->surface, font);
+ context->surface->DrawString (context->surface,
+ ITEM (text)->value, -1,
+ offx, *offy, DSTF_TOPLEFT);
+
+ *offy += (size * 64) / 48;
+
+ context_pop (context, (Item *) text);
+}
+
+static void
+render_bullet (Context *context,
+ gint *offx,
+ gint offy)
+{
+ IDirectFBSurface *src;
+ gchar *image;
+ gint w, h;
+
+ image = context_get_bullet (context);
+ if (image)
+ {
+ src = resources_get_surface (image);
+ if (!src)
+ return;
+
+ src->GetSize (src, &w, &h);
+
+ context->surface->SetBlittingFlags (context->surface,
+ DSBLIT_BLEND_ALPHACHANNEL);
+ context->surface->Blit (context->surface,
+ src, NULL, *offx + 20, offy - h);
+ context->surface->SetBlittingFlags (context->surface, DSBLIT_NOFX);
+
+ resources_release_surface (image);
+
+ *offx += w + 24;
+ }
+}