diff options
Diffstat (limited to 'Source/WebCore')
5 files changed, 47 insertions, 12 deletions
diff --git a/Source/WebCore/platform/graphics/android/BaseTile.cpp b/Source/WebCore/platform/graphics/android/BaseTile.cpp index 98eb623..a331dfc 100644 --- a/Source/WebCore/platform/graphics/android/BaseTile.cpp +++ b/Source/WebCore/platform/graphics/android/BaseTile.cpp @@ -183,6 +183,30 @@ void BaseTile::markAsDirty(int unsigned pictureCount, m_lastDirtyPicture = pictureCount; for (int i = 0; i < m_maxBufferNumber; i++) m_dirtyArea[i].op(dirtyArea, SkRegion::kUnion_Op); + + // Check if we actually intersect with the area + bool intersect = false; + SkRegion::Iterator cliperator(dirtyArea); + int tileWidth = TilesManager::instance()->tileWidth(); + int tileHeight = TilesManager::instance()->tileHeight(); + if (m_isLayerTile) { + tileWidth = TilesManager::instance()->layerTileWidth(); + tileHeight = TilesManager::instance()->layerTileHeight(); + } + SkRect realTileRect; + SkRect dirtyRect; + while (!cliperator.done()) { + dirtyRect.set(cliperator.rect()); + if (intersectWithRect(m_x, m_y, tileWidth, tileHeight, + m_scale, dirtyRect, realTileRect)) { + intersect = true; + break; + } + cliperator.next(); + } + if (!intersect) + return; + m_dirty = true; if (m_state == UpToDate) { // We only mark a tile as unpainted in 'markAsDirty' if its status is diff --git a/Source/WebCore/platform/graphics/android/FontAndroid.cpp b/Source/WebCore/platform/graphics/android/FontAndroid.cpp index 852413f..e100955 100644 --- a/Source/WebCore/platform/graphics/android/FontAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/FontAndroid.cpp @@ -52,6 +52,7 @@ #include <wtf/OwnPtr.h> #include <wtf/PassOwnArrayPtr.h> #include <wtf/PassOwnPtr.h> +#include <wtf/unicode/CharacterNames.h> #include <wtf/unicode/Unicode.h> #endif @@ -881,10 +882,14 @@ void TextRunWalker::normalizeSpacesAndMirrorChars(const UChar* source, bool rtl, UChar32 character; int nextPosition = position; U16_NEXT(source, nextPosition, length, character); + if (Font::treatAsSpace(character)) - character = ' '; + character = space; + else if (Font::treatAsZeroWidthSpace(character)) + character = zeroWidthSpace; else if (rtl) character = u_charMirror(character); + U16_APPEND(destination, position, length, character, error); ASSERT(!error); position = nextPosition; diff --git a/Source/WebCore/platform/graphics/android/MediaLayer.cpp b/Source/WebCore/platform/graphics/android/MediaLayer.cpp index 7fa5ac2..0181892 100644 --- a/Source/WebCore/platform/graphics/android/MediaLayer.cpp +++ b/Source/WebCore/platform/graphics/android/MediaLayer.cpp @@ -68,7 +68,8 @@ MediaLayer::~MediaLayer() bool MediaLayer::drawGL(GLWebViewState* glWebViewState, SkMatrix& matrix) { - TilesManager::instance()->shader()->clip(drawClip()); + FloatRect clippingRect = TilesManager::instance()->shader()->rectInScreenCoord(drawClip()); + TilesManager::instance()->shader()->clip(clippingRect); // when the plugin gains focus webkit applies an outline to the // widget, which causes the layer to expand to accommodate the diff --git a/Source/WebCore/platform/graphics/android/RasterRenderer.cpp b/Source/WebCore/platform/graphics/android/RasterRenderer.cpp index 8bf6fcc..0c92de4 100644 --- a/Source/WebCore/platform/graphics/android/RasterRenderer.cpp +++ b/Source/WebCore/platform/graphics/android/RasterRenderer.cpp @@ -65,15 +65,20 @@ static const String TAGS[] = { TAG_UPDATE_TEXTURE, }; +SkBitmap* RasterRenderer::g_bitmap = 0; + RasterRenderer::RasterRenderer() : BaseRenderer(BaseRenderer::Raster) { #ifdef DEBUG_COUNT ClassTracker::instance()->increment("RasterRenderer"); #endif - m_bitmap.setConfig(SkBitmap::kARGB_8888_Config, - TilesManager::instance()->tileWidth(), - TilesManager::instance()->tileHeight()); - m_bitmap.allocPixels(); + if (!g_bitmap) { + g_bitmap = new SkBitmap(); + g_bitmap->setConfig(SkBitmap::kARGB_8888_Config, + TilesManager::instance()->tileWidth(), + TilesManager::instance()->tileHeight()); + g_bitmap->allocPixels(); + } } RasterRenderer::~RasterRenderer() @@ -89,14 +94,14 @@ void RasterRenderer::setupCanvas(const TileRenderInfo& renderInfo, SkCanvas* can m_perfMon.start(TAG_CREATE_BITMAP); if (renderInfo.baseTile->isLayerTile()) { - m_bitmap.setIsOpaque(false); - m_bitmap.eraseARGB(0, 0, 0, 0); + g_bitmap->setIsOpaque(false); + g_bitmap->eraseARGB(0, 0, 0, 0); } else { - m_bitmap.setIsOpaque(true); - m_bitmap.eraseARGB(255, 255, 255, 255); + g_bitmap->setIsOpaque(true); + g_bitmap->eraseARGB(255, 255, 255, 255); } - SkDevice* device = new SkDevice(NULL, m_bitmap, false); + SkDevice* device = new SkDevice(NULL, *g_bitmap, false); if (renderInfo.measurePerf) { m_perfMon.stop(TAG_CREATE_BITMAP); diff --git a/Source/WebCore/platform/graphics/android/RasterRenderer.h b/Source/WebCore/platform/graphics/android/RasterRenderer.h index 69dfaf8..96b3f58 100644 --- a/Source/WebCore/platform/graphics/android/RasterRenderer.h +++ b/Source/WebCore/platform/graphics/android/RasterRenderer.h @@ -52,7 +52,7 @@ protected: virtual const String* getPerformanceTags(int& tagCount); private: - SkBitmap m_bitmap; + static SkBitmap* g_bitmap; }; |