Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2009 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "config.h"
     32 #include "WebImage.h"
     33 
     34 #include "Image.h"
     35 #include "ImageSource.h"
     36 #include "SharedBuffer.h"
     37 
     38 #include "WebData.h"
     39 #include "WebSize.h"
     40 
     41 #include <CoreGraphics/CGImage.h>
     42 
     43 #include <wtf/PassRefPtr.h>
     44 #include <wtf/RetainPtr.h>
     45 
     46 using namespace WebCore;
     47 
     48 namespace WebKit {
     49 
     50 WebImage WebImage::fromData(const WebData& data, const WebSize& desiredSize)
     51 {
     52     // FIXME: Do something like what WebImageSkia.cpp does to enumerate frames.
     53     // Not sure whether the CG decoder uses the same frame ordering rules (if so
     54     // we can just use the same logic).
     55 
     56     ImageSource source;
     57     source.setData(PassRefPtr<SharedBuffer>(data).get(), true);
     58     if (!source.isSizeAvailable())
     59         return WebImage();
     60 
     61     RetainPtr<CGImageRef> frame0(AdoptCF, source.createFrameAtIndex(0));
     62     if (!frame0)
     63         return WebImage();
     64 
     65     return WebImage(frame0.get());
     66 }
     67 
     68 void WebImage::reset()
     69 {
     70     CGImageRelease(m_imageRef);
     71     m_imageRef = 0;
     72 }
     73 
     74 void WebImage::assign(const WebImage& image)
     75 {
     76     assign(image.m_imageRef);
     77 }
     78 
     79 bool WebImage::isNull() const
     80 {
     81     return !m_imageRef;
     82 }
     83 
     84 WebSize WebImage::size() const
     85 {
     86     return WebSize(CGImageGetWidth(m_imageRef), CGImageGetHeight(m_imageRef));
     87 }
     88 
     89 WebImage::WebImage(const PassRefPtr<Image>& image)
     90     : m_imageRef(0)
     91 {
     92     if (image.get())
     93         assign(image->nativeImageForCurrentFrame());
     94 }
     95 
     96 WebImage& WebImage::operator=(const PassRefPtr<Image>& image)
     97 {
     98     if (image.get())
     99         assign(image->nativeImageForCurrentFrame());
    100     else
    101         reset();
    102     return *this;
    103 }
    104 
    105 void WebImage::assign(CGImageRef imageRef)
    106 {
    107     // Make sure to retain the imageRef first incase m_imageRef == imageRef.
    108     CGImageRetain(imageRef);
    109     CGImageRelease(m_imageRef);
    110     m_imageRef = imageRef;
    111 }
    112 
    113 } // namespace WebKit
    114