aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/gwin/image.h53
-rw-r--r--src/gwin/gimage.c55
2 files changed, 33 insertions, 75 deletions
diff --git a/include/gwin/image.h b/include/gwin/image.h
index 66dd0b94..66aba3d1 100644
--- a/include/gwin/image.h
+++ b/include/gwin/image.h
@@ -60,42 +60,51 @@ GHandle gwinGImageCreate(GDisplay *g, GImageObject *widget, GWindowInit *pInit);
#define gwinImageCreate(w, pInit) gwinGImageCreate(GDISP, w, pInit)
/**
- * @brief Sets the input routines that support reading the image from memory
- * in RAM or flash.
- * @return TRUE if the IO open function succeeds
+ * @brief Opens the image using a GFILE
+ * @return TRUE if the image can be opened
*
* @param[in] gh The widget (must be an image widget)
- * @param[in] memory A pointer to the image in RAM or Flash
+ * @param[in] f The open (for reading) GFILE to use
*
* @api
*/
-bool_t gwinImageOpenMemory(GHandle gh, const void* memory);
+bool_t gwinImageOpenGFile(GHandle gh, GFILE *f);
-#if defined(WIN32) || GFX_USE_OS_WIN32 || GFX_USE_OS_LINUX || GFX_USE_OS_OSX || defined(__DOXYGEN__)
- /**
- * @brief Sets the input routines that support reading the image from a file
- * @return TRUE if the IO open function succeeds
- *
- * @param[in] gh The widget (must be an image widget)
- * @param[in] filename The filename to open
- *
- * @api
- */
- bool_t gwinImageOpenFile(GHandle gh, const char* filename);
-#endif
+/**
+ * @brief Opens the image using the specified filename
+ * @return TRUE if the open succeeds
+ *
+ * @param[in] gh The widget (must be an image widget)
+ * @param[in] filename The filename to open
+ *
+ * @api
+ */
+#define gwinImageOpenFile(gh, filename) gwinImageOpenGFile((gh), gfileOpen((filename), "rb"))
-#if GFX_USE_OS_CHIBIOS || defined(__DOXYGEN__)
/**
- * @brief Sets the input routines that support reading the image from a BaseFileStream (eg. an SD-Card).
+ * @brief Sets the input routines that support reading the image from memory
+ * in RAM or flash.
+ * @pre GFILE_NEED_MEMFS must be TRUE
* @return TRUE if the IO open function succeeds
*
* @param[in] gh The widget (must be an image widget)
- * @param[in] streamPtr A pointer to the (open) BaseFileStream object.
+ * @param[in] ptr A pointer to the image in RAM or Flash
*
* @api
*/
- bool_t gwinImageOpenStream(GHandle gh, void *streamPtr);
-#endif
+#define gwinImageOpenMemory(gh, ptr) gwinImageOpenGFile((gh), gfileOpenMemory((void *)(ptr), "rb"))
+
+/**
+ * @brief Sets the input routines that support reading the image from a BaseFileStream (eg. an SD-Card).
+ * @return TRUE if the IO open function succeeds
+ * @pre GFILE_NEED_CHIBIOSFS and GFX_USE_OS_CHIBIOS must be TRUE
+ *
+ * @param[in] gh The widget (must be an image widget)
+ * @param[in] streamPtr A pointer to the (open) BaseFileStream object.
+ *
+ * @api
+ */
+#define gwinImageOpenStream(gh, streamPtr) gwinImageOpenGFile((gh), gfileOpenBaseFIleStream((streamPtr), "rb"))
/**
* @brief Cache the image.
diff --git a/src/gwin/gimage.c b/src/gwin/gimage.c
index b1f8e078..e4032b96 100644
--- a/src/gwin/gimage.c
+++ b/src/gwin/gimage.c
@@ -139,37 +139,11 @@ GHandle gwinGImageCreate(GDisplay *g, GImageObject *gobj, GWindowInit *pInit) {
return (GHandle)gobj;
}
-bool_t gwinImageOpenMemory(GHandle gh, const void* memory) {
+bool_t gwinImageOpenGFile(GHandle gh, GFILE *f) {
if (gdispImageIsOpen(&widget(gh)->image))
gdispImageClose(&widget(gh)->image);
- if (!gdispImageSetMemoryReader(&widget(gh)->image, memory))
- return FALSE;
-
- if (gdispImageOpen(&widget(gh)->image) != GDISP_IMAGE_ERR_OK)
- return FALSE;
-
- if ((gh->flags & GWIN_FLG_VISIBLE)) {
- // Setting the clip here shouldn't be necessary if the redraw doesn't overdraw
- // but we put it in for safety anyway
- #if GDISP_NEED_CLIP
- gdispGSetClip(gh->display, gh->x, gh->y, gh->width, gh->height);
- #endif
- _redraw(gh);
- }
-
- return TRUE;
-}
-
-#if defined(WIN32) || GFX_USE_OS_WIN32 || GFX_USE_OS_LINUX || GFX_USE_OS_OSX || defined(__DOXYGEN__)
-bool_t gwinImageOpenFile(GHandle gh, const char* filename) {
- if (gdispImageIsOpen(&widget(gh)->image))
- gdispImageClose(&widget(gh)->image);
-
- if (!gdispImageSetFileReader(&widget(gh)->image, filename))
- return FALSE;
-
- if (gdispImageOpen(&widget(gh)->image) != GDISP_IMAGE_ERR_OK)
+ if ((gdispImageOpenGFile(&widget(gh)->image, f) & GDISP_IMAGE_ERR_UNRECOVERABLE))
return FALSE;
if ((gh->flags & GWIN_FLG_VISIBLE)) {
@@ -183,31 +157,6 @@ bool_t gwinImageOpenFile(GHandle gh, const char* filename) {
return TRUE;
}
-#endif
-
-#if GFX_USE_OS_CHIBIOS || defined(__DOXYGEN__)
-bool_t gwinImageOpenStream(GHandle gh, void *streamPtr) {
- if (gdispImageIsOpen(&widget(gh)->image))
- gdispImageClose(&widget(gh)->image);
-
- if (!gdispImageSetBaseFileStreamReader(&widget(gh)->image, streamPtr))
- return FALSE;
-
- if (gdispImageOpen(&widget(gh)->image) != GDISP_IMAGE_ERR_OK)
- return FALSE;
-
- if ((gh->flags & GWIN_FLG_VISIBLE)) {
- // Setting the clip here shouldn't be necessary if the redraw doesn't overdraw
- // but we put it in for safety anyway
- #if GDISP_NEED_CLIP
- gdispGSetClip(gh->display, gh->x, gh->y, gh->width, gh->height);
- #endif
- _redraw(gh);
- }
-
- return TRUE;
-}
-#endif
gdispImageError gwinImageCache(GHandle gh) {
return gdispImageCache(&widget(gh)->image);