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