18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Kevin Ollivier <kevino@theolliviers.com>
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "AffineTransform.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Font.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IntRect.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/MathExtras.h>
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <math.h>
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h>
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/defs.h>
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/window.h>
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/dcclient.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/dcgraph.h>
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/graphics.h>
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if __WXMAC__
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <Carbon/Carbon.h>
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#elif __WXMSW__
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <windows.h>
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint getWxCompositingOperation(CompositeOperator op, bool hasAlpha)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Add support for more operators.
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (op == CompositeSourceOver && !hasAlpha)
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        op = CompositeCopy;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int function;
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (op) {
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CompositeClear:
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            function = wxCLEAR;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CompositeCopy:
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            function = wxCOPY;
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            function = wxCOPY;
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return function;
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int strokeStyleToWxPenStyle(int p)
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (p == SolidStroke)
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return wxSOLID;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (p == DottedStroke)
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return wxDOT;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (p == DashedStroke)
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return wxLONG_DASH;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (p == NoStroke)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return wxTRANSPARENT;
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return wxSOLID;
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass GraphicsContextPlatformPrivate {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GraphicsContextPlatformPrivate();
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ~GraphicsContextPlatformPrivate();
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC)
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wxGCDC* context;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wxWindowDC* context;
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int mswDCStateID;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wxRegion gtkCurrentClipRgn;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wxRegion gtkPaintClipRgn;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGraphicsContextPlatformPrivate::GraphicsContextPlatformPrivate() :
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    context(0),
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mswDCStateID(0),
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gtkCurrentClipRgn(wxRegion()),
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gtkPaintClipRgn(wxRegion())
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectGraphicsContextPlatformPrivate::~GraphicsContextPlatformPrivate()
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid GraphicsContext::platformInit(PlatformGraphicsContext* context)
115f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_data = new GraphicsContextPlatformPrivate;
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setPaintingDisabled(!context);
118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (context) {
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Make sure the context starts in sync with our state.
121a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        setPlatformFillColor(fillColor(), ColorSpaceDeviceRGB);
122a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        setPlatformStrokeColor(strokeColor(), ColorSpaceDeviceRGB);
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC)
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context = (wxGCDC*)context;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context = (wxWindowDC*)context;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
131f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid GraphicsContext::platformDestroy()
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_data;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPlatformGraphicsContext* GraphicsContext::platformContext() const
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (PlatformGraphicsContext*)m_data->context;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::savePlatformState()
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->context)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC)
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        gc->PushState();
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // when everything is working with USE_WXGC, we can remove this
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #if __WXMAC__
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextRef context;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (gc)
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context = (CGContextRef)gc->GetNativeContext();
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (context)
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CGContextSaveGState(context);
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #elif __WXMSW__
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HDC dc = (HDC)m_data->context->GetHDC();
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->mswDCStateID = ::SaveDC(dc);
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #elif __WXGTK__
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->gtkCurrentClipRgn = m_data->context->m_currentClippingRegion;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->gtkPaintClipRgn = m_data->context->m_paintClippingRegion;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #endif
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // __WXMAC__
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::restorePlatformState()
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->context)
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC)
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        gc->PopState();
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #if __WXMAC__
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextRef context;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (gc)
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            context = (CGContextRef)gc->GetNativeContext();
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (context)
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CGContextRestoreGState(context);
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #elif __WXMSW__
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HDC dc = (HDC)m_data->context->GetHDC();
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ::RestoreDC(dc, m_data->mswDCStateID);
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #elif __WXGTK__
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->context->m_currentClippingRegion = m_data->gtkCurrentClipRgn;
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->context->m_paintClippingRegion = m_data->gtkPaintClipRgn;
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #endif
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // USE_WXGC
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Draws a filled rectangle with a stroked border.
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::drawRect(const IntRect& rect)
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle())));
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->DrawRectangle(rect.x(), rect.y(), rect.width(), rect.height());
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is only used to draw borders.
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2)
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FloatPoint p1 = point1;
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FloatPoint p2 = point2;
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle())));
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->DrawLine(point1.x(), point1.y(), point2.x(), point2.y());
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This method is only used to draw the little circles used in lists.
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::drawEllipse(const IntRect& rect)
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle())));
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->DrawEllipse(rect.x(), rect.y(), rect.width(), rect.height());
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::strokeArc(const IntRect& rect, int startAngle, int angleSpan)
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle())));
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->DrawEllipticArc(rect.x(), rect.y(), rect.width(), rect.height(), startAngle, angleSpan);
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::drawConvexPolygon(size_t npoints, const FloatPoint* points, bool shouldAntialias)
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (npoints <= 1)
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wxPoint* polygon = new wxPoint[npoints];
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (size_t i = 0; i < npoints; i++)
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        polygon[i] = wxPoint(points[i].x(), points[i].y());
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle())));
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->DrawPolygon((int)npoints, polygon);
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete [] polygon;
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2530617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenvoid GraphicsContext::clipConvexPolygon(size_t numPoints, const FloatPoint* points, bool antialiased)
254ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
255ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (paintingDisabled())
256ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return;
257ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
258ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (numPoints <= 1)
259ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return;
260ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
261ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // FIXME: IMPLEMENT!!
262ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
263ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
264643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsContext::fillRect(const FloatRect& rect, const Color& color, ColorSpace colorSpace)
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
269e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    savePlatformState();
270e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->SetPen(*wxTRANSPARENT_PEN);
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->SetBrush(wxBrush(color));
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->DrawRectangle(rect.x(), rect.y(), rect.width(), rect.height());
274e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
275e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    restorePlatformState();
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsContext::fillRoundedRect(const IntRect& rect, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight, const Color& color, ColorSpace colorSpace)
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid GraphicsContext::drawFocusRing(const Path& path, int width, int offset, const Color& color)
287d0825bca7fe65beaee391d30da42e937db621564Steve Block{
288d0825bca7fe65beaee391d30da42e937db621564Steve Block    // FIXME: implement
289d0825bca7fe65beaee391d30da42e937db621564Steve Block}
290d0825bca7fe65beaee391d30da42e937db621564Steve Block
291d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid GraphicsContext::drawFocusRing(const Vector<IntRect>& rects, int width, int offset, const Color& color)
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::clip(const FloatRect& r)
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wxWindowDC* windc = dynamic_cast<wxWindowDC*>(m_data->context);
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wxPoint pos(0, 0);
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (windc) {
305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if !defined(__WXGTK__) || wxCHECK_VERSION(2,9,0)
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wxWindow* window = windc->GetWindow();
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wxWindow* window = windc->m_owner;
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (window) {
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            wxWindow* parent = window->GetParent();
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // we need to convert from WebView "global" to WebFrame "local" coords.
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // FIXME: We only want to go to the top WebView.
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (parent) {
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                pos += window->GetPosition();
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                parent = parent->GetParent();
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->SetClippingRegion(r.x() - pos.x, r.y() - pos.y, r.width() + pos.x, r.height() + pos.y);
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::clipOut(const Path&)
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::clipOut(const IntRect&)
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
334f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid GraphicsContext::clipPath(const Path&, WindRule)
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    notImplemented();
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
33981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid GraphicsContext::drawLineForText(const FloatPoint& origin, float width, bool printing)
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    FloatPoint endPoint = origin + FloatSize(width, 0);
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), wxSOLID));
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->DrawLine(origin.x(), origin.y(), endPoint.x(), endPoint.y());
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid GraphicsContext::drawLineForTextChecking(const FloatPoint& origin, float width, TextCheckingLineStyle style)
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    switch (style) {
3525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    case TextCheckingSpellingLineStyle:
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->context->SetPen(wxPen(*wxRED, 2, wxLONG_DASH));
3545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        break;
3555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    case TextCheckingGrammarLineStyle:
3565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_data->context->SetPen(wxPen(*wxGREEN, 2, wxLONG_DASH));
3575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        break;
3585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    default:
3595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return;
3605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->context->DrawLine(origin.x(), origin.y(), origin.x() + width, origin.y());
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::clip(const Path&)
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
369cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid GraphicsContext::canvasClip(const Path& path)
370cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
371cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    clip(path);
372cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
373cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
3748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockAffineTransform GraphicsContext::getCTM() const
3755e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if USE(WXGC)
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (gc) {
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        wxGraphicsMatrix matrix = gc->GetTransform();
380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        double a, b, c, d, e, f;
381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        matrix.Get(&a, &b, &c, &d, &e, &f);
382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return AffineTransform(a, b, c, d, e, f);
383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
3855e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return AffineTransform();
3865e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
3875e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::translate(float tx, float ty)
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC)
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->context) {
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        gc->Translate(tx, ty);
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::rotate(float angle)
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC)
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->context) {
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        gc->Rotate(angle);
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::scale(const FloatSize& scale)
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if USE(WXGC)
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->context) {
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        gc->Scale(scale.width(), scale.height());
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochFloatRect GraphicsContext::roundToDevicePixels(const FloatRect& frect, RoundingMode)
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FloatRect result;
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wxCoord x = (wxCoord)frect.x();
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wxCoord y = (wxCoord)frect.y();
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    x = m_data->context->LogicalToDeviceX(x);
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    y = m_data->context->LogicalToDeviceY(y);
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result.setX((float)x);
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result.setY((float)y);
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    x = (wxCoord)frect.width();
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    y = (wxCoord)frect.height();
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    x = m_data->context->LogicalToDeviceXRel(x);
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    y = m_data->context->LogicalToDeviceYRel(y);
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result.setWidth((float)x);
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result.setHeight((float)y);
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::setURLForRect(const KURL&, const IntRect&)
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
444f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid GraphicsContext::setPlatformCompositeOperation(CompositeOperator op)
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->context)
447635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if wxCHECK_VERSION(2,9,0)
449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_data->context->SetLogicalFunction(static_cast<wxRasterOperationMode>(getWxCompositingOperation(op, false)));
450635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->context->SetLogicalFunction(getWxCompositingOperation(op, false));
452635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
453635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
456643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsContext::setPlatformStrokeColor(const Color& color, ColorSpace colorSpace)
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->context)
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->context->SetPen(wxPen(color, strokeThickness(), strokeStyleToWxPenStyle(strokeStyle())));
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::setPlatformStrokeThickness(float thickness)
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->context)
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->context->SetPen(wxPen(strokeColor(), thickness, strokeStyleToWxPenStyle(strokeStyle())));
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
475643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsContext::setPlatformFillColor(const Color& color, ColorSpace colorSpace)
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->context)
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->context->SetBrush(wxBrush(color));
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4845e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid GraphicsContext::concatCTM(const AffineTransform& transform)
4855e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
4865e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (paintingDisabled())
4875e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        return;
4885e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if USE(WXGC)
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (gc)
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        gc->ConcatTransform(transform);
493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
4945e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return;
4955e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
4965e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
49781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid GraphicsContext::setCTM(const AffineTransform& transform)
49881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
49981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (paintingDisabled())
50081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
50181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
50281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(WXGC)
50381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
50481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (gc)
50581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        gc->SetTransform(transform);
50681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
50781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return;
50881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
50981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
510635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid GraphicsContext::setPlatformShouldAntialias(bool enable)
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::setImageInterpolationQuality(InterpolationQuality)
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectInterpolationQuality GraphicsContext::imageInterpolationQuality() const
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return InterpolationDefault;
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
526f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid GraphicsContext::fillPath(const Path& path)
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if USE(WXGC)
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (gc)
5312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        gc->FillPath(*path.platformPath());
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
535f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid GraphicsContext::strokePath(const Path& path)
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if USE(WXGC)
538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wxGraphicsContext* gc = m_data->context->GetGraphicsContext();
539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (gc)
5402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        gc->StrokePath(*path.platformPath());
541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContext::fillRect(const FloatRect& rect)
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (paintingDisabled())
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid GraphicsContext::setPlatformShadow(FloatSize const&, float, Color const&, ColorSpace)
551231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
552231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
553231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
554231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
555231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::clearPlatformShadow()
556231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
557231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
558231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
559231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
560231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::beginTransparencyLayer(float)
561231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
562231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
563231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
564231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
565231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::endTransparencyLayer()
566231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
567231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
568231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
569231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
570231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::clearRect(const FloatRect&)
571231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
572231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
573231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
575231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::strokeRect(const FloatRect&, float)
576231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
577231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
578231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
579231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
580231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::setLineCap(LineCap)
581231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
582231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
583231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
584231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
585dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid GraphicsContext::setLineDash(const DashArray&, float dashOffset)
586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    notImplemented();
588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
590231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::setLineJoin(LineJoin)
591231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
592231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
593231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
594231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
595231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::setMiterLimit(float)
596231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
597231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
598231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
599231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::setAlpha(float)
601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
602231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
603231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
604231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
605231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid GraphicsContext::addInnerRoundedRectClip(const IntRect& rect, int thickness)
606231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
607231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    notImplemented();
608231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
609231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
610d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS)
611643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockHDC GraphicsContext::getWindowsContext(const IntRect& dstRect, bool supportAlphaBlend, bool mayCreateBitmap)
612643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
613643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (dstRect.isEmpty())
614643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
615643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
616643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Create a bitmap DC in which to draw.
617643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    BITMAPINFO bitmapInfo;
618643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biSize          = sizeof(BITMAPINFOHEADER);
619643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biWidth         = dstRect.width();
620643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biHeight        = dstRect.height();
621643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biPlanes        = 1;
622643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biBitCount      = 32;
623643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biCompression   = BI_RGB;
624643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biSizeImage     = 0;
625643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biXPelsPerMeter = 0;
626643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biYPelsPerMeter = 0;
627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biClrUsed       = 0;
628643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bitmapInfo.bmiHeader.biClrImportant  = 0;
629643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
630643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void* pixels = 0;
631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    HBITMAP bitmap = ::CreateDIBSection(0, &bitmapInfo, DIB_RGB_COLORS, &pixels, 0, 0);
632643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!bitmap)
633643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
634643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
635643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    HDC displayDC = ::GetDC(0);
636643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    HDC bitmapDC = ::CreateCompatibleDC(displayDC);
637643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ::ReleaseDC(0, displayDC);
638643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
639643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ::SelectObject(bitmapDC, bitmap);
640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Fill our buffer with clear if we're going to alpha blend.
642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (supportAlphaBlend) {
643643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        BITMAP bmpInfo;
644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        GetObject(bitmap, sizeof(bmpInfo), &bmpInfo);
645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int bufferSize = bmpInfo.bmWidthBytes * bmpInfo.bmHeight;
646643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        memset(bmpInfo.bmBits, 0, bufferSize);
647643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return bitmapDC;
649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
650643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
651643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid GraphicsContext::releaseWindowsContext(HDC hdc, const IntRect& dstRect, bool supportAlphaBlend, bool mayCreateBitmap)
652643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
653643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (hdc) {
654643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
655643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!dstRect.isEmpty()) {
656643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
657643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            HBITMAP bitmap = static_cast<HBITMAP>(GetCurrentObject(hdc, OBJ_BITMAP));
658643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            BITMAP info;
659643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            GetObject(bitmap, sizeof(info), &info);
660643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            ASSERT(info.bmBitsPixel == 32);
661643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
662643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            wxBitmap bmp;
663643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            bmp.SetHBITMAP(bitmap);
664643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if !wxCHECK_VERSION(2,9,0)
665643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (supportAlphaBlend)
666643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                bmp.UseAlpha();
667643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
668643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_data->context->DrawBitmap(bmp, dstRect.x(), dstRect.y(), supportAlphaBlend);
669643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
670643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            ::DeleteObject(bitmap);
671643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
672643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
673643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ::DeleteDC(hdc);
674643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
675643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
676643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
677643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
679