ThemeHelperChromiumWin.cpp   [plain text]


/*
 * 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