1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
/*
* Copyright (c) 2008, 2009, Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "ThemeHelperChromiumWin.h"
#include "FloatRect.h"
#include "GraphicsContext.h"
namespace WebCore {
ThemeHelperWin::ThemeHelperWin(GraphicsContext* context, const IntRect& rect)
: m_orgContext(context)
, m_orgMatrix(context->getCTM())
, m_orgRect(rect)
{
if (m_orgMatrix.b() != 0 || m_orgMatrix.c() != 0) { // Check for skew.
// Complicated effects, make a copy and draw the bitmap there.
m_type = COPY;
m_rect.setSize(rect.size());
m_newBuffer.set(ImageBuffer::create(rect.size(), false).release());
// Theme drawing messes with the transparency.
// FIXME: Ideally, we would leave this transparent, but I was
// having problems with button drawing, so we fill with white. Buttons
// looked good with transparent here and no fixing up of the alpha
// later, but text areas didn't. This makes text areas look good but
// gives buttons a white halo. Is there a way to fix this? I think
// buttons actually have antialised edges which is just not possible
// to handle on a transparent background given that it messes with the
// alpha channel.
FloatRect newContextRect(0, 0, rect.width(), rect.height());
GraphicsContext* newContext = m_newBuffer->context();
newContext->setFillColor(Color::white);
newContext->fillRect(newContextRect);
return;
}
if (m_orgMatrix.a() != 1.0 || m_orgMatrix.d() != 1.0) { // Check for scale.
// Only a scaling is applied.
m_type = SCALE;
// Save the transformed coordinates to draw.
m_rect = m_orgMatrix.mapRect(rect);
m_orgContext->save();
m_orgContext->concatCTM(m_orgContext->getCTM().inverse());
return;
}
// Nothing interesting.
m_rect = rect;
m_type = ORIGINAL;
}
ThemeHelperWin::~ThemeHelperWin()
{
switch (m_type) {
case SCALE:
m_orgContext->restore();
break;
case COPY: {
// Copy the duplicate bitmap with our control to the original canvas.
FloatRect destRect(m_orgRect);
m_newBuffer->context()->platformContext()->canvas()->
getTopPlatformDevice().fixupAlphaBeforeCompositing();
m_orgContext->drawImage(m_newBuffer->image(), destRect);
break;
}
case ORIGINAL:
break;
}
}
} // namespace WebCore
|