blob: 3482a6b01cbe093c10164074aefb220d53657e2a [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
11// This is used by CGDataProviderCreateWithData
12
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
18// These are used by CGDataProviderSequentialCallbacks
19
caryclark@google.com3dd45912012-06-06 12:11:10 +000020static size_t get_bytes_proc(void* info, void* buffer, size_t bytes) {
reed@google.com61c22042012-02-24 15:29:00 +000021 SkASSERT(info);
22 return ((SkStream*)info)->read(buffer, bytes);
23}
24
25static off_t skip_forward_proc(void* info, off_t bytes) {
caryclark@google.com3dd45912012-06-06 12:11:10 +000026 return ((SkStream*)info)->skip((size_t) bytes);
reed@google.com61c22042012-02-24 15:29:00 +000027}
28
29static void rewind_proc(void* info) {
30 SkASSERT(info);
31 ((SkStream*)info)->rewind();
32}
33
34static void release_info_proc(void* info) {
35 SkASSERT(info);
36 ((SkStream*)info)->unref();
37}
38
39CGDataProviderRef SkCreateDataProviderFromStream(SkStream* stream) {
40 stream->ref(); // unref will be called when the provider is deleted
reed@google.com12b1f192013-03-25 20:15:40 +000041
reed@google.com61c22042012-02-24 15:29:00 +000042 const void* addr = stream->getMemoryBase();
43 if (addr) {
44 // special-case when the stream is just a block of ram
45 return CGDataProviderCreateWithData(stream, addr, stream->getLength(),
reed@google.com12b1f192013-03-25 20:15:40 +000046 unref_proc);
reed@google.com61c22042012-02-24 15:29:00 +000047 }
reed@google.com12b1f192013-03-25 20:15:40 +000048
reed@google.com61c22042012-02-24 15:29:00 +000049 CGDataProviderSequentialCallbacks rec;
50 sk_bzero(&rec, sizeof(rec));
51 rec.version = 0;
52 rec.getBytes = get_bytes_proc;
53 rec.skipForward = skip_forward_proc;
54 rec.rewind = rewind_proc;
55 rec.releaseInfo = release_info_proc;
56 return CGDataProviderCreateSequential(stream, &rec);
57}
reed@google.com12b1f192013-03-25 20:15:40 +000058
59///////////////////////////////////////////////////////////////////////////////
60
61#include "SkData.h"
62
63CGDataProviderRef SkCreateDataProviderFromStream(SkData* data) {
64 data->ref();
65 return CGDataProviderCreateWithData(data, data->data(), data->size(),
66 unref_proc);
67}
68