blob: b565acc12be64fb204d2718cf11aff9e7b4e2972 [file] [log] [blame]
// Copyright 2015 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 <string>
#include <iostream>
#include <iomanip>
#include "sky/compositor/statistics_layer.h"
namespace sky {
namespace compositor {
StatisticsLayer::StatisticsLayer(uint64_t enabledOptions)
: options_(enabledOptions) {
}
static void PaintContext_DrawStatisticsText(SkCanvas& canvas,
const std::string& string,
int x,
int y) {
SkPaint paint;
paint.setTextSize(14);
paint.setLinearText(false);
paint.setColor(SK_ColorRED);
canvas.drawText(string.c_str(), string.size(), x, y, paint);
}
static void VisualizeStopWatch(SkCanvas& canvas,
const instrumentation::Stopwatch& stopwatch,
SkScalar width,
bool show_graph,
bool show_labels,
std::string label_prefix) {
const int x = 8;
const int y = 70;
const int height = 80;
if (show_graph) {
SkRect visualizationRect = SkRect::MakeWH(width, height);
stopwatch.visualize(canvas, visualizationRect);
}
if (show_labels) {
double msPerFrame = stopwatch.lastLap().InMillisecondsF();
double fps = 1e3 / msPerFrame;
std::stringstream stream;
stream.setf(std::ios::fixed | std::ios::showpoint);
stream << std::setprecision(2);
stream << label_prefix << " " << fps << " FPS | " << msPerFrame
<< "ms/frame";
PaintContext_DrawStatisticsText(canvas, stream.str(), x, y);
}
if (show_labels || show_graph) {
canvas.translate(0, height);
}
}
void StatisticsLayer::Paint(PaintContext::ScopedFrame& frame) {
if (!options_.anyEnabled()) {
return;
}
using Opt = CompositorOptions::Option;
SkScalar width = paint_bounds().width();
SkAutoCanvasRestore save(&frame.canvas(), false);
VisualizeStopWatch(frame.canvas(), frame.context().frame_time(), width,
options_.isEnabled(Opt::VisualizeRasterizerStatistics),
options_.isEnabled(Opt::DisplayRasterizerStatistics),
"Rasterizer");
VisualizeStopWatch(frame.canvas(), frame.context().engine_time(), width,
options_.isEnabled(Opt::VisualizeEngineStatistics),
options_.isEnabled(Opt::DisplayEngineStatistics),
"Engine");
}
} // namespace compositor
} // namespace sky