15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (c) 2006,2007,2008, Google Inc. All rights reserved. 302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 1702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/skia/SkiaUtils.h" 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkColorPriv.h" 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkMatrix.h" 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkRegion.h" 3881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/platform/graphics/GraphicsContext.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/ImageBuffer.h" 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const struct CompositOpToXfermodeMode { 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint8_t mCompositOp; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint8_t m_xfermodeMode; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} gMapCompositOpsToXfermodeModes[] = { 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeClear, SkXfermode::kClear_Mode }, 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeCopy, SkXfermode::kSrc_Mode }, 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeSourceOver, SkXfermode::kSrcOver_Mode }, 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeSourceIn, SkXfermode::kSrcIn_Mode }, 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeSourceOut, SkXfermode::kSrcOut_Mode }, 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeSourceAtop, SkXfermode::kSrcATop_Mode }, 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeDestinationOver, SkXfermode::kDstOver_Mode }, 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeDestinationIn, SkXfermode::kDstIn_Mode }, 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeDestinationOut, SkXfermode::kDstOut_Mode }, 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeDestinationAtop, SkXfermode::kDstATop_Mode }, 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositeXOR, SkXfermode::kXor_Mode }, 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositePlusDarker, SkXfermode::kDarken_Mode }, 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { CompositePlusLighter, SkXfermode::kPlus_Mode } 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// keep this array in sync with BlendMode enum in GraphicsTypes.h 6381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)static const uint8_t gMapBlendOpsToXfermodeModes[] = { 6481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kClear_Mode, // BlendModeNormal 6581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kMultiply_Mode, // BlendModeMultiply 6681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kScreen_Mode, // BlendModeScreen 6781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kOverlay_Mode, // BlendModeOverlay 6881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kDarken_Mode, // BlendModeDarken 6981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kLighten_Mode, // BlendModeLighten 7081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kColorDodge_Mode, // BlendModeColorDodge 7181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kColorBurn_Mode, // BlendModeColorBurn 7281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kHardLight_Mode, // BlendModeHardLight 7381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kSoftLight_Mode, // BlendModeSoftLight 7481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kDifference_Mode, // BlendModeDifference 7581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kExclusion_Mode, // BlendModeExclusion 7681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kHue_Mode, // BlendModeHue 7781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kSaturation_Mode, // BlendModeSaturation 7881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kColor_Mode, // BlendModeColor 7981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkXfermode::kLuminosity_Mode // BlendModeLuminosity 8081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}; 8181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 8281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)SkXfermode::Mode WebCoreCompositeToSkiaComposite(CompositeOperator op, BlendMode blendMode) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (blendMode != BlendModeNormal) { 8581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if ((uint8_t)blendMode >= SK_ARRAY_COUNT(gMapBlendOpsToXfermodeModes)) { 8681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) SkDEBUGF(("GraphicsContext::setPlatformCompositeOperation unknown BlendMode %d\n", blendMode)); 8781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return SkXfermode::kSrcOver_Mode; 8881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 8981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return (SkXfermode::Mode)gMapBlendOpsToXfermodeModes[(uint8_t)blendMode]; 9081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) } 9181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const CompositOpToXfermodeMode* table = gMapCompositOpsToXfermodeModes; 9302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < SK_ARRAY_COUNT(gMapCompositOpsToXfermodeModes); i++) { 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (table[i].mCompositOp == op) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (SkXfermode::Mode)table[i].m_xfermodeMode; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkDEBUGF(("GraphicsContext::setPlatformCompositeOperation unknown CompositeOperator %d\n", op)); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SkXfermode::kSrcOver_Mode; // fall-back 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static U8CPU InvScaleByte(U8CPU component, uint32_t scale) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkASSERT(component == (uint8_t)component); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (component * scale + 0x8000) >> 16; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SkColor SkPMColorToColor(SkPMColor pm) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!pm) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned a = SkGetPackedA32(pm); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!a) { 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // A zero alpha value when there are non-zero R, G, or B channels is an 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // invalid premultiplied color (since all channels should have been 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // multiplied by 0 if a=0). 11802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch SkASSERT(false); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In production, return 0 to protect against division by zero. 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t scale = (255 << 16) / a; 12402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SkColorSetARGB(a, 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InvScaleByte(SkGetPackedR32(pm), scale), 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InvScaleByte(SkGetPackedG32(pm), scale), 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InvScaleByte(SkGetPackedB32(pm), scale)); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color SkPMColorToWebCoreColor(SkPMColor pm) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SkPMColorToColor(pm); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void ClipRectToCanvas(const GraphicsContext* context, const SkRect& srcRect, SkRect* destRect) 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!context->getClipBounds(destRect) || !destRect->intersect(srcRect)) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) destRect->setEmpty(); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14283750176c3ee2cea66c8a9751271026a5901be3aBen Murdochbool SkPathContainsPoint(const SkPath& originalPath, const FloatPoint& point, SkPath::FillType ft) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch SkRect bounds = originalPath.getBounds(); 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We can immediately return false if the point is outside the bounding 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // rect. We don't use bounds.contains() here, since it would exclude 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // points on the right and bottom edges of the bounding rect, and we want 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to include them. 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkScalar fX = SkFloatToScalar(point.x()); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkScalar fY = SkFloatToScalar(point.y()); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (fX < bounds.fLeft || fX > bounds.fRight || fY < bounds.fTop || fY > bounds.fBottom) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Scale the path to a large size before hit testing for two reasons: 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 1) Skia has trouble with coordinates close to the max signed 16-bit values, so we scale larger paths down. 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // TODO: when Skia is patched to work properly with large values, this will not be necessary. 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 2) Skia does not support analytic hit testing, so we scale paths up to do raster hit testing with subpixel accuracy. 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkScalar biggestCoord = std::max(std::max(std::max(bounds.fRight, bounds.fBottom), -bounds.fLeft), -bounds.fTop); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (SkScalarNearlyZero(biggestCoord)) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) biggestCoord = std::max(std::max(biggestCoord, fX + 1), fY + 1); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const SkScalar kMaxCoordinate = SkIntToScalar(1 << 15); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkScalar scale = SkScalarDiv(kMaxCoordinate, biggestCoord); 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch SkRegion rgn; 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkRegion clip; 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SkMatrix m; 17083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch SkPath scaledPath(originalPath); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch scaledPath.setFillType(ft); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m.setScale(scale, scale); 17483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch scaledPath.transform(m, 0); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int x = static_cast<int>(floorf(0.5f + point.x() * scale)); 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int y = static_cast<int>(floorf(0.5f + point.y() * scale)); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clip.setRect(x - 1, y - 1, x + 1, y + 1); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return rgn.setPath(scaledPath, clip); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 184