diff options
Diffstat (limited to 'cc/priority_calculator.cc')
-rw-r--r-- | cc/priority_calculator.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/cc/priority_calculator.cc b/cc/priority_calculator.cc new file mode 100644 index 0000000..055520c --- /dev/null +++ b/cc/priority_calculator.cc @@ -0,0 +1,84 @@ +// Copyright 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "config.h" + +#include "CCPriorityCalculator.h" + +using namespace std; + +namespace cc { + +static const int uiDrawsToRootSurfacePriority = -1; +static const int visibleDrawsToRootSurfacePriority = 0; +static const int renderSurfacesPriority = 1; +static const int uiDoesNotDrawToRootSurfacePriority = 2; +static const int visibleDoesNotDrawToRootSurfacePriority = 3; + +// The lower digits are how far from being visible the texture is, +// in pixels. +static const int notVisibleBasePriority = 1000000; +static const int notVisibleLimitPriority = 1900000; + +// Small animated layers are treated as though they are 512 pixels +// from being visible. +static const int smallAnimatedLayerPriority = notVisibleBasePriority + 512; + +static const int lingeringBasePriority = 2000000; +static const int lingeringLimitPriority = 2900000; + +// static +int CCPriorityCalculator::uiPriority(bool drawsToRootSurface) +{ + return drawsToRootSurface ? uiDrawsToRootSurfacePriority : uiDoesNotDrawToRootSurfacePriority; +} + +// static +int CCPriorityCalculator::visiblePriority(bool drawsToRootSurface) +{ + return drawsToRootSurface ? visibleDrawsToRootSurfacePriority : visibleDoesNotDrawToRootSurfacePriority; +} + +// static +int CCPriorityCalculator::renderSurfacePriority() +{ + return renderSurfacesPriority; +} + +// static +int CCPriorityCalculator::lingeringPriority(int previousPriority) +{ + // FIXME: We should remove this once we have priorities for all + // textures (we can't currently calculate distances for + // off-screen textures). + return min(lingeringLimitPriority, + max(lingeringBasePriority, previousPriority + 1)); +} + +namespace { +int manhattanDistance(const IntRect& a, const IntRect& b) +{ + IntRect c = unionRect(a, b); + int x = max(0, c.width() - a.width() - b.width() + 1); + int y = max(0, c.height() - a.height() - b.height() + 1); + return (x + y); +} +} + +// static +int CCPriorityCalculator::priorityFromDistance(const IntRect& visibleRect, const IntRect& textureRect, bool drawsToRootSurface) +{ + int distance = manhattanDistance(visibleRect, textureRect); + if (!distance) + return visiblePriority(drawsToRootSurface); + return min(notVisibleLimitPriority, notVisibleBasePriority + distance); +} + +// static +int CCPriorityCalculator::smallAnimatedLayerMinPriority() +{ + return smallAnimatedLayerPriority; +} + +} // cc |