summaryrefslogtreecommitdiff
path: root/cairosdl.h
diff options
context:
space:
mode:
authorM Joonas Pihlaja <jpihlaja@cc.helsinki.fi>2009-02-15 15:10:30 +0200
committerM Joonas Pihlaja <jpihlaja@cc.helsinki.fi>2009-02-15 15:10:30 +0200
commit11ea8fbcc8634b130a22237dadf338c0d735adb1 (patch)
tree1e5a14ec69759702dc68bbda6f215af6c803db62 /cairosdl.h
Import cairosdl.
Diffstat (limited to 'cairosdl.h')
-rw-r--r--cairosdl.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/cairosdl.h b/cairosdl.h
new file mode 100644
index 0000000..beb190d
--- /dev/null
+++ b/cairosdl.h
@@ -0,0 +1,112 @@
+#ifndef CAIROSDL_H
+#define CAIROSDL_H
+/*
+ * Copyright (c) 2009 M Joonas Pihlaja
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include <cairo.h>
+#include <SDL.h>
+
+/* All cairo and cairosdl functions expect the underlying SDL_Surface
+ * to be locked or not need locking. The underlying condition is that
+ * the ->pixels member of the SDL_Surface should be valid and not
+ * change during the lifetime of the cairo_surface_t representing it,
+ * and that malloc and whatever other OS facilities are allowed to be
+ * called. */
+
+/* Create a cairo image surface and bind the SDL_Surface to it. If
+ * the pixel format of the SDL_Surface isn't supported by cairo,
+ * returns a surface in CAIRO_STATUS_INVALID_FORMAT error state. */
+cairo_surface_t *
+cairosdl_surface_create (SDL_Surface *sdl_surface);
+
+/* Returns the SDL_Surface bound to the image surface. */
+SDL_Surface *
+cairosdl_surface_get_target (cairo_surface_t *surface);
+
+
+/* These functions are noops for Amask=0 surfaces. For
+ * Amask=0xFF000000 surfaces they write the indicated area(s) of the
+ * SDL_Surface bound to the surface from a backing buffer. */
+void
+cairosdl_surface_flush_rects (cairo_surface_t *surface,
+ int num_rects,
+ SDL_Rect const *rects);
+
+void
+cairosdl_surface_flush_rect (cairo_surface_t *surface,
+ int x,
+ int y,
+ int width,
+ int height);
+
+void
+cairosdl_surface_flush (cairo_surface_t *surface);
+
+
+/* These functions are noops for Amask=0 surfaces. For
+ * Amask=0xFF000000 surfaces they read the indicated area(s) from the
+ * SDL_Surface bound to the surface into a backing buffer. */
+void
+cairosdl_surface_mark_dirty_rects (cairo_surface_t *surface,
+ int num_rects,
+ SDL_Rect const *rects);
+
+void
+cairosdl_surface_mark_dirty_rect (cairo_surface_t *surface,
+ int x,
+ int y,
+ int width,
+ int height);
+
+void
+cairosdl_surface_mark_dirty (cairo_surface_t *surface);
+
+
+/* Context convenience functions. */
+
+/* Equivalent to cairo_create(cairosdl_surface_create(sdl_surface)); */
+cairo_t *
+cairosdl_create (SDL_Surface *sdl_surface);
+
+/* Equivalent to cairosdl_surface_get_target(cairo_get_target(cr)); */
+SDL_Surface *
+cairosdl_get_target (cairo_t *cr);
+
+/* Calls cairosdl_surface_flush() on the target of the cairo context
+ * and then destroys the context. */
+void
+cairosdl_destroy (cairo_t *cr);
+
+
+/* Cairo pixel configuration. This isn't tweakable, it just is. */
+#define CAIROSDL_ASHIFT 24
+#define CAIROSDL_RSHIFT 16
+#define CAIROSDL_GSHIFT 8
+#define CAIROSDL_BSHIFT 0
+#define CAIROSDL_AMASK (255U << CAIROSDL_ASHIFT)
+#define CAIROSDL_RMASK (255U << CAIROSDL_RSHIFT)
+#define CAIROSDL_GMASK (255U << CAIROSDL_GSHIFT)
+#define CAIROSDL_BMASK (255U << CAIROSDL_BSHIFT)
+
+#endif /* CAIROSDL_H */