diff options
Diffstat (limited to 'utils/mac/SkStream_mac.cpp')
-rw-r--r-- | utils/mac/SkStream_mac.cpp | 67 |
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); +} |