| /* | |
| * 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); | |
| } |