summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/codecs.c1
-rw-r--r--apps/codecs.h3
-rw-r--r--apps/codecs/lib/codeclib.c11
-rw-r--r--apps/plugin.c1
-rw-r--r--apps/plugin.h3
-rw-r--r--apps/plugins/lib/gray_scroll.c35
-rw-r--r--apps/plugins/lib/xlcd.c38
7 files changed, 22 insertions, 70 deletions
diff --git a/apps/codecs.c b/apps/codecs.c
index 380816ba40..0301a490d8 100644
--- a/apps/codecs.c
+++ b/apps/codecs.c
@@ -215,6 +215,7 @@ struct codec_api ci = {
/* new stuff at the end, sort into place next time
the API gets incompatible */
+ memmove,
};
int codec_load_ram(char* codecptr, int size, void* ptr2, int bufwrap,
diff --git a/apps/codecs.h b/apps/codecs.h
index 6e2ef9882c..00f0f64733 100644
--- a/apps/codecs.h
+++ b/apps/codecs.h
@@ -85,7 +85,7 @@
#define CODEC_MAGIC 0x52434F44 /* RCOD */
/* increase this every time the api struct changes */
-#define CODEC_API_VERSION 3
+#define CODEC_API_VERSION 4
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
@@ -292,6 +292,7 @@ struct codec_api {
/* new stuff at the end, sort into place next time
the API gets incompatible */
+ void* (*memmove)(void *out, const void *in, size_t n);
};
/* codec header */
diff --git a/apps/codecs/lib/codeclib.c b/apps/codecs/lib/codeclib.c
index 1f070e8eac..917970ba8d 100644
--- a/apps/codecs/lib/codeclib.c
+++ b/apps/codecs/lib/codeclib.c
@@ -132,16 +132,9 @@ void* memchr(const void *s, int c, size_t n)
return(local_rb->memchr(s,c,n));
}
-void* memmove(void *s1, const void *s2, size_t n)
+void *memmove(void *dest, const void *src, size_t n)
{
- char* dest=(char*)s1;
- char* src=(char*)s2;
- size_t i;
-
- for (i=0;i<n;i++)
- dest[i]=src[i];
-
- return(dest);
+ return(local_rb->memmove(dest,src,n));
}
void qsort(void *base, size_t nmemb, size_t size,
diff --git a/apps/plugin.c b/apps/plugin.c
index 774ae547a3..3e099253dc 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -384,6 +384,7 @@ static const struct plugin_api rockbox_api = {
lcd_bitmap_transparent_part,
lcd_bitmap_transparent,
#endif
+ memmove,
};
int plugin_load(const char* plugin, void* parameter)
diff --git a/apps/plugin.h b/apps/plugin.h
index 1998bcf315..952bdc8846 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -97,7 +97,7 @@
#define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */
-#define PLUGIN_API_VERSION 5
+#define PLUGIN_API_VERSION 6
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
@@ -451,6 +451,7 @@ struct plugin_api {
void (*lcd_bitmap_transparent)(const fb_data *src, int x, int y,
int width, int height);
#endif
+ void* (*memmove)(void *out, const void *in, size_t n);
};
/* plugin header */
diff --git a/apps/plugins/lib/gray_scroll.c b/apps/plugins/lib/gray_scroll.c
index 341024a67e..89ca2f37c3 100644
--- a/apps/plugins/lib/gray_scroll.c
+++ b/apps/plugins/lib/gray_scroll.c
@@ -29,29 +29,6 @@
#ifdef HAVE_LCD_BITMAP /* and also not for the Player */
#include "gray.h"
-/* FIXME: intermediate solution until we have properly optimised memmove() */
-static void *my_memmove(void *dst0, const void *src0, size_t len0)
-{
- char *dst = (char *) dst0;
- char *src = (char *) src0;
-
- if (dst <= src)
- {
- while (len0--)
- *dst++ = *src++;
- }
- else
- {
- dst += len0;
- src += len0;
-
- while (len0--)
- *(--dst) = *(--src);
- }
-
- return dst0;
-}
-
/*** Scrolling ***/
/* Scroll left */
@@ -68,7 +45,7 @@ void gray_scroll_left(int count)
blank = (_gray_info.drawmode & DRMODE_INVERSEVID) ?
_gray_info.fg_brightness : _gray_info.bg_brightness;
- my_memmove(_gray_info.cur_buffer, _gray_info.cur_buffer + shift, length);
+ _gray_rb->memmove(_gray_info.cur_buffer, _gray_info.cur_buffer + shift, length);
_gray_rb->memset(_gray_info.cur_buffer + length, blank, shift);
}
@@ -86,7 +63,7 @@ void gray_scroll_right(int count)
blank = (_gray_info.drawmode & DRMODE_INVERSEVID) ?
_gray_info.fg_brightness : _gray_info.bg_brightness;
- my_memmove(_gray_info.cur_buffer + shift, _gray_info.cur_buffer, length);
+ _gray_rb->memmove(_gray_info.cur_buffer + shift, _gray_info.cur_buffer, length);
_gray_rb->memset(_gray_info.cur_buffer, blank, shift);
}
@@ -107,7 +84,7 @@ void gray_scroll_up(int count)
do
{
- my_memmove(data, data + count, length);
+ _gray_rb->memmove(data, data + count, length);
_gray_rb->memset(data + length, blank, count);
data += _gray_info.height;
}
@@ -131,7 +108,7 @@ void gray_scroll_down(int count)
do
{
- my_memmove(data + count, data, length);
+ _gray_rb->memmove(data + count, data, length);
_gray_rb->memset(data, blank, count);
data += _gray_info.height;
}
@@ -161,7 +138,7 @@ void gray_ub_scroll_left(int count)
+ MULU16(_gray_info.plane_size, _gray_info.depth);
do
{
- my_memmove(ptr_row, ptr_row + count, length);
+ _gray_rb->memmove(ptr_row, ptr_row + count, length);
_gray_rb->memset(ptr_row + length, 0, count);
ptr_row += _gray_info.plane_size;
}
@@ -193,7 +170,7 @@ void gray_ub_scroll_right(int count)
+ MULU16(_gray_info.plane_size, _gray_info.depth);
do
{
- my_memmove(ptr_row + count, ptr_row, length);
+ _gray_rb->memmove(ptr_row + count, ptr_row, length);
_gray_rb->memset(ptr_row, 0, count);
ptr_row += _gray_info.plane_size;
}
diff --git a/apps/plugins/lib/xlcd.c b/apps/plugins/lib/xlcd.c
index 33d807f2f3..a842cf5eb7 100644
--- a/apps/plugins/lib/xlcd.c
+++ b/apps/plugins/lib/xlcd.c
@@ -106,28 +106,6 @@ void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3)
}
#if LCD_DEPTH >= 8
-/* FIXME: intermediate solution until we have properly optimised memmove() */
-static void *my_memmove(void *dst0, const void *src0, size_t len0)
-{
- char *dst = (char *) dst0;
- char *src = (char *) src0;
-
- if (dst <= src)
- {
- while (len0--)
- *dst++ = *src++;
- }
- else
- {
- dst += len0;
- src += len0;
-
- while (len0--)
- *(--dst) = *(--src);
- }
-
- return dst0;
-}
void xlcd_scroll_left(int count)
{
@@ -143,7 +121,7 @@ void xlcd_scroll_left(int count)
do
{
- my_memmove(data, data + count, length * sizeof(fb_data));
+ local_rb->memmove(data, data + count, length * sizeof(fb_data));
data += LCD_WIDTH;
}
while (data < data_end);
@@ -168,7 +146,7 @@ void xlcd_scroll_right(int count)
do
{
- my_memmove(data + count, data, length * sizeof(fb_data));
+ local_rb->memmove(data + count, data, length * sizeof(fb_data));
data += LCD_WIDTH;
}
while (data < data_end);
@@ -188,9 +166,9 @@ void xlcd_scroll_up(int count)
length = LCD_HEIGHT - count;
- my_memmove(local_rb->lcd_framebuffer,
- local_rb->lcd_framebuffer + count * LCD_WIDTH,
- length * LCD_WIDTH * sizeof(fb_data));
+ local_rb->memmove(local_rb->lcd_framebuffer,
+ local_rb->lcd_framebuffer + count * LCD_WIDTH,
+ length * LCD_WIDTH * sizeof(fb_data));
oldmode = local_rb->lcd_get_drawmode();
local_rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
@@ -207,9 +185,9 @@ void xlcd_scroll_down(int count)
length = LCD_HEIGHT - count;
- my_memmove(local_rb->lcd_framebuffer + count * LCD_WIDTH,
- local_rb->lcd_framebuffer,
- length * LCD_WIDTH * sizeof(fb_data));
+ local_rb->memmove(local_rb->lcd_framebuffer + count * LCD_WIDTH,
+ local_rb->lcd_framebuffer,
+ length * LCD_WIDTH * sizeof(fb_data));
oldmode = local_rb->lcd_get_drawmode();
local_rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);