blob: 2c1c1e2e057539c89957e0f5924db0a6c9f982fe [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"
Herb Derbyd7b34a52017-03-20 11:19:23 -04009
mtklein1ee76512015-11-02 10:20:27 -080010#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
11
reed@google.com61c22042012-02-24 15:29:00 +000012#include "SkCGUtils.h"
Herb Derbyb549cc32017-03-27 13:35:15 -040013#include "SkMalloc.h"
reed@google.com61c22042012-02-24 15:29:00 +000014#include "SkStream.h"
15
scroggoa1193e42015-01-21 12:09:53 -080016// These are used by CGDataProviderCreateWithData
reed@google.com61c22042012-02-24 15:29:00 +000017
reed@google.com12b1f192013-03-25 20:15:40 +000018static void unref_proc(void* info, const void* addr, size_t size) {
reed@google.com61c22042012-02-24 15:29:00 +000019 SkASSERT(info);
20 ((SkRefCnt*)info)->unref();
21}
22
scroggoa1193e42015-01-21 12:09:53 -080023static void delete_stream_proc(void* info, const void* addr, size_t size) {
24 SkASSERT(info);
25 SkStream* stream = (SkStream*)info;
26 SkASSERT(stream->getMemoryBase() == addr);
27 SkASSERT(stream->getLength() == size);
halcanary385fe4d2015-08-26 13:07:48 -070028 delete stream;
scroggoa1193e42015-01-21 12:09:53 -080029}
30
reed@google.com61c22042012-02-24 15:29:00 +000031// These are used by CGDataProviderSequentialCallbacks
32
caryclark@google.com3dd45912012-06-06 12:11:10 +000033static size_t get_bytes_proc(void* info, void* buffer, size_t bytes) {
reed@google.com61c22042012-02-24 15:29:00 +000034 SkASSERT(info);
35 return ((SkStream*)info)->read(buffer, bytes);
36}
37
38static off_t skip_forward_proc(void* info, off_t bytes) {
caryclark@google.com3dd45912012-06-06 12:11:10 +000039 return ((SkStream*)info)->skip((size_t) bytes);
reed@google.com61c22042012-02-24 15:29:00 +000040}
41
42static void rewind_proc(void* info) {
43 SkASSERT(info);
44 ((SkStream*)info)->rewind();
45}
46
scroggoa1193e42015-01-21 12:09:53 -080047// Used when info is an SkStream.
reed@google.com61c22042012-02-24 15:29:00 +000048static void release_info_proc(void* info) {
49 SkASSERT(info);
halcanary385fe4d2015-08-26 13:07:48 -070050 delete (SkStream*)info;
reed@google.com61c22042012-02-24 15:29:00 +000051}
52
bungemanf93d7112016-09-16 06:24:20 -070053CGDataProviderRef SkCreateDataProviderFromStream(std::unique_ptr<SkStreamRewindable> stream) {
scroggoa1193e42015-01-21 12:09:53 -080054 // TODO: Replace with SkStream::getData() when that is added. Then we only
55 // have one version of CGDataProviderCreateWithData (i.e. same release proc)
reed@google.com61c22042012-02-24 15:29:00 +000056 const void* addr = stream->getMemoryBase();
57 if (addr) {
58 // special-case when the stream is just a block of ram
bungemanf93d7112016-09-16 06:24:20 -070059 size_t size = stream->getLength();
60 return CGDataProviderCreateWithData(stream.release(), addr, size, delete_stream_proc);
reed@google.com61c22042012-02-24 15:29:00 +000061 }
skia.committer@gmail.come60ed082013-03-26 07:01:04 +000062
reed@google.com61c22042012-02-24 15:29:00 +000063 CGDataProviderSequentialCallbacks rec;
64 sk_bzero(&rec, sizeof(rec));
65 rec.version = 0;
66 rec.getBytes = get_bytes_proc;
67 rec.skipForward = skip_forward_proc;
68 rec.rewind = rewind_proc;
69 rec.releaseInfo = release_info_proc;
bungemanf93d7112016-09-16 06:24:20 -070070 return CGDataProviderCreateSequential(stream.release(), &rec);
reed@google.com61c22042012-02-24 15:29:00 +000071}
reed@google.com12b1f192013-03-25 20:15:40 +000072
73///////////////////////////////////////////////////////////////////////////////
74
75#include "SkData.h"
76
bungemanf93d7112016-09-16 06:24:20 -070077CGDataProviderRef SkCreateDataProviderFromData(sk_sp<SkData> data) {
78 const void* addr = data->data();
79 size_t size = data->size();
80 return CGDataProviderCreateWithData(data.release(), addr, size, unref_proc);
reed@google.com12b1f192013-03-25 20:15:40 +000081}
mtklein1ee76512015-11-02 10:20:27 -080082
83#endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)