SkStream_mac.cpp revision a1193e4b0e34a7e4e1bd33e9708d7341679f8321
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