| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/heads_up_display_layer_impl.h" | 5 #include "cc/heads_up_display_layer_impl.h" |
| 6 | 6 |
| 7 #include <limits> | |
| 8 | |
| 9 #include "base/stringprintf.h" | 7 #include "base/stringprintf.h" |
| 10 #include "cc/debug_colors.h" | 8 #include "cc/debug_colors.h" |
| 11 #include "cc/debug_rect_history.h" | 9 #include "cc/debug_rect_history.h" |
| 12 #include "cc/font_atlas.h" | 10 #include "cc/font_atlas.h" |
| 13 #include "cc/frame_rate_counter.h" | 11 #include "cc/frame_rate_counter.h" |
| 14 #include "cc/layer_tree_impl.h" | 12 #include "cc/layer_tree_impl.h" |
| 13 #include "cc/paint_time_counter.h" |
| 15 #include "cc/quad_sink.h" | 14 #include "cc/quad_sink.h" |
| 16 #include "cc/renderer.h" | 15 #include "cc/renderer.h" |
| 17 #include "cc/texture_draw_quad.h" | 16 #include "cc/texture_draw_quad.h" |
| 18 #include "skia/ext/platform_canvas.h" | 17 #include "skia/ext/platform_canvas.h" |
| 19 #include "skia/ext/platform_canvas.h" | 18 #include "skia/ext/platform_canvas.h" |
| 20 #include "third_party/khronos/GLES2/gl2.h" | 19 #include "third_party/khronos/GLES2/gl2.h" |
| 21 #include "third_party/khronos/GLES2/gl2ext.h" | 20 #include "third_party/khronos/GLES2/gl2ext.h" |
| 22 #include "third_party/skia/include/core/SkBitmap.h" | 21 #include "third_party/skia/include/core/SkBitmap.h" |
| 23 #include "third_party/skia/include/core/SkPaint.h" | 22 #include "third_party/skia/include/core/SkPaint.h" |
| 24 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" | 23 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 40 swizzleMatrix.fMat[3 + 5 * 3] = 1; | 39 swizzleMatrix.fMat[3 + 5 * 3] = 1; |
| 41 | 40 |
| 42 SkPaint paint; | 41 SkPaint paint; |
| 43 skia::RefPtr<SkColorMatrixFilter> filter = | 42 skia::RefPtr<SkColorMatrixFilter> filter = |
| 44 skia::AdoptRef(new SkColorMatrixFilter(swizzleMatrix)); | 43 skia::AdoptRef(new SkColorMatrixFilter(swizzleMatrix)); |
| 45 paint.setColorFilter(filter.get()); | 44 paint.setColorFilter(filter.get()); |
| 46 | 45 |
| 47 return paint; | 46 return paint; |
| 48 } | 47 } |
| 49 | 48 |
| 49 HeadsUpDisplayLayerImpl::Graph::Graph(double indicatorValue, double startHigh) |
| 50 : current(0) |
| 51 , min(0) |
| 52 , max(0) |
| 53 , high(startHigh) |
| 54 , defaultHigh(startHigh) |
| 55 , indicator(indicatorValue) |
| 56 { |
| 57 } |
| 58 |
| 59 double HeadsUpDisplayLayerImpl::Graph::updateHigh(Graph& graph) |
| 60 { |
| 61 double targetHigh = std::max(graph.max, graph.defaultHigh); |
| 62 graph.high += (targetHigh - graph.high) * 0.5; |
| 63 return graph.high; |
| 64 } |
| 65 |
| 50 HeadsUpDisplayLayerImpl::HeadsUpDisplayLayerImpl(LayerTreeImpl* treeImpl, int id
) | 66 HeadsUpDisplayLayerImpl::HeadsUpDisplayLayerImpl(LayerTreeImpl* treeImpl, int id
) |
| 51 : LayerImpl(treeImpl, id) | 67 : LayerImpl(treeImpl, id) |
| 52 , m_averageFPS(0) | 68 , m_fpsGraph(60.0, 80.0) |
| 53 , m_minFPS(0) | 69 , m_paintTimeGraph(16.0, 48.0) |
| 54 , m_maxFPS(0) | |
| 55 { | 70 { |
| 56 } | 71 } |
| 57 | 72 |
| 58 HeadsUpDisplayLayerImpl::~HeadsUpDisplayLayerImpl() | 73 HeadsUpDisplayLayerImpl::~HeadsUpDisplayLayerImpl() |
| 59 { | 74 { |
| 60 } | 75 } |
| 61 | 76 |
| 62 void HeadsUpDisplayLayerImpl::setFontAtlas(scoped_ptr<FontAtlas> fontAtlas) | 77 void HeadsUpDisplayLayerImpl::setFontAtlas(scoped_ptr<FontAtlas> fontAtlas) |
| 63 { | 78 { |
| 64 m_fontAtlas = fontAtlas.Pass(); | 79 m_fontAtlas = fontAtlas.Pass(); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 | 165 |
| 151 bool HeadsUpDisplayLayerImpl::layerIsAlwaysDamaged() const | 166 bool HeadsUpDisplayLayerImpl::layerIsAlwaysDamaged() const |
| 152 { | 167 { |
| 153 return true; | 168 return true; |
| 154 } | 169 } |
| 155 | 170 |
| 156 void HeadsUpDisplayLayerImpl::drawHudContents(SkCanvas* canvas) | 171 void HeadsUpDisplayLayerImpl::drawHudContents(SkCanvas* canvas) |
| 157 { | 172 { |
| 158 const LayerTreeDebugState& debugState = layerTreeImpl()->debug_state(); | 173 const LayerTreeDebugState& debugState = layerTreeImpl()->debug_state(); |
| 159 | 174 |
| 175 FrameRateCounter* fpsCounter = layerTreeImpl()->frame_rate_counter(); |
| 176 PaintTimeCounter* paintTimeCounter = layerTreeImpl()->paint_time_counter(); |
| 177 |
| 160 if (debugState.showPlatformLayerTree) { | 178 if (debugState.showPlatformLayerTree) { |
| 161 SkPaint paint = createPaint(); | 179 SkPaint paint = createPaint(); |
| 162 paint.setColor(SkColorSetARGB(192, 0, 0, 0)); | 180 drawGraphBackground(canvas, paint, SkRect::MakeXYWH(0, 0, bounds().width
(), bounds().height())); |
| 163 canvas->drawRect(SkRect::MakeXYWH(0, 0, bounds().width(), bounds().heigh
t()), paint); | |
| 164 } | 181 } |
| 165 | 182 |
| 166 int platformLayerTreeTop = 0; | 183 int top = 0; |
| 167 | 184 |
| 168 if (debugState.showFPSCounter) | 185 if (debugState.continuousPainting || debugState.showFPSCounter) { |
| 169 platformLayerTreeTop = drawFPSCounter(canvas, layerTreeImpl()->frame_rat
e_counter()); | 186 // Update numbers not every frame so text is readable |
| 187 base::TimeTicks now = base::TimeTicks::Now(); |
| 188 if (base::TimeDelta(now - m_lastGraphNumbersUpdate).InSecondsF() > 0.25)
{ |
| 189 m_fpsGraph.current = fpsCounter->getAverageFPS(); |
| 190 fpsCounter->getMinAndMaxFPS(m_fpsGraph.min, m_fpsGraph.max); |
| 191 |
| 192 m_paintTimeGraph.current = paintTimeCounter->GetPaintTimeOfRecentFra
me(paintTimeCounter->HistorySize() - 1); |
| 193 paintTimeCounter->GetMinAndMaxPaintTime(&m_paintTimeGraph.min, &m_pa
intTimeGraph.max); |
| 194 |
| 195 m_lastGraphNumbersUpdate = now; |
| 196 } |
| 197 |
| 198 if (debugState.continuousPainting) |
| 199 top = drawPaintTimeDisplay(canvas, paintTimeCounter, top); |
| 200 // Don't show the FPS display when continuous painting is enabled, becau
se it would show misleading numbers. |
| 201 else if (debugState.showFPSCounter) |
| 202 top = drawFPSDisplay(canvas, fpsCounter, top); |
| 203 } |
| 170 | 204 |
| 171 if (debugState.showPlatformLayerTree && m_fontAtlas) { | 205 if (debugState.showPlatformLayerTree && m_fontAtlas) { |
| 172 std::string layerTree = layerTreeImpl()->layer_tree_as_text(); | 206 std::string layerTree = layerTreeImpl()->layer_tree_as_text(); |
| 173 m_fontAtlas->drawText(canvas, createPaint(), layerTree, gfx::Point(2, pl
atformLayerTreeTop), bounds()); | 207 m_fontAtlas->drawText(canvas, createPaint(), layerTree, gfx::Point(2, to
p), bounds()); |
| 174 } | 208 } |
| 175 | 209 |
| 176 if (debugState.showHudRects()) | 210 if (debugState.showHudRects()) |
| 177 drawDebugRects(canvas, layerTreeImpl()->debug_rect_history()); | 211 drawDebugRects(canvas, layerTreeImpl()->debug_rect_history()); |
| 178 } | 212 } |
| 179 | 213 |
| 180 int HeadsUpDisplayLayerImpl::drawFPSCounter(SkCanvas* canvas, FrameRateCounter*
fpsCounter) | 214 void HeadsUpDisplayLayerImpl::drawTextLeftAligned(SkCanvas* canvas, SkPaint& pai
nt, SkRect bounds, std::string text) |
| 215 { |
| 216 if (!m_fontAtlas) |
| 217 return; |
| 218 |
| 219 m_fontAtlas->drawText(canvas, paint, text, gfx::Point(bounds.left(), bounds.
top()), gfx::Size(bounds.width(), bounds.height())); |
| 220 } |
| 221 |
| 222 void HeadsUpDisplayLayerImpl::drawTextRightAligned(SkCanvas* canvas, SkPaint& pa
int, SkRect bounds, std::string text) |
| 223 { |
| 224 if (!m_fontAtlas) |
| 225 return; |
| 226 |
| 227 int textWidth = m_fontAtlas->textSize(text).width(); |
| 228 |
| 229 gfx::Point textPosition(bounds.right() - textWidth, bounds.top()); |
| 230 gfx::Size textArea(bounds.width(), bounds.height()); |
| 231 |
| 232 m_fontAtlas->drawText(canvas, paint, text, textPosition, textArea); |
| 233 } |
| 234 |
| 235 void HeadsUpDisplayLayerImpl::drawGraphBackground(SkCanvas* canvas, SkPaint& pai
nt, SkRect bounds) |
| 236 { |
| 237 paint.setColor(SkColorSetARGB(215, 17, 17, 17)); |
| 238 canvas->drawRect(bounds, paint); |
| 239 } |
| 240 |
| 241 void HeadsUpDisplayLayerImpl::drawGraphLines(SkCanvas* canvas, SkPaint& paint, S
kRect bounds, Graph& graph) |
| 242 { |
| 243 // Draw top and bottom line. |
| 244 paint.setColor(SkColorSetRGB(130, 130, 130)); |
| 245 canvas->drawLine(bounds.left(), bounds.top() - 1, bounds.right(), bounds.top
() - 1, paint); |
| 246 canvas->drawLine(bounds.left(), bounds.bottom(), bounds.right(), bounds.bott
om(), paint); |
| 247 |
| 248 // Draw indicator line. |
| 249 paint.setColor(SkColorSetRGB(100, 100, 100)); |
| 250 const double indicatorTop = bounds.height() * (1 - graph.indicator / graph.h
igh) - 1; |
| 251 canvas->drawLine(bounds.left(), bounds.top() + indicatorTop, bounds.right(),
bounds.top() + indicatorTop, paint); |
| 252 } |
| 253 |
| 254 int HeadsUpDisplayLayerImpl::drawFPSDisplay(SkCanvas* canvas, FrameRateCounter*
fpsCounter, int top) |
| 181 { | 255 { |
| 182 const int padding = 4; | 256 const int padding = 4; |
| 183 const int gap = 6; | 257 const int gap = 6; |
| 184 | 258 |
| 185 const int fontHeight = m_fontAtlas.get() ? m_fontAtlas->fontHeight() : 0; | 259 const int fontHeight = m_fontAtlas.get() ? m_fontAtlas->fontHeight() : 0; |
| 186 | 260 |
| 187 const int graphWidth = fpsCounter->timeStampHistorySize() - 3; | 261 const int graphWidth = fpsCounter->timeStampHistorySize() - 2; |
| 188 const int graphHeight = 40; | 262 const int graphHeight = 40; |
| 189 | 263 |
| 190 const int histogramWidth = 37; | 264 const int histogramWidth = 37; |
| 191 | 265 |
| 192 const int width = graphWidth + histogramWidth + 4 * padding; | 266 const int width = graphWidth + histogramWidth + 4 * padding; |
| 193 const int height = fontHeight + graphHeight + 4 * padding + 2; | 267 const int height = fontHeight + graphHeight + 4 * padding + 2; |
| 194 | 268 |
| 195 const int left = bounds().width() - width - 2; | 269 const int left = bounds().width() - width - 2; |
| 196 const int top = 2; | 270 top += 2; |
| 197 | 271 |
| 198 SkPaint paint = createPaint(); | 272 SkPaint paint = createPaint(); |
| 199 | 273 drawGraphBackground(canvas, paint, SkRect::MakeXYWH(left, top, width, height
)); |
| 200 // Draw background. | |
| 201 paint.setColor(SkColorSetARGB(215, 17, 17, 17)); | |
| 202 canvas->drawRect(SkRect::MakeXYWH(left, top, width, height), paint); | |
| 203 | 274 |
| 204 SkRect textBounds = SkRect::MakeXYWH(left + padding, top + padding, graphWid
th + histogramWidth + gap + 2, fontHeight); | 275 SkRect textBounds = SkRect::MakeXYWH(left + padding, top + padding, graphWid
th + histogramWidth + gap + 2, fontHeight); |
| 205 SkRect graphBounds = SkRect::MakeXYWH(left + padding, textBounds.bottom() +
2 * padding, graphWidth, graphHeight); | 276 SkRect graphBounds = SkRect::MakeXYWH(left + padding, textBounds.bottom() +
2 * padding, graphWidth, graphHeight); |
| 206 SkRect histogramBounds = SkRect::MakeXYWH(graphBounds.right() + gap, graphBo
unds.top(), histogramWidth, graphHeight); | 277 SkRect histogramBounds = SkRect::MakeXYWH(graphBounds.right() + gap, graphBo
unds.top(), histogramWidth, graphHeight); |
| 207 | 278 |
| 208 drawFPSCounterText(canvas, paint, fpsCounter, textBounds); | 279 drawTextLeftAligned(canvas, paint, textBounds, base::StringPrintf("FPS:%5.1f
", m_fpsGraph.current)); |
| 209 drawFPSCounterGraphAndHistogram(canvas, paint, fpsCounter, graphBounds, hist
ogramBounds); | 280 drawTextRightAligned(canvas, paint, textBounds, base::StringPrintf("%.0f-%.0
f", m_fpsGraph.min, m_fpsGraph.max)); |
| 210 | 281 |
| 211 return top + height; | 282 const double high = Graph::updateHigh(m_fpsGraph); |
| 212 } | 283 drawGraphLines(canvas, paint, graphBounds, m_fpsGraph); |
| 213 | |
| 214 void HeadsUpDisplayLayerImpl::drawFPSCounterText(SkCanvas* canvas, SkPaint& pain
t, FrameRateCounter* fpsCounter, SkRect bounds) | |
| 215 { | |
| 216 // Update FPS text - not every frame so text is readable | |
| 217 base::TimeTicks now = base::TimeTicks::Now(); | |
| 218 if (base::TimeDelta(now - textUpdateTime).InSecondsF() > 0.25) { | |
| 219 m_averageFPS = fpsCounter->getAverageFPS(); | |
| 220 textUpdateTime = now; | |
| 221 } | |
| 222 | |
| 223 // Draw FPS text. | |
| 224 if (m_fontAtlas.get()) { | |
| 225 std::string fpsText = base::StringPrintf("FPS:%5.1f", m_averageFPS); | |
| 226 std::string minMaxText = base::StringPrintf("%.0f-%.0f", std::min( m_min
FPS, m_maxFPS), m_maxFPS); | |
| 227 | |
| 228 int minMaxWidth = m_fontAtlas->textSize(minMaxText).width(); | |
| 229 gfx::Size textArea(bounds.width(), bounds.height()); | |
| 230 | |
| 231 paint.setColor(SK_ColorRED); | |
| 232 m_fontAtlas->drawText(canvas, paint, fpsText, gfx::Point(bounds.left(),
bounds.top()), textArea); | |
| 233 m_fontAtlas->drawText(canvas, paint, minMaxText, gfx::Point(bounds.right
() - minMaxWidth, bounds.top()), textArea); | |
| 234 } | |
| 235 } | |
| 236 | |
| 237 void HeadsUpDisplayLayerImpl::drawFPSCounterGraphAndHistogram(SkCanvas* canvas,
SkPaint& paint, FrameRateCounter* fpsCounter, SkRect graphBounds, SkRect histogr
amBounds) | |
| 238 { | |
| 239 const double loFPS = 0; | |
| 240 const double hiFPS = std::max(m_maxFPS + 10.0, 80.0); | |
| 241 | |
| 242 // Draw top and bottom line. | |
| 243 paint.setColor(SkColorSetRGB(130, 130, 130)); | |
| 244 canvas->drawLine(graphBounds.left(), graphBounds.top() - 1, graphBounds.righ
t(), graphBounds.top() - 1, paint); | |
| 245 canvas->drawLine(graphBounds.left(), graphBounds.bottom(), graphBounds.right
(), graphBounds.bottom(), paint); | |
| 246 | |
| 247 // Draw 60fps line. | |
| 248 const double top60 = graphBounds.top() + graphBounds.height() * (1 - ((60 -
loFPS) / (hiFPS - loFPS))) - 1; | |
| 249 paint.setColor(SkColorSetRGB(100, 100, 100)); | |
| 250 canvas->drawLine(graphBounds.left(), top60, graphBounds.right(), top60, pain
t); | |
| 251 | 284 |
| 252 // Collect graph and histogram data. | 285 // Collect graph and histogram data. |
| 253 int x = 0; | 286 int x = 0; |
| 254 SkPath path; | 287 SkPath path; |
| 255 | 288 |
| 256 m_minFPS = std::numeric_limits<double>::max(); | |
| 257 m_maxFPS = 0; | |
| 258 | |
| 259 const int histogramSize = 20; | 289 const int histogramSize = 20; |
| 260 double histogram[histogramSize] = {0}; | 290 double histogram[histogramSize] = {0}; |
| 261 double maxBucketValue = 0; | 291 double maxBucketValue = 0; |
| 262 | 292 |
| 263 for (size_t i = 1; i < fpsCounter->timeStampHistorySize() - 1; ++i) { | 293 for (size_t i = 0; i < fpsCounter->timeStampHistorySize() - 1; ++i) { |
| 264 base::TimeDelta delta = fpsCounter->timeStampOfRecentFrame(i + 1) - fpsC
ounter->timeStampOfRecentFrame(i); | 294 base::TimeDelta delta = fpsCounter->timeStampOfRecentFrame(i + 1) - fpsC
ounter->timeStampOfRecentFrame(i); |
| 265 | 295 |
| 266 // Skip this particular instantaneous frame rate if it is not likely to
have been valid. | 296 // Skip this particular instantaneous frame rate if it is not likely to
have been valid. |
| 267 if (!fpsCounter->isBadFrameInterval(delta)) { | 297 if (!fpsCounter->isBadFrameInterval(delta)) { |
| 268 | 298 |
| 269 double fps = 1.0 / delta.InSecondsF(); | 299 double fps = 1.0 / delta.InSecondsF(); |
| 270 | 300 |
| 271 m_minFPS = std::min(fps, m_minFPS); | |
| 272 m_maxFPS = std::max(fps, m_maxFPS); | |
| 273 | |
| 274 // Clamp the FPS to the range we want to plot visually. | 301 // Clamp the FPS to the range we want to plot visually. |
| 275 double p = (fps - loFPS) / (hiFPS - loFPS); | 302 double p = fps / high; |
| 276 if (p < 0) | |
| 277 p = 0; | |
| 278 if (p > 1) | 303 if (p > 1) |
| 279 p = 1; | 304 p = 1; |
| 280 | 305 |
| 281 // Plot this data point. | 306 // Plot this data point. |
| 282 SkPoint cur = SkPoint::Make(graphBounds.left() + x, graphBounds.bott
om() - p * graphBounds.height()); | 307 SkPoint cur = SkPoint::Make(graphBounds.left() + x, graphBounds.bott
om() - p * graphBounds.height()); |
| 283 if (path.isEmpty()) | 308 if (path.isEmpty()) |
| 284 path.moveTo(cur); | 309 path.moveTo(cur); |
| 285 else | 310 else |
| 286 path.lineTo(cur); | 311 path.lineTo(cur); |
| 287 | 312 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 310 canvas->drawRect(SkRect::MakeXYWH(histogramBounds.left(), histogramB
ounds.bottom() - (i + 1) * barHeight, barWidth, 1), paint); | 335 canvas->drawRect(SkRect::MakeXYWH(histogramBounds.left(), histogramB
ounds.bottom() - (i + 1) * barHeight, barWidth, 1), paint); |
| 311 } | 336 } |
| 312 } | 337 } |
| 313 | 338 |
| 314 // Draw FPS graph. | 339 // Draw FPS graph. |
| 315 paint.setAntiAlias(true); | 340 paint.setAntiAlias(true); |
| 316 paint.setStyle(SkPaint::kStroke_Style); | 341 paint.setStyle(SkPaint::kStroke_Style); |
| 317 paint.setStrokeWidth(1); | 342 paint.setStrokeWidth(1); |
| 318 | 343 |
| 319 canvas->drawPath(path, paint); | 344 canvas->drawPath(path, paint); |
| 345 |
| 346 return top + height; |
| 347 } |
| 348 |
| 349 int HeadsUpDisplayLayerImpl::drawPaintTimeDisplay(SkCanvas* canvas, PaintTimeCou
nter* paintTimeCounter, int top) |
| 350 { |
| 351 const int padding = 4; |
| 352 const int fontHeight = m_fontAtlas.get() ? m_fontAtlas->fontHeight() : 0; |
| 353 |
| 354 const int graphWidth = paintTimeCounter->HistorySize() * 2 - 1; |
| 355 const int graphHeight = 40; |
| 356 |
| 357 const int width = graphWidth + 2 * padding; |
| 358 const int height = fontHeight + graphHeight + 4 * padding + 2 + fontHeight +
padding; |
| 359 |
| 360 const int left = bounds().width() - width - 2; |
| 361 top += 2; |
| 362 |
| 363 SkPaint paint = createPaint(); |
| 364 drawGraphBackground(canvas, paint, SkRect::MakeXYWH(left, top, width, height
)); |
| 365 |
| 366 SkRect textBounds = SkRect::MakeXYWH(left + padding, top + padding, graphWid
th, fontHeight); |
| 367 SkRect textBounds2 = SkRect::MakeXYWH(left + padding, textBounds.bottom() +
padding, graphWidth, fontHeight); |
| 368 SkRect graphBounds = SkRect::MakeXYWH(left + padding, textBounds2.bottom() +
2 * padding, graphWidth, graphHeight); |
| 369 |
| 370 drawTextLeftAligned(canvas, paint, textBounds, "Page paint time (ms)"); |
| 371 drawTextLeftAligned(canvas, paint, textBounds2, base::StringPrintf("%5.1f",
m_paintTimeGraph.current)); |
| 372 drawTextRightAligned(canvas, paint, textBounds2, base::StringPrintf("%.1f-%.
1f", m_paintTimeGraph.min, m_paintTimeGraph.max)); |
| 373 |
| 374 const double high = Graph::updateHigh(m_paintTimeGraph); |
| 375 drawGraphLines(canvas, paint, graphBounds, m_paintTimeGraph); |
| 376 |
| 377 // Same green as used for paint times in the WebInspector Timeline |
| 378 paint.setColor(SkColorSetRGB(95, 160, 80)); |
| 379 for (size_t i = 0; i < paintTimeCounter->HistorySize(); ++i) { |
| 380 double pt = paintTimeCounter->GetPaintTimeOfRecentFrame(i); |
| 381 |
| 382 if (pt == 0.0) |
| 383 continue; |
| 384 |
| 385 double p = pt / high; |
| 386 if (p > 1) |
| 387 p = 1; |
| 388 |
| 389 canvas->drawRect(SkRect::MakeXYWH(graphBounds.left() + i * 2, graphBound
s.bottom() - p * graphBounds.height(), 1, p * graphBounds.height()), paint); |
| 390 } |
| 391 |
| 392 return top + height; |
| 320 } | 393 } |
| 321 | 394 |
| 322 void HeadsUpDisplayLayerImpl::drawDebugRects(SkCanvas* canvas, DebugRectHistory*
debugRectHistory) | 395 void HeadsUpDisplayLayerImpl::drawDebugRects(SkCanvas* canvas, DebugRectHistory*
debugRectHistory) |
| 323 { | 396 { |
| 324 const std::vector<DebugRect>& debugRects = debugRectHistory->debugRects(); | 397 const std::vector<DebugRect>& debugRects = debugRectHistory->debugRects(); |
| 325 float rectScale = 1 / layerTreeImpl()->device_scale_factor(); | 398 float rectScale = 1 / layerTreeImpl()->device_scale_factor(); |
| 326 | 399 |
| 327 canvas->save(); | 400 canvas->save(); |
| 328 canvas->scale(rectScale, rectScale); | 401 canvas->scale(rectScale, rectScale); |
| 329 | 402 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 | 457 |
| 385 canvas->restore(); | 458 canvas->restore(); |
| 386 } | 459 } |
| 387 | 460 |
| 388 const char* HeadsUpDisplayLayerImpl::layerTypeAsString() const | 461 const char* HeadsUpDisplayLayerImpl::layerTypeAsString() const |
| 389 { | 462 { |
| 390 return "HeadsUpDisplayLayer"; | 463 return "HeadsUpDisplayLayer"; |
| 391 } | 464 } |
| 392 | 465 |
| 393 } // namespace cc | 466 } // namespace cc |
| OLD | NEW |