Home | History | Annotate | Download | only in graphics
      1 /*
      2  * Copyright (C) 2011 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
      6  * are met:
      7  * 1.  Redistributions of source code must retain the above copyright
      8  *     notice, this list of conditions and the following disclaimer.
      9  * 2.  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 APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     23  */
     24 
     25 #include "config.h"
     26 #include "platform/graphics/Image.h"
     27 
     28 #include "platform/graphics/GraphicsLayer.h"
     29 #include "platform/graphics/skia/NativeImageSkia.h"
     30 #include "wtf/PassOwnPtr.h"
     31 
     32 #include <gtest/gtest.h>
     33 
     34 using namespace blink;
     35 
     36 namespace {
     37 
     38 class MockGraphicsLayerClient : public GraphicsLayerClient {
     39 public:
     40     virtual void notifyAnimationStarted(const GraphicsLayer*, double monotonicTime) OVERRIDE { }
     41     virtual void paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const IntRect& inClip) OVERRIDE { }
     42     virtual String debugName(const GraphicsLayer*) OVERRIDE { return String(); }
     43 };
     44 
     45 class TestImage : public Image {
     46 public:
     47 
     48     static PassRefPtr<TestImage> create(const IntSize& size, bool isOpaque)
     49     {
     50         return adoptRef(new TestImage(size, isOpaque));
     51     }
     52 
     53     explicit TestImage(const IntSize& size, bool isOpaque)
     54         : Image(0)
     55         , m_size(size)
     56     {
     57         SkBitmap bitmap;
     58         bitmap.allocN32Pixels(size.width(), size.height(), isOpaque);
     59         m_nativeImage = NativeImageSkia::create(bitmap);
     60     }
     61 
     62     virtual bool isBitmapImage() const OVERRIDE
     63     {
     64         return true;
     65     }
     66 
     67     virtual bool currentFrameKnownToBeOpaque() OVERRIDE
     68     {
     69         return m_nativeImage->bitmap().isOpaque();
     70     }
     71 
     72     virtual IntSize size() const OVERRIDE
     73     {
     74         return m_size;
     75     }
     76 
     77     virtual PassRefPtr<NativeImageSkia> nativeImageForCurrentFrame() OVERRIDE
     78     {
     79         if (m_size.isZero())
     80             return nullptr;
     81 
     82         return m_nativeImage;
     83     }
     84 
     85     // Stub implementations of pure virtual Image functions.
     86     virtual void destroyDecodedData(bool) OVERRIDE
     87     {
     88     }
     89 
     90     virtual void draw(GraphicsContext*, const FloatRect&, const FloatRect&, CompositeOperator, WebBlendMode) OVERRIDE
     91     {
     92     }
     93 
     94 private:
     95 
     96     IntSize m_size;
     97 
     98     RefPtr<NativeImageSkia> m_nativeImage;
     99 };
    100 
    101 class GraphicsLayerForTesting : public GraphicsLayer {
    102 public:
    103     explicit GraphicsLayerForTesting(GraphicsLayerClient* client)
    104         : GraphicsLayer(client) { };
    105 
    106     virtual WebLayer* contentsLayer() const { return GraphicsLayer::contentsLayer(); }
    107 };
    108 
    109 TEST(ImageLayerChromiumTest, imageLayerContentReset)
    110 {
    111     MockGraphicsLayerClient client;
    112     OwnPtr<GraphicsLayerForTesting> graphicsLayer = adoptPtr(new GraphicsLayerForTesting(&client));
    113     ASSERT_TRUE(graphicsLayer.get());
    114 
    115     ASSERT_FALSE(graphicsLayer->hasContentsLayer());
    116     ASSERT_FALSE(graphicsLayer->contentsLayer());
    117 
    118     RefPtr<Image> image = TestImage::create(IntSize(100, 100), false);
    119     ASSERT_TRUE(image.get());
    120 
    121     graphicsLayer->setContentsToImage(image.get());
    122     ASSERT_TRUE(graphicsLayer->hasContentsLayer());
    123     ASSERT_TRUE(graphicsLayer->contentsLayer());
    124 
    125     graphicsLayer->setContentsToImage(0);
    126     ASSERT_FALSE(graphicsLayer->hasContentsLayer());
    127     ASSERT_FALSE(graphicsLayer->contentsLayer());
    128 }
    129 
    130 TEST(ImageLayerChromiumTest, opaqueImages)
    131 {
    132     MockGraphicsLayerClient client;
    133     OwnPtr<GraphicsLayerForTesting> graphicsLayer = adoptPtr(new GraphicsLayerForTesting(&client));
    134     ASSERT_TRUE(graphicsLayer.get());
    135 
    136     RefPtr<Image> opaqueImage = TestImage::create(IntSize(100, 100), true /* opaque */);
    137     ASSERT_TRUE(opaqueImage.get());
    138     RefPtr<Image> nonOpaqueImage = TestImage::create(IntSize(100, 100), false /* opaque */);
    139     ASSERT_TRUE(nonOpaqueImage.get());
    140 
    141     ASSERT_FALSE(graphicsLayer->contentsLayer());
    142 
    143     graphicsLayer->setContentsToImage(opaqueImage.get());
    144     ASSERT_TRUE(graphicsLayer->contentsLayer()->opaque());
    145 
    146     graphicsLayer->setContentsToImage(nonOpaqueImage.get());
    147     ASSERT_FALSE(graphicsLayer->contentsLayer()->opaque());
    148 }
    149 
    150 } // namespace
    151