aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/gwin/gwin.h33
-rw-r--r--src/gwin/gwin.c12
2 files changed, 45 insertions, 0 deletions
diff --git a/include/gwin/gwin.h b/include/gwin/gwin.h
index de4b6387..372ece9c 100644
--- a/include/gwin/gwin.h
+++ b/include/gwin/gwin.h
@@ -766,6 +766,39 @@ extern "C" {
#endif
/*-------------------------------------------------
+ * Image functions
+ *-------------------------------------------------*/
+
+ #if GDISP_NEED_IMAGE || defined(__DOXYGEN__)
+ /**
+ * @brief Draw the image
+ * @return GDISP_IMAGE_ERR_OK (0) on success or an error code.
+ *
+ * @param[in] gh The window handle
+ * @param[in] img The image structure
+ * @param[in] x,y The window location to draw the image
+ * @param[in] cx,cy The area on the screen to draw
+ * @param[in] sx,sy The image position to start drawing at
+ *
+ * @pre gdispImageOpen() must have returned successfully.
+ *
+ * @note If sx,sy + cx,cy is outside the image boundaries the area outside the image
+ * is simply not drawn.
+ * @note If @p gdispImageCache() has been called first for this frame, this routine will draw using a
+ * fast blit from the cached frame. If not, it reads the input and decodes it as it
+ * is drawing. This may be significantly slower than if the image has been cached (but
+ * uses a lot less RAM)
+ *
+ * @api
+ */
+ gdispImageError gwinDrawImage(GHandle gh, gdispImage *img, coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t sx, coord_t sy);
+ #endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/*-------------------------------------------------
* Additional functionality
*-------------------------------------------------*/
diff --git a/src/gwin/gwin.c b/src/gwin/gwin.c
index 16f06b0c..f5d78ac6 100644
--- a/src/gwin/gwin.c
+++ b/src/gwin/gwin.c
@@ -489,6 +489,18 @@ void gwinBlitArea(GHandle gh, coord_t x, coord_t y, coord_t cx, coord_t cy, coor
}
#endif
+#if GDISP_NEED_IMAGE
+ gdispImageError gwinDrawImage(GHandle gh, gdispImage *img, coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t sx, coord_t sy) {
+ if (!((gh->flags & GWIN_FLG_VISIBLE)))
+ return GDISP_IMAGE_ERR_OK;
+
+ #if GDISP_NEED_CLIP
+ gdispSetClip(gh->x, gh->y, gh->width, gh->height);
+ #endif
+ return gdispImageDraw(img, gh->x+x, gh->y+y, cx, cy, sx, sy);
+ }
+#endif
+
#endif /* GFX_USE_GWIN */
/** @} */