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