18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
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
292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG)
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContextPlatformPrivateCG.h"
312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(CAIRO)
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContextPlatformPrivateCairo.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
355e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "AffineTransform.h"
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "BitmapInfo.h"
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "TransformationMatrix.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Path.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/MathExtras.h>
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void fillWithClearColor(HBITMAP bitmap)
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    BITMAP bmpInfo;
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    GetObject(bitmap, sizeof(bmpInfo), &bmpInfo);
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int bufferSize = bmpInfo.bmWidthBytes * bmpInfo.bmHeight;
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    memset(bmpInfo.bmBits, 0, bufferSize);
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool GraphicsContext::inTransparencyLayer() const { return m_data->m_transparencyCount; }
558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid GraphicsContext::setShouldIncludeChildWindows(bool include)
578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_data->m_shouldIncludeChildWindows = include;
598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool GraphicsContext::shouldIncludeChildWindows() const
628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return m_data->m_shouldIncludeChildWindows;
648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochGraphicsContext::WindowsBitmap::WindowsBitmap(HDC hdc, IntSize size)
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    : m_hdc(0)
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BitmapInfo bitmapInfo = BitmapInfo::create(size);
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void* storage = 0;
722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_bitmap = CreateDIBSection(0, &bitmapInfo, DIB_RGB_COLORS, &storage, 0, 0);
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_bitmap)
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_hdc = CreateCompatibleDC(hdc);
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    SelectObject(m_hdc, m_bitmap);
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_pixelData.initialize(m_bitmap);
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(storage == m_pixelData.buffer());
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    SetGraphicsMode(m_hdc, GM_ADVANCED);
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochGraphicsContext::WindowsBitmap::~WindowsBitmap()
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!m_bitmap)
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DeleteDC(m_hdc);
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DeleteObject(m_bitmap);
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochGraphicsContext::WindowsBitmap* GraphicsContext::createWindowsBitmap(IntSize size)
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return new WindowsBitmap(m_data->m_hdc, size);
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochHDC GraphicsContext::getWindowsContext(const IntRect& dstRect, bool supportAlphaBlend, bool mayCreateBitmap)
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Should a bitmap be created also when a shadow is set?
1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (mayCreateBitmap && (!m_data->m_hdc || inTransparencyLayer())) {
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (dstRect.isEmpty())
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return 0;
1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Create a bitmap DC in which to draw.
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BitmapInfo bitmapInfo = BitmapInfo::create(dstRect.size());
1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void* pixels = 0;
1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        HBITMAP bitmap = ::CreateDIBSection(NULL, &bitmapInfo, DIB_RGB_COLORS, &pixels, 0, 0);
1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!bitmap)
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return 0;
1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        HDC bitmapDC = ::CreateCompatibleDC(m_data->m_hdc);
1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ::SelectObject(bitmapDC, bitmap);
1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Fill our buffer with clear if we're going to alpha blend.
1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (supportAlphaBlend)
1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch           fillWithClearColor(bitmap);
1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Make sure we can do world transforms.
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        SetGraphicsMode(bitmapDC, GM_ADVANCED);
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Apply a translation to our context so that the drawing done will be at (0,0) of the bitmap.
1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        XFORM xform = TransformationMatrix().translate(-dstRect.x(), -dstRect.y());
1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ::SetWorldTransform(bitmapDC, &xform);
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return bitmapDC;
1310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_data->flush();
1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_data->save();
1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_data->m_hdc;
1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContextPlatformPrivate::save()
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_hdc)
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SaveDC(m_hdc);
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContextPlatformPrivate::restore()
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_hdc)
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RestoreDC(m_hdc, -1);
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContextPlatformPrivate::clip(const FloatRect& clipRect)
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_hdc)
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IntersectClipRect(m_hdc, clipRect.x(), clipRect.y(), clipRect.maxX(), clipRect.maxY());
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContextPlatformPrivate::clip(const Path&)
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContextPlatformPrivate::scale(const FloatSize& size)
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_hdc)
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    XFORM xform = TransformationMatrix().scaleNonUniform(size.width(), size.height());
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ModifyWorldTransform(m_hdc, &xform, MWT_LEFTMULTIPLY);
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const double deg2rad = 0.017453292519943295769; // pi/180
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContextPlatformPrivate::rotate(float degreesAngle)
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    XFORM xform = TransformationMatrix().rotate(degreesAngle);
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ModifyWorldTransform(m_hdc, &xform, MWT_LEFTMULTIPLY);
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GraphicsContextPlatformPrivate::translate(float x , float y)
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_hdc)
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    XFORM xform = TransformationMatrix().translate(x, y);
1870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ModifyWorldTransform(m_hdc, &xform, MWT_LEFTMULTIPLY);
1880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1905e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid GraphicsContextPlatformPrivate::concatCTM(const AffineTransform& transform)
1915e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
1925e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (!m_hdc)
1935e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        return;
1945e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
1958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    XFORM xform = transform.toTransformationMatrix();
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ModifyWorldTransform(m_hdc, &xform, MWT_LEFTMULTIPLY);
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid GraphicsContextPlatformPrivate::setCTM(const AffineTransform& transform)
20081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
20181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!m_hdc)
20281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
20381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
20481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    XFORM xform = transform.toTransformationMatrix();
20581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    SetWorldTransform(m_hdc, &xform);
20681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
20781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
209