SkStream_mac.cpp revision 3dd459151f65bf5d1ccf5311cb9167332042879e
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 1361c22047dcc04be9fe7342f7e557996566f7f289reed@google.comstatic void unref_data_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 4161c22047dcc04be9fe7342f7e557996566f7f289reed@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(), 4661c22047dcc04be9fe7342f7e557996566f7f289reed@google.com unref_data_proc); 4761c22047dcc04be9fe7342f7e557996566f7f289reed@google.com } 4861c22047dcc04be9fe7342f7e557996566f7f289reed@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} 5861c22047dcc04be9fe7342f7e557996566f7f289reed@google.com 5961c22047dcc04be9fe7342f7e557996566f7f289reed@google.com 60