Home | History | Annotate | Download | only in mac
      1 /*
      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 // These are used by CGDataProviderCreateWithData
     12 
     13 static void unref_proc(void* info, const void* addr, size_t size) {
     14     SkASSERT(info);
     15     ((SkRefCnt*)info)->unref();
     16 }
     17 
     18 static void delete_stream_proc(void* info, const void* addr, size_t size) {
     19     SkASSERT(info);
     20     SkStream* stream = (SkStream*)info;
     21     SkASSERT(stream->getMemoryBase() == addr);
     22     SkASSERT(stream->getLength() == size);
     23     SkDELETE(stream);
     24 }
     25 
     26 // These are used by CGDataProviderSequentialCallbacks
     27 
     28 static size_t get_bytes_proc(void* info, void* buffer, size_t bytes) {
     29     SkASSERT(info);
     30     return ((SkStream*)info)->read(buffer, bytes);
     31 }
     32 
     33 static off_t skip_forward_proc(void* info, off_t bytes) {
     34     return ((SkStream*)info)->skip((size_t) bytes);
     35 }
     36 
     37 static void rewind_proc(void* info) {
     38     SkASSERT(info);
     39     ((SkStream*)info)->rewind();
     40 }
     41 
     42 // Used when info is an SkStream.
     43 static void release_info_proc(void* info) {
     44     SkASSERT(info);
     45     SkDELETE((SkStream*)info);
     46 }
     47 
     48 CGDataProviderRef SkCreateDataProviderFromStream(SkStream* stream) {
     49     // TODO: Replace with SkStream::getData() when that is added. Then we only
     50     // have one version of CGDataProviderCreateWithData (i.e. same release proc)
     51     const void* addr = stream->getMemoryBase();
     52     if (addr) {
     53         // special-case when the stream is just a block of ram
     54         return CGDataProviderCreateWithData(stream, addr, stream->getLength(),
     55                                             delete_stream_proc);
     56     }
     57 
     58     CGDataProviderSequentialCallbacks rec;
     59     sk_bzero(&rec, sizeof(rec));
     60     rec.version = 0;
     61     rec.getBytes = get_bytes_proc;
     62     rec.skipForward = skip_forward_proc;
     63     rec.rewind = rewind_proc;
     64     rec.releaseInfo = release_info_proc;
     65     return CGDataProviderCreateSequential(stream, &rec);
     66 }
     67 
     68 ///////////////////////////////////////////////////////////////////////////////
     69 
     70 #include "SkData.h"
     71 
     72 CGDataProviderRef SkCreateDataProviderFromData(SkData* data) {
     73     data->ref();
     74     return CGDataProviderCreateWithData(data, data->data(), data->size(),
     75                                             unref_proc);
     76 }
     77