Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/layers/composite/FrameUniformityData.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "FrameUniformityData.h"
8
9
#include <map>
10
11
#include "Units.h"
12
#include "gfxPoint.h"
13
#include "mozilla/TimeStamp.h"
14
#include "mozilla/dom/APZTestDataBinding.h"
15
#include "mozilla/dom/ToJSValue.h"
16
#include "nsTArray.h"
17
18
namespace mozilla {
19
namespace layers {
20
21
using namespace gfx;
22
23
Point
24
LayerTransforms::GetAverage()
25
0
{
26
0
  MOZ_ASSERT(!mTransforms.IsEmpty());
27
0
28
0
  Point current = mTransforms[0];
29
0
  Point average;
30
0
  size_t length = mTransforms.Length();
31
0
32
0
  for (size_t i = 1; i < length; i++) {
33
0
    Point nextTransform = mTransforms[i];
34
0
    Point movement = nextTransform - current;
35
0
    average += Point(std::fabs(movement.x), std::fabs(movement.y));
36
0
    current = nextTransform;
37
0
  }
38
0
39
0
  average = average / (float) length;
40
0
  return average;
41
0
}
42
43
Point
44
LayerTransforms::GetStdDev()
45
0
{
46
0
  Point average = GetAverage();
47
0
  Point stdDev;
48
0
  Point current = mTransforms[0];
49
0
50
0
  for (size_t i = 1; i < mTransforms.Length(); i++) {
51
0
    Point next = mTransforms[i];
52
0
    Point move = next - current;
53
0
    move.x = fabs(move.x);
54
0
    move.y = fabs(move.y);
55
0
56
0
    Point diff = move - average;
57
0
    diff.x = diff.x * diff.x;
58
0
    diff.y = diff.y * diff.y;
59
0
    stdDev += diff;
60
0
61
0
    current = next;
62
0
  }
63
0
64
0
  stdDev = stdDev / mTransforms.Length();
65
0
  stdDev.x = sqrt(stdDev.x);
66
0
  stdDev.y = sqrt(stdDev.y);
67
0
  return stdDev;
68
0
}
69
70
LayerTransformRecorder::~LayerTransformRecorder()
71
0
{
72
0
  Reset();
73
0
}
74
75
void
76
LayerTransformRecorder::RecordTransform(Layer* aLayer, const Point& aTransform)
77
0
{
78
0
  LayerTransforms* layerTransforms = GetLayerTransforms((uintptr_t) aLayer);
79
0
  layerTransforms->mTransforms.AppendElement(aTransform);
80
0
}
81
82
void
83
LayerTransformRecorder::EndTest(FrameUniformityData* aOutData)
84
0
{
85
0
  for (auto iter = mFrameTransforms.begin(); iter != mFrameTransforms.end(); ++iter) {
86
0
    uintptr_t layer = iter->first;
87
0
    float uniformity = CalculateFrameUniformity(layer);
88
0
89
0
    std::pair<uintptr_t,float> result(layer, uniformity);
90
0
    aOutData->mUniformities.insert(result);
91
0
  }
92
0
93
0
  Reset();
94
0
}
95
96
LayerTransforms*
97
LayerTransformRecorder::GetLayerTransforms(uintptr_t aLayer)
98
0
{
99
0
  if (!mFrameTransforms.count(aLayer)) {
100
0
    LayerTransforms* newTransform = new LayerTransforms();
101
0
    std::pair<uintptr_t, LayerTransforms*> newLayer(aLayer, newTransform);
102
0
    mFrameTransforms.insert(newLayer);
103
0
  }
104
0
105
0
  return mFrameTransforms.find(aLayer)->second;
106
0
}
107
108
void
109
LayerTransformRecorder::Reset()
110
0
{
111
0
  for (auto iter = mFrameTransforms.begin(); iter != mFrameTransforms.end(); ++iter) {
112
0
    LayerTransforms* layerTransforms = iter->second;
113
0
    delete layerTransforms;
114
0
  }
115
0
116
0
  mFrameTransforms.clear();
117
0
}
118
119
float
120
LayerTransformRecorder::CalculateFrameUniformity(uintptr_t aLayer)
121
0
{
122
0
  LayerTransforms* layerTransform = GetLayerTransforms(aLayer);
123
0
  float yUniformity = -1;
124
0
  if (!layerTransform->mTransforms.IsEmpty()) {
125
0
    Point stdDev = layerTransform->GetStdDev();
126
0
    yUniformity = stdDev.y;
127
0
  }
128
0
  return yUniformity;
129
0
}
130
131
bool
132
FrameUniformityData::ToJS(JS::MutableHandleValue aOutValue, JSContext* aContext)
133
0
{
134
0
  dom::FrameUniformityResults results;
135
0
  dom::Sequence<dom::FrameUniformity>& layers = results.mLayerUniformities.Construct();
136
0
137
0
  for (auto iter = mUniformities.begin(); iter != mUniformities.end(); ++iter) {
138
0
    uintptr_t layerAddr = iter->first;
139
0
    float uniformity = iter->second;
140
0
141
0
    // FIXME: Make this infallible after bug 968520 is done.
142
0
    MOZ_ALWAYS_TRUE(layers.AppendElement(fallible));
143
0
    dom::FrameUniformity& entry = layers.LastElement();
144
0
145
0
    entry.mLayerAddress.Construct() = layerAddr;
146
0
    entry.mFrameUniformity.Construct() = uniformity;
147
0
  }
148
0
149
0
  return dom::ToJSValue(aContext, results, aOutValue);
150
0
}
151
152
} // namespace layers
153
} // namespace mozilla