blob: 26884711ed3976621c6beefe00291f63b94e19bd [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
8#include "SkCGUtils.h"
9#include "SkStream.h"
10
scroggoa1193e42015-01-21 12:09:53 -080011// These are used by CGDataProviderCreateWithData
reed@google.com61c22042012-02-24 15:29:00 +000012
reed@google.com12b1f192013-03-25 20:15:40 +000013static void unref_proc(void* info, const void* addr, size_t size) {
reed@google.com61c22042012-02-24 15:29:00 +000014 SkASSERT(info);
15 ((SkRefCnt*)info)->unref();
16}
17
scroggoa1193e42015-01-21 12:09:53 -080018static void delete_stream_proc(void* info, const void* addr, size_t size) {
19 SkASSERT(info);
20 SkStream* stream = (SkStream*)info;
21 SkASSERT(stream->getMemoryBase() == addr);
22 SkASSERT(stream->getLength() == size);
23 SkDELETE(stream);
24}
25
reed@google.com61c22042012-02-24 15:29:00 +000026// These are used by CGDataProviderSequentialCallbacks
27
caryclark@google.com3dd45912012-06-06 12:11:10 +000028static size_t get_bytes_proc(void* info, void* buffer, size_t bytes) {
reed@google.com61c22042012-02-24 15:29:00 +000029 SkASSERT(info);
30 return ((SkStream*)info)->read(buffer, bytes);
31}
32
33static off_t skip_forward_proc(void* info, off_t bytes) {
caryclark@google.com3dd45912012-06-06 12:11:10 +000034 return ((SkStream*)info)->skip((size_t) bytes);
reed@google.com61c22042012-02-24 15:29:00 +000035}
36
37static void rewind_proc(void* info) {
38 SkASSERT(info);
39 ((SkStream*)info)->rewind();
40}
41
scroggoa1193e42015-01-21 12:09:53 -080042// Used when info is an SkStream.
reed@google.com61c22042012-02-24 15:29:00 +000043static void release_info_proc(void* info) {
44 SkASSERT(info);
scroggoa1193e42015-01-21 12:09:53 -080045 SkDELETE((SkStream*)info);
reed@google.com61c22042012-02-24 15:29:00 +000046}
47
48CGDataProviderRef SkCreateDataProviderFromStream(SkStream* stream) {
scroggoa1193e42015-01-21 12:09:53 -080049 // TODO: Replace with SkStream::getData() when that is added. Then we only
50 // have one version of CGDataProviderCreateWithData (i.e. same release proc)
reed@google.com61c22042012-02-24 15:29:00 +000051 const void* addr = stream->getMemoryBase();
52 if (addr) {
53 // special-case when the stream is just a block of ram
54 return CGDataProviderCreateWithData(stream, addr, stream->getLength(),
scroggoa1193e42015-01-21 12:09:53 -080055 delete_stream_proc);
reed@google.com61c22042012-02-24 15:29:00 +000056 }
skia.committer@gmail.come60ed082013-03-26 07:01:04 +000057
reed@google.com61c22042012-02-24 15:29:00 +000058 CGDataProviderSequentialCallbacks rec;
59 sk_bzero(&rec, sizeof(rec));
60 rec.version = 0;
61 rec.getBytes = get_bytes_proc;
62 rec.skipForward = skip_forward_proc;
63 rec.rewind = rewind_proc;
64 rec.releaseInfo = release_info_proc;
65 return CGDataProviderCreateSequential(stream, &rec);
66}
reed@google.com12b1f192013-03-25 20:15:40 +000067
68///////////////////////////////////////////////////////////////////////////////
69
70#include "SkData.h"
71
reed@google.com50b14a22013-03-25 20:21:26 +000072CGDataProviderRef SkCreateDataProviderFromData(SkData* data) {
reed@google.com12b1f192013-03-25 20:15:40 +000073 data->ref();
74 return CGDataProviderCreateWithData(data, data->data(), data->size(),
75 unref_proc);
76}