161c22047dcc04be9fe7342f7e557996566f7f289reed@google.com/*
261c22047dcc04be9fe7342f7e557996566f7f289reed@google.com * Copyright 2012 Google Inc.
361c22047dcc04be9fe7342f7e557996566f7f289reed@google.com *
461c22047dcc04be9fe7342f7e557996566f7f289reed@google.com * Use of this source code is governed by a BSD-style license that can be
561c22047dcc04be9fe7342f7e557996566f7f289reed@google.com * found in the LICENSE file.
661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com */
761c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
861c22047dcc04be9fe7342f7e557996566f7f289reed@google.com#include "SkCGUtils.h"
961c22047dcc04be9fe7342f7e557996566f7f289reed@google.com#include "SkStream.h"
1061c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
11a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo// These are used by CGDataProviderCreateWithData
1261c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
1312b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.comstatic void unref_proc(void* info, const void* addr, size_t size) {
1461c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    SkASSERT(info);
1561c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    ((SkRefCnt*)info)->unref();
1661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
1761c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
18a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggostatic void delete_stream_proc(void* info, const void* addr, size_t size) {
19a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    SkASSERT(info);
20a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    SkStream* stream = (SkStream*)info;
21a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    SkASSERT(stream->getMemoryBase() == addr);
22a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    SkASSERT(stream->getLength() == size);
23a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    SkDELETE(stream);
24a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo}
25a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo
2661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com// These are used by CGDataProviderSequentialCallbacks
2761c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
283dd459151f65bf5d1ccf5311cb9167332042879ecaryclark@google.comstatic size_t get_bytes_proc(void* info, void* buffer, size_t bytes) {
2961c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    SkASSERT(info);
3061c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    return ((SkStream*)info)->read(buffer, bytes);
3161c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
3261c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
3361c22047dcc04be9fe7342f7e557996566f7f289reed@google.comstatic off_t skip_forward_proc(void* info, off_t bytes) {
343dd459151f65bf5d1ccf5311cb9167332042879ecaryclark@google.com    return ((SkStream*)info)->skip((size_t) bytes);
3561c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
3661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
3761c22047dcc04be9fe7342f7e557996566f7f289reed@google.comstatic void rewind_proc(void* info) {
3861c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    SkASSERT(info);
3961c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    ((SkStream*)info)->rewind();
4061c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
4161c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
42a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo// Used when info is an SkStream.
4361c22047dcc04be9fe7342f7e557996566f7f289reed@google.comstatic void release_info_proc(void* info) {
4461c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    SkASSERT(info);
45a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    SkDELETE((SkStream*)info);
4661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
4761c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
4861c22047dcc04be9fe7342f7e557996566f7f289reed@google.comCGDataProviderRef SkCreateDataProviderFromStream(SkStream* stream) {
49a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    // TODO: Replace with SkStream::getData() when that is added. Then we only
50a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    // have one version of CGDataProviderCreateWithData (i.e. same release proc)
5161c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    const void* addr = stream->getMemoryBase();
5261c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    if (addr) {
5361c22047dcc04be9fe7342f7e557996566f7f289reed@google.com        // special-case when the stream is just a block of ram
5461c22047dcc04be9fe7342f7e557996566f7f289reed@google.com        return CGDataProviderCreateWithData(stream, addr, stream->getLength(),
55a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo                                            delete_stream_proc);
5661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    }
57e60ed08a3568b5e253dfb5dec2b52d13a16fff1cskia.committer@gmail.com
5861c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    CGDataProviderSequentialCallbacks rec;
5961c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    sk_bzero(&rec, sizeof(rec));
6061c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.version = 0;
6161c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.getBytes = get_bytes_proc;
6261c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.skipForward = skip_forward_proc;
6361c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.rewind = rewind_proc;
6461c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.releaseInfo = release_info_proc;
6561c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    return CGDataProviderCreateSequential(stream, &rec);
6661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
6712b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com
6812b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com///////////////////////////////////////////////////////////////////////////////
6912b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com
7012b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com#include "SkData.h"
7112b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com
7250b14a26dcb6d36f59987d00fd39897d1d5082bfreed@google.comCGDataProviderRef SkCreateDataProviderFromData(SkData* data) {
7312b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com    data->ref();
7412b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com    return CGDataProviderCreateWithData(data, data->data(), data->size(),
7512b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com                                            unref_proc);
7612b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com}
77