~ubuntu-branches/ubuntu/raring/qtwebkit-source/raring-proposed

« back to all changes in this revision

Viewing changes to Source/WebCore/platform/graphics/CrossfadeGeneratedImage.cpp

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-02-18 14:24:18 UTC
  • Revision ID: package-import@ubuntu.com-20130218142418-eon0jmjg3nj438uy
Tags: upstream-2.3
ImportĀ upstreamĀ versionĀ 2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2011 Apple 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 COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 "CrossfadeGeneratedImage.h"
 
28
 
 
29
#include "FloatRect.h"
 
30
#include "GraphicsContext.h"
 
31
#include "ImageBuffer.h"
 
32
#include "PlatformMemoryInstrumentation.h"
 
33
 
 
34
using namespace std;
 
35
 
 
36
namespace WebCore {
 
37
 
 
38
CrossfadeGeneratedImage::CrossfadeGeneratedImage(Image* fromImage, Image* toImage, float percentage, IntSize crossfadeSize, const IntSize& size)
 
39
    : m_fromImage(fromImage)
 
40
    , m_toImage(toImage)
 
41
    , m_percentage(percentage)
 
42
    , m_crossfadeSize(crossfadeSize)
 
43
{
 
44
    m_size = size;
 
45
}
 
46
 
 
47
void CrossfadeGeneratedImage::drawCrossfade(GraphicsContext* context)
 
48
{
 
49
    float inversePercentage = 1 - m_percentage;
 
50
 
 
51
    IntSize fromImageSize = m_fromImage->size();
 
52
    IntSize toImageSize = m_toImage->size();
 
53
 
 
54
    // Draw nothing if either of the images hasn't loaded yet.
 
55
    if (m_fromImage == Image::nullImage() || m_toImage == Image::nullImage())
 
56
        return;
 
57
 
 
58
    GraphicsContextStateSaver stateSaver(*context);
 
59
 
 
60
    context->clip(IntRect(IntPoint(), m_crossfadeSize));
 
61
    context->beginTransparencyLayer(1);
 
62
    
 
63
    // Draw the image we're fading away from.
 
64
    context->save();
 
65
    if (m_crossfadeSize != fromImageSize)
 
66
        context->scale(FloatSize(static_cast<float>(m_crossfadeSize.width()) / fromImageSize.width(),
 
67
                                 static_cast<float>(m_crossfadeSize.height()) / fromImageSize.height()));
 
68
    context->setAlpha(inversePercentage);
 
69
    context->drawImage(m_fromImage, ColorSpaceDeviceRGB, IntPoint());
 
70
    context->restore();
 
71
 
 
72
    // Draw the image we're fading towards.
 
73
    context->save();
 
74
    if (m_crossfadeSize != toImageSize)
 
75
        context->scale(FloatSize(static_cast<float>(m_crossfadeSize.width()) / toImageSize.width(),
 
76
                                 static_cast<float>(m_crossfadeSize.height()) / toImageSize.height()));
 
77
    context->setAlpha(m_percentage);
 
78
    context->drawImage(m_toImage, ColorSpaceDeviceRGB, IntPoint(), CompositePlusLighter);
 
79
    context->restore();
 
80
 
 
81
    context->endTransparencyLayer();
 
82
}
 
83
 
 
84
void CrossfadeGeneratedImage::draw(GraphicsContext* context, const FloatRect& dstRect, const FloatRect& srcRect, ColorSpace, CompositeOperator compositeOp)
 
85
{
 
86
    GraphicsContextStateSaver stateSaver(*context);
 
87
    context->setCompositeOperation(compositeOp);
 
88
    context->clip(dstRect);
 
89
    context->translate(dstRect.x(), dstRect.y());
 
90
    if (dstRect.size() != srcRect.size())
 
91
        context->scale(FloatSize(dstRect.width() / srcRect.width(), dstRect.height() / srcRect.height()));
 
92
    context->translate(-srcRect.x(), -srcRect.y());
 
93
    
 
94
    drawCrossfade(context);
 
95
}
 
96
 
 
97
void CrossfadeGeneratedImage::drawPattern(GraphicsContext* context, const FloatRect& srcRect, const AffineTransform& patternTransform, const FloatPoint& phase, ColorSpace styleColorSpace, CompositeOperator compositeOp, const FloatRect& dstRect)
 
98
{
 
99
    OwnPtr<ImageBuffer> imageBuffer = ImageBuffer::create(m_size, 1, ColorSpaceDeviceRGB, context->isAcceleratedContext() ? Accelerated : Unaccelerated);
 
100
    if (!imageBuffer)
 
101
        return;
 
102
 
 
103
    // Fill with the cross-faded image.
 
104
    GraphicsContext* graphicsContext = imageBuffer->context();
 
105
    drawCrossfade(graphicsContext);
 
106
 
 
107
    // Tile the image buffer into the context.
 
108
    imageBuffer->drawPattern(context, srcRect, patternTransform, phase, styleColorSpace, compositeOp, dstRect);
 
109
}
 
110
 
 
111
void CrossfadeGeneratedImage::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
 
112
{
 
113
    MemoryClassInfo info(memoryObjectInfo, this, PlatformMemoryTypes::Image);
 
114
    GeneratedImage::reportMemoryUsage(memoryObjectInfo);
 
115
    info.addMember(m_fromImage);
 
116
    info.addMember(m_toImage);
 
117
}
 
118
 
 
119
}