summaryrefslogtreecommitdiffstats
path: root/cc/priority_calculator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc/priority_calculator.cc')
-rw-r--r--cc/priority_calculator.cc84
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