15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef MockImageDecoder_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/image-decoders/ImageDecoder.h"
29521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/PassOwnPtr.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class MockImageDecoderClient {
34926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void decoderBeingDestroyed() = 0;
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void frameBufferRequested() = 0;
37c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    virtual ImageFrame::Status status() = 0;
387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual size_t frameCount() = 0;
397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual int repetitionCount() const = 0;
407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    virtual float frameDuration() const = 0;
4106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
4206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    // Clients can control the behavior of MockImageDecoder::decodedSize() by
4306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    // overriding this method. The default implementation causes
4406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    // MockImageDecoder::decodedSize() to return the same thing as
4506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    // MockImageDecoder::size(). See the precise implementation of
4606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    // MockImageDecoder::decodedSize() below.
4706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual IntSize decodedSize() const { return IntSize(); }
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MockImageDecoder : public ImageDecoder {
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static PassOwnPtr<MockImageDecoder> create(MockImageDecoderClient* client) { return adoptPtr(new MockImageDecoder(client)); }
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    MockImageDecoder(MockImageDecoderClient* client)
5506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        : ImageDecoder(ImageSource::AlphaPremultiplied, ImageSource::GammaAndColorProfileApplied, noDecodedImageByteLimit)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        , m_client(client)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    { }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ~MockImageDecoder()
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_client->decoderBeingDestroyed();
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual IntSize decodedSize() const OVERRIDE
6506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    {
6606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return m_client->decodedSize().isEmpty() ? size() : m_client->decodedSize();
6706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
6806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
6906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual bool setSize(unsigned width, unsigned height) OVERRIDE
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ImageDecoder::setSize(width, height);
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_frameBufferCache.resize(1);
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_frameBufferCache[0].setSize(width, height);
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual String filenameExtension() const OVERRIDE
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "mock";
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual size_t frameCount() OVERRIDE
837757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    {
847757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return m_client->frameCount();
857757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
867757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
8706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual int repetitionCount() const OVERRIDE
887757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    {
897757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return m_client->repetitionCount();
907757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
9206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual ImageFrame* frameBufferAtIndex(size_t) OVERRIDE
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_client->frameBufferRequested();
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_frameBufferCache[0].setStatus(m_client->status());
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return &m_frameBufferCache[0];
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual bool frameIsCompleteAtIndex(size_t) const OVERRIDE
1017757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    {
102c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return m_client->status() == ImageFrame::FrameComplete;
1037757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
1047757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
10506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual float frameDurationAtIndex(size_t) const OVERRIDE
1067757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    {
1077757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return m_client->frameDuration();
1087757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    void setFrameHasAlpha(bool hasAlpha) { m_frameBufferCache[0].setHasAlpha(hasAlpha); }
11106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    MockImageDecoderClient* m_client;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)class MockImageDecoderFactory : public ImageDecoderFactory {
11706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)public:
11806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    static PassOwnPtr<MockImageDecoderFactory> create(MockImageDecoderClient* client, const SkISize& decodedSize)
11906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    {
12006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return adoptPtr(new MockImageDecoderFactory(client, IntSize(decodedSize.width(), decodedSize.height())));
12106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
12206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
12306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    static PassOwnPtr<MockImageDecoderFactory> create(MockImageDecoderClient* client, const IntSize& decodedSize)
12406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    {
12506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return adoptPtr(new MockImageDecoderFactory(client, decodedSize));
12606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
12706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
12806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    virtual PassOwnPtr<ImageDecoder> create() OVERRIDE
12906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    {
13006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        OwnPtr<MockImageDecoder> decoder = MockImageDecoder::create(m_client);
13106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        decoder->setSize(m_decodedSize.width(), m_decodedSize.height());
13206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        decoder->setFrameHasAlpha(false);
13306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return decoder.release();
13406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
13506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
13606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)private:
13706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    MockImageDecoderFactory(MockImageDecoderClient* client, const IntSize& decodedSize)
13806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        : m_client(client)
13906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        , m_decodedSize(decodedSize)
14006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    {
14106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
14206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
14306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    MockImageDecoderClient* m_client;
14406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    IntSize m_decodedSize;
14506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)};
14606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // MockImageDecoder_h
150