SkStream_mac.cpp revision 50b14a26dcb6d36f59987d00fd39897d1d5082bf
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
1161c22047dcc04be9fe7342f7e557996566f7f289reed@google.com// This is 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
1861c22047dcc04be9fe7342f7e557996566f7f289reed@google.com// These are used by CGDataProviderSequentialCallbacks
1961c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
203dd459151f65bf5d1ccf5311cb9167332042879ecaryclark@google.comstatic size_t get_bytes_proc(void* info, void* buffer, size_t bytes) {
2161c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    SkASSERT(info);
2261c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    return ((SkStream*)info)->read(buffer, bytes);
2361c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
2461c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
2561c22047dcc04be9fe7342f7e557996566f7f289reed@google.comstatic off_t skip_forward_proc(void* info, off_t bytes) {
263dd459151f65bf5d1ccf5311cb9167332042879ecaryclark@google.com    return ((SkStream*)info)->skip((size_t) bytes);
2761c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
2861c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
2961c22047dcc04be9fe7342f7e557996566f7f289reed@google.comstatic void rewind_proc(void* info) {
3061c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    SkASSERT(info);
3161c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    ((SkStream*)info)->rewind();
3261c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
3361c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
3461c22047dcc04be9fe7342f7e557996566f7f289reed@google.comstatic void release_info_proc(void* info) {
3561c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    SkASSERT(info);
3661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    ((SkStream*)info)->unref();
3761c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
3861c22047dcc04be9fe7342f7e557996566f7f289reed@google.com
3961c22047dcc04be9fe7342f7e557996566f7f289reed@google.comCGDataProviderRef SkCreateDataProviderFromStream(SkStream* stream) {
4061c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    stream->ref();  // unref will be called when the provider is deleted
4112b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com
4261c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    const void* addr = stream->getMemoryBase();
4361c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    if (addr) {
4461c22047dcc04be9fe7342f7e557996566f7f289reed@google.com        // special-case when the stream is just a block of ram
4561c22047dcc04be9fe7342f7e557996566f7f289reed@google.com        return CGDataProviderCreateWithData(stream, addr, stream->getLength(),
4612b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com                                            unref_proc);
4761c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    }
4812b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com
4961c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    CGDataProviderSequentialCallbacks rec;
5061c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    sk_bzero(&rec, sizeof(rec));
5161c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.version = 0;
5261c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.getBytes = get_bytes_proc;
5361c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.skipForward = skip_forward_proc;
5461c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.rewind = rewind_proc;
5561c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    rec.releaseInfo = release_info_proc;
5661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com    return CGDataProviderCreateSequential(stream, &rec);
5761c22047dcc04be9fe7342f7e557996566f7f289reed@google.com}
5812b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com
5912b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com///////////////////////////////////////////////////////////////////////////////
6012b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com
6112b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com#include "SkData.h"
6212b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com
6350b14a26dcb6d36f59987d00fd39897d1d5082bfreed@google.comCGDataProviderRef SkCreateDataProviderFromData(SkData* data) {
6412b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com    data->ref();
6512b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com    return CGDataProviderCreateWithData(data, data->data(), data->size(),
6612b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com                                            unref_proc);
6712b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com}
6812b1f19c1f5f4e9fe64053fee73ee72e2a301ec1reed@google.com
69