summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/android
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/android')
-rw-r--r--WebCore/platform/graphics/android/AffineTransformAndroid.cpp218
-rw-r--r--WebCore/platform/graphics/android/FontAndroid.cpp208
-rw-r--r--WebCore/platform/graphics/android/FontCacheAndroid.cpp134
-rw-r--r--WebCore/platform/graphics/android/FontCustomPlatformData.cpp78
-rw-r--r--WebCore/platform/graphics/android/FontCustomPlatformData.h57
-rw-r--r--WebCore/platform/graphics/android/FontDataAndroid.cpp122
-rw-r--r--WebCore/platform/graphics/android/FontPlatformData.h72
-rw-r--r--WebCore/platform/graphics/android/FontPlatformDataAndroid.cpp176
-rw-r--r--WebCore/platform/graphics/android/GlyphMapAndroid.cpp70
-rw-r--r--WebCore/platform/graphics/android/GradientAndroid.cpp116
-rw-r--r--WebCore/platform/graphics/android/GraphicsContextAndroid.cpp1118
-rw-r--r--WebCore/platform/graphics/android/ImageAndroid.cpp297
-rw-r--r--WebCore/platform/graphics/android/ImageBufferAndroid.cpp216
-rw-r--r--WebCore/platform/graphics/android/ImageBufferData.h40
-rw-r--r--WebCore/platform/graphics/android/ImageSourceAndroid.cpp361
-rw-r--r--WebCore/platform/graphics/android/PathAndroid.cpp268
-rw-r--r--WebCore/platform/graphics/android/PatternAndroid.cpp54
-rw-r--r--WebCore/platform/graphics/android/PlatformGraphicsContext.cpp77
-rw-r--r--WebCore/platform/graphics/android/PlatformGraphicsContext.h169
-rw-r--r--WebCore/platform/graphics/android/SkBitmapRef.h62
-rw-r--r--WebCore/platform/graphics/android/android_graphics.cpp228
-rw-r--r--WebCore/platform/graphics/android/android_graphics.h89
22 files changed, 0 insertions, 4230 deletions
diff --git a/WebCore/platform/graphics/android/AffineTransformAndroid.cpp b/WebCore/platform/graphics/android/AffineTransformAndroid.cpp
deleted file mode 100644
index c01d078..0000000
--- a/WebCore/platform/graphics/android/AffineTransformAndroid.cpp
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "AffineTransform.h"
-
-#include "FloatRect.h"
-#include "IntRect.h"
-
-#include "android_graphics.h"
-
-namespace WebCore {
-
-static const double deg2rad = 0.017453292519943295769; // pi/180
-
-AffineTransform::AffineTransform()
-{
- m_transform.reset();
-}
-
-AffineTransform::AffineTransform(const SkMatrix& mat) : m_transform(mat) {}
-
-AffineTransform::AffineTransform(double a, double b, double c, double d, double tx, double ty)
-{
- m_transform.reset();
-
- m_transform.set(SkMatrix::kMScaleX, SkDoubleToScalar(a));
- m_transform.set(SkMatrix::kMSkewX, SkDoubleToScalar(b));
- m_transform.set(SkMatrix::kMTransX, SkDoubleToScalar(tx));
-
- m_transform.set(SkMatrix::kMScaleY, SkDoubleToScalar(d));
- m_transform.set(SkMatrix::kMSkewX, SkDoubleToScalar(c));
- m_transform.set(SkMatrix::kMTransX, SkDoubleToScalar(ty));
-}
-
-void AffineTransform::setMatrix(double a, double b, double c, double d, double tx, double ty)
-{
- m_transform.set(SkMatrix::kMScaleX, SkDoubleToScalar(a));
- m_transform.set(SkMatrix::kMSkewX, SkDoubleToScalar(b));
- m_transform.set(SkMatrix::kMTransX, SkDoubleToScalar(tx));
-
- m_transform.set(SkMatrix::kMScaleY, SkDoubleToScalar(d));
- m_transform.set(SkMatrix::kMSkewX, SkDoubleToScalar(c));
- m_transform.set(SkMatrix::kMTransX, SkDoubleToScalar(ty));
-}
-
-void AffineTransform::map(double x, double y, double *x2, double *y2) const
-{
- SkPoint src, dst;
- src.set(SkDoubleToScalar(x), SkDoubleToScalar(y));
- m_transform.mapPoints(&dst, &src, 1);
-
- *x2 = SkScalarToDouble(dst.fX);
- *y2 = SkScalarToDouble(dst.fY);
-}
-
-IntRect AffineTransform::mapRect(const IntRect &rect) const
-{
- SkRect src, dst;
- SkIRect ir;
-
- android_setrect(&src, rect);
- m_transform.mapRect(&dst, src);
- dst.round(&ir);
-
- return IntRect(ir.fLeft, ir.fTop, ir.width(), ir.height());
-}
-
-FloatRect AffineTransform::mapRect(const FloatRect &rect) const
-{
- SkRect src, dst;
- SkIRect ir;
-
- android_setrect(&src, rect);
- m_transform.mapRect(&dst, src);
- dst.round(&ir);
-
- return IntRect(ir.fLeft, ir.fTop, ir.width(), ir.height());
-}
-
-bool AffineTransform::isIdentity() const
-{
- return m_transform.isIdentity();
-}
-
-void AffineTransform::reset()
-{
- m_transform.reset();
-}
-
- double AffineTransform::a() const {
- return SkScalarToDouble(m_transform[0]);
- }
- void AffineTransform::setA(double a) {
- m_transform.set(0, SkDoubleToScalar(a));
- }
-
- double AffineTransform::b() const {
- return SkScalarToDouble(m_transform[1]);
- }
- void AffineTransform::setB(double b) {
- m_transform.set(1, SkDoubleToScalar(b));
- }
-
- double AffineTransform::c() const {
- return SkScalarToDouble(m_transform[3]);
- }
- void AffineTransform::setC(double c) {
- m_transform.set(3, SkDoubleToScalar(c));
- }
-
- double AffineTransform::d() const {
- return SkScalarToDouble(m_transform[4]);
- }
- void AffineTransform::setD(double d) {
- m_transform.set(4, SkDoubleToScalar(d));
- }
-
- double AffineTransform::e() const {
- return SkScalarToDouble(m_transform[2]);
- }
- void AffineTransform::setE(double e) {
- m_transform.set(2, SkDoubleToScalar(e));
- }
-
- double AffineTransform::f() const {
- return SkScalarToDouble(m_transform[5]);
- }
- void AffineTransform::setF(double f) {
- m_transform.set(5, SkDoubleToScalar(f));
- }
-
-AffineTransform &AffineTransform::scale(double sx, double sy)
-{
- m_transform.preScale(SkDoubleToScalar(sx), SkDoubleToScalar(sy));
- return *this;
-}
-
-AffineTransform &AffineTransform::rotate(double d)
-{
- m_transform.preRotate(SkDoubleToScalar(d));
- return *this;
-}
-
-AffineTransform &AffineTransform::translate(double tx, double ty)
-{
- m_transform.preTranslate(SkDoubleToScalar(tx), SkDoubleToScalar(ty));
- return *this;
-}
-
-AffineTransform &AffineTransform::shear(double sx, double sy)
-{
- m_transform.preSkew(SkDoubleToScalar(sx), SkDoubleToScalar(sy));
- return *this;
-}
-
-double AffineTransform::det() const
-{
- return SkScalarToDouble(m_transform[SkMatrix::kMScaleX]) * SkScalarToDouble(m_transform[SkMatrix::kMScaleY]) -
- SkScalarToDouble(m_transform[SkMatrix::kMSkewX]) * SkScalarToDouble(m_transform[SkMatrix::kMSkewY]);
-}
-
-AffineTransform AffineTransform::inverse() const
-{
- AffineTransform inverse;
-
- m_transform.invert(&inverse.m_transform);
-
- return inverse;
-}
-
-AffineTransform::operator SkMatrix() const
-{
- return m_transform;
-}
-
-bool AffineTransform::operator==(const AffineTransform &m2) const
-{
- return m_transform == m2.m_transform;
-}
-
-AffineTransform &AffineTransform::operator*= (const AffineTransform &m2)
-{
- m_transform.setConcat(m2.m_transform, m_transform);
- return *this;
-}
-
-AffineTransform AffineTransform::operator* (const AffineTransform &m2)
-{
- AffineTransform cat;
-
- cat.m_transform.setConcat(m2.m_transform, m_transform);
- return cat;
-}
-
-}
diff --git a/WebCore/platform/graphics/android/FontAndroid.cpp b/WebCore/platform/graphics/android/FontAndroid.cpp
deleted file mode 100644
index 54a1a08..0000000
--- a/WebCore/platform/graphics/android/FontAndroid.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright 2009, The Android Open Source Project
- * Copyright (C) 2006 Apple Computer, 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:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 "Font.h"
-
-#include "FontData.h"
-#include "FontFallbackList.h"
-#include "GraphicsContext.h"
-#include "GlyphBuffer.h"
-#include "PlatformGraphicsContext.h"
-#include "IntRect.h"
-
-#include "SkCanvas.h"
-#include "SkLayerDrawLooper.h"
-#include "SkPaint.h"
-#include "SkTemplates.h"
-#include "SkTypeface.h"
-#include "SkUtils.h"
-
-namespace WebCore {
-
-static void updateForFont(SkPaint* paint, const SimpleFontData* font) {
- font->platformData().setupPaint(paint);
- paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
-}
-
-static SkPaint* setupFill(SkPaint* paint, GraphicsContext* gc,
- const SimpleFontData* font) {
- gc->setupFillPaint(paint);
- updateForFont(paint, font);
- return paint;
-}
-
-static SkPaint* setupStroke(SkPaint* paint, GraphicsContext* gc,
- const SimpleFontData* font) {
- gc->setupStrokePaint(paint);
- updateForFont(paint, font);
- return paint;
-}
-
-static bool setupForText(SkPaint* paint, GraphicsContext* gc,
- const SimpleFontData* font) {
- int mode = gc->textDrawingMode();
-
- if ((mode & (cTextFill | cTextStroke)) == (cTextFill | cTextStroke)) {
- SkLayerDrawLooper* looper = new SkLayerDrawLooper;
- paint->setLooper(looper)->unref();
-
- // we clear the looper, in case we have a shadow
-
- SkPaint* fillP = NULL;
- SkPaint* strokeP = NULL;
- if (gc->willStroke()) {
- strokeP = setupStroke(looper->addLayer(), gc, font);
- strokeP->setLooper(NULL);
- }
- if (gc->willFill()) {
- fillP = setupFill(looper->addLayer(), gc, font);
- fillP->setLooper(NULL);
- }
-
- SkPaint shadowPaint;
- SkPoint offset;
- if (gc->setupShadowPaint(&shadowPaint, &offset)) {
- SkPaint* p = looper->addLayer(offset.fX, offset.fY);
- *p = shadowPaint;
- if (strokeP && !fillP) {
- // stroke the shadow if we have stroke but no fill
- p->setStyle(SkPaint::kStroke_Style);
- p->setStrokeWidth(strokeP->getStrokeWidth());
- }
- updateForFont(p, font);
- }
- } else if (mode & cTextFill) {
- (void)setupFill(paint, gc, font);
- } else if (mode & cTextStroke) {
- (void)setupStroke(paint, gc, font);
- } else {
- return false;
- }
- return true;
-}
-
-void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
- const GlyphBuffer& glyphBuffer, int from, int numGlyphs,
- const FloatPoint& point) const {
- SkASSERT(sizeof(GlyphBufferGlyph) == sizeof(uint16_t)); // compile-time assert
-
- SkPaint paint;
- if (!setupForText(&paint, gc, font)) {
- return;
- }
-
- SkScalar x = SkFloatToScalar(point.x());
- SkScalar y = SkFloatToScalar(point.y());
- const GlyphBufferGlyph* glyphs = glyphBuffer.glyphs(from);
- const GlyphBufferAdvance* adv = glyphBuffer.advances(from);
- SkAutoSTMalloc<32, SkPoint> storage(numGlyphs);
- SkPoint* pos = storage.get();
-
- /* We need an array of [x,y,x,y,x,y,...], but webkit is giving us
- point.xy + [width, height, width, height, ...], so we have to convert
- */
- for (int i = 0; i < numGlyphs; i++) {
- pos[i].set(x, y);
- x += SkFloatToScalar(adv[i].width());
- y += SkFloatToScalar(adv[i].height());
- }
-
- SkCanvas* canvas = gc->platformContext()->mCanvas;
- canvas->drawPosText(glyphs, numGlyphs * sizeof(*glyphs), pos, paint);
-}
-
-FloatRect Font::selectionRectForComplexText(const TextRun& run, const IntPoint& point, int h, int, int) const
-{
- SkPaint paint;
- SkScalar width, left;
- SkPaint::FontMetrics metrics;
-
- primaryFont()->platformData().setupPaint(&paint);
-
- width = paint.measureText(run.characters(), run.length() << 1);
- SkScalar spacing = paint.getFontMetrics(&metrics);
-
- return FloatRect(point.x(),
- point.y() - floorf(SkScalarToFloat(-metrics.fAscent)),
- roundf(SkScalarToFloat(width)),
- roundf(SkScalarToFloat(spacing)));
-}
-
-void Font::drawComplexText(GraphicsContext* gc, TextRun const& run, FloatPoint const& point, int, int) const
-{
- SkCanvas* canvas = gc->platformContext()->mCanvas;
- SkPaint paint;
-
- if (!setupForText(&paint, gc, primaryFont())) {
- return;
- }
-
- // go to chars, instead of glyphs, which was set by setupForText()
- paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
-
- canvas->drawText(run.characters(), run.length() << 1,
- SkFloatToScalar(point.x()), SkFloatToScalar(point.y()),
- paint);
-}
-
-float Font::floatWidthForComplexText(const TextRun& run) const
-{
- SkPaint paint;
-
- primaryFont()->platformData().setupPaint(&paint);
-
-//printf("--------- complext measure %d chars\n", run.to() - run.from());
-
- SkScalar width = paint.measureText(run.characters(), run.length() << 1);
- return SkScalarToFloat(width);
-}
-
-int Font::offsetForPositionForComplexText(const TextRun& run, int x, bool includePartialGlyphs) const
-{
- SkPaint paint;
- int count = run.length();
- SkAutoSTMalloc<64, SkScalar> storage(count);
- SkScalar* widths = storage.get();
-
- primaryFont()->platformData().setupPaint(&paint);
-
- count = paint.getTextWidths(run.characters(), count << 1, widths);
-
- if (count > 0)
- {
- SkScalar pos = 0;
- for (int i = 0; i < count; i++)
- {
- if (x < SkScalarRound(pos + SkScalarHalf(widths[i])))
- return i;
- pos += widths[i];
- }
- }
- return count;
-}
-
-}
diff --git a/WebCore/platform/graphics/android/FontCacheAndroid.cpp b/WebCore/platform/graphics/android/FontCacheAndroid.cpp
deleted file mode 100644
index c257348..0000000
--- a/WebCore/platform/graphics/android/FontCacheAndroid.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2009, The Android Open Source Project
- * Copyright (C) 2006 Apple Computer, 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:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. 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.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "FontCache.h"
-#include "FontPlatformData.h"
-#include "Font.h"
-#include "NotImplemented.h"
-#include "SimpleFontData.h"
-#include "SkPaint.h"
-#include "SkTypeface.h"
-#include "SkUtils.h"
-
-namespace WebCore {
-
-void FontCache::platformInit()
-{
-}
-
-const SimpleFontData* FontCache::getFontDataForCharacters(const Font& font, const UChar* characters, int length)
-{
- // since all of our fonts logically map to the fallback, we can always claim
- // that each font supports all characters.
- return font.primaryFont();
-}
-
-FontPlatformData* FontCache::getSimilarFontPlatformData(const Font& font)
-{
- return 0;
-}
-
-FontPlatformData* FontCache::getLastResortFallbackFont(const FontDescription& font)
-{
- static AtomicString str("sans-serif");
- return getCachedFontPlatformData(font, str);
-}
-
-static char* AtomicStringToUTF8String(const AtomicString& utf16)
-{
- SkASSERT(sizeof(uint16_t) == sizeof(utf16.characters()[0]));
- const uint16_t* uni = (uint16_t*)utf16.characters();
-
- size_t bytes = SkUTF16_ToUTF8(uni, utf16.length(), NULL);
- char* utf8 = (char*)sk_malloc_throw(bytes + 1);
-
- (void)SkUTF16_ToUTF8(uni, utf16.length(), utf8);
- utf8[bytes] = 0;
- return utf8;
-}
-
-FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family)
-{
- char* storage = 0;
- const char* name = 0;
-
- if (family.length() == 0) {
- static const struct {
- FontDescription::GenericFamilyType mType;
- const char* mName;
- } gNames[] = {
- { FontDescription::SerifFamily, "serif" },
- { FontDescription::SansSerifFamily, "sans-serif" },
- { FontDescription::MonospaceFamily, "monospace" },
- { FontDescription::CursiveFamily, "cursive" },
- { FontDescription::FantasyFamily, "fantasy" }
- };
-
- FontDescription::GenericFamilyType type = fontDescription.genericFamily();
- for (unsigned i = 0; i < SK_ARRAY_COUNT(gNames); i++)
- {
- if (type == gNames[i].mType)
- {
- name = gNames[i].mName;
- break;
- }
- }
- // if we fall out of the loop, its ok for name to still be 0
- }
- else { // convert the name to utf8
- storage = AtomicStringToUTF8String(family);
- name = storage;
- }
-
- int style = SkTypeface::kNormal;
- if (fontDescription.weight() >= FontWeightBold)
- style |= SkTypeface::kBold;
- if (fontDescription.italic())
- style |= SkTypeface::kItalic;
-
- SkTypeface* tf = SkTypeface::Create(name, (SkTypeface::Style)style);
-
- FontPlatformData* result = new FontPlatformData(tf,
- fontDescription.computedSize(),
- (style & SkTypeface::kBold) && !tf->isBold(),
- (style & SkTypeface::kItalic) && !tf->isItalic());
- tf->unref();
- sk_free(storage);
- return result;
-}
-
- // new as of SVN change 36269, Sept 8, 2008
-void FontCache::getTraitsInFamily(const AtomicString& familyName, Vector<unsigned>& traitsMasks)
-{
- // Don't understand this yet, but it seems safe to leave unimplemented
-}
-
-}
-
diff --git a/WebCore/platform/graphics/android/FontCustomPlatformData.cpp b/WebCore/platform/graphics/android/FontCustomPlatformData.cpp
deleted file mode 100644
index eb1933c..0000000
--- a/WebCore/platform/graphics/android/FontCustomPlatformData.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2008, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "FontCustomPlatformData.h"
-
-#include "SkTypeface.h"
-#include "SkStream.h"
-#include "SharedBuffer.h"
-#include "FontPlatformData.h"
-
-namespace WebCore {
-
-FontCustomPlatformData::FontCustomPlatformData(SkTypeface* face)
-{
- face->safeRef();
- m_typeface = face;
-}
-
-FontCustomPlatformData::~FontCustomPlatformData()
-{
- m_typeface->safeUnref();
- // the unref is enough to release the font data...
-}
-
-FontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, bool italic,
- FontRenderingMode mode)
-{
- // turn bold/italic into fakeBold/fakeItalic
- if (m_typeface != NULL) {
- if (m_typeface->isBold() == bold)
- bold = false;
- if (m_typeface->isItalic() == italic)
- italic = false;
- }
- return FontPlatformData(m_typeface, size, bold, italic);
-}
-
-FontCustomPlatformData* createFontCustomPlatformData(SharedBuffer* buffer)
-{
- // pass true until we know how we can share the data, and not have to
- // make a copy of it.
- SkStream* stream = new SkMemoryStream(buffer->data(), buffer->size(), true);
- SkTypeface* face = SkTypeface::CreateFromStream(stream);
- if (NULL == face) {
- SkDebugf("--------- SkTypeface::CreateFromBuffer failed %d\n",
- buffer->size());
- return NULL;
- }
-
- SkAutoUnref aur(face);
-
- return new FontCustomPlatformData(face);
-}
-
-}
diff --git a/WebCore/platform/graphics/android/FontCustomPlatformData.h b/WebCore/platform/graphics/android/FontCustomPlatformData.h
deleted file mode 100644
index e45d509..0000000
--- a/WebCore/platform/graphics/android/FontCustomPlatformData.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2008, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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.
- */
-
-#ifndef FontCustomPlatformData_h_
-#define FontCustomPlatformData_h_
-
-#include <wtf/Noncopyable.h>
-#include "FontRenderingMode.h"
-
-class SkTypeface;
-
-namespace WebCore {
-
- class SharedBuffer;
- class FontPlatformData;
-
- class FontCustomPlatformData : Noncopyable {
- public:
- FontCustomPlatformData(SkTypeface* face);
- ~FontCustomPlatformData();
-
- SkTypeface* typeface() const { return m_typeface; }
-
- FontPlatformData fontPlatformData(int size, bool bold, bool italic, FontRenderingMode );
-
- private:
- SkTypeface* m_typeface;
- };
-
- FontCustomPlatformData* createFontCustomPlatformData(SharedBuffer* buffer);
-
-} // namespace WebCore
-
-#endif // FontCustomPlatformData_h_
-
diff --git a/WebCore/platform/graphics/android/FontDataAndroid.cpp b/WebCore/platform/graphics/android/FontDataAndroid.cpp
deleted file mode 100644
index 3dd9789..0000000
--- a/WebCore/platform/graphics/android/FontDataAndroid.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright 2009, The Android Open Source Project
- * Copyright (C) 2006 Apple Computer, 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:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. 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.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "Font.h"
-#include "FontCache.h"
-#include "SimpleFontData.h"
-#include "FloatRect.h"
-#include "FontDescription.h"
-
-#include "SkPaint.h"
-#include "SkTypeface.h"
-#include "SkTime.h"
-
-namespace WebCore {
-
-void SimpleFontData::platformInit()
-{
- SkPaint paint;
- SkPaint::FontMetrics metrics;
-
- m_font.setupPaint(&paint);
- (void)paint.getFontMetrics(&metrics);
-
- // use ceil instead of round to favor descent, given a lot of accidental
- // clipping of descenders (e.g. 14pt 'g') in textedit fields
- int d = SkScalarCeil(metrics.fDescent);
- int s = SkScalarRound(metrics.fDescent - metrics.fAscent);
- int a = s - d;
-
- m_ascent = a;
- m_descent = d;
- m_xHeight = SkScalarToFloat(-metrics.fAscent) * 0.56f; // hack I stole from the window's port
- m_lineSpacing = a + d;
- m_lineGap = SkScalarRound(metrics.fLeading);
-}
-
-void SimpleFontData::platformDestroy()
-{
- delete m_smallCapsFontData;
-}
-
-SimpleFontData* SimpleFontData::smallCapsFontData(const FontDescription& fontDescription) const
-{
- if (!m_smallCapsFontData) {
- m_smallCapsFontData = new SimpleFontData(FontPlatformData(m_font, fontDescription.computedSize() * 0.7f));
- }
- return m_smallCapsFontData;
-}
-
-#define kMaxBufferCount 64
-
-bool SimpleFontData::containsCharacters(const UChar* characters, int length) const
-{
- SkPaint paint;
- uint16_t glyphs[kMaxBufferCount];
-
- m_font.setupPaint(&paint);
- paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
-
- while (length > 0) {
- int n = SkMin32(length, SK_ARRAY_COUNT(glyphs));
-
- int count = paint.textToGlyphs(characters, n << 1, glyphs);
- for (int i = 0; i < count; i++) {
- if (0 == glyphs[i]) {
- return false; // missing glyph
- }
- }
-
- characters += n;
- length -= n;
- }
- return true;
-}
-
-void SimpleFontData::determinePitch()
-{
- m_treatAsFixedPitch = false;
-}
-
-float SimpleFontData::platformWidthForGlyph(Glyph glyph) const
-{
- SkASSERT(sizeof(glyph) == 2); // compile-time assert
-
- SkPaint paint;
-
- m_font.setupPaint(&paint);
-
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
- SkScalar width = paint.measureText(&glyph, 2);
-
- return SkScalarToFloat(width);
-}
-
-}
diff --git a/WebCore/platform/graphics/android/FontPlatformData.h b/WebCore/platform/graphics/android/FontPlatformData.h
deleted file mode 100644
index 2bb8834..0000000
--- a/WebCore/platform/graphics/android/FontPlatformData.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * This file is part of the internal font implementation. It should not be included by anyone other than
- * FontMac.cpp, FontWin.cpp and Font.cpp.
- *
- * Copyright 2009, The Android Open Source Project
- * Copyright (C) 2006 Apple Computer, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef FontPlatformData_H
-#define FontPlatformData_H
-
-#include "StringImpl.h"
-
-class SkPaint;
-class SkTypeface;
-
-namespace WebCore {
-
-class FontPlatformData {
-public:
- static FontPlatformData Deleted() {
- return FontPlatformData(NULL, -1, false, false);
- }
-
- FontPlatformData();
- FontPlatformData(const FontPlatformData&);
- FontPlatformData(SkTypeface*, float textSize, bool fakeBold, bool fakeItalic);
- FontPlatformData(const FontPlatformData& src, float textSize);
- ~FontPlatformData();
-
- FontPlatformData(WTF::HashTableDeletedValueType)
- : mTypeface(hashTableDeletedFontValue()) { }
- bool isHashTableDeletedValue() const {
- return mTypeface == hashTableDeletedFontValue();
- }
-
- FontPlatformData& operator=(const FontPlatformData&);
- bool operator==(const FontPlatformData& a) const;
-
- void setupPaint(SkPaint*) const;
- unsigned hash() const;
-
-private:
- SkTypeface* mTypeface;
- float mTextSize;
- bool mFakeBold;
- bool mFakeItalic;
-
- static SkTypeface* hashTableDeletedFontValue() {
- return reinterpret_cast<SkTypeface*>(-1);
- }
-};
-
-} /* namespace */
-
-#endif
diff --git a/WebCore/platform/graphics/android/FontPlatformDataAndroid.cpp b/WebCore/platform/graphics/android/FontPlatformDataAndroid.cpp
deleted file mode 100644
index e82c1f6..0000000
--- a/WebCore/platform/graphics/android/FontPlatformDataAndroid.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * This file is part of the internal font implementation. It should not be included by anyone other than
- * FontMac.cpp, FontWin.cpp and Font.cpp.
- *
- * Copyright 2009, The Android Open Source Project
- * Copyright (C) 2006 Apple Computer, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- */
-
-#include "config.h"
-#include "FontPlatformData.h"
-
-#include "SkPaint.h"
-#include "SkTypeface.h"
-
-//#define TRACE_FONTPLATFORMDATA_LIFE
-//#define COUNT_FONTPLATFORMDATA_LIFE
-
-#ifdef COUNT_FONTPLATFORMDATA_LIFE
-static int gCount;
-static int gMaxCount;
-
-static void inc_count()
-{
- if (++gCount > gMaxCount)
- {
- gMaxCount = gCount;
- SkDebugf("---------- FontPlatformData %d\n", gMaxCount);
- }
-}
-
-static void dec_count() { --gCount; }
-#else
- #define inc_count()
- #define dec_count()
-#endif
-
-#ifdef TRACE_FONTPLATFORMDATA_LIFE
- #define trace(num) SkDebugf("FontPlatformData%d %p %g %d %d\n", num, mTypeface, mTextSize, mFakeBold, mFakeItalic)
-#else
- #define trace(num)
-#endif
-
-namespace WebCore {
-
-FontPlatformData::FontPlatformData()
- : mTypeface(NULL), mTextSize(0), mFakeBold(false), mFakeItalic(false)
-{
- inc_count();
- trace(1);
-}
-
-FontPlatformData::FontPlatformData(const FontPlatformData& src)
-{
- if (hashTableDeletedFontValue() != src.mTypeface) {
- src.mTypeface->safeRef();
- }
-
- mTypeface = src.mTypeface;
-
- mTextSize = src.mTextSize;
- mFakeBold = src.mFakeBold;
- mFakeItalic = src.mFakeItalic;
-
- inc_count();
- trace(2);
-}
-
-FontPlatformData::FontPlatformData(SkTypeface* tf, float textSize, bool fakeBold, bool fakeItalic)
- : mTypeface(tf), mTextSize(textSize), mFakeBold(fakeBold), mFakeItalic(fakeItalic)
-{
- if (hashTableDeletedFontValue() != mTypeface) {
- mTypeface->safeRef();
- }
-
- inc_count();
- trace(3);
-}
-
-FontPlatformData::FontPlatformData(const FontPlatformData& src, float textSize)
- : mTypeface(src.mTypeface), mTextSize(textSize), mFakeBold(src.mFakeBold), mFakeItalic(src.mFakeItalic)
-{
- if (hashTableDeletedFontValue() != mTypeface) {
- mTypeface->safeRef();
- }
-
- inc_count();
- trace(4);
-}
-
-FontPlatformData::~FontPlatformData()
-{
- dec_count();
-#ifdef TRACE_FONTPLATFORMDATA_LIFE
- SkDebugf("----------- ~FontPlatformData\n");
-#endif
-
- if (hashTableDeletedFontValue() != mTypeface) {
- mTypeface->safeUnref();
- }
-}
-
-FontPlatformData& FontPlatformData::operator=(const FontPlatformData& src)
-{
- if (hashTableDeletedFontValue() != src.mTypeface) {
- src.mTypeface->safeRef();
- }
- if (hashTableDeletedFontValue() != mTypeface) {
- mTypeface->safeUnref();
- }
-
- mTypeface = src.mTypeface;
- mTextSize = src.mTextSize;
- mFakeBold = src.mFakeBold;
- mFakeItalic = src.mFakeItalic;
-
- return *this;
-}
-
-void FontPlatformData::setupPaint(SkPaint* paint) const
-{
- float ts = mTextSize;
- if (!(ts > 0))
- ts = 12;
-
- paint->setAntiAlias(true);
- paint->setSubpixelText(true);
- paint->setTextSize(SkFloatToScalar(ts));
- paint->setTypeface(mTypeface);
- paint->setFakeBoldText(mFakeBold);
- paint->setTextSkewX(mFakeItalic ? -SK_Scalar1/4 : 0);
- paint->setTextEncoding(SkPaint::kUTF16_TextEncoding);
-}
-
-bool FontPlatformData::operator==(const FontPlatformData& a) const
-{
- return mTypeface == a.mTypeface &&
- mTextSize == a.mTextSize &&
- mFakeBold == a.mFakeBold &&
- mFakeItalic == a.mFakeItalic;
-}
-
-unsigned FontPlatformData::hash() const
-{
- unsigned h;
-
- if (hashTableDeletedFontValue() == mTypeface) {
- h = reinterpret_cast<unsigned>(mTypeface);
- } else {
- h = SkTypeface::UniqueID(mTypeface);
- }
-
- uint32_t sizeAsInt = *reinterpret_cast<const uint32_t*>(&mTextSize);
-
- h ^= 0x01010101 * (((int)mFakeBold << 1) | (int)mFakeItalic);
- h ^= sizeAsInt;
- return h;
-}
-
-}
-
diff --git a/WebCore/platform/graphics/android/GlyphMapAndroid.cpp b/WebCore/platform/graphics/android/GlyphMapAndroid.cpp
deleted file mode 100644
index 1df06b1..0000000
--- a/WebCore/platform/graphics/android/GlyphMapAndroid.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2009, The Android Open Source Project
- * Copyright (C) 2006 Apple Computer, 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:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. 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.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "GlyphPageTreeNode.h"
-#include "SimpleFontData.h"
-
-#include "SkTemplates.h"
-#include "SkPaint.h"
-#include "SkUtils.h"
-
-namespace WebCore {
-
-#define NO_BREAK_SPACE_UNICHAR 0xA0
-
-bool GlyphPage::fill(unsigned offset, unsigned length, UChar* buffer, unsigned bufferLength, const SimpleFontData* fontData)
-{
- if (SkUTF16_IsHighSurrogate(buffer[bufferLength-1])) {
- SkDebugf("%s last char is high-surrogate", __FUNCTION__);
- return false;
- }
-
- SkPaint paint;
- fontData->platformData().setupPaint(&paint);
- paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
-
- SkAutoSTMalloc <GlyphPage::size, uint16_t> glyphStorage(length);
- uint16_t* glyphs = glyphStorage.get();
- unsigned count = paint.textToGlyphs(buffer, bufferLength << 1, glyphs);
- if (count != length) {
- SkDebugf("%s count != length\n", __FUNCTION__);
- return false;
- }
-
- unsigned allGlyphs = 0; // track if any of the glyphIDs are non-zero
- for (unsigned i = 0; i < length; i++) {
- setGlyphDataForIndex(offset + i, glyphs[i], fontData);
- allGlyphs |= glyphs[i];
- }
- return allGlyphs != 0;
-}
-
-}
-
diff --git a/WebCore/platform/graphics/android/GradientAndroid.cpp b/WebCore/platform/graphics/android/GradientAndroid.cpp
deleted file mode 100644
index 71b7f73..0000000
--- a/WebCore/platform/graphics/android/GradientAndroid.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright 2006, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "Gradient.h"
-
-#include "android_graphics.h"
-#include "CSSParser.h"
-#include "GraphicsContext.h"
-#include "NotImplemented.h"
-#include "SkCanvas.h"
-#include "SkColorShader.h"
-#include "SkGradientShader.h"
-#include "SkPaint.h"
-
-class PlatformGradientRec {
-public:
- PlatformGradientRec() : m_shader(NULL) {}
- ~PlatformGradientRec() { m_shader->safeUnref(); }
-
- SkShader* m_shader;
- SkShader::TileMode m_tileMode;
-};
-
-namespace WebCore {
-
-void Gradient::platformDestroy()
-{
- delete m_gradient;
- m_gradient = 0;
-}
-
-static U8CPU F2B(float x)
-{
- return (int)(x * 255);
-}
-
-SkShader* Gradient::getShader(SkShader::TileMode mode) {
- if (NULL == m_gradient) {
- m_gradient = new PlatformGradientRec;
- } else if (m_gradient->m_tileMode == mode) {
- return m_gradient->m_shader;
- }
-
- SkPoint pts[2];
-
- android_setpt(&pts[0], m_p0);
- android_setpt(&pts[1], m_p1);
- size_t count = m_stops.size();
- SkAutoMalloc storage(count * (sizeof(SkColor) + sizeof(SkScalar)));
- SkColor* colors = (SkColor*)storage.get();
- SkScalar* pos = (SkScalar*)(colors + count);
-
- Vector<ColorStop>::iterator iter = m_stops.begin();
- int i = -1;
- while (i++, iter != m_stops.end()) {
- pos[i] = SkFloatToScalar(iter->stop);
- colors[i] = SkColorSetARGB(F2B(iter->alpha), F2B(iter->red),
- F2B(iter->green), F2B(iter->blue));
- ++iter;
- }
-
- SkShader* s;
- if (0 == count) {
- // it seems the spec says a zero-size gradient draws transparent
- s = new SkColorShader(0);
- } else if (m_radial) {
- s = SkGradientShader::CreateRadial(pts[0], SkFloatToScalar(m_r0),
- colors, pos, count, mode);
- } else {
- s = SkGradientShader::CreateLinear(pts, colors, pos, count, mode);
- }
-
- m_gradient->m_shader->safeUnref();
- m_gradient->m_shader = s;
- m_gradient->m_tileMode = mode;
- return s;
-}
-
-void Gradient::fill(GraphicsContext* context, const FloatRect& rect)
-{
- SkRect r;
- SkPaint paint;
- // we don't care about the mode, so try to use the existing one
- SkShader::TileMode mode = m_gradient ? m_gradient->m_tileMode :
- SkShader::kClamp_TileMode;
-
- paint.setAntiAlias(true);
- paint.setShader(this->getShader(mode));
- android_gc2canvas(context)->drawRect(*android_setrect(&r, rect), paint);
-}
-
-
-} //namespace
diff --git a/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp b/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp
deleted file mode 100644
index c2e0f02..0000000
--- a/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp
+++ /dev/null
@@ -1,1118 +0,0 @@
-/*
- * Copyright 2006, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "Gradient.h"
-#include "GraphicsContext.h"
-#include "GraphicsContextPrivate.h"
-#include "NotImplemented.h"
-#include "Path.h"
-#include "Pattern.h"
-
-#include "SkBlurDrawLooper.h"
-#include "SkBlurMaskFilter.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkDashPathEffect.h"
-#include "SkDevice.h"
-#include "SkPaint.h"
-#include "SkPorterDuff.h"
-#include "PlatformGraphicsContext.h"
-#include "AffineTransform.h"
-
-#include "android_graphics.h"
-#include "SkGradientShader.h"
-#include "SkBitmapRef.h"
-#include "SkString.h"
-
-using namespace std;
-
-#define GC2Canvas(ctx) (ctx)->m_data->mPgc->mCanvas
-
-namespace WebCore {
-
-static int RoundToInt(float x)
-{
- return (int)roundf(x);
-}
-
-template <typename T> T* deepCopyPtr(const T* src) {
- return src ? new T(*src) : NULL;
-}
-
-/* TODO / questions
-
- mAlpha: how does this interact with the alpha in Color? multiply them together?
- mPorterDuffMode: do I always respect this? If so, then
- the rgb() & 0xFF000000 check will abort drawing too often
- Is Color premultiplied or not? If it is, then I can't blindly pass it to paint.setColor()
-*/
-
-struct ShadowRec {
- SkScalar mBlur; // >0 means valid shadow
- SkScalar mDx;
- SkScalar mDy;
- SkColor mColor;
-};
-
-class GraphicsContextPlatformPrivate {
-public:
- GraphicsContext* mCG; // back-ptr to our parent
- PlatformGraphicsContext* mPgc;
-
- struct State {
- SkPath* mPath;
- float mMiterLimit;
- float mAlpha;
- float mStrokeThickness;
- SkPaint::Cap mLineCap;
- SkPaint::Join mLineJoin;
- SkPorterDuff::Mode mPorterDuffMode;
- int mDashRatio; //ratio of the length of a dash to its width
- ShadowRec mShadow;
- SkColor mFillColor;
- SkColor mStrokeColor;
- bool mUseAA;
-
- State() {
- mPath = NULL; // lazily allocated
- mMiterLimit = 4;
- mAlpha = 1;
- mStrokeThickness = 0.0f; // Same as default in GraphicsContextPrivate.h
- mLineCap = SkPaint::kDefault_Cap;
- mLineJoin = SkPaint::kDefault_Join;
- mPorterDuffMode = SkPorterDuff::kSrcOver_Mode;
- mDashRatio = 3;
- mUseAA = true;
- mShadow.mBlur = 0;
- mFillColor = SK_ColorBLACK;
- mStrokeColor = SK_ColorBLACK;
- }
-
- State(const State& other) {
- memcpy(this, &other, sizeof(State));
- mPath = deepCopyPtr<SkPath>(other.mPath);
- }
-
- ~State() {
- delete mPath;
- }
-
- void setShadow(int radius, int dx, int dy, SkColor c) {
- // cut the radius in half, to visually match the effect seen in
- // safari browser
- mShadow.mBlur = SkScalarHalf(SkIntToScalar(radius));
- mShadow.mDx = SkIntToScalar(dx);
- mShadow.mDy = SkIntToScalar(dy);
- mShadow.mColor = c;
- }
-
- bool setupShadowPaint(SkPaint* paint, SkPoint* offset) {
- if (mShadow.mBlur > 0) {
- paint->setAntiAlias(true);
- paint->setDither(true);
- paint->setPorterDuffXfermode(mPorterDuffMode);
- paint->setColor(mShadow.mColor);
- paint->setMaskFilter(SkBlurMaskFilter::Create(mShadow.mBlur,
- SkBlurMaskFilter::kNormal_BlurStyle))->unref();
- offset->set(mShadow.mDx, mShadow.mDy);
- return true;
- }
- return false;
- }
-
- SkColor applyAlpha(SkColor c) const
- {
- int s = RoundToInt(mAlpha * 256);
- if (s >= 256)
- return c;
- if (s < 0)
- return 0;
-
- int a = SkAlphaMul(SkColorGetA(c), s);
- return (c & 0x00FFFFFF) | (a << 24);
- }
- };
-
- SkDeque mStateStack;
- State* mState;
-
- GraphicsContextPlatformPrivate(GraphicsContext* cg, PlatformGraphicsContext* pgc)
- : mCG(cg)
- , mPgc(pgc), mStateStack(sizeof(State)) {
- State* state = (State*)mStateStack.push_back();
- new (state) State();
- mState = state;
- }
-
- ~GraphicsContextPlatformPrivate() {
- if (mPgc && mPgc->deleteUs())
- delete mPgc;
-
- // we force restores so we don't leak any subobjects owned by our
- // stack of State records.
- while (mStateStack.count() > 0)
- this->restore();
- }
-
- void save() {
- State* newState = (State*)mStateStack.push_back();
- new (newState) State(*mState);
- mState = newState;
- }
-
- void restore() {
- mState->~State();
- mStateStack.pop_back();
- mState = (State*)mStateStack.back();
- }
-
- void setFillColor(const Color& c) {
- mState->mFillColor = c.rgb();
- }
-
- void setStrokeColor(const Color& c) {
- mState->mStrokeColor = c.rgb();
- }
-
- void setStrokeThickness(float f) {
- mState->mStrokeThickness = f;
- }
-
- void beginPath() {
- if (mState->mPath) {
- mState->mPath->reset();
- }
- }
-
- void addPath(const SkPath& other) {
- if (!mState->mPath) {
- mState->mPath = new SkPath(other);
- } else {
- mState->mPath->addPath(other);
- }
- }
-
- // may return null
- SkPath* getPath() const { return mState->mPath; }
-
- void setup_paint_common(SkPaint* paint) const {
- paint->setAntiAlias(mState->mUseAA);
- paint->setDither(true);
- paint->setPorterDuffXfermode(mState->mPorterDuffMode);
- if (mState->mShadow.mBlur > 0) {
- SkDrawLooper* looper = new SkBlurDrawLooper(mState->mShadow.mBlur,
- mState->mShadow.mDx,
- mState->mShadow.mDy,
- mState->mShadow.mColor);
- paint->setLooper(looper)->unref();
- }
-
- /* need to sniff textDrawingMode(), which returns the bit_OR of...
- const int cTextInvisible = 0;
- const int cTextFill = 1;
- const int cTextStroke = 2;
- const int cTextClip = 4;
- */
- }
-
- void setup_paint_fill(SkPaint* paint) const {
- this->setup_paint_common(paint);
- paint->setColor(mState->mFillColor);
- }
-
- /* sets up the paint for stroking. Returns true if the style is really
- just a dash of squares (the size of the paint's stroke-width.
- */
- bool setup_paint_stroke(SkPaint* paint, SkRect* rect) {
- this->setup_paint_common(paint);
- paint->setColor(mState->mStrokeColor);
-
- float width = mState->mStrokeThickness;
-
- // this allows dashing and dotting to work properly for hairline strokes
- // FIXME: Should we only do this for dashed and dotted strokes?
- if (0 == width) {
- width = 1;
- }
-
-// paint->setColor(mState->applyAlpha(mCG->strokeColor().rgb()));
- paint->setStyle(SkPaint::kStroke_Style);
- paint->setStrokeWidth(SkFloatToScalar(width));
- paint->setStrokeCap(mState->mLineCap);
- paint->setStrokeJoin(mState->mLineJoin);
- paint->setStrokeMiter(SkFloatToScalar(mState->mMiterLimit));
-
- if (rect != NULL && (RoundToInt(width) & 1)) {
- rect->inset(-SK_ScalarHalf, -SK_ScalarHalf);
- }
-
- switch (mCG->strokeStyle()) {
- case NoStroke:
- case SolidStroke:
- width = 0;
- break;
- case DashedStroke:
- width = mState->mDashRatio * width;
- break;
- /* no break */
- case DottedStroke:
- break;
- }
-
- if (width > 0) {
- SkScalar intervals[] = { width, width };
- SkPathEffect* pe = new SkDashPathEffect(intervals, 2, 0);
- paint->setPathEffect(pe)->unref();
- // return true if we're basically a dotted dash of squares
- return RoundToInt(width) == RoundToInt(paint->getStrokeWidth());
- }
- return false;
- }
-
-private:
- // not supported yet
- State& operator=(const State&);
-};
-
-static SkShader::TileMode SpreadMethod2TileMode(GradientSpreadMethod sm) {
- SkShader::TileMode mode = SkShader::kClamp_TileMode;
-
- switch (sm) {
- case SpreadMethodPad:
- mode = SkShader::kClamp_TileMode;
- break;
- case SpreadMethodReflect:
- mode = SkShader::kMirror_TileMode;
- break;
- case SpreadMethodRepeat:
- mode = SkShader::kRepeat_TileMode;
- break;
- }
- return mode;
-}
-
-static void extactShader(SkPaint* paint, ColorSpace cs, Pattern* pat,
- Gradient* grad, GradientSpreadMethod sm) {
- switch (cs) {
- case PatternColorSpace:
- // createPlatformPattern() returns a new inst
- paint->setShader(pat->createPlatformPattern(
- AffineTransform()))->safeUnref();
- break;
- case GradientColorSpace: {
- // grad->getShader() returns a cached obj
- paint->setShader(grad->getShader(SpreadMethod2TileMode(sm)));
- break;
- }
- default:
- break;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////
-
-GraphicsContext* GraphicsContext::createOffscreenContext(int width, int height)
-{
- PlatformGraphicsContext* pgc = new PlatformGraphicsContext();
-
- SkBitmap bitmap;
-
- bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
- bitmap.allocPixels();
- bitmap.eraseColor(0);
- pgc->mCanvas->setBitmapDevice(bitmap);
-
- GraphicsContext* ctx = new GraphicsContext(pgc);
-//printf("-------- create offscreen <canvas> %p\n", ctx);
- return ctx;
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////
-
-GraphicsContext::GraphicsContext(PlatformGraphicsContext *gc)
- : m_common(createGraphicsContextPrivate())
- , m_data(new GraphicsContextPlatformPrivate(this, gc))
-{
- setPaintingDisabled(NULL == gc || NULL == gc->mCanvas);
-}
-
-GraphicsContext::~GraphicsContext()
-{
- delete m_data;
- this->destroyGraphicsContextPrivate(m_common);
-}
-
-void GraphicsContext::savePlatformState()
-{
- // save our private State
- m_data->save();
- // save our native canvas
- GC2Canvas(this)->save();
-}
-
-void GraphicsContext::restorePlatformState()
-{
- // restore our native canvas
- GC2Canvas(this)->restore();
- // restore our private State
- m_data->restore();
-}
-
-bool GraphicsContext::willFill() const {
- return m_data->mState->mFillColor != 0;
-}
-
-bool GraphicsContext::willStroke() const {
- return m_data->mState->mStrokeColor != 0;
-}
-
-// Draws a filled rectangle with a stroked border.
-void GraphicsContext::drawRect(const IntRect& rect)
-{
- if (paintingDisabled())
- return;
-
- SkPaint paint;
- SkRect r;
-
- android_setrect(&r, rect);
-
- if (fillColor().alpha()) {
- m_data->setup_paint_fill(&paint);
- GC2Canvas(this)->drawRect(r, paint);
- }
-
- if (strokeStyle() != NoStroke && strokeColor().alpha()) {
- paint.reset();
- m_data->setup_paint_stroke(&paint, &r);
- GC2Canvas(this)->drawRect(r, paint);
- }
-}
-
-// This is only used to draw borders.
-void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2)
-{
- if (paintingDisabled())
- return;
-
- StrokeStyle style = strokeStyle();
- if (style == NoStroke)
- return;
-
- SkPaint paint;
- SkCanvas* canvas = GC2Canvas(this);
- const int idx = SkAbs32(point2.x() - point1.x());
- const int idy = SkAbs32(point2.y() - point1.y());
-
- // special-case horizontal and vertical lines that are really just dots
- if (m_data->setup_paint_stroke(&paint, NULL) && (0 == idx || 0 == idy)) {
- const SkScalar diameter = paint.getStrokeWidth();
- const SkScalar radius = SkScalarHalf(diameter);
- SkScalar x = SkIntToScalar(SkMin32(point1.x(), point2.x()));
- SkScalar y = SkIntToScalar(SkMin32(point1.y(), point2.y()));
- SkScalar dx, dy;
- int count;
- SkRect bounds;
-
- if (0 == idy) { // horizontal
- bounds.set(x, y - radius, x + SkIntToScalar(idx), y + radius);
- x += radius;
- dx = diameter * 2;
- dy = 0;
- count = idx;
- } else { // vertical
- bounds.set(x - radius, y, x + radius, y + SkIntToScalar(idy));
- y += radius;
- dx = 0;
- dy = diameter * 2;
- count = idy;
- }
-
- // the actual count is the number of ONs we hit alternating
- // ON(diameter), OFF(diameter), ...
- {
- SkScalar width = SkScalarDiv(SkIntToScalar(count), diameter);
- // now computer the number of cells (ON and OFF)
- count = SkScalarRound(width);
- // now compute the number of ONs
- count = (count + 1) >> 1;
- }
-
- SkAutoMalloc storage(count * sizeof(SkPoint));
- SkPoint* verts = (SkPoint*)storage.get();
- // now build the array of vertices to past to drawPoints
- for (int i = 0; i < count; i++) {
- verts[i].set(x, y);
- x += dx;
- y += dy;
- }
-
- paint.setStyle(SkPaint::kFill_Style);
- paint.setPathEffect(NULL);
-
- // clipping to bounds is not required for correctness, but it does
- // allow us to reject the entire array of points if we are completely
- // offscreen. This is common in a webpage for android, where most of
- // the content is clipped out. If drawPoints took an (optional) bounds
- // parameter, that might even be better, as we would *just* use it for
- // culling, and not both wacking the canvas' save/restore stack.
- canvas->save(SkCanvas::kClip_SaveFlag);
- canvas->clipRect(bounds);
- canvas->drawPoints(SkCanvas::kPoints_PointMode, count, verts, paint);
- canvas->restore();
- } else {
- SkPoint pts[2];
- android_setpt(&pts[0], point1);
- android_setpt(&pts[1], point2);
- canvas->drawLine(pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, paint);
- }
-}
-
-static void setrect_for_underline(SkRect* r, GraphicsContext* context, const IntPoint& point, int yOffset, int width)
-{
- float lineThickness = context->strokeThickness();
-// if (lineThickness < 1) // do we really need/want this?
-// lineThickness = 1;
-
- yOffset += 1; // we add 1 to have underlines appear below the text
-
- r->fLeft = SkIntToScalar(point.x());
- r->fTop = SkIntToScalar(point.y() + yOffset);
- r->fRight = r->fLeft + SkIntToScalar(width);
- r->fBottom = r->fTop + SkFloatToScalar(lineThickness);
-}
-
-void GraphicsContext::drawLineForText(IntPoint const& pt, int width, bool)
-{
- if (paintingDisabled())
- return;
-
- SkRect r;
- setrect_for_underline(&r, this, pt, 0, width);
-
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setColor(this->strokeColor().rgb());
-
- GC2Canvas(this)->drawRect(r, paint);
-}
-
-void GraphicsContext::drawLineForMisspellingOrBadGrammar(const IntPoint& pt, int width, bool grammar)
-{
- if (paintingDisabled())
- return;
-
- SkRect r;
- setrect_for_underline(&r, this, pt, 0, width);
-
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setColor(SK_ColorRED); // is this specified somewhere?
-
- GC2Canvas(this)->drawRect(r, paint);
-}
-
-// This method is only used to draw the little circles used in lists.
-void GraphicsContext::drawEllipse(const IntRect& rect)
-{
- if (paintingDisabled())
- return;
-
- SkPaint paint;
- SkRect oval;
-
- android_setrect(&oval, rect);
-
- if (fillColor().rgb() & 0xFF000000) {
- m_data->setup_paint_fill(&paint);
- GC2Canvas(this)->drawOval(oval, paint);
- }
- if (strokeStyle() != NoStroke) {
- paint.reset();
- m_data->setup_paint_stroke(&paint, &oval);
- GC2Canvas(this)->drawOval(oval, paint);
- }
-}
-
-static inline int fast_mod(int value, int max)
-{
- int sign = SkExtractSign(value);
-
- value = SkApplySign(value, sign);
- if (value >= max) {
- value %= max;
- }
- return SkApplySign(value, sign);
-}
-
-void GraphicsContext::strokeArc(const IntRect& r, int startAngle, int angleSpan)
-{
- if (paintingDisabled())
- return;
-
- SkPath path;
- SkPaint paint;
- SkRect oval;
-
- android_setrect(&oval, r);
-
- if (strokeStyle() == NoStroke) {
- m_data->setup_paint_fill(&paint); // we want the fill color
- paint.setStyle(SkPaint::kStroke_Style);
- paint.setStrokeWidth(SkFloatToScalar(this->strokeThickness()));
- }
- else {
- m_data->setup_paint_stroke(&paint, NULL);
- }
-
- // we do this before converting to scalar, so we don't overflow SkFixed
- startAngle = fast_mod(startAngle, 360);
- angleSpan = fast_mod(angleSpan, 360);
-
- path.addArc(oval, SkIntToScalar(-startAngle), SkIntToScalar(-angleSpan));
- GC2Canvas(this)->drawPath(path, paint);
-}
-
-void GraphicsContext::drawConvexPolygon(size_t numPoints, const FloatPoint* points, bool shouldAntialias)
-{
- if (paintingDisabled())
- return;
-
- if (numPoints <= 1)
- return;
-
- SkPaint paint;
- SkPath path;
-
- path.incReserve(numPoints);
- path.moveTo(SkFloatToScalar(points[0].x()), SkFloatToScalar(points[0].y()));
- for (size_t i = 1; i < numPoints; i++)
- path.lineTo(SkFloatToScalar(points[i].x()), SkFloatToScalar(points[i].y()));
-
- if (GC2Canvas(this)->quickReject(path, shouldAntialias ?
- SkCanvas::kAA_EdgeType : SkCanvas::kBW_EdgeType)) {
- return;
- }
-
- if (fillColor().rgb() & 0xFF000000) {
- m_data->setup_paint_fill(&paint);
- paint.setAntiAlias(shouldAntialias);
- GC2Canvas(this)->drawPath(path, paint);
- }
-
- if (strokeStyle() != NoStroke) {
- paint.reset();
- m_data->setup_paint_stroke(&paint, NULL);
- paint.setAntiAlias(shouldAntialias);
- GC2Canvas(this)->drawPath(path, paint);
- }
-}
-
-void GraphicsContext::fillRoundedRect(const IntRect& rect, const IntSize& topLeft, const IntSize& topRight,
- const IntSize& bottomLeft, const IntSize& bottomRight, const Color& color)
-{
- if (paintingDisabled())
- return;
-
- SkPaint paint;
- SkPath path;
- SkScalar radii[8];
- SkRect r;
-
- radii[0] = SkIntToScalar(topLeft.width());
- radii[1] = SkIntToScalar(topLeft.height());
- radii[2] = SkIntToScalar(topRight.width());
- radii[3] = SkIntToScalar(topRight.height());
- radii[4] = SkIntToScalar(bottomRight.width());
- radii[5] = SkIntToScalar(bottomRight.height());
- radii[6] = SkIntToScalar(bottomLeft.width());
- radii[7] = SkIntToScalar(bottomLeft.height());
- path.addRoundRect(*android_setrect(&r, rect), radii);
-
- m_data->setup_paint_fill(&paint);
- GC2Canvas(this)->drawPath(path, paint);
-}
-
-void GraphicsContext::fillRect(const FloatRect& rect)
-{
- SkPaint paint;
- SkRect r;
-
- android_setrect(&r, rect);
- m_data->setup_paint_fill(&paint);
-
- extactShader(&paint, m_common->state.fillColorSpace,
- m_common->state.fillPattern.get(),
- m_common->state.fillGradient.get(), spreadMethod());
-
- GC2Canvas(this)->drawRect(r, paint);
-}
-
-void GraphicsContext::fillRect(const FloatRect& rect, const Color& color)
-{
- if (paintingDisabled())
- return;
-
- if (color.rgb() & 0xFF000000) {
- SkPaint paint;
- SkRect r;
-
- android_setrect(&r, rect);
- m_data->setup_paint_common(&paint);
- paint.setColor(color.rgb()); // punch in the specified color
- paint.setShader(NULL); // in case we had one set
- GC2Canvas(this)->drawRect(r, paint);
- }
-}
-
-void GraphicsContext::clip(const FloatRect& rect)
-{
- if (paintingDisabled())
- return;
-
- SkRect r;
-
- GC2Canvas(this)->clipRect(*android_setrect(&r, rect));
-}
-
-void GraphicsContext::clip(const Path& path)
-{
- if (paintingDisabled())
- return;
-
-// path.platformPath()->dump(false, "clip path");
-
- GC2Canvas(this)->clipPath(*path.platformPath());
-}
-
-void GraphicsContext::addInnerRoundedRectClip(const IntRect& rect, int thickness)
-{
- if (paintingDisabled())
- return;
-
-//printf("-------- addInnerRoundedRectClip: [%d %d %d %d] thickness=%d\n", rect.x(), rect.y(), rect.width(), rect.height(), thickness);
-
- SkPath path;
- SkRect r;
- android_setrect(&r, rect);
- path.addOval(r, SkPath::kCW_Direction);
- // only perform the inset if we won't invert r
- if (2*thickness < rect.width() && 2*thickness < rect.height())
- {
- r.inset(SkIntToScalar(thickness) ,SkIntToScalar(thickness));
- path.addOval(r, SkPath::kCCW_Direction);
- }
- GC2Canvas(this)->clipPath(path);
-}
-
-void GraphicsContext::clipOut(const IntRect& r)
-{
- if (paintingDisabled())
- return;
-
- SkRect rect;
-
- GC2Canvas(this)->clipRect(*android_setrect(&rect, r), SkRegion::kDifference_Op);
-}
-
-void GraphicsContext::clipOutEllipseInRect(const IntRect& r)
-{
- if (paintingDisabled())
- return;
-
- SkRect oval;
- SkPath path;
-
- path.addOval(*android_setrect(&oval, r), SkPath::kCCW_Direction);
- GC2Canvas(this)->clipPath(path, SkRegion::kDifference_Op);
-}
-
-void GraphicsContext::clipOut(const Path& p)
-{
- if (paintingDisabled())
- return;
-
- GC2Canvas(this)->clipPath(*p.platformPath(), SkRegion::kDifference_Op);
-}
-
-void GraphicsContext::clipToImageBuffer(const FloatRect&, const ImageBuffer*) {
- SkDebugf("xxxxxxxxxxxxxxxxxx clipToImageBuffer not implemented\n");
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////
-
-#if SVG_SUPPORT
-KRenderingDeviceContext* GraphicsContext::createRenderingDeviceContext()
-{
- return new KRenderingDeviceContextQuartz(platformContext());
-}
-#endif
-
-void GraphicsContext::beginTransparencyLayer(float opacity)
-{
- if (paintingDisabled())
- return;
-
- SkCanvas* canvas = GC2Canvas(this);
-
- if (opacity < 1)
- {
- canvas->saveLayerAlpha(NULL, (int)(opacity * 255), SkCanvas::kHasAlphaLayer_SaveFlag);
- }
- else
- canvas->save();
-}
-
-void GraphicsContext::endTransparencyLayer()
-{
- if (paintingDisabled())
- return;
-
- GC2Canvas(this)->restore();
-}
-
- ///////////////////////////////////////////////////////////////////////////
-
- void GraphicsContext::setupFillPaint(SkPaint* paint) {
- m_data->setup_paint_fill(paint);
- }
-
- void GraphicsContext::setupStrokePaint(SkPaint* paint) {
- m_data->setup_paint_stroke(paint, NULL);
- }
-
- bool GraphicsContext::setupShadowPaint(SkPaint* paint, SkPoint* offset) {
- return m_data->mState->setupShadowPaint(paint, offset);
- }
-
- // referenced from CanvasStyle.cpp
- void GraphicsContext::setCMYKAFillColor(float c, float m, float y, float k, float a) {
- float r = 1 - (c + k);
- float g = 1 - (m + k);
- float b = 1 - (y + k);
- return this->setFillColor(Color(r, g, b, a));
- }
-
- // referenced from CanvasStyle.cpp
- void GraphicsContext::setCMYKAStrokeColor(float c, float m, float y, float k, float a) {
- float r = 1 - (c + k);
- float g = 1 - (m + k);
- float b = 1 - (y + k);
- return this->setStrokeColor(Color(r, g, b, a));
- }
-
- void GraphicsContext::setPlatformStrokeColor(const Color& c) {
- m_data->setStrokeColor(c);
- }
-
- void GraphicsContext::setPlatformStrokeThickness(float f) {
- m_data->setStrokeThickness(f);
- }
-
- void GraphicsContext::setPlatformFillColor(const Color& c) {
- m_data->setFillColor(c);
- }
-
-void GraphicsContext::setPlatformShadow(const IntSize& size, int blur, const Color& color)
-{
- if (paintingDisabled())
- return;
-
- if (blur <= 0) {
- this->clearPlatformShadow();
- }
-
- SkColor c;
- if (color.isValid()) {
- c = color.rgb();
- } else {
- c = SkColorSetARGB(0xFF/3, 0, 0, 0); // "std" Apple shadow color
- }
- m_data->mState->setShadow(blur, size.width(), size.height(), c);
-}
-
-void GraphicsContext::clearPlatformShadow()
-{
- if (paintingDisabled())
- return;
-
- m_data->mState->setShadow(0, 0, 0, 0);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-void GraphicsContext::drawFocusRing(const Color& color)
-{
- // Do nothing, since we draw the focus ring independently.
-}
-
-PlatformGraphicsContext* GraphicsContext::platformContext() const
-{
- ASSERT(!paintingDisabled());
- return m_data->mPgc;
-}
-
-void GraphicsContext::setMiterLimit(float limit)
-{
- m_data->mState->mMiterLimit = limit;
-}
-
-void GraphicsContext::setAlpha(float alpha)
-{
- m_data->mState->mAlpha = alpha;
-}
-
-void GraphicsContext::setCompositeOperation(CompositeOperator op)
-{
- m_data->mState->mPorterDuffMode = android_convert_compositeOp(op);
-}
-
-void GraphicsContext::clearRect(const FloatRect& rect)
-{
- if (paintingDisabled())
- return;
-
- SkPaint paint;
- SkRect r;
-
- android_setrect(&r, rect);
- m_data->setup_paint_fill(&paint);
- paint.setPorterDuffXfermode(SkPorterDuff::kClear_Mode);
- GC2Canvas(this)->drawRect(r, paint);
-}
-
-void GraphicsContext::strokeRect(const FloatRect& rect, float lineWidth)
-{
- if (paintingDisabled())
- return;
-
- SkPaint paint;
- SkRect r;
-
- android_setrect(&r, rect);
-
- m_data->setup_paint_stroke(&paint, NULL);
- paint.setStrokeWidth(SkFloatToScalar(lineWidth));
- GC2Canvas(this)->drawRect(r, paint);
-}
-
-void GraphicsContext::setLineCap(LineCap cap)
-{
- switch (cap) {
- case ButtCap:
- m_data->mState->mLineCap = SkPaint::kButt_Cap;
- break;
- case RoundCap:
- m_data->mState->mLineCap = SkPaint::kRound_Cap;
- break;
- case SquareCap:
- m_data->mState->mLineCap = SkPaint::kSquare_Cap;
- break;
- default:
- SkDEBUGF(("GraphicsContext::setLineCap: unknown LineCap %d\n", cap));
- break;
- }
-}
-
-void GraphicsContext::setLineJoin(LineJoin join)
-{
- switch (join) {
- case MiterJoin:
- m_data->mState->mLineJoin = SkPaint::kMiter_Join;
- break;
- case RoundJoin:
- m_data->mState->mLineJoin = SkPaint::kRound_Join;
- break;
- case BevelJoin:
- m_data->mState->mLineJoin = SkPaint::kBevel_Join;
- break;
- default:
- SkDEBUGF(("GraphicsContext::setLineJoin: unknown LineJoin %d\n", join));
- break;
- }
-}
-
-void GraphicsContext::scale(const FloatSize& size)
-{
- if (paintingDisabled())
- return;
- GC2Canvas(this)->scale(SkFloatToScalar(size.width()), SkFloatToScalar(size.height()));
-}
-
-void GraphicsContext::rotate(float angleInRadians)
-{
- if (paintingDisabled())
- return;
- GC2Canvas(this)->rotate(SkFloatToScalar(angleInRadians * (180.0f / 3.14159265f)));
-}
-
-void GraphicsContext::translate(float x, float y)
-{
- if (paintingDisabled())
- return;
- GC2Canvas(this)->translate(SkFloatToScalar(x), SkFloatToScalar(y));
-}
-
-void GraphicsContext::concatCTM(const AffineTransform& xform)
-{
- if (paintingDisabled())
- return;
-
-//printf("-------------- GraphicsContext::concatCTM\n");
- GC2Canvas(this)->concat((SkMatrix) xform);
-}
-
-FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& rect)
-{
- if (paintingDisabled())
- return FloatRect();
-
- const SkMatrix& matrix = GC2Canvas(this)->getTotalMatrix();
- SkRect r;
- android_setrect(&r, rect);
- matrix.mapRect(&r);
- FloatRect result(SkScalarToFloat(r.fLeft), SkScalarToFloat(r.fTop), SkScalarToFloat(r.width()), SkScalarToFloat(r.height()));
- return result;
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////////////
-
-void GraphicsContext::setURLForRect(const KURL& link, const IntRect& destRect)
-{
-// appears to be PDF specific, so we ignore it
-#if 0
-if (paintingDisabled())
- return;
-
-CFURLRef urlRef = link.createCFURL();
-if (urlRef) {
- CGContextRef context = platformContext();
-
- // Get the bounding box to handle clipping.
- CGRect box = CGContextGetClipBoundingBox(context);
-
- IntRect intBox((int)box.origin.x, (int)box.origin.y, (int)box.size.width, (int)box.size.height);
- IntRect rect = destRect;
- rect.intersect(intBox);
-
- CGPDFContextSetURLForRect(context, urlRef,
- CGRectApplyAffineTransform(rect, CGContextGetCTM(context)));
-
- CFRelease(urlRef);
-}
-#endif
-}
-
-void GraphicsContext::setUseAntialiasing(bool useAA) {
- if (paintingDisabled())
- return;
- m_data->mState->mUseAA = useAA;
-}
-
-AffineTransform GraphicsContext::getCTM() const {
- return AffineTransform(GC2Canvas(this)->getTotalMatrix());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-void GraphicsContext::beginPath() {
- m_data->beginPath();
-}
-
-void GraphicsContext::addPath(const Path& p) {
- m_data->addPath(*p.platformPath());
-}
-
-void GraphicsContext::drawPath() {
- this->fillPath();
- this->strokePath();
-}
-
-void GraphicsContext::fillPath() {
- SkPath* path = m_data->getPath();
- if (paintingDisabled() || !path)
- return;
-
- switch (this->fillRule()) {
- case RULE_NONZERO:
- path->setFillType(SkPath::kWinding_FillType);
- break;
- case RULE_EVENODD:
- path->setFillType(SkPath::kEvenOdd_FillType);
- break;
- }
-
- SkPaint paint;
- m_data->setup_paint_fill(&paint);
-
- extactShader(&paint, m_common->state.fillColorSpace,
- m_common->state.fillPattern.get(),
- m_common->state.fillGradient.get(), spreadMethod());
-
- GC2Canvas(this)->drawPath(*path, paint);
-}
-
-void GraphicsContext::strokePath() {
- const SkPath* path = m_data->getPath();
- if (paintingDisabled() || !path || strokeStyle() == NoStroke)
- return;
-
- SkPaint paint;
- m_data->setup_paint_stroke(&paint, NULL);
-
- extactShader(&paint, m_common->state.strokeColorSpace,
- m_common->state.strokePattern.get(),
- m_common->state.strokeGradient.get(), spreadMethod());
-
- GC2Canvas(this)->drawPath(*path, paint);
-}
-
-void GraphicsContext::setImageInterpolationQuality(InterpolationQuality mode)
-{
- /*
- enum InterpolationQuality {
- InterpolationDefault,
- InterpolationNone,
- InterpolationLow,
- InterpolationMedium,
- InterpolationHigh
- };
-
- TODO: record this, so we can know when to use bitmap-filtering when we draw
- ... not sure how meaningful this will be given our playback model.
-
- Certainly safe to do nothing for the present.
- */
-}
-
-} // namespace WebCore
-
-///////////////////////////////////////////////////////////////////////////////
-
-SkCanvas* android_gc2canvas(WebCore::GraphicsContext* gc) {
- return gc->platformContext()->mCanvas;
-}
-
diff --git a/WebCore/platform/graphics/android/ImageAndroid.cpp b/WebCore/platform/graphics/android/ImageAndroid.cpp
deleted file mode 100644
index 04235d5..0000000
--- a/WebCore/platform/graphics/android/ImageAndroid.cpp
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright 2009, The Android Open Source Project
- * Copyright (C) 2004, 2005, 2006 Apple Computer, 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:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 "AffineTransform.h"
-#include "BitmapImage.h"
-#include "Image.h"
-#include "FloatRect.h"
-#include "GraphicsContext.h"
-#include "PlatformGraphicsContext.h"
-#include "PlatformString.h"
-#include "SharedBuffer.h"
-
-#include "android_graphics.h"
-#include "SkBitmapRef.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkImageDecoder.h"
-#include "SkShader.h"
-#include "SkString.h"
-#include "SkTemplates.h"
-
-#include <utils/AssetManager.h>
-
-//#define TRACE_SUBSAMPLED_BITMAPS
-//#define TRACE_SKIPPED_BITMAPS
-
-android::AssetManager* globalAssetManager() {
- static android::AssetManager* gGlobalAssetMgr;
- if (!gGlobalAssetMgr) {
- gGlobalAssetMgr = new android::AssetManager();
- gGlobalAssetMgr->addDefaultAssets();
- }
- return gGlobalAssetMgr;
-}
-
-namespace WebCore {
-
-void FrameData::clear()
-{
- if (m_frame) {
- m_frame->unref();
- m_frame = 0;
- m_duration = 0.;
- m_hasAlpha = true;
- }
-}
-
-BitmapImage::BitmapImage(SkBitmapRef* ref, ImageObserver* observer)
- : Image(observer)
- , m_currentFrame(0)
- , m_frames(0)
- , m_frameTimer(0)
- , m_repetitionCount(0)
- , m_repetitionsComplete(0)
- , m_isSolidColor(false)
- , m_animationFinished(true)
- , m_allDataReceived(true)
- , m_haveSize(true)
- , m_sizeAvailable(true)
- , m_decodedSize(0)
- , m_haveFrameCount(true)
- , m_frameCount(1)
-{
- initPlatformData();
-
- m_size = IntSize(ref->bitmap().width(), ref->bitmap().height());
-
- m_frames.grow(1);
- m_frames[0].m_frame = ref;
- m_frames[0].m_hasAlpha = !ref->bitmap().isOpaque();
- checkForSolidColor();
- ref->ref();
-}
-
-
-void BitmapImage::initPlatformData()
-{
- m_source.clearURL();
-}
-
-void BitmapImage::invalidatePlatformData()
-{
-}
-
-void BitmapImage::checkForSolidColor()
-{
- m_isSolidColor = false;
- if (frameCount() == 1) {
- SkBitmapRef* ref = frameAtIndex(0);
- if (!ref) {
- return; // keep solid == false
- }
-
- const SkBitmap& bm = ref->bitmap();
- if (bm.width() != 1 || bm.height() != 1) {
- return; // keep solid == false
- }
-
- SkAutoLockPixels alp(bm);
- if (!bm.readyToDraw()) {
- return; // keep solid == false
- }
-
- SkPMColor color;
- switch (bm.getConfig()) {
- case SkBitmap::kARGB_8888_Config:
- color = *bm.getAddr32(0, 0);
- break;
- case SkBitmap::kRGB_565_Config:
- color = SkPixel16ToPixel32(*bm.getAddr16(0, 0));
- break;
- case SkBitmap::kIndex8_Config: {
- SkColorTable* ctable = bm.getColorTable();
- if (!ctable) {
- return;
- }
- color = (*ctable)[*bm.getAddr8(0, 0)];
- break;
- }
- default:
- return; // keep solid == false
- }
- m_isSolidColor = true;
- m_solidColor = android_SkPMColorToWebCoreColor(color);
- }
-}
-
-void BitmapImage::draw(GraphicsContext* ctxt, const FloatRect& dstRect,
- const FloatRect& srcRect, CompositeOperator compositeOp)
-{
- SkBitmapRef* image = this->nativeImageForCurrentFrame();
- if (!image) { // If it's too early we won't have an image yet.
- return;
- }
-
- // in case we get called with an incomplete bitmap
- const SkBitmap& bitmap = image->bitmap();
- if (bitmap.getPixels() == NULL && bitmap.pixelRef() == NULL) {
-#ifdef TRACE_SKIPPED_BITMAPS
- SkDebugf("----- skip bitmapimage: [%d %d] pixels %p pixelref %p\n",
- bitmap.width(), bitmap.height(),
- bitmap.getPixels(), bitmap.pixelRef());
-#endif
- return;
- }
-
- SkIRect srcR;
- SkRect dstR;
- float invScaleX = (float)bitmap.width() / image->origWidth();
- float invScaleY = (float)bitmap.height() / image->origHeight();
-
- android_setrect(&dstR, dstRect);
- android_setrect_scaled(&srcR, srcRect, invScaleX, invScaleY);
- if (srcR.isEmpty() || dstR.isEmpty()) {
-#ifdef TRACE_SKIPPED_BITMAPS
- SkDebugf("----- skip bitmapimage: [%d %d] src-empty %d dst-empty %d\n",
- bitmap.width(), bitmap.height(),
- srcR.isEmpty(), dstR.isEmpty());
-#endif
- return;
- }
-
- SkCanvas* canvas = ctxt->platformContext()->mCanvas;
- SkPaint paint;
-
- paint.setFilterBitmap(true);
- paint.setPorterDuffXfermode(android_convert_compositeOp(compositeOp));
- canvas->drawBitmapRect(bitmap, &srcR, dstR, &paint);
-
- startAnimation();
-
-#ifdef TRACE_SUBSAMPLED_BITMAPS
- if (bitmap.width() != image->origWidth() ||
- bitmap.height() != image->origHeight()) {
- SkDebugf("--- BitmapImage::draw [%d %d] orig [%d %d]\n",
- bitmap.width(), bitmap.height(),
- image->origWidth(), image->origHeight());
- }
-#endif
-}
-
-void BitmapImage::setURL(const String& str)
-{
- m_source.setURL(str);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-void Image::drawPattern(GraphicsContext* ctxt, const FloatRect& tileRect,
- const AffineTransform& patternTransform,
- const FloatPoint& phase, CompositeOperator compositeOp,
- const FloatRect& destRect)
-{
- SkBitmapRef* image = this->nativeImageForCurrentFrame();
- if (!image) { // If it's too early we won't have an image yet.
- return;
- }
-
- // in case we get called with an incomplete bitmap
- const SkBitmap& bitmap = image->bitmap();
- if (bitmap.getPixels() == NULL && bitmap.pixelRef() == NULL) {
- return;
- }
-
- SkRect dstR;
- android_setrect(&dstR, destRect);
- if (dstR.isEmpty()) {
- return;
- }
-
- SkCanvas* canvas = ctxt->platformContext()->mCanvas;
- SkPaint paint;
-
- SkShader* shader = SkShader::CreateBitmapShader(bitmap,
- SkShader::kRepeat_TileMode,
- SkShader::kRepeat_TileMode);
- paint.setShader(shader)->unref();
- // now paint is the only owner of shader
- paint.setPorterDuffXfermode(android_convert_compositeOp(compositeOp));
- paint.setFilterBitmap(true);
-
- SkMatrix matrix(patternTransform);
-
- float scaleX = (float)image->origWidth() / bitmap.width();
- float scaleY = (float)image->origHeight() / bitmap.height();
- matrix.preScale(SkFloatToScalar(scaleX), SkFloatToScalar(scaleY));
-
- matrix.postTranslate(SkFloatToScalar(phase.x()),
- SkFloatToScalar(phase.y()));
- shader->setLocalMatrix(matrix);
- canvas->drawRect(dstR, paint);
-
-#ifdef TRACE_SUBSAMPLED_BITMAPS
- if (bitmap.width() != image->origWidth() ||
- bitmap.height() != image->origHeight()) {
- SkDebugf("--- Image::drawPattern [%d %d] orig [%d %d] dst [%g %g]\n",
- bitmap.width(), bitmap.height(),
- image->origWidth(), image->origHeight(),
- SkScalarToFloat(dstR.width()), SkScalarToFloat(dstR.height()));
- }
-#endif
-}
-
-// missingImage, textAreaResizeCorner
-PassRefPtr<Image> Image::loadPlatformResource(const char *name)
-{
- android::AssetManager* am = globalAssetManager();
-
- SkString path("webkit/");
- path.append(name);
- path.append(".png");
-
- android::Asset* a = am->open(path.c_str(),
- android::Asset::ACCESS_BUFFER);
- if (a == NULL) {
- SkDebugf("---------------- failed to open image asset %s\n", name);
- return NULL;
- }
-
- SkAutoTDelete<android::Asset> ad(a);
-
- SkBitmap bm;
- if (SkImageDecoder::DecodeMemory(a->getBuffer(false), a->getLength(), &bm)) {
- SkBitmapRef* ref = new SkBitmapRef(bm);
- // create will call ref(), so we need aur() to release ours upon return
- SkAutoUnref aur(ref);
- return BitmapImage::create(ref, 0);
- }
- return Image::nullImage();
-}
-
-} // namespace
-
diff --git a/WebCore/platform/graphics/android/ImageBufferAndroid.cpp b/WebCore/platform/graphics/android/ImageBufferAndroid.cpp
deleted file mode 100644
index de88b33..0000000
--- a/WebCore/platform/graphics/android/ImageBufferAndroid.cpp
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "BitmapImage.h"
-#include "ImageBuffer.h"
-#include "ImageData.h"
-#include "NotImplemented.h"
-
-#include "android_graphics.h"
-#include "GraphicsContext.h"
-#include "PlatformGraphicsContext.h"
-#include "SkBitmapRef.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkDevice.h"
-#include "SkUnPreMultiply.h"
-
-using namespace std;
-
-namespace WebCore {
-
-ImageBufferData::ImageBufferData(const IntSize&)
-{
-}
-
-ImageBuffer::ImageBuffer(const IntSize& size, bool grayScale, bool& success)
- : m_data(size)
- , m_size(size)
-{
- m_context.set(GraphicsContext::createOffscreenContext(size.width(), size.height()));
- success = true;
-}
-
-ImageBuffer::~ImageBuffer()
-{
-}
-
-GraphicsContext* ImageBuffer::context() const
-{
- return m_context.get();
-}
-
-/* This guy needs to make a deep copy of the bitmap, so that the returned
- image doesn't reflect any subsequent changes to the canvas' backend.
- e.g. this is called when <canvas> wants to make a Pattern, which needs
- to snapshot the current pixels when it is created.
- */
-Image* ImageBuffer::image() const
-{
- if (!m_image) {
- ASSERT(context());
- SkCanvas* canvas = context()->platformContext()->mCanvas;
- SkDevice* device = canvas->getDevice();
- const SkBitmap& orig = device->accessBitmap(false);
-
- SkBitmap copy;
- orig.copyTo(&copy, orig.config());
-
- SkBitmapRef* ref = new SkBitmapRef(copy);
- m_image = BitmapImage::create(ref, 0);
- ref->unref();
- }
- return m_image.get();
-}
-
-PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const
-{
- GraphicsContext* gc = this->context();
- if (!gc) {
- return 0;
- }
-
- const SkBitmap& src = android_gc2canvas(gc)->getDevice()->accessBitmap(false);
- SkAutoLockPixels alp(src);
- if (!src.getPixels()) {
- return 0;
- }
-
- PassRefPtr<ImageData> result = ImageData::create(rect.width(), rect.height());
- unsigned char* data = result->data()->data().data();
-
- if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > m_size.width() || (rect.y() + rect.height()) > m_size.height())
- memset(data, 0, result->data()->length());
-
- int originx = rect.x();
- int destx = 0;
- if (originx < 0) {
- destx = -originx;
- originx = 0;
- }
- int endx = rect.x() + rect.width();
- if (endx > m_size.width())
- endx = m_size.width();
- int numColumns = endx - originx;
-
- int originy = rect.y();
- int desty = 0;
- if (originy < 0) {
- desty = -originy;
- originy = 0;
- }
- int endy = rect.y() + rect.height();
- if (endy > m_size.height())
- endy = m_size.height();
- int numRows = endy - originy;
-
- unsigned srcPixelsPerRow = src.rowBytesAsPixels();
- unsigned destBytesPerRow = 4 * rect.width();
-
- const SkPMColor* srcRows = src.getAddr32(originx, originy);
- unsigned char* destRows = data + desty * destBytesPerRow + destx * 4;
- for (int y = 0; y < numRows; ++y) {
- for (int x = 0; x < numColumns; x++) {
- // ugh, it appears they want unpremultiplied pixels
- SkColor c = SkUnPreMultiply::PMColorToColor(srcRows[x]);
- int basex = x * 4;
- destRows[basex + 0] = SkColorGetR(c);
- destRows[basex + 1] = SkColorGetG(c);
- destRows[basex + 2] = SkColorGetB(c);
- destRows[basex + 3] = SkColorGetA(c);
- }
- srcRows += srcPixelsPerRow;
- destRows += destBytesPerRow;
- }
- return result;
-}
-
-void ImageBuffer::putImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint)
-{
- GraphicsContext* gc = this->context();
- if (!gc) {
- return;
- }
-
- const SkBitmap& dst = android_gc2canvas(gc)->getDevice()->accessBitmap(true);
- SkAutoLockPixels alp(dst);
- if (!dst.getPixels()) {
- return;
- }
-
- ASSERT(sourceRect.width() > 0);
- ASSERT(sourceRect.height() > 0);
-
- int originx = sourceRect.x();
- int destx = destPoint.x() + sourceRect.x();
- ASSERT(destx >= 0);
- ASSERT(destx < m_size.width());
- ASSERT(originx >= 0);
- ASSERT(originx <= sourceRect.right());
-
- int endx = destPoint.x() + sourceRect.right();
- ASSERT(endx <= m_size.width());
-
- int numColumns = endx - destx;
-
- int originy = sourceRect.y();
- int desty = destPoint.y() + sourceRect.y();
- ASSERT(desty >= 0);
- ASSERT(desty < m_size.height());
- ASSERT(originy >= 0);
- ASSERT(originy <= sourceRect.bottom());
-
- int endy = destPoint.y() + sourceRect.bottom();
- ASSERT(endy <= m_size.height());
- int numRows = endy - desty;
-
- unsigned srcBytesPerRow = 4 * source->width();
- unsigned dstPixelsPerRow = dst.rowBytesAsPixels();
-
- unsigned char* srcRows = source->data()->data().data() + originy * srcBytesPerRow + originx * 4;
- SkPMColor* dstRows = dst.getAddr32(destx, desty);
- for (int y = 0; y < numRows; ++y) {
- for (int x = 0; x < numColumns; x++) {
- int basex = x * 4;
- dstRows[x] = SkPackARGB32(srcRows[basex + 3],
- srcRows[basex + 0],
- srcRows[basex + 1],
- srcRows[basex + 2]);
- }
- dstRows += dstPixelsPerRow;
- srcRows += srcBytesPerRow;
- }
-}
-
-
-String ImageBuffer::toDataURL(const String&) const
-{
- // leaving this unimplemented, until I understand what its for (and what it
- // really is).
- return "data:,"; // I think this means we couldn't make the data url
-}
-
-}
diff --git a/WebCore/platform/graphics/android/ImageBufferData.h b/WebCore/platform/graphics/android/ImageBufferData.h
deleted file mode 100644
index 7d8cd3b..0000000
--- a/WebCore/platform/graphics/android/ImageBufferData.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2008, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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.
- */
-
-#ifndef ImageBufferData_h
-#define ImageBufferData_h
-
-namespace WebCore {
-
-class IntSize;
-
-class ImageBufferData {
-public:
- ImageBufferData(const IntSize&);
-};
-
-} // namespace WebCore
-
-#endif // ImageBufferData_h
diff --git a/WebCore/platform/graphics/android/ImageSourceAndroid.cpp b/WebCore/platform/graphics/android/ImageSourceAndroid.cpp
deleted file mode 100644
index a6bf6c6..0000000
--- a/WebCore/platform/graphics/android/ImageSourceAndroid.cpp
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "ImageDecoder.h"
-#include "ImageSource.h"
-#include "IntSize.h"
-#include "NotImplemented.h"
-#include "SharedBuffer.h"
-#include "PlatformString.h"
-
-#include "JavaSharedClient.h"
-
-#include "SkBitmapRef.h"
-#include "SkImageRef.h"
-#include "SkImageDecoder.h"
-#include "SkStream.h"
-#include "SkTemplates.h"
-
-SkPixelRef* SkCreateRLEPixelRef(const SkBitmap& src);
-
-//#define TRACE_SUBSAMPLE_BITMAPS
-//#define TRACE_RLE_BITMAPS
-
-#include "SkImageRef_GlobalPool.h"
-#include "SkImageRef_ashmem.h"
-
-// made this up, so we don't waste a file-descriptor on small images, plus
-// we don't want to lose too much on the round-up to a page size (4K)
-#define MIN_ASHMEM_ALLOC_SIZE (32*1024)
-
-// don't use RLE for images smaller than this, since they incur a drawing cost
-// (and don't work as patterns yet) we only want to use RLE when we must
-#define MIN_RLE_ALLOC_SIZE (512*1024)
-
-static bool should_use_ashmem(const SkBitmap& bm) {
- return bm.getSize() >= MIN_ASHMEM_ALLOC_SIZE;
-}
-
-/* Images larger than this should be subsampled. Using ashmem, the decoded
- pixels will be purged as needed, so this value can be pretty large. Making
- it too small hurts image quality (e.g. abc.com background). 2Meg works for
- the sites I've tested, but if we hit important sites that need more, we
- should try increasing it and see if it has negative impact on performance
- (i.e. we end up thrashing because we need to keep decoding images that have
- been purged.
-
- Perhaps this value should be some fraction of the available RAM...
-*/
-static size_t computeMaxBitmapSizeForCache() {
- return 2*1024*1024;
-}
-
-/* 8bit images larger than this should be recompressed in RLE, to reduce
- on the imageref cache.
-
- Downside: performance, since we have to decode/encode
- and then rle-decode when we draw.
-*/
-static bool shouldReencodeAsRLE(const SkBitmap& bm) {
- const SkBitmap::Config c = bm.config();
- return (SkBitmap::kIndex8_Config == c || SkBitmap::kA8_Config == c)
- &&
- bm.width() >= 64 // narrower than this won't compress well in RLE
- &&
- bm.getSize() > MIN_RLE_ALLOC_SIZE;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-class PrivateAndroidImageSourceRec : public SkBitmapRef {
-public:
- PrivateAndroidImageSourceRec(const SkBitmap& bm, int origWidth,
- int origHeight, int sampleSize)
- : SkBitmapRef(bm), fSampleSize(sampleSize), fAllDataReceived(false) {
- this->setOrigSize(origWidth, origHeight);
- }
-
- int fSampleSize;
- bool fAllDataReceived;
-};
-
-using namespace android;
-
-namespace WebCore {
-
-class SharedBufferStream : public SkMemoryStream {
-public:
- SharedBufferStream(SharedBuffer* buffer)
- : SkMemoryStream(buffer->data(), buffer->size(), false) {
- fBuffer = buffer;
- buffer->ref();
- }
-
- virtual ~SharedBufferStream() {
- // we can't necessarily call fBuffer->deref() here, as we may be
- // in a different thread from webkit, and SharedBuffer is not
- // threadsafe. Therefore we defer it until it can be executed in the
- // webkit thread.
-// SkDebugf("-------- enqueue buffer %p for deref\n", fBuffer);
- JavaSharedClient::EnqueueFunctionPtr(CallDeref, fBuffer);
- }
-
-private:
- // don't allow this to change our data. should not get called, but we
- // override here just to be sure
- virtual void setMemory(const void* data, size_t length, bool copyData) {
- sk_throw();
- }
-
- // we share ownership of this with webkit
- SharedBuffer* fBuffer;
-
- // will be invoked in the webkit thread
- static void CallDeref(void* buffer) {
-// SkDebugf("-------- call deref on buffer %p\n", buffer);
- ((SharedBuffer*)buffer)->deref();
- }
-};
-
-
-///////////////////////////////////////////////////////////////////////////////
-
-ImageSource::ImageSource() {
- m_decoder.m_image = NULL;
-}
-
-ImageSource::~ImageSource() {
- delete m_decoder.m_image;
-}
-
-bool ImageSource::initialized() const {
- return m_decoder.m_image != NULL;
-}
-
-static int computeSampleSize(const SkBitmap& bitmap) {
- const size_t maxSize = computeMaxBitmapSizeForCache();
- size_t size = bitmap.getSize();
- int sampleSize = 1;
-
- while (size > maxSize) {
- sampleSize <<= 1;
- size >>= 2;
- }
-
-#ifdef TRACE_SUBSAMPLE_BITMAPS
- if (sampleSize > 1) {
- SkDebugf("------- bitmap [%d %d] config=%d origSize=%d predictSize=%d sampleSize=%d\n",
- bitmap.width(), bitmap.height(), bitmap.config(),
- bitmap.getSize(), size, sampleSize);
- }
-#endif
- return sampleSize;
-}
-
-static SkPixelRef* convertToRLE(SkBitmap* bm, const void* data, size_t len) {
- if (!shouldReencodeAsRLE(*bm)) {
- return NULL;
- }
-
- SkBitmap tmp;
-
- if (!SkImageDecoder::DecodeMemory(data, len, &tmp) || !tmp.getPixels()) {
- return NULL;
- }
-
- SkPixelRef* ref = SkCreateRLEPixelRef(tmp);
- if (NULL == ref) {
- return NULL;
- }
-
-#ifdef TRACE_RLE_BITMAPS
- SkDebugf("---- reencode bitmap as RLE: [%d %d] encodeSize=%d\n",
- tmp.width(), tmp.height(), len);
-#endif
-
- bm->setConfig(SkBitmap::kRLE_Index8_Config, tmp.width(), tmp.height());
- return ref;
-}
-
-void ImageSource::clearURL()
-{
- m_decoder.m_url.reset();
-}
-
-void ImageSource::setURL(const String& url)
-{
- if (url.startsWith("data:")) {
- clearURL();
- } else {
- m_decoder.m_url.setUTF16(url.characters(), url.length());
- }
-}
-
-void ImageSource::setData(SharedBuffer* data, bool allDataReceived)
-{
- if (NULL == m_decoder.m_image) {
- SkBitmap tmp;
-
- SkMemoryStream stream(data->data(), data->size(), false);
- SkImageDecoder* codec = SkImageDecoder::Factory(&stream);
- SkAutoTDelete<SkImageDecoder> ad(codec);
-
- if (!codec || !codec->decode(&stream, &tmp, SkBitmap::kNo_Config,
- SkImageDecoder::kDecodeBounds_Mode)) {
- return;
- }
-
- int origW = tmp.width();
- int origH = tmp.height();
- int sampleSize = computeSampleSize(tmp);
- if (sampleSize > 1) {
- codec->setSampleSize(sampleSize);
- stream.rewind();
- if (!codec->decode(&stream, &tmp, SkBitmap::kNo_Config,
- SkImageDecoder::kDecodeBounds_Mode)) {
- return;
- }
- }
-
- m_decoder.m_image = new PrivateAndroidImageSourceRec(tmp, origW, origH,
- sampleSize);
-
-// SkDebugf("----- started: [%d %d] %s\n", origW, origH, m_decoder.m_url.c_str());
- }
-
- PrivateAndroidImageSourceRec* decoder = m_decoder.m_image;
- if (allDataReceived && !decoder->fAllDataReceived) {
- decoder->fAllDataReceived = true;
-
- SkBitmap* bm = &decoder->bitmap();
- SkPixelRef* ref = convertToRLE(bm, data->data(), data->size());
-
- if (NULL == ref) {
- SkStream* strm = new SharedBufferStream(data);
- // imageref now owns the stream object
- if (should_use_ashmem(*bm)) {
-// SkDebugf("---- use ashmem for image [%d %d]\n", bm->width(), bm->height());
- ref = new SkImageRef_ashmem(strm, bm->config(), decoder->fSampleSize);
- } else {
-// SkDebugf("---- use globalpool for image [%d %d]\n", bm->width(), bm->height());
- ref = new SkImageRef_GlobalPool(strm, bm->config(), decoder->fSampleSize);
- }
-
- // SkDebugf("----- allDataReceived [%d %d]\n", bm->width(), bm->height());
- }
-
- // we promise to never change the pixels (makes picture recording fast)
- ref->setImmutable();
- // give it the URL if we have one
- ref->setURI(m_decoder.m_url);
- // our bitmap is now the only owner of the imageref
- bm->setPixelRef(ref)->unref();
-
-// SkDebugf("---- finished: [%d %d] %s\n", bm->width(), bm->height(), ref->getURI());
- }
-}
-
-bool ImageSource::isSizeAvailable()
-{
- return m_decoder.m_image != NULL;
-}
-
-IntSize ImageSource::size() const
-{
- if (m_decoder.m_image) {
- return IntSize(m_decoder.m_image->origWidth(), m_decoder.m_image->origHeight());
- }
- return IntSize(0, 0);
-}
-
-int ImageSource::repetitionCount()
-{
- return 1;
- // A property with value 0 means loop forever.
-}
-
-size_t ImageSource::frameCount() const
-{
- // i.e. 0 frames if we're not decoded, or 1 frame if we are
- return m_decoder.m_image != NULL;
-}
-
-SkBitmapRef* ImageSource::createFrameAtIndex(size_t index)
-{
- SkASSERT(index == 0);
- SkASSERT(m_decoder.m_image != NULL);
- m_decoder.m_image->ref();
- return m_decoder.m_image;
-}
-
-float ImageSource::frameDurationAtIndex(size_t index)
-{
- SkASSERT(index == 0);
- float duration = 0;
-
- // Many annoying ads specify a 0 duration to make an image flash as quickly as possible.
- // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify
- // a duration of <= 10 ms. See gfxImageFrame::GetTimeout in Gecko or Radar 4051389 for more.
- if (duration <= 0.010f)
- duration = 0.100f;
- return duration;
-}
-
-bool ImageSource::frameHasAlphaAtIndex(size_t index)
-{
- SkASSERT(0 == index);
-
- if (NULL == m_decoder.m_image)
- return true; // if we're not sure, assume the worse-case
- const PrivateAndroidImageSourceRec& decoder = *m_decoder.m_image;
- // if we're 16bit, we know even without all the data available
- if (decoder.bitmap().getConfig() == SkBitmap::kRGB_565_Config)
- return false;
-
- if (!decoder.fAllDataReceived)
- return true; // if we're not sure, assume the worse-case
-
- return !decoder.bitmap().isOpaque();
-}
-
-bool ImageSource::frameIsCompleteAtIndex(size_t index)
-{
- SkASSERT(0 == index);
- return m_decoder.m_image && m_decoder.m_image->fAllDataReceived;
-}
-
-void ImageSource::clear()
-{
- // do nothing, since the cache is managed elsewhere
-}
-
-IntSize ImageSource::frameSizeAtIndex(size_t index) const
-{
- // for now, all (1) of our frames are the same size
- return this->size();
-}
-
-}
diff --git a/WebCore/platform/graphics/android/PathAndroid.cpp b/WebCore/platform/graphics/android/PathAndroid.cpp
deleted file mode 100644
index 819173b..0000000
--- a/WebCore/platform/graphics/android/PathAndroid.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "Path.h"
-#include "FloatRect.h"
-#include "AffineTransform.h"
-
-#include "SkPath.h"
-#include "SkRegion.h"
-
-#include "android_graphics.h"
-
-namespace WebCore {
-
-Path::Path()
-{
- m_path = new SkPath;
-// m_path->setFlags(SkPath::kWinding_FillType);
-}
-
-Path::Path(const Path& other)
-{
- m_path = new SkPath(*other.m_path);
-}
-
-Path::~Path()
-{
- delete m_path;
-}
-
-Path& Path::operator=(const Path& other)
-{
- *m_path = *other.m_path;
- return *this;
-}
-
-bool Path::isEmpty() const
-{
- return m_path->isEmpty();
-}
-
-bool Path::contains(const FloatPoint& point, WindRule rule) const
-{
- SkRegion rgn, clip;
-
- int x = (int)floorf(point.x());
- int y = (int)floorf(point.y());
- clip.setRect(x, y, x + 1, y + 1);
-
- SkPath::FillType ft = m_path->getFillType(); // save
- m_path->setFillType(rule == RULE_NONZERO ? SkPath::kWinding_FillType : SkPath::kEvenOdd_FillType);
-
- bool contains = rgn.setPath(*m_path, clip);
-
- m_path->setFillType(ft); // restore
- return contains;
-}
-
-void Path::translate(const FloatSize& size)
-{
- m_path->offset(SkFloatToScalar(size.width()), SkFloatToScalar(size.height()));
-}
-
-FloatRect Path::boundingRect() const
-{
- SkRect r;
-
- m_path->computeBounds(&r, SkPath::kExact_BoundsType);
- return FloatRect( SkScalarToFloat(r.fLeft),
- SkScalarToFloat(r.fTop),
- SkScalarToFloat(r.width()),
- SkScalarToFloat(r.height()));
-}
-
-void Path::moveTo(const FloatPoint& point)
-{
- m_path->moveTo(SkFloatToScalar(point.x()), SkFloatToScalar(point.y()));
-}
-
-void Path::addLineTo(const FloatPoint& p)
-{
- m_path->lineTo(SkFloatToScalar(p.x()), SkFloatToScalar(p.y()));
-}
-
-void Path::addQuadCurveTo(const FloatPoint& cp, const FloatPoint& ep)
-{
- m_path->quadTo( SkFloatToScalar(cp.x()), SkFloatToScalar(cp.y()),
- SkFloatToScalar(ep.x()), SkFloatToScalar(ep.y()));
-}
-
-void Path::addBezierCurveTo(const FloatPoint& p1, const FloatPoint& p2, const FloatPoint& ep)
-{
- m_path->cubicTo(SkFloatToScalar(p1.x()), SkFloatToScalar(p1.y()),
- SkFloatToScalar(p2.x()), SkFloatToScalar(p2.y()),
- SkFloatToScalar(ep.x()), SkFloatToScalar(ep.y()));
-}
-
-void Path::addArcTo(const FloatPoint& p1, const FloatPoint& p2, float radius)
-{
- m_path->arcTo(SkFloatToScalar(p1.x()), SkFloatToScalar(p1.y()),
- SkFloatToScalar(p2.x()), SkFloatToScalar(p2.y()),
- SkFloatToScalar(radius));
-}
-
-void Path::closeSubpath()
-{
- m_path->close();
-}
-
-static const float gPI = 3.14159265f;
-static const float g2PI = 6.28318531f;
-static const float g180OverPI = 57.29577951308f;
-
-static float fast_mod(float angle, float max) {
- if (angle >= max || angle <= -max) {
- angle = fmodf(angle, max);
- }
- return angle;
-}
-
-void Path::addArc(const FloatPoint& p, float r, float sa, float ea,
- bool clockwise) {
- SkScalar cx = SkFloatToScalar(p.x());
- SkScalar cy = SkFloatToScalar(p.y());
- SkScalar radius = SkFloatToScalar(r);
-
- SkRect oval;
- oval.set(cx - radius, cy - radius, cx + radius, cy + radius);
-
- float sweep = ea - sa;
- bool prependOval = false;
-
- /* Note if clockwise and the sign of the sweep disagree. This particular
- logic was deduced from http://canvex.lazyilluminati.com/misc/arc.html
- */
- if (clockwise && (sweep > 0 || sweep < -g2PI)) {
- sweep = fmodf(sweep, g2PI) - g2PI;
- } else if (!clockwise && (sweep < 0 || sweep > g2PI)) {
- sweep = fmodf(sweep, g2PI) + g2PI;
- }
-
- // If the abs(sweep) >= 2PI, then we need to add a circle before we call
- // arcTo, since it treats the sweep mod 2PI. We don't have a prepend call,
- // so we just remember this, and at the end create a new path with an oval
- // and our current path, and then swap then.
- //
- if (sweep >= g2PI || sweep <= -g2PI) {
- prependOval = true;
-// SkDebugf("addArc sa=%g ea=%g cw=%d sweep %g treat as circle\n", sa, ea, clockwise, sweep);
-
- // now reduce sweep to just the amount we need, so that the current
- // point is left where the caller expects it.
- sweep = fmodf(sweep, g2PI);
- }
-
- sa = fast_mod(sa, g2PI);
- SkScalar startDegrees = SkFloatToScalar(sa * g180OverPI);
- SkScalar sweepDegrees = SkFloatToScalar(sweep * g180OverPI);
-
-// SkDebugf("addArc sa=%g ea=%g cw=%d sweep=%g ssweep=%g\n", sa, ea, clockwise, sweep, SkScalarToFloat(sweepDegrees));
- m_path->arcTo(oval, startDegrees, sweepDegrees, false);
-
- if (prependOval) {
- SkPath tmp;
- tmp.addOval(oval);
- tmp.addPath(*m_path);
- m_path->swap(tmp);
- }
-}
-
-void Path::addRect(const FloatRect& rect)
-{
- SkRect r;
-
- android_setrect(&r, rect);
- m_path->addRect(r);
-}
-
-void Path::addEllipse(const FloatRect& rect)
-{
- SkRect r;
-
- android_setrect(&r, rect);
- m_path->addOval(r);
-}
-
-void Path::clear()
-{
- m_path->reset();
-}
-
-static FloatPoint* setfpts(FloatPoint dst[], const SkPoint src[], int count)
-{
- for (int i = 0; i < count; i++)
- {
- dst[i].setX(SkScalarToFloat(src[i].fX));
- dst[i].setY(SkScalarToFloat(src[i].fY));
- }
- return dst;
-}
-
-void Path::apply(void* info, PathApplierFunction function) const
-{
- SkPath::Iter iter(*m_path, false);
- SkPoint pts[4];
-
- PathElement elem;
- FloatPoint fpts[3];
-
- for (;;)
- {
- switch (iter.next(pts)) {
- case SkPath::kMove_Verb:
- elem.type = PathElementMoveToPoint;
- elem.points = setfpts(fpts, &pts[0], 1);
- break;
- case SkPath::kLine_Verb:
- elem.type = PathElementAddLineToPoint;
- elem.points = setfpts(fpts, &pts[1], 1);
- break;
- case SkPath::kQuad_Verb:
- elem.type = PathElementAddQuadCurveToPoint;
- elem.points = setfpts(fpts, &pts[1], 2);
- break;
- case SkPath::kCubic_Verb:
- elem.type = PathElementAddCurveToPoint;
- elem.points = setfpts(fpts, &pts[1], 3);
- break;
- case SkPath::kClose_Verb:
- elem.type = PathElementCloseSubpath;
- elem.points = NULL;
- break;
- case SkPath::kDone_Verb:
- return;
- }
- function(info, &elem);
- }
-}
-
-void Path::transform(const AffineTransform& xform)
-{
- m_path->transform(xform);
-}
-
-}
diff --git a/WebCore/platform/graphics/android/PatternAndroid.cpp b/WebCore/platform/graphics/android/PatternAndroid.cpp
deleted file mode 100644
index 2840faa..0000000
--- a/WebCore/platform/graphics/android/PatternAndroid.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2006, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "Pattern.h"
-
-#include "android_graphics.h"
-#include "GraphicsContext.h"
-#include "SkBitmapRef.h"
-#include "SkCanvas.h"
-#include "SkColorShader.h"
-#include "SkShader.h"
-#include "SkPaint.h"
-
-namespace WebCore {
-
-static SkShader::TileMode toTileMode(bool doRepeat) {
- return doRepeat ? SkShader::kRepeat_TileMode : SkShader::kClamp_TileMode;
-}
-
-SkShader* Pattern::createPlatformPattern(const AffineTransform& transform) const
-{
- SkBitmapRef* ref = tileImage()->nativeImageForCurrentFrame();
- SkShader* s = SkShader::CreateBitmapShader(ref->bitmap(),
- toTileMode(m_repeatX),
- toTileMode(m_repeatY));
-
- // TODO: do I treat transform as a local matrix???
- return s;
-}
-
-} //namespace
diff --git a/WebCore/platform/graphics/android/PlatformGraphicsContext.cpp b/WebCore/platform/graphics/android/PlatformGraphicsContext.cpp
deleted file mode 100644
index b13f45f..0000000
--- a/WebCore/platform/graphics/android/PlatformGraphicsContext.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2006, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "Node.h"
-#include "PlatformGraphicsContext.h"
-#include "SkCanvas.h"
-
-namespace WebCore {
-
-PlatformGraphicsContext::PlatformGraphicsContext(SkCanvas* canvas, WTF::Vector<Container>* buttons)
- : mCanvas(canvas), m_deleteCanvas(false), m_buttons(buttons)
-{
-}
-
-PlatformGraphicsContext::PlatformGraphicsContext() : m_deleteCanvas(true)
-{
- mCanvas = new SkCanvas;
- // Since this is our own private SkCanvas, and has no relation to a picture
- // storing button references would be meaningless.
- m_buttons = NULL;
-}
-
-PlatformGraphicsContext::~PlatformGraphicsContext()
-{
- if (m_deleteCanvas) {
-// printf("-------------------- deleting offscreen canvas\n");
- delete mCanvas;
- }
-}
-
-void PlatformGraphicsContext::storeButtonInfo(Node* node, const IntRect& r)
-{
- if (m_buttons == NULL)
- return;
- // Check to see if we already have a Container for this node. If so, update
- // it with the new rectangle and make the new recording canvas reference
- // its picture.
- Container* end = m_buttons->end();
- for (Container* ptr = m_buttons->begin(); ptr != end; ptr++) {
- if (ptr->matches(node)) {
- mCanvas->drawPicture(*(ptr->picture()));
- ptr->setRect(r);
- return;
- }
- }
- // We did not have a Container representing this node, so create a new one.
- Container container(node, r);
- // Place a reference to our subpicture in the Picture.
- mCanvas->drawPicture(*(container.picture()));
- // Keep track of the information about the button.
- m_buttons->append(container);
-}
-
-} // WebCore
diff --git a/WebCore/platform/graphics/android/PlatformGraphicsContext.h b/WebCore/platform/graphics/android/PlatformGraphicsContext.h
deleted file mode 100644
index dce8ef3..0000000
--- a/WebCore/platform/graphics/android/PlatformGraphicsContext.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright 2006, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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.
- */
-
-#ifndef platform_graphics_context_h
-#define platform_graphics_context_h
-
-#include "IntRect.h"
-#include "RenderSkinAndroid.h"
-#include "RenderSkinButton.h"
-#include "SkCanvas.h"
-#include "SkPicture.h"
-#include "SkTDArray.h"
-
-class SkCanvas;
-class WebCore::Node;
-
-class Container {
-public:
- Container(WebCore::Node* node, const WebCore::IntRect& r)
- : m_node(node), m_rect(r), m_state(WebCore::RenderSkinAndroid::kDisabled)
- {
- m_picture = new SkPicture;
- }
-
- ~Container()
- {
- m_picture->unref();
- }
-
- Container& operator=(const Container& src)
- {
- if (this != &src) {
- m_node = src.m_node;
- if (m_picture)
- m_picture->unref();
- m_picture = src.m_picture;
- m_picture->ref();
- m_rect = src.m_rect;
- m_state = WebCore::RenderSkinAndroid::kDisabled;
- }
- return *this;
- }
-
- Container(const Container& src)
- {
- m_node = src.m_node;
- m_picture = src.m_picture;
- m_picture->ref();
- m_rect = src.m_rect;
- m_state = WebCore::RenderSkinAndroid::kDisabled;
- }
-
- // m_picture has a ref count of 1 to begin with. It will increase each time
- // m_picture is referenced by another picture. When the other pictures are
- // deleted, the ref count gets decremented. If the ref count is one, then
- // no other pictures reference this one, so the button is no longer being
- // used, and therefore can be removed.
- bool canBeRemoved()
- {
- return m_picture->getRefCnt() == 1;
- }
-
- bool matches(const WebCore::Node* match) { return m_node == match; }
-
- const WebCore::Node* node() const { return m_node; }
-
- // Provide a pointer to our SkPicture.
- SkPicture* picture() { return m_picture; }
-
- WebCore::IntRect rect() { return m_rect; }
-
- // Update the rectangle with a new rectangle, as the positioning of this
- // button may have changed due to a new layout. If it is a new rectangle,
- // set its state to disabled, so that it will be redrawn when we cycle
- // through the list of buttons.
- void setRect(WebCore::IntRect r)
- {
- if (m_rect != r) {
- m_rect = r;
- m_state = WebCore::RenderSkinAndroid::kDisabled;
- }
- }
-
- // Update the focus state of this button, depending on whether it
- // corresponds to the focused node passed in. If its state has changed,
- // re-record to the subpicture, so the master picture will reflect the
- // change.
- void updateFocusState(WebCore::RenderSkinAndroid::State state)
- {
- if (state == m_state)
- return;
- // If this button is being told to draw focused, but it is already in a
- // pressed state, leave it in the pressed state, to show that it is
- // being followed.
- if (m_state == WebCore::RenderSkinAndroid::kPressed &&
- state == WebCore::RenderSkinAndroid::kFocused)
- return;
- m_state = state;
- SkCanvas* canvas = m_picture->beginRecording(m_rect.width(), m_rect.height());
- WebCore::RenderSkinButton::Draw(canvas, m_rect, state);
- m_picture->endRecording();
- }
-private:
- // Only used for comparison, since after it is stored it will be transferred
- // to the UI thread.
- WebCore::Node* m_node;
- // The rectangle representing the bounds of the button.
- WebCore::IntRect m_rect;
- // An SkPicture that, thanks to storeButtonInfo, is pointed to by the master
- // picture, so that we can rerecord this button without rerecording the
- // world.
- SkPicture* m_picture;
- // The state of the button - Currently kFocused or kNormal (and kDisabled
- // as an initial value), but could be expanded to include other states.
- WebCore::RenderSkinAndroid::State m_state;
-};
-
-namespace WebCore {
-
- class GraphicsContext;
-
-class PlatformGraphicsContext {
-public:
- PlatformGraphicsContext();
- // Pass in a recording canvas, and an array of button information to be
- // updated.
- PlatformGraphicsContext(SkCanvas* canvas, WTF::Vector<Container>* buttons);
- ~PlatformGraphicsContext();
-
- void setupFillPaint(GraphicsContext*, SkPaint*);
- void setupStrokePaint(GraphicsContext*, SkPaint*);
-
- SkCanvas* mCanvas;
-
- bool deleteUs() const { return m_deleteCanvas; }
- // If our graphicscontext has a button list, add a new container for the
- // nod/rect, and record a new subpicture for this node/button in the current
- // mCanvas
- void storeButtonInfo(Node* node, const IntRect& r);
-private:
- bool m_deleteCanvas;
- WTF::Vector<Container>* m_buttons;
-};
-
-}
-#endif
-
diff --git a/WebCore/platform/graphics/android/SkBitmapRef.h b/WebCore/platform/graphics/android/SkBitmapRef.h
deleted file mode 100644
index 094102b..0000000
--- a/WebCore/platform/graphics/android/SkBitmapRef.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2006, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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.
- */
-
-#ifndef SkBitmapRef_DEFINED
-#define SkBitmapRef_DEFINED
-
-#include "SkRefCnt.h"
-#include "SkBitmap.h"
-
-class SkBitmapRef : public SkRefCnt {
-public:
- SkBitmapRef() : fOrigWidth(0), fOrigHeight(0), fAccessed(false) {}
- explicit SkBitmapRef(const SkBitmap& src)
- : fBitmap(src),
- fOrigWidth(src.width()),
- fOrigHeight(src.height()),
- fAccessed(false) {}
-
- const SkBitmap& bitmap() const { return fBitmap; }
- SkBitmap& bitmap() { return fBitmap; }
-
- int origWidth() const { return fOrigWidth; }
- int origHeight() const { return fOrigHeight; }
-
- void setOrigSize(int width, int height) {
- fOrigWidth = width;
- fOrigHeight = height;
- }
- // return true if this is not the first access
- // mark it true so all subsequent calls return true
- bool accessed() { bool result = fAccessed;
- fAccessed = true; return result; }
-
-private:
- SkBitmap fBitmap;
- int fOrigWidth, fOrigHeight;
- bool fAccessed;
-};
-
-#endif
diff --git a/WebCore/platform/graphics/android/android_graphics.cpp b/WebCore/platform/graphics/android/android_graphics.cpp
deleted file mode 100644
index 2bc0c8f..0000000
--- a/WebCore/platform/graphics/android/android_graphics.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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 "android_graphics.h"
-#include "IntPoint.h"
-#include "IntRect.h"
-#include "FloatPoint.h"
-#include "FloatRect.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkCornerPathEffect.h"
-#include "SkGradientShader.h"
-#include "SkPath.h"
-#include "SkRegion.h"
-
-SkPoint* android_setpt(SkPoint* dst, const WebCore::IntPoint& src)
-{
- dst->set(SkIntToScalar(src.x()), SkIntToScalar(src.y()));
- return dst;
-}
-
-SkPoint* android_setpt(SkPoint* dst, const WebCore::FloatPoint& src)
-{
- dst->set(SkFloatToScalar(src.x()), SkFloatToScalar(src.y()));
- return dst;
-}
-
-SkRect* android_setrect(SkRect* dst, const WebCore::IntRect& src)
-{
- dst->set(SkIntToScalar(src.x()),
- SkIntToScalar(src.y()),
- SkIntToScalar(src.x() + src.width()),
- SkIntToScalar(src.y() + src.height()));
- return dst;
-}
-
-SkIRect* android_setrect(SkIRect* dst, const WebCore::IntRect& src)
-{
- dst->set(src.x(), src.y(),
- src.x() + src.width(),
- src.y() + src.height());
- return dst;
-}
-
-SkRect* android_setrect(SkRect* dst, const WebCore::FloatRect& src)
-{
- dst->set(SkFloatToScalar(src.x()),
- SkFloatToScalar(src.y()),
- SkFloatToScalar(src.x() + src.width()),
- SkFloatToScalar(src.y() + src.height()));
- return dst;
-}
-
-SkIRect* android_setrect(SkIRect* dst, const WebCore::FloatRect& src)
-{
- dst->set(SkScalarRound(SkFloatToScalar(src.x())),
- SkScalarRound(SkFloatToScalar(src.y())),
- SkScalarRound(SkFloatToScalar(src.x() + src.width())),
- SkScalarRound(SkFloatToScalar(src.y() + src.height())));
- return dst;
-}
-
-SkIRect* android_setrect_scaled(SkIRect* dst, const WebCore::FloatRect& src,
- float sx, float sy)
-{
- dst->set(SkScalarRound(SkFloatToScalar(src.x() * sx)),
- SkScalarRound(SkFloatToScalar(src.y() * sy)),
- SkScalarRound(SkFloatToScalar((src.x() + src.width()) * sx)),
- SkScalarRound(SkFloatToScalar((src.y() + src.height()) * sy)));
- return dst;
-}
-
-static const struct CompositOpToPorterDuffMode {
- uint8_t mCompositOp;
- uint8_t mPorterDuffMode;
-} gMapCompositOpsToPorterDuffModes[] = {
- { WebCore::CompositeClear, SkPorterDuff::kClear_Mode },
- { WebCore::CompositeCopy, SkPorterDuff::kSrcOver_Mode }, // TODO
- { WebCore::CompositeSourceOver, SkPorterDuff::kSrcOver_Mode },
- { WebCore::CompositeSourceIn, SkPorterDuff::kSrcIn_Mode },
- { WebCore::CompositeSourceOut, SkPorterDuff::kSrcOut_Mode },
- { WebCore::CompositeSourceAtop, SkPorterDuff::kSrcATop_Mode },
- { WebCore::CompositeDestinationOver, SkPorterDuff::kDstOver_Mode },
- { WebCore::CompositeDestinationIn, SkPorterDuff::kDstIn_Mode },
- { WebCore::CompositeDestinationOut, SkPorterDuff::kDstOut_Mode },
- { WebCore::CompositeDestinationAtop, SkPorterDuff::kDstATop_Mode },
- { WebCore::CompositeXOR, SkPorterDuff::kXor_Mode },
- { WebCore::CompositePlusDarker, SkPorterDuff::kDarken_Mode },
- { WebCore::CompositeHighlight, SkPorterDuff::kSrcOver_Mode }, // TODO
- { WebCore::CompositePlusLighter, SkPorterDuff::kLighten_Mode }
-};
-
-SkPorterDuff::Mode android_convert_compositeOp(WebCore::CompositeOperator op)
-{
- const CompositOpToPorterDuffMode* table = gMapCompositOpsToPorterDuffModes;
-
- for (unsigned i = 0; i < SK_ARRAY_COUNT(gMapCompositOpsToPorterDuffModes); i++) {
- if (table[i].mCompositOp == op) {
- return (SkPorterDuff::Mode)table[i].mPorterDuffMode;
- }
- }
-
- SkDEBUGF(("GraphicsContext::setCompositeOperation uknown CompositOperator %d\n", op));
- return SkPorterDuff::kSrcOver_Mode; // fall-back
-}
-
-SkShader::TileMode android_convert_TileRule(WebCore::Image::TileRule rule)
-{
- // stretch == clamp
- // repeat == repeat
- // RoundTile???
-
- return WebCore::Image::RepeatTile == rule ? SkShader::kRepeat_TileMode : SkShader::kClamp_TileMode;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-static U8CPU InvScaleByte(U8CPU component, uint32_t scale)
-{
- SkASSERT(component == (uint8_t)component);
- return (component * scale + 0x8000) >> 16;
-}
-
-// move this guy into SkColor.h
-static SkColor SkPMColorToColor(SkPMColor pm)
-{
- if (0 == pm)
- return 0;
-
- unsigned a = SkGetPackedA32(pm);
- uint32_t scale = (255 << 16) / a;
-
- return SkColorSetARGB(a,
- InvScaleByte(SkGetPackedR32(pm), scale),
- InvScaleByte(SkGetPackedG32(pm), scale),
- InvScaleByte(SkGetPackedB32(pm), scale));
-}
-
-WebCore::Color android_SkPMColorToWebCoreColor(SkPMColor pm)
-{
- SkColor c = SkPMColorToColor(pm);
-
- // need the cast to find the right constructor
- return WebCore::Color((int)SkColorGetR(c), (int)SkColorGetG(c),
- (int)SkColorGetB(c), (int)SkColorGetA(c));
-}
-
-const static SkColor focusOuterColors[] = {
- SkColorSetARGB(0xff, 0xB3, 0x3F, 0x08), // normal focus ring select
- SkColorSetARGB(0xff, 0x46, 0xb0, 0x00), // fake focus ring select, for phone, email, text
- SkColorSetARGB(0xff, 0xb0, 0x16, 0x00), // invalid focus ring color
- SkColorSetARGB(0xff, 0xAD, 0x5C, 0x0A), // normal focus ring pressed
- SkColorSetARGB(0xff, 0x36, 0xc0, 0x00) // fake focus ring pressed
-};
-
-const static SkColor focusInnerColors[] = {
- SkColorSetARGB(0xff, 0xFE, 0x92, 0x30), // normal focus ring select
- SkColorSetARGB(0xff, 0x8c, 0xd9, 0x00), // fake focus ring select, for phone, email, text
- SkColorSetARGB(0xff, 0xd9, 0x2c, 0x00), // invalid focus ring color
- SkColorSetARGB(0xff, 0xFE, 0xBD, 0x3A), // normal focus ring pressed
- SkColorSetARGB(0xff, 0x7c, 0xe9, 0x00) // fake focus ring pressed
-};
-
-const static SkColor focusPressedColors[] = {
- SkColorSetARGB(0x80, 0xFF, 0xC6, 0x4B), // normal focus ring pressed
- SkColorSetARGB(0x80, 0x7c, 0xe9, 0x00) // fake focus ring pressed
-};
-
-#define FOCUS_RING_ROUNDEDNESS SkIntToScalar(5) // used to draw corners
-#define FOCUS_RING_INNER_DIAMETER SkFixedToScalar(SkIntToFixed(3)>>1) // 3/2 == 1.5
-#define FOCUS_RING_OUTER_OUTSET 2 // used to inflate rects added to region
-
-void FocusRing::DrawRing(SkCanvas* canvas,
- const Vector<WebCore::IntRect>& rects, Flavor flavor)
-{
- unsigned rectCount = rects.size();
- SkRegion rgn;
- SkPath path;
- for (unsigned i = 0; i < rectCount; i++)
- {
- SkIRect r;
-
- android_setrect(&r, rects[i]);
- r.inset(-FOCUS_RING_OUTER_OUTSET, -FOCUS_RING_OUTER_OUTSET);
- rgn.op(r, SkRegion::kUnion_Op);
- }
- rgn.getBoundaryPath(&path);
-
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setPathEffect(new SkCornerPathEffect(FOCUS_RING_ROUNDEDNESS))->unref();
- if (flavor >= NORMAL_ANIMATING) { // pressed
- paint.setColor(focusPressedColors[flavor - NORMAL_ANIMATING]);
- canvas->drawPath(path, paint);
- }
- paint.setStyle(SkPaint::kStroke_Style);
- paint.setStrokeWidth(FOCUS_RING_OUTER_DIAMETER);
- paint.setColor(focusOuterColors[flavor]);
- canvas->drawPath(path, paint);
- paint.setStrokeWidth(FOCUS_RING_INNER_DIAMETER);
- paint.setColor(focusInnerColors[flavor]);
- canvas->drawPath(path, paint);
-}
-
-
diff --git a/WebCore/platform/graphics/android/android_graphics.h b/WebCore/platform/graphics/android/android_graphics.h
deleted file mode 100644
index 21492cf..0000000
--- a/WebCore/platform/graphics/android/android_graphics.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 APPLE COMPUTER, INC. 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.
- */
-
-#ifndef android_graphics_DEFINED
-#define android_graphics_DEFINED
-
-#include "Color.h"
-#include "Image.h"
-#include "wtf/Vector.h"
-
-#include "SkColor.h"
-#include "SkPorterDuff.h"
-#include "SkScalar.h"
-#include "SkShader.h"
-
-class SkCanvas;
-struct SkPoint;
-struct SKRect;
-
-namespace WebCore {
- class FloatRect;
- class IntPoint;
- class IntRect;
- class GraphicsContext;
-}
-
-SkPoint* android_setpt(SkPoint* dst, const WebCore::IntPoint& src);
-SkPoint* android_setpt(SkPoint* dst, const WebCore::FloatPoint& src);
-SkRect* android_setrect(SkRect* dst, const WebCore::IntRect& src);
-SkRect* android_setrect(SkRect* dst, const WebCore::FloatRect& src);
-SkIRect* android_setrect(SkIRect* dst, const WebCore::IntRect& src);
-SkIRect* android_setrect(SkIRect* dst, const WebCore::FloatRect& src);
-SkIRect* android_setrect_scaled(SkIRect* dst, const WebCore::FloatRect& src,
- float sx, float sy);
-
-SkPorterDuff::Mode android_convert_compositeOp(WebCore::CompositeOperator);
-SkShader::TileMode android_convert_TileRule(WebCore::Image::TileRule);
-
-WebCore::Color android_SkPMColorToWebCoreColor(SkPMColor pm);
-
-SkCanvas* android_gc2canvas(WebCore::GraphicsContext* gc);
-
-// Data and methods for focus rings
-
-// used to inflate node cache entry
-#define FOCUS_RING_HIT_TEST_RADIUS 5
-
-// used to inval rectangle enclosing pressed state of focus ring
-#define FOCUS_RING_OUTER_DIAMETER SkFixedToScalar(SkIntToFixed(13)>>2) // 13/4 == 3.25
-
-struct FocusRing {
-public:
- enum Flavor {
- NORMAL_FLAVOR,
- FAKE_FLAVOR,
- INVALID_FLAVOR,
- NORMAL_ANIMATING,
- FAKE_ANIMATING,
- ANIMATING_COUNT = 2
- };
-
- static void DrawRing(SkCanvas* ,
- const Vector<WebCore::IntRect>& rects, Flavor );
-};
-
-#endif
-