blob: 36e5194a1990b3e65bdbf0fe3654bcff5659b167 [file] [log] [blame]
reed@google.com61c22042012-02-24 15:29:00 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
mtklein1ee76512015-11-02 10:20:27 -08008#include "SkTypes.h"
9#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
10
reed@google.com61c22042012-02-24 15:29:00 +000011#include "SkCGUtils.h"
12#include "SkStream.h"
13
scroggoa1193e42015-01-21 12:09:53 -080014// These are used by CGDataProviderCreateWithData
reed@google.com61c22042012-02-24 15:29:00 +000015
reed@google.com12b1f192013-03-25 20:15:40 +000016static void unref_proc(void* info, const void* addr, size_t size) {
reed@google.com61c22042012-02-24 15:29:00 +000017 SkASSERT(info);
18 ((SkRefCnt*)info)->unref();
19}
20
scroggoa1193e42015-01-21 12:09:53 -080021static void delete_stream_proc(void* info, const void* addr, size_t size) {
22 SkASSERT(info);
23 SkStream* stream = (SkStream*)info;
24 SkASSERT(stream->getMemoryBase() == addr);
25 SkASSERT(stream->getLength() == size);
halcanary385fe4d2015-08-26 13:07:48 -070026 delete stream;
scroggoa1193e42015-01-21 12:09:53 -080027}
28
reed@google.com61c22042012-02-24 15:29:00 +000029// These are used by CGDataProviderSequentialCallbacks
30
caryclark@google.com3dd45912012-06-06 12:11:10 +000031static size_t get_bytes_proc(void* info, void* buffer, size_t bytes) {
reed@google.com61c22042012-02-24 15:29:00 +000032 SkASSERT(info);
33 return ((SkStream*)info)->read(buffer, bytes);
34}
35
36static off_t skip_forward_proc(void* info, off_t bytes) {
caryclark@google.com3dd45912012-06-06 12:11:10 +000037 return ((SkStream*)info)->skip((size_t) bytes);
reed@google.com61c22042012-02-24 15:29:00 +000038}
39
40static void rewind_proc(void* info) {
41 SkASSERT(info);
42 ((SkStream*)info)->rewind();
43}
44
scroggoa1193e42015-01-21 12:09:53 -080045// Used when info is an SkStream.
reed@google.com61c22042012-02-24 15:29:00 +000046static void release_info_proc(void* info) {
47 SkASSERT(info);
halcanary385fe4d2015-08-26 13:07:48 -070048 delete (SkStream*)info;
reed@google.com61c22042012-02-24 15:29:00 +000049}
50
51CGDataProviderRef SkCreateDataProviderFromStream(SkStream* stream) {
scroggoa1193e42015-01-21 12:09:53 -080052 // TODO: Replace with SkStream::getData() when that is added. Then we only
53 // have one version of CGDataProviderCreateWithData (i.e. same release proc)
reed@google.com61c22042012-02-24 15:29:00 +000054 const void* addr = stream->getMemoryBase();
55 if (addr) {
56 // special-case when the stream is just a block of ram
57 return CGDataProviderCreateWithData(stream, addr, stream->getLength(),
scroggoa1193e42015-01-21 12:09:53 -080058 delete_stream_proc);
reed@google.com61c22042012-02-24 15:29:00 +000059 }
skia.committer@gmail.come60ed082013-03-26 07:01:04 +000060
reed@google.com61c22042012-02-24 15:29:00 +000061 CGDataProviderSequentialCallbacks rec;
62 sk_bzero(&rec, sizeof(rec));
63 rec.version = 0;
64 rec.getBytes = get_bytes_proc;
65 rec.skipForward = skip_forward_proc;
66 rec.rewind = rewind_proc;
67 rec.releaseInfo = release_info_proc;
68 return CGDataProviderCreateSequential(stream, &rec);
69}
reed@google.com12b1f192013-03-25 20:15:40 +000070
71///////////////////////////////////////////////////////////////////////////////
72
73#include "SkData.h"
74
reed@google.com50b14a22013-03-25 20:21:26 +000075CGDataProviderRef SkCreateDataProviderFromData(SkData* data) {
reed@google.com12b1f192013-03-25 20:15:40 +000076 data->ref();
77 return CGDataProviderCreateWithData(data, data->data(), data->size(),
78 unref_proc);
79}
mtklein1ee76512015-11-02 10:20:27 -080080
81#endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)