blob: e878c97244151f52d8f2d4dfdf027cb791e9f4a2 [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
bungemanf93d7112016-09-16 06:24:20 -070051CGDataProviderRef SkCreateDataProviderFromStream(std::unique_ptr<SkStreamRewindable> 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
bungemanf93d7112016-09-16 06:24:20 -070057 size_t size = stream->getLength();
58 return CGDataProviderCreateWithData(stream.release(), addr, size, 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;
bungemanf93d7112016-09-16 06:24:20 -070068 return CGDataProviderCreateSequential(stream.release(), &rec);
reed@google.com61c22042012-02-24 15:29:00 +000069}
reed@google.com12b1f192013-03-25 20:15:40 +000070
71///////////////////////////////////////////////////////////////////////////////
72
73#include "SkData.h"
74
bungemanf93d7112016-09-16 06:24:20 -070075CGDataProviderRef SkCreateDataProviderFromData(sk_sp<SkData> data) {
76 const void* addr = data->data();
77 size_t size = data->size();
78 return CGDataProviderCreateWithData(data.release(), addr, size, unref_proc);
reed@google.com12b1f192013-03-25 20:15:40 +000079}
mtklein1ee76512015-11-02 10:20:27 -080080
81#endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)