aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/SkUtils.cpp')
-rw-r--r--src/core/SkUtils.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/core/SkUtils.cpp b/src/core/SkUtils.cpp
index 76da23a6d0..c65947dfe9 100644
--- a/src/core/SkUtils.cpp
+++ b/src/core/SkUtils.cpp
@@ -34,6 +34,18 @@
*(dst)++ = value; *(dst)++ = value; \
*(dst)++ = value; *(dst)++ = value; \
} while (0)
+
+#define copy_16_longs(dst, src) \
+ do { \
+ *(dst)++ = *(src)++; *(dst)++ = *(src)++; \
+ *(dst)++ = *(src)++; *(dst)++ = *(src)++; \
+ *(dst)++ = *(src)++; *(dst)++ = *(src)++; \
+ *(dst)++ = *(src)++; *(dst)++ = *(src)++; \
+ *(dst)++ = *(src)++; *(dst)++ = *(src)++; \
+ *(dst)++ = *(src)++; *(dst)++ = *(src)++; \
+ *(dst)++ = *(src)++; *(dst)++ = *(src)++; \
+ *(dst)++ = *(src)++; *(dst)++ = *(src)++; \
+ } while (0)
#endif
///////////////////////////////////////////////////////////////////////////////
@@ -109,6 +121,24 @@ static void sk_memset32_portable(uint32_t dst[], uint32_t value, int count) {
}
}
+static void sk_memcpy32_portable(uint32_t dst[], const uint32_t src[], int count) {
+ SkASSERT(dst != NULL && count >= 0);
+
+ int sixteenlongs = count >> 4;
+ if (sixteenlongs) {
+ do {
+ copy_16_longs(dst, src);
+ } while (--sixteenlongs != 0);
+ count &= 15;
+ }
+
+ if (count) {
+ do {
+ *dst++ = *src++;
+ } while (--count != 0);
+ }
+}
+
static void choose_memset16(SkMemset16Proc* proc) {
*proc = SkMemset16GetPlatformProc();
if (NULL == *proc) {
@@ -141,6 +171,22 @@ void sk_memset32(uint32_t dst[], uint32_t value, int count) {
return proc(dst, value, count);
}
+static void choose_memcpy32(SkMemcpy32Proc* proc) {
+ *proc = SkMemcpy32GetPlatformProc();
+ if (NULL == *proc) {
+ *proc = &sk_memcpy32_portable;
+ }
+}
+
+void sk_memcpy32(uint32_t dst[], const uint32_t src[], int count) {
+ SK_DECLARE_STATIC_ONCE(once);
+ static SkMemcpy32Proc proc = NULL;
+ SkOnce(&once, choose_memcpy32, &proc);
+ SkASSERT(proc != NULL);
+
+ return proc(dst, src, count);
+}
+
///////////////////////////////////////////////////////////////////////////////
/* 0xxxxxxx 1 total