diff options
author | Steve Block <steveblock@google.com> | 2011-05-06 11:45:16 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-05-12 13:44:10 +0100 |
commit | cad810f21b803229eb11403f9209855525a25d57 (patch) | |
tree | 29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /WebCore/platform/graphics/wx/GraphicsContextWx.cpp | |
parent | 121b0cf4517156d0ac5111caf9830c51b69bae8f (diff) | |
download | external_webkit-cad810f21b803229eb11403f9209855525a25d57.zip external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2 |
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'WebCore/platform/graphics/wx/GraphicsContextWx.cpp')
-rw-r--r-- | WebCore/platform/graphics/wx/GraphicsContextWx.cpp | 666 |
1 files changed, 0 insertions, 666 deletions
diff --git a/WebCore/platform/graphics/wx/GraphicsContextWx.cpp b/WebCore/platform/graphics/wx/GraphicsContextWx.cpp deleted file mode 100644 index cee6aee..0000000 --- a/WebCore/platform/graphics/wx/GraphicsContextWx.cpp +++ /dev/null @@ -1,666 +0,0 @@ -/* - * Copyright (C) 2007 Kevin Ollivier <kevino@theolliviers.com> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 "GraphicsContext.h" - -#include "AffineTransform.h" -#include "FloatRect.h" -#include "Font.h" -#include "IntRect.h" -#include "NotImplemented.h" -#include "Pen.h" -#include <wtf/MathExtras.h> - -#include <math.h> -#include <stdio.h> - -#include <wx/defs.h> -#include <wx/window.h> -#include <wx/dcclient.h> -#include <wx/dcgraph.h> -#include <wx/graphics.h> - -#if __WXMAC__ -#include <Carbon/Carbon.h> -#elif __WXMSW__ -#include <windows.h> -#endif - -namespace WebCore { - -int getWxCompositingOperation(CompositeOperator op, bool hasAlpha) -{ - // FIXME: Add support for more operators. - if (op == CompositeSourceOver && !hasAlpha) - op = CompositeCopy; - - int function; - switch (op) { - case CompositeClear: - function = wxCLEAR; - case CompositeCopy: - function = wxCOPY; - break; - default: - function = wxCOPY; - } - return function; -} - -static int strokeStyleToWxPenStyle(int p) -{ - if (p == SolidStroke) - return wxSOLID; - if (p == DottedStroke) - return wxDOT; - if (p == DashedStroke) - return wxLONG_DASH; - if (p == NoStroke) - return wxTRANSPARENT; - - return wxSOLID; -} - -class GraphicsContextPlatformPrivate { -public: - GraphicsContextPlatformPrivate(); - ~GraphicsContextPlatformPrivate(); - -#if USE(WXGC) - wxGCDC* context; -#else - wxWindowDC* context; -#endif - int mswDCStateID; - wxRegion gtkCurrentClipRgn; - wxRegion gtkPaintClipRgn; -}; - -GraphicsContextPlatformPrivate::GraphicsContextPlatformPrivate() : - context(0), - mswDCStateID(0), - gtkCurrentClipRgn(wxRegion()), - gtkPaintClipRgn(wxRegion()) -{ -} - -GraphicsContextPlatformPrivate::~GraphicsContextPlatformPrivate() -{ -} - - -void GraphicsContext::platformInit(PlatformGraphicsContext* context) -{ - m_data = new GraphicsContextPlatformPrivate; - setPaintingDisabled(!context); - - if (context) { - // Make sure the context starts in sync with our state. - setPlatformFillColor(fillColor(), ColorSpaceDeviceRGB); - setPlatformStrokeColor(strokeColor(), ColorSpaceDeviceRGB); - } -#if USE(WXGC) - m_data->context = (wxGCDC*)context; -#else - m_data->context = (wxWindowDC*)context; -#endif -} - -void GraphicsContext::platformDestroy() -{ - delete m_data; -} - -PlatformGraphicsContext* GraphicsContext::platformContext() const -{ - return (PlatformGraphicsContext*)m_data->context; -} - -void GraphicsContext::savePlatformState() -{ - if (m_data->context) - { -#if USE(WXGC) - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - gc->PushState(); -#else - // when everything is working with USE_WXGC, we can remove this - #if __WXMAC__ - CGContextRef context; - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - if (gc) - context = (CGContextRef)gc->GetNativeContext(); - if (context) - CGContextSaveGState(context); - #elif __WXMSW__ - HDC dc = (HDC)m_data->context->GetHDC(); - m_data->mswDCStateID = ::SaveDC(dc); - #elif __WXGTK__ - m_data->gtkCurrentClipRgn = m_data->context->m_currentClippingRegion; - m_data->gtkPaintClipRgn = m_data->context->m_paintClippingRegion; - #endif -#endif // __WXMAC__ - } -} - -void GraphicsContext::restorePlatformState() -{ - if (m_data->context) - { -#if USE(WXGC) - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - gc->PopState(); -#else - #if __WXMAC__ - CGContextRef context; - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - if (gc) - context = (CGContextRef)gc->GetNativeContext(); - if (context) - CGContextRestoreGState(context); - #elif __WXMSW__ - HDC dc = (HDC)m_data->context->GetHDC(); - ::RestoreDC(dc, m_data->mswDCStateID); - #elif __WXGTK__ - m_data->context->m_currentClippingRegion = m_data->gtkCurrentClipRgn; - m_data->context->m_paintClippingRegion = m_data->gtkPaintClipRgn; - #endif - -#endif // USE_WXGC - } -} - -// Draws a filled rectangle with a stroked border. -void GraphicsContext::drawRect(const IntRect& rect) -{ - if (paintingDisabled()) - return; - - m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle()))); - m_data->context->DrawRectangle(rect.x(), rect.y(), rect.width(), rect.height()); -} - -// This is only used to draw borders. -void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) -{ - if (paintingDisabled()) - return; - - FloatPoint p1 = point1; - FloatPoint p2 = point2; - - m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle()))); - m_data->context->DrawLine(point1.x(), point1.y(), point2.x(), point2.y()); -} - -// This method is only used to draw the little circles used in lists. -void GraphicsContext::drawEllipse(const IntRect& rect) -{ - if (paintingDisabled()) - return; - - m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle()))); - m_data->context->DrawEllipse(rect.x(), rect.y(), rect.width(), rect.height()); -} - -void GraphicsContext::strokeArc(const IntRect& rect, int startAngle, int angleSpan) -{ - if (paintingDisabled()) - return; - - m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle()))); - m_data->context->DrawEllipticArc(rect.x(), rect.y(), rect.width(), rect.height(), startAngle, angleSpan); -} - -void GraphicsContext::drawConvexPolygon(size_t npoints, const FloatPoint* points, bool shouldAntialias) -{ - if (paintingDisabled()) - return; - - if (npoints <= 1) - return; - - wxPoint* polygon = new wxPoint[npoints]; - for (size_t i = 0; i < npoints; i++) - polygon[i] = wxPoint(points[i].x(), points[i].y()); - m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), strokeStyleToWxPenStyle(strokeStyle()))); - m_data->context->DrawPolygon((int)npoints, polygon); - delete [] polygon; -} - -void GraphicsContext::clipConvexPolygon(size_t numPoints, const FloatPoint* points, bool antialiased) -{ - if (paintingDisabled()) - return; - - if (numPoints <= 1) - return; - - // FIXME: IMPLEMENT!! -} - -void GraphicsContext::fillRect(const FloatRect& rect, const Color& color, ColorSpace colorSpace) -{ - if (paintingDisabled()) - return; - - savePlatformState(); - - m_data->context->SetPen(*wxTRANSPARENT_PEN); - m_data->context->SetBrush(wxBrush(color)); - m_data->context->DrawRectangle(rect.x(), rect.y(), rect.width(), rect.height()); - - restorePlatformState(); -} - -void GraphicsContext::fillRoundedRect(const IntRect& rect, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight, const Color& color, ColorSpace colorSpace) -{ - if (paintingDisabled()) - return; - - notImplemented(); -} - -void GraphicsContext::drawFocusRing(const Path& path, int width, int offset, const Color& color) -{ - // FIXME: implement -} - -void GraphicsContext::drawFocusRing(const Vector<IntRect>& rects, int width, int offset, const Color& color) -{ - if (paintingDisabled()) - return; - - notImplemented(); -} - -void GraphicsContext::clip(const FloatRect& r) -{ - wxWindowDC* windc = dynamic_cast<wxWindowDC*>(m_data->context); - wxPoint pos(0, 0); - - if (windc) { -#if !defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) - wxWindow* window = windc->GetWindow(); -#else - wxWindow* window = windc->m_owner; -#endif - if (window) { - wxWindow* parent = window->GetParent(); - // we need to convert from WebView "global" to WebFrame "local" coords. - // FIXME: We only want to go to the top WebView. - while (parent) { - pos += window->GetPosition(); - parent = parent->GetParent(); - } - } - } - - m_data->context->SetClippingRegion(r.x() - pos.x, r.y() - pos.y, r.width() + pos.x, r.height() + pos.y); -} - -void GraphicsContext::clipOut(const Path&) -{ - notImplemented(); -} - -void GraphicsContext::clipOut(const IntRect&) -{ - notImplemented(); -} - -void GraphicsContext::clipPath(const Path&, WindRule) -{ - notImplemented(); -} - -void GraphicsContext::drawLineForText(const IntPoint& origin, int width, bool printing) -{ - if (paintingDisabled()) - return; - - IntPoint endPoint = origin + IntSize(width, 0); - m_data->context->SetPen(wxPen(strokeColor(), strokeThickness(), wxSOLID)); - m_data->context->DrawLine(origin.x(), origin.y(), endPoint.x(), endPoint.y()); -} - -void GraphicsContext::drawLineForTextChecking(const IntPoint& origin, int width, TextCheckingLineStyle style) -{ - switch (style) { - case TextCheckingSpellingLineStyle: - m_data->context->SetPen(wxPen(*wxRED, 2, wxLONG_DASH)); - break; - case TextCheckingGrammarLineStyle: - m_data->context->SetPen(wxPen(*wxGREEN, 2, wxLONG_DASH)); - break; - default: - return; - } - m_data->context->DrawLine(origin.x(), origin.y(), origin.x() + width, origin.y()); -} - -void GraphicsContext::clip(const Path&) -{ - notImplemented(); -} - -void GraphicsContext::canvasClip(const Path& path) -{ - clip(path); -} - -AffineTransform GraphicsContext::getCTM() const -{ -#if USE(WXGC) - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - if (gc) { - wxGraphicsMatrix matrix = gc->GetTransform(); - double a, b, c, d, e, f; - matrix.Get(&a, &b, &c, &d, &e, &f); - return AffineTransform(a, b, c, d, e, f); - } -#endif - return AffineTransform(); -} - -void GraphicsContext::translate(float tx, float ty) -{ -#if USE(WXGC) - if (m_data->context) { - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - gc->Translate(tx, ty); - } -#endif -} - -void GraphicsContext::rotate(float angle) -{ -#if USE(WXGC) - if (m_data->context) { - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - gc->Rotate(angle); - } -#endif -} - -void GraphicsContext::scale(const FloatSize& scale) -{ -#if USE(WXGC) - if (m_data->context) { - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - gc->Scale(scale.width(), scale.height()); - } -#endif -} - - -FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& frect) -{ - FloatRect result; - - wxCoord x = (wxCoord)frect.x(); - wxCoord y = (wxCoord)frect.y(); - - x = m_data->context->LogicalToDeviceX(x); - y = m_data->context->LogicalToDeviceY(y); - result.setX((float)x); - result.setY((float)y); - x = (wxCoord)frect.width(); - y = (wxCoord)frect.height(); - x = m_data->context->LogicalToDeviceXRel(x); - y = m_data->context->LogicalToDeviceYRel(y); - result.setWidth((float)x); - result.setHeight((float)y); - return result; -} - -void GraphicsContext::setURLForRect(const KURL&, const IntRect&) -{ - notImplemented(); -} - -void GraphicsContext::setPlatformCompositeOperation(CompositeOperator op) -{ - if (m_data->context) - { -#if wxCHECK_VERSION(2,9,0) - m_data->context->SetLogicalFunction(static_cast<wxRasterOperationMode>(getWxCompositingOperation(op, false))); -#else - m_data->context->SetLogicalFunction(getWxCompositingOperation(op, false)); -#endif - } -} - -void GraphicsContext::setPlatformStrokeColor(const Color& color, ColorSpace colorSpace) -{ - if (paintingDisabled()) - return; - - if (m_data->context) - m_data->context->SetPen(wxPen(color, strokeThickness(), strokeStyleToWxPenStyle(strokeStyle()))); -} - -void GraphicsContext::setPlatformStrokeThickness(float thickness) -{ - if (paintingDisabled()) - return; - - if (m_data->context) - m_data->context->SetPen(wxPen(strokeColor(), thickness, strokeStyleToWxPenStyle(strokeStyle()))); - -} - -void GraphicsContext::setPlatformFillColor(const Color& color, ColorSpace colorSpace) -{ - if (paintingDisabled()) - return; - - if (m_data->context) - m_data->context->SetBrush(wxBrush(color)); -} - -void GraphicsContext::concatCTM(const AffineTransform& transform) -{ - if (paintingDisabled()) - return; - -#if USE(WXGC) - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - if (gc) - gc->ConcatTransform(transform); -#endif - return; -} - -void GraphicsContext::setPlatformShouldAntialias(bool enable) -{ - if (paintingDisabled()) - return; - notImplemented(); -} - -void GraphicsContext::setImageInterpolationQuality(InterpolationQuality) -{ -} - -InterpolationQuality GraphicsContext::imageInterpolationQuality() const -{ - return InterpolationDefault; -} - -void GraphicsContext::fillPath(const Path& path) -{ -#if USE(WXGC) - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - if (gc) - gc->FillPath(path.platformPath()); -#endif -} - -void GraphicsContext::strokePath(const Path& path) -{ -#if USE(WXGC) - wxGraphicsContext* gc = m_data->context->GetGraphicsContext(); - if (gc) - gc->StrokePath(path.platformPath()); -#endif -} - -void GraphicsContext::fillRect(const FloatRect& rect) -{ - if (paintingDisabled()) - return; -} - -void GraphicsContext::setPlatformShadow(FloatSize const&, float, Color const&, ColorSpace) -{ - notImplemented(); -} - -void GraphicsContext::clearPlatformShadow() -{ - notImplemented(); -} - -void GraphicsContext::beginTransparencyLayer(float) -{ - notImplemented(); -} - -void GraphicsContext::endTransparencyLayer() -{ - notImplemented(); -} - -void GraphicsContext::clearRect(const FloatRect&) -{ - notImplemented(); -} - -void GraphicsContext::strokeRect(const FloatRect&, float) -{ - notImplemented(); -} - -void GraphicsContext::setLineCap(LineCap) -{ - notImplemented(); -} - -void GraphicsContext::setLineDash(const DashArray&, float dashOffset) -{ - notImplemented(); -} - -void GraphicsContext::setLineJoin(LineJoin) -{ - notImplemented(); -} - -void GraphicsContext::setMiterLimit(float) -{ - notImplemented(); -} - -void GraphicsContext::setAlpha(float) -{ - notImplemented(); -} - -void GraphicsContext::addInnerRoundedRectClip(const IntRect& rect, int thickness) -{ - notImplemented(); -} - -#if OS(WINDOWS) -HDC GraphicsContext::getWindowsContext(const IntRect& dstRect, bool supportAlphaBlend, bool mayCreateBitmap) -{ - if (dstRect.isEmpty()) - return 0; - - // Create a bitmap DC in which to draw. - BITMAPINFO bitmapInfo; - bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bitmapInfo.bmiHeader.biWidth = dstRect.width(); - bitmapInfo.bmiHeader.biHeight = dstRect.height(); - bitmapInfo.bmiHeader.biPlanes = 1; - bitmapInfo.bmiHeader.biBitCount = 32; - bitmapInfo.bmiHeader.biCompression = BI_RGB; - bitmapInfo.bmiHeader.biSizeImage = 0; - bitmapInfo.bmiHeader.biXPelsPerMeter = 0; - bitmapInfo.bmiHeader.biYPelsPerMeter = 0; - bitmapInfo.bmiHeader.biClrUsed = 0; - bitmapInfo.bmiHeader.biClrImportant = 0; - - void* pixels = 0; - HBITMAP bitmap = ::CreateDIBSection(0, &bitmapInfo, DIB_RGB_COLORS, &pixels, 0, 0); - if (!bitmap) - return 0; - - HDC displayDC = ::GetDC(0); - HDC bitmapDC = ::CreateCompatibleDC(displayDC); - ::ReleaseDC(0, displayDC); - - ::SelectObject(bitmapDC, bitmap); - - // Fill our buffer with clear if we're going to alpha blend. - if (supportAlphaBlend) { - BITMAP bmpInfo; - GetObject(bitmap, sizeof(bmpInfo), &bmpInfo); - int bufferSize = bmpInfo.bmWidthBytes * bmpInfo.bmHeight; - memset(bmpInfo.bmBits, 0, bufferSize); - } - return bitmapDC; -} - -void GraphicsContext::releaseWindowsContext(HDC hdc, const IntRect& dstRect, bool supportAlphaBlend, bool mayCreateBitmap) -{ - if (hdc) { - - if (!dstRect.isEmpty()) { - - HBITMAP bitmap = static_cast<HBITMAP>(GetCurrentObject(hdc, OBJ_BITMAP)); - BITMAP info; - GetObject(bitmap, sizeof(info), &info); - ASSERT(info.bmBitsPixel == 32); - - wxBitmap bmp; - bmp.SetHBITMAP(bitmap); -#if !wxCHECK_VERSION(2,9,0) - if (supportAlphaBlend) - bmp.UseAlpha(); -#endif - m_data->context->DrawBitmap(bmp, dstRect.x(), dstRect.y(), supportAlphaBlend); - - ::DeleteObject(bitmap); - } - - ::DeleteDC(hdc); - } -} -#endif - -} |