1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
|
/*
* Copyright (C) 2009, 2010, 2011, 2012 Research In Motion Limited. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef BackingStore_p_h
#define BackingStore_p_h
#include "BackingStore.h"
#include "Color.h"
#include "RenderQueue.h"
#include "TileIndex.h"
#include "TileIndexHash.h"
#include "Timer.h"
#include <BlackBerryPlatformGraphics.h>
#include <BlackBerryPlatformGuardedPointer.h>
#include <pthread.h>
#include <wtf/HashMap.h>
#include <wtf/Vector.h>
namespace WebCore {
class IntRect;
class FloatRect;
class LayerRenderer;
class TransformationMatrix;
}
namespace BlackBerry {
namespace Platform {
class ViewportAccessor;
}
namespace WebKit {
class BackingStoreTile;
class TileBuffer;
class WebPage;
class BackingStoreClient;
typedef WTF::HashMap<TileIndex, BackingStoreTile*> TileMap;
class BackingStoreGeometry {
public:
BackingStoreGeometry()
: m_numberOfTilesWide(0)
, m_numberOfTilesHigh(0)
, m_scale(0.0)
{
}
Platform::IntRect backingStoreRect() const;
Platform::IntSize backingStoreSize() const;
int numberOfTilesWide() const { return m_numberOfTilesWide; }
void setNumberOfTilesWide(int numberOfTilesWide) { m_numberOfTilesWide = numberOfTilesWide; }
int numberOfTilesHigh() const { return m_numberOfTilesHigh; }
void setNumberOfTilesHigh(int numberOfTilesHigh) { m_numberOfTilesHigh = numberOfTilesHigh; }
Platform::IntPoint backingStoreOffset() const { return m_backingStoreOffset; }
void setBackingStoreOffset(const Platform::IntPoint& offset) { m_backingStoreOffset = offset; }
BackingStoreTile* tileAt(TileIndex index) const { return m_tileMap.get(index); }
const TileMap& tileMap() const { return m_tileMap; }
void setTileMap(const TileMap& tileMap) { m_tileMap = tileMap; }
double scale() const { return m_scale; }
void setScale(double scale) { m_scale = scale; }
private:
int m_numberOfTilesWide;
int m_numberOfTilesHigh;
double m_scale;
Platform::IntPoint m_backingStoreOffset;
TileMap m_tileMap;
};
class BackingStoreWindowBufferState {
public:
Platform::IntRectRegion blittedRegion() const { return m_blittedRegion; }
void addBlittedRegion(const Platform::IntRectRegion& region)
{
m_blittedRegion = Platform::IntRectRegion::unionRegions(m_blittedRegion, region);
}
void clearBlittedRegion(const Platform::IntRectRegion& region)
{
m_blittedRegion = Platform::IntRectRegion::subtractRegions(m_blittedRegion, region);
}
void clearBlittedRegion() { m_blittedRegion = Platform::IntRectRegion(); }
bool isRendered(const Platform::IntPoint& scrollPosition, const Platform::IntRectRegion& contents) const
{
return Platform::IntRectRegion::subtractRegions(contents, m_blittedRegion).isEmpty();
}
private:
Platform::IntRectRegion m_blittedRegion;
};
class BackingStorePrivate : public BlackBerry::Platform::GuardedPointerBase {
public:
enum TileMatrixDirection { Horizontal, Vertical };
BackingStorePrivate();
void instrumentBeginFrame();
void instrumentCancelFrame();
// Returns whether direct rendering is explicitly turned on or is
// required because the surface pool is not large enough to meet
// the minimum number of tiles required to scroll.
bool shouldDirectRenderingToWindow() const;
// Returns whether we're using the OpenGL code path for compositing the
// backing store tiles. This can be due to the main window using
// BlackBerry::Platform::Graphics::Window::GLES2Usage.
bool isOpenGLCompositing() const;
bool isSuspended() const { return m_suspendBackingStoreUpdates; }
// Suspends all backingstore updates so that rendering to the backingstore is disabled.
void suspendBackingStoreUpdates();
// Resumes all backingstore updates so that rendering to the backingstore is enabled.
void resumeBackingStoreUpdates();
// Suspends all screen updates so that 'blitVisibleContents' is disabled.
void suspendScreenUpdates();
// Resumes all screen updates so that 'blitVisibleContents' is enabled.
void resumeScreenUpdates(BackingStore::ResumeUpdateOperation);
// The functions repaint(), slowScroll(), scroll(), scrollingStartedHelper() are
// called from outside WebKit and within WebKit via ChromeClientBlackBerry.
void repaint(const Platform::IntRect& windowRect, bool contentChanged, bool immediate);
void slowScroll(const Platform::IntSize& delta, const Platform::IntRect& windowRect, bool immediate);
void scroll(const Platform::IntSize& delta, const Platform::IntRect& scrollViewRect, const Platform::IntRect& clipRect);
void scrollingStartedHelper(const Platform::IntSize& delta);
bool shouldSuppressNonVisibleRegularRenderJobs() const;
bool shouldPerformRenderJobs() const;
bool shouldPerformRegularRenderJobs() const;
void dispatchRenderJob();
void renderJob();
// Set of helper methods for the scrollBackingStore() method.
Platform::IntRect contentsRect() const;
Platform::IntRect expandedContentsRect() const;
Platform::IntRect visibleContentsRect() const;
Platform::IntRect unclippedVisibleContentsRect() const;
bool shouldMoveLeft(const Platform::IntRect&) const;
bool shouldMoveRight(const Platform::IntRect&) const;
bool shouldMoveUp(const Platform::IntRect&) const;
bool shouldMoveDown(const Platform::IntRect&) const;
bool canMoveX(const Platform::IntRect&) const;
bool canMoveY(const Platform::IntRect&) const;
bool canMoveLeft(const Platform::IntRect&) const;
bool canMoveRight(const Platform::IntRect&) const;
bool canMoveUp(const Platform::IntRect&) const;
bool canMoveDown(const Platform::IntRect&) const;
Platform::IntRect backingStoreRectForScroll(int deltaX, int deltaY, const Platform::IntRect&) const;
void setBackingStoreRect(const Platform::IntRect&, double scale);
typedef WTF::Vector<TileIndex> TileIndexList;
TileIndexList indexesForBackingStoreRect(const Platform::IntRect&) const;
Platform::IntPoint originOfLastRenderForTile(const TileIndex&, BackingStoreTile*, const Platform::IntRect& backingStoreRect) const;
TileIndex indexOfLastRenderForTile(const TileIndex&, BackingStoreTile*) const;
TileIndex indexOfTile(const Platform::IntPoint& origin, const Platform::IntRect& backingStoreRect) const;
void clearAndUpdateTileOfNotRenderedRegion(const TileIndex&, BackingStoreTile*, const Platform::IntRectRegion&, const Platform::IntRect& backingStoreRect, bool update = true);
bool isCurrentVisibleJob(const TileIndex&, BackingStoreTile*, const Platform::IntRect& backingStoreRect) const;
// Not thread safe. Call only when threads are in sync.
void clearRenderedRegion(BackingStoreTile*, const Platform::IntRectRegion&);
// Responsible for scrolling the backing store and updating the
// tile matrix geometry.
void scrollBackingStore(int deltaX, int deltaY);
// Render the tiles dirty rect and invalidate the screen.
bool renderDirectToWindow(const Platform::IntRect&);
// Render the tiles dirty rect.
// NOTE: This will not update the screen. To do that you should call
// blitVisibleContents() after this method.
bool render(const Platform::IntRect&);
// Called by the render queue to ensure that the queue is in a
// constant state before performing a render job.
void requestLayoutIfNeeded() const;
// Helper render methods.
bool renderVisibleContents();
bool renderBackingStore();
void blitVisibleContents(bool force = false);
// Assumes the rect to be in window/viewport coordinates.
void copyPreviousContentsToBackSurfaceOfWindow();
void copyPreviousContentsToBackSurfaceOfTile(const Platform::IntRect&, BackingStoreTile*);
void paintDefaultBackground(const Platform::IntRect& dstRect, BlackBerry::Platform::ViewportAccessor*, bool flush);
void blitOnIdle();
typedef std::pair<TileIndex, Platform::IntRect> TileRect;
Platform::IntRect blitTileRect(TileBuffer*, const TileRect&, const Platform::IntPoint&, const WebCore::TransformationMatrix&, BackingStoreGeometry*);
#if USE(ACCELERATED_COMPOSITING)
// Use instead of blitVisibleContents() if you need more control over
// OpenGL state. Note that contents is expressed in untransformed
// content coordinates.
// Preconditions: You have to call prepareFrame and setViewport on the LayerRenderer before
// calling this.
void compositeContents(WebCore::LayerRenderer*, const WebCore::TransformationMatrix&, const WebCore::FloatRect& contents, bool contentsOpaque);
bool drawLayersOnCommitIfNeeded();
void drawAndBlendLayersForDirectRendering(const Platform::IntRect& dirtyRect);
// WebPage will call this when drawing layers to tell us we don't need to
void willDrawLayersOnCommit() { m_needsDrawLayersOnCommit = false; }
// WebPageCompositor uses this to cut down on excessive message sending.
bool isDirectRenderingAnimationMessageScheduled() { return m_isDirectRenderingAnimationMessageScheduled; }
void setDirectRenderingAnimationMessageScheduled() { m_isDirectRenderingAnimationMessageScheduled = true; }
#endif
void blitHorizontalScrollbar();
void blitVerticalScrollbar();
// Returns whether the tile index is currently visible or not.
bool isTileVisible(const TileIndex&) const;
bool isTileVisible(const Platform::IntPoint&) const;
// Returns a rect that is the union of all tiles that are visible.
Platform::IntRect visibleTilesRect() const;
// Used to clip to the visible content for instance.
Platform::IntRect tileVisibleContentsRect(const TileIndex&) const;
// Used to clip to the unclipped visible content for instance which includes overscroll.
Platform::IntRect tileUnclippedVisibleContentsRect(const TileIndex&) const;
// Used to clip to the contents for instance.
Platform::IntRect tileContentsRect(const TileIndex&, const Platform::IntRect&) const;
Platform::IntRect tileContentsRect(const TileIndex&, const Platform::IntRect&, BackingStoreGeometry* state) const;
// This is called by WebPage once load is committed to reset the render queue.
void resetRenderQueue();
// This is called by FrameLoaderClient that explicitly paints on first visible layout.
void clearVisibleZoom();
// This is called by WebPage once load is committed to reset all the tiles.
void resetTiles(bool resetBackground);
// This is called by WebPage after load is complete to update all the tiles.
void updateTiles(bool updateVisible, bool immediate);
// This is called during scroll and by the render queue.
void updateTilesForScrollOrNotRenderedRegion(bool checkLoading = true);
// Reset an individual tile.
void resetTile(const TileIndex&, BackingStoreTile*, bool resetBackground);
// Update an individual tile.
void updateTile(const TileIndex&, bool immediate);
void updateTile(const Platform::IntPoint&, bool immediate);
Platform::IntRect mapFromTilesToTransformedContents(const TileRect&) const;
Platform::IntRect mapFromTilesToTransformedContents(const TileRect&, const Platform::IntRect&) const;
typedef WTF::Vector<TileRect> TileRectList;
TileRectList mapFromTransformedContentsToAbsoluteTileBoundaries(const Platform::IntRect&) const;
TileRectList mapFromTransformedContentsToTiles(const Platform::IntRect&) const;
TileRectList mapFromTransformedContentsToTiles(const Platform::IntRect&, BackingStoreGeometry*) const;
void setTileMatrixNeedsUpdate() { m_tileMatrixNeedsUpdate = true; }
void updateTileMatrixIfNeeded();
// Called by WebPagePrivate::notifyTransformedContentsSizeChanged.
void contentsSizeChanged(const Platform::IntSize&);
// Called by WebPagePrivate::notifyTransformedScrollChanged.
void scrollChanged(const Platform::IntPoint&);
// Called by WebpagePrivate::notifyTransformChanged.
void transformChanged();
// Called by WebpagePrivate::actualVisibleSizeChanged.
void actualVisibleSizeChanged(const Platform::IntSize&);
// Called by WebPagePrivate::setScreenRotated.
void orientationChanged();
// Sets the geometry of the tile matrix.
void setGeometryOfTileMatrix(int numberOfTilesWide, int numberOfTilesHigh);
// Create the surfaces of the backing store.
void createSurfaces();
void createVisibleTileBuffer();
// Various calculations of quantities relevant to backing store.
Platform::IntPoint originOfTile(const TileIndex&) const;
Platform::IntPoint originOfTile(const TileIndex&, const Platform::IntRect&) const;
int minimumNumberOfTilesWide() const;
int minimumNumberOfTilesHigh() const;
Platform::IntSize expandedContentsSize() const;
// The tile geometry methods are all static function.
static int tileWidth();
static int tileHeight();
static Platform::IntSize tileSize();
static Platform::IntRect tileRect();
// This takes transformed contents coordinates.
void renderContents(BlackBerry::Platform::Graphics::Buffer*, const Platform::IntPoint& surfaceOffset, const Platform::IntRect& contentsRect) const;
void renderContents(Platform::Graphics::Drawable* /*drawable*/, const Platform::IntRect& /*contentsRect*/, const Platform::IntSize& /*destinationSize*/) const;
void blitToWindow(const Platform::IntRect& dstRect, const BlackBerry::Platform::Graphics::Buffer* srcBuffer, const Platform::IntRect& srcRect, bool blend, unsigned char globalAlpha);
void fillWindow(Platform::Graphics::FillPattern, const Platform::IntRect& dstRect, const Platform::IntPoint& contentsOrigin, double contentsScale);
WebCore::Color webPageBackgroundColorUserInterfaceThread() const; // use WebSettings::backgroundColor() for the WebKit thread
void setWebPageBackgroundColor(const WebCore::Color&);
void invalidateWindow();
void invalidateWindow(const Platform::IntRect& dst);
void clearWindow(const Platform::IntRect&, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha = 255);
bool isScrollingOrZooming() const;
void setScrollingOrZooming(bool scrollingOrZooming, bool shouldBlit = true);
void lockBackingStore();
void unlockBackingStore();
BackingStoreGeometry* frontState() const;
BackingStoreGeometry* backState() const;
void swapState();
BackingStoreWindowBufferState* windowFrontBufferState() const;
BackingStoreWindowBufferState* windowBackBufferState() const;
static void setCurrentBackingStoreOwner(WebPage* webPage) { BackingStorePrivate::s_currentBackingStoreOwner = webPage; }
static WebPage* currentBackingStoreOwner() { return BackingStorePrivate::s_currentBackingStoreOwner; }
bool isActive() const;
// Surface abstraction, maybe BlackBerry::Platform::Graphics::Buffer could be made public instead.
BlackBerry::Platform::IntSize surfaceSize() const;
BlackBerry::Platform::Graphics::Buffer* buffer() const;
void didRenderContent(const Platform::IntRect& renderedRect);
static WebPage* s_currentBackingStoreOwner;
unsigned m_suspendScreenUpdates;
unsigned m_suspendBackingStoreUpdates;
BackingStore::ResumeUpdateOperation m_resumeOperation;
bool m_suspendRenderJobs;
bool m_suspendRegularRenderJobs;
bool m_tileMatrixNeedsUpdate;
bool m_isScrollingOrZooming;
WebPage* m_webPage;
BackingStoreClient* m_client;
OwnPtr<RenderQueue> m_renderQueue;
mutable Platform::IntSize m_previousDelta;
bool m_defersBlit;
bool m_hasBlitJobs;
WebCore::Color m_webPageBackgroundColor; // for user interface thread operations such as blitting
mutable unsigned m_frontState;
mutable unsigned m_backState;
unsigned m_currentWindowBackBuffer;
mutable BackingStoreWindowBufferState m_windowBufferState[2];
TileMatrixDirection m_preferredTileMatrixDimension;
Platform::IntRect m_visibleTileBufferRect;
pthread_mutex_t m_mutex;
#if USE(ACCELERATED_COMPOSITING)
mutable bool m_needsDrawLayersOnCommit; // Not thread safe, WebKit thread only
bool m_isDirectRenderingAnimationMessageScheduled;
#endif
protected:
virtual ~BackingStorePrivate();
};
} // namespace WebKit
} // namespace BlackBerry
#endif // BackingStore_p_h
|