Home | History | Annotate | Download | only in android
      1 /*
      2  * Copyright 2009, The Android Open Source Project
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *  * Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  *  * Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "BitmapAllocatorAndroid.h"
     28 #include "SharedBufferStream.h"
     29 #include "SkImageRef_GlobalPool.h"
     30 #include "SkImageRef_ashmem.h"
     31 
     32 // made this up, so we don't waste a file-descriptor on small images, plus
     33 // we don't want to lose too much on the round-up to a page size (4K)
     34 #define MIN_ASHMEM_ALLOC_SIZE   (32*1024)
     35 
     36 
     37 static bool should_use_ashmem(const SkBitmap& bm) {
     38     return bm.getSize() >= MIN_ASHMEM_ALLOC_SIZE;
     39 }
     40 
     41 ///////////////////////////////////////////////////////////////////////////////
     42 
     43 namespace WebCore {
     44 
     45 BitmapAllocatorAndroid::BitmapAllocatorAndroid(SharedBuffer* data,
     46                                                int sampleSize)
     47 {
     48     fStream = new SharedBufferStream(data);
     49     fSampleSize = sampleSize;
     50 }
     51 
     52 BitmapAllocatorAndroid::~BitmapAllocatorAndroid()
     53 {
     54     fStream->unref();
     55 }
     56 
     57 bool BitmapAllocatorAndroid::allocPixelRef(SkBitmap* bitmap, SkColorTable*)
     58 {
     59     SkPixelRef* ref;
     60     if (should_use_ashmem(*bitmap)) {
     61 //        SkDebugf("ashmem [%d %d]\n", bitmap->width(), bitmap->height());
     62         ref = new SkImageRef_ashmem(fStream, bitmap->config(), fSampleSize);
     63     } else {
     64 //        SkDebugf("globalpool [%d %d]\n", bitmap->width(), bitmap->height());
     65         ref = new SkImageRef_GlobalPool(fStream, bitmap->config(), fSampleSize);
     66     }
     67     bitmap->setPixelRef(ref)->unref();
     68     return true;
     69 }
     70 
     71 }
     72