summaryrefslogtreecommitdiff
path: root/utils/mac/SkStream_mac.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/mac/SkStream_mac.cpp')
-rw-r--r--utils/mac/SkStream_mac.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/utils/mac/SkStream_mac.cpp b/utils/mac/SkStream_mac.cpp
new file mode 100644
index 00000000..64d2dbb2
--- /dev/null
+++ b/utils/mac/SkStream_mac.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkCGUtils.h"
+#include "SkStream.h"
+
+// This is used by CGDataProviderCreateWithData
+
+static void unref_proc(void* info, const void* addr, size_t size) {
+ SkASSERT(info);
+ ((SkRefCnt*)info)->unref();
+}
+
+// These are used by CGDataProviderSequentialCallbacks
+
+static size_t get_bytes_proc(void* info, void* buffer, size_t bytes) {
+ SkASSERT(info);
+ return ((SkStream*)info)->read(buffer, bytes);
+}
+
+static off_t skip_forward_proc(void* info, off_t bytes) {
+ return ((SkStream*)info)->skip((size_t) bytes);
+}
+
+static void rewind_proc(void* info) {
+ SkASSERT(info);
+ ((SkStream*)info)->rewind();
+}
+
+static void release_info_proc(void* info) {
+ SkASSERT(info);
+ ((SkStream*)info)->unref();
+}
+
+CGDataProviderRef SkCreateDataProviderFromStream(SkStream* stream) {
+ stream->ref(); // unref will be called when the provider is deleted
+
+ const void* addr = stream->getMemoryBase();
+ if (addr) {
+ // special-case when the stream is just a block of ram
+ return CGDataProviderCreateWithData(stream, addr, stream->getLength(),
+ unref_proc);
+ }
+
+ CGDataProviderSequentialCallbacks rec;
+ sk_bzero(&rec, sizeof(rec));
+ rec.version = 0;
+ rec.getBytes = get_bytes_proc;
+ rec.skipForward = skip_forward_proc;
+ rec.rewind = rewind_proc;
+ rec.releaseInfo = release_info_proc;
+ return CGDataProviderCreateSequential(stream, &rec);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+#include "SkData.h"
+
+CGDataProviderRef SkCreateDataProviderFromData(SkData* data) {
+ data->ref();
+ return CGDataProviderCreateWithData(data, data->data(), data->size(),
+ unref_proc);
+}