summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/skia/SkiaUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/skia/SkiaUtils.cpp')
-rw-r--r--WebCore/platform/graphics/skia/SkiaUtils.cpp257
1 files changed, 0 insertions, 257 deletions
diff --git a/WebCore/platform/graphics/skia/SkiaUtils.cpp b/WebCore/platform/graphics/skia/SkiaUtils.cpp
deleted file mode 100644
index da83793..0000000
--- a/WebCore/platform/graphics/skia/SkiaUtils.cpp
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (c) 2006,2007,2008, Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 THE COPYRIGHT
- * OWNER 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 "SkiaUtils.h"
-
-#include "ImageBuffer.h"
-#include "SharedBuffer.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkMatrix.h"
-#include "SkRegion.h"
-#include "SkUnPreMultiply.h"
-
-namespace WebCore {
-
-#if PLATFORM(ANDROID)
-static const struct CompositOpToSkiaMode {
- uint8_t mCompositOp;
- uint8_t mMode;
-} gMapCompositOpsToSkiaModes[] = {
- { CompositeClear, SkXfermode::kClear_Mode },
- { CompositeCopy, SkXfermode::kSrc_Mode },
- { CompositeSourceOver, SkXfermode::kSrcOver_Mode },
- { CompositeSourceIn, SkXfermode::kSrcIn_Mode },
- { CompositeSourceOut, SkXfermode::kSrcOut_Mode },
- { CompositeSourceAtop, SkXfermode::kSrcATop_Mode },
- { CompositeDestinationOver, SkXfermode::kDstOver_Mode },
- { CompositeDestinationIn, SkXfermode::kDstIn_Mode },
- { CompositeDestinationOut, SkXfermode::kDstOut_Mode },
- { CompositeDestinationAtop, SkXfermode::kDstATop_Mode },
- { CompositeXOR, SkXfermode::kXor_Mode },
- // need more details on the composite modes to be sure these are right
- { CompositePlusDarker, SkXfermode::kDarken_Mode },
- { CompositeHighlight, SkXfermode::kSrcOver_Mode }, // TODO
- { CompositePlusLighter, SkXfermode::kPlus_Mode }
-};
-
-SkXfermode::Mode WebCoreCompositeToSkiaCOmposite(CompositeOperator op)
-{
- const CompositOpToSkiaMode* table = gMapCompositOpsToSkiaModes;
-
- for (unsigned i = 0; i < SK_ARRAY_COUNT(gMapCompositOpsToSkiaModes); i++) {
- if (table[i].mCompositOp == op)
- return (SkXfermode::Mode)table[i].mMode;
- }
-
- SkDEBUGF(("GraphicsContext::setCompositeOperation uknown CompositeOperator %d\n", op));
- return SkXfermode::kSrcOver_Mode; // fall-back
-}
-
-#endif
-
-static const struct CompositOpToXfermodeMode {
- uint8_t mCompositOp;
- uint8_t m_xfermodeMode;
-} gMapCompositOpsToXfermodeModes[] = {
- { CompositeClear, SkXfermode::kClear_Mode },
- { CompositeCopy, SkXfermode::kSrc_Mode },
- { CompositeSourceOver, SkXfermode::kSrcOver_Mode },
- { CompositeSourceIn, SkXfermode::kSrcIn_Mode },
- { CompositeSourceOut, SkXfermode::kSrcOut_Mode },
- { CompositeSourceAtop, SkXfermode::kSrcATop_Mode },
- { CompositeDestinationOver, SkXfermode::kDstOver_Mode },
- { CompositeDestinationIn, SkXfermode::kDstIn_Mode },
- { CompositeDestinationOut, SkXfermode::kDstOut_Mode },
- { CompositeDestinationAtop, SkXfermode::kDstATop_Mode },
- { CompositeXOR, SkXfermode::kXor_Mode },
- { CompositePlusDarker, SkXfermode::kDarken_Mode },
- { CompositeHighlight, SkXfermode::kSrcOver_Mode }, // TODO
- { CompositePlusLighter, SkXfermode::kPlus_Mode }
-};
-
-SkXfermode::Mode WebCoreCompositeToSkiaComposite(CompositeOperator op)
-{
- const CompositOpToXfermodeMode* table = gMapCompositOpsToXfermodeModes;
-
- for (unsigned i = 0; i < SK_ARRAY_COUNT(gMapCompositOpsToXfermodeModes); i++) {
- if (table[i].mCompositOp == op)
- return (SkXfermode::Mode)table[i].m_xfermodeMode;
- }
-
- SkDEBUGF(("GraphicsContext::setPlatformCompositeOperation unknown CompositeOperator %d\n", op));
- return SkXfermode::kSrcOver_Mode; // fall-back
-}
-
-#if PLATFORM(ANDROID)
-Color SkPMColorToWebCoreColor(SkPMColor pm)
-{
- SkColor c = SkUnPreMultiply::PMColorToColor(pm);
- // need the cast to find the right constructor
- return WebCore::Color((int)SkColorGetR(c), (int)SkColorGetG(c),
- (int)SkColorGetB(c), (int)SkColorGetA(c));
-}
-#else
-static U8CPU InvScaleByte(U8CPU component, uint32_t scale)
-{
- SkASSERT(component == (uint8_t)component);
- return (component * scale + 0x8000) >> 16;
-}
-
-SkColor SkPMColorToColor(SkPMColor pm)
-{
- if (!pm)
- return 0;
- unsigned a = SkGetPackedA32(pm);
- if (!a) {
- // A zero alpha value when there are non-zero R, G, or B channels is an
- // invalid premultiplied color (since all channels should have been
- // multiplied by 0 if a=0).
- SkASSERT(false);
- // In production, return 0 to protect against division by zero.
- return 0;
- }
-
- uint32_t scale = (255 << 16) / a;
-
- return SkColorSetARGB(a,
- InvScaleByte(SkGetPackedR32(pm), scale),
- InvScaleByte(SkGetPackedG32(pm), scale),
- InvScaleByte(SkGetPackedB32(pm), scale));
-}
-
-Color SkPMColorToWebCoreColor(SkPMColor pm)
-{
- return SkPMColorToColor(pm);
-}
-#endif
-
-void IntersectRectAndRegion(const SkRegion& region, const SkRect& srcRect, SkRect* destRect) {
- // The cliperator requires an int rect, so we round out.
- SkIRect srcRectRounded;
- srcRect.roundOut(&srcRectRounded);
-
- // The Cliperator will iterate over a bunch of rects where our transformed
- // rect and the clipping region (which may be non-square) overlap.
- SkRegion::Cliperator cliperator(region, srcRectRounded);
- if (cliperator.done()) {
- destRect->setEmpty();
- return;
- }
-
- // Get the union of all visible rects in the clip that overlap our bitmap.
- SkIRect currentVisibleRect = cliperator.rect();
- cliperator.next();
- while (!cliperator.done()) {
- currentVisibleRect.join(cliperator.rect());
- cliperator.next();
- }
-
- destRect->set(currentVisibleRect);
-}
-
-void ClipRectToCanvas(const SkCanvas& canvas, const SkRect& srcRect, SkRect* destRect) {
- // Translate into the canvas' coordinate space. This is where the clipping
- // region applies.
- SkRect transformedSrc;
- canvas.getTotalMatrix().mapRect(&transformedSrc, srcRect);
-
- // Do the intersection.
- SkRect transformedDest;
- IntersectRectAndRegion(canvas.getTotalClip(), transformedSrc, &transformedDest);
-
- // Now transform it back into world space.
- SkMatrix inverseTransform;
- canvas.getTotalMatrix().invert(&inverseTransform);
- inverseTransform.mapRect(destRect, transformedDest);
-}
-
-bool SkPathContainsPoint(SkPath* originalPath, const FloatPoint& point, SkPath::FillType ft)
-{
- SkRegion rgn;
- SkRegion clip;
-
- SkPath::FillType originalFillType = originalPath->getFillType();
-
- const SkPath* path = originalPath;
- SkPath scaledPath;
- int scale = 1;
-
- SkRect bounds = originalPath->getBounds();
-
- // We can immediately return false if the point is outside the bounding
- // rect. We don't use bounds.contains() here, since it would exclude
- // points on the right and bottom edges of the bounding rect, and we want
- // to include them.
- SkScalar fX = SkFloatToScalar(point.x());
- SkScalar fY = SkFloatToScalar(point.y());
- if (fX < bounds.fLeft || fX > bounds.fRight || fY < bounds.fTop || fY > bounds.fBottom)
- return false;
-
- originalPath->setFillType(ft);
-
- // Skia has trouble with coordinates close to the max signed 16-bit values
- // If we have those, we need to scale.
- //
- // TODO: remove this code once Skia is patched to work properly with large
- // values
- const SkScalar kMaxCoordinate = SkIntToScalar(1<<15);
- SkScalar biggestCoord = std::max(std::max(std::max(bounds.fRight, bounds.fBottom), -bounds.fLeft), -bounds.fTop);
-
- if (biggestCoord > kMaxCoordinate) {
- scale = SkScalarCeil(SkScalarDiv(biggestCoord, kMaxCoordinate));
-
- SkMatrix m;
- m.setScale(SkScalarInvert(SkIntToScalar(scale)), SkScalarInvert(SkIntToScalar(scale)));
- originalPath->transform(m, &scaledPath);
- path = &scaledPath;
- }
-
- int x = static_cast<int>(floorf(point.x() / scale));
- int y = static_cast<int>(floorf(point.y() / scale));
- clip.setRect(x - 1, y - 1, x + 1, y + 1);
-
- bool contains = rgn.setPath(*path, clip);
-
- originalPath->setFillType(originalFillType);
- return contains;
-}
-
-GraphicsContext* scratchContext()
-{
- static ImageBuffer* scratch = ImageBuffer::create(IntSize(1, 1)).leakPtr();
- // We don't bother checking for failure creating the ImageBuffer, since our
- // ImageBuffer initializer won't fail.
- return scratch->context();
-}
-
-} // namespace WebCore