blob: de6e497b372698f52265890795e449e46a3de595 [file] [log] [blame]
// Copyright 2017 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 "ui/gfx/paint_vector_icon.h"
#include <gtest/gtest.h>
#include <vector>
#include "cc/paint/paint_record.h"
#include "cc/paint/paint_recorder.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkPath.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/vector_icon_types.h"
namespace gfx {
namespace {
class MockCanvas : public SkCanvas {
public:
MockCanvas(int width, int height) : SkCanvas(width, height) {}
// SkCanvas overrides:
void onDrawPath(const SkPath& path, const SkPaint& paint) override {
paths_.push_back(path);
}
const std::vector<SkPath>& paths() const { return paths_; }
private:
std::vector<SkPath> paths_;
DISALLOW_COPY_AND_ASSIGN(MockCanvas);
};
// Tests that a relative move to command (R_MOVE_TO) after a close command
// (CLOSE) uses the correct starting point. See crbug.com/697497
TEST(VectorIconTest, RelativeMoveToAfterClose) {
cc::PaintRecorder recorder;
Canvas canvas(recorder.beginRecording(100, 100), 1.0f);
const PathElement elements[] = {
MOVE_TO, 4, 5,
LINE_TO, 10, 11,
CLOSE,
// This move should use (4, 5) as the start point rather than (10, 11).
R_MOVE_TO, 20, 21,
R_LINE_TO, 50, 51,
END,
};
const VectorIcon icon = {elements, nullptr};
PaintVectorIcon(&canvas, icon, 100, SK_ColorMAGENTA);
sk_sp<cc::PaintRecord> record = recorder.finishRecordingAsPicture();
MockCanvas mock(100, 100);
record->Playback(&mock);
ASSERT_EQ(1U, mock.paths().size());
SkPoint last_point;
EXPECT_TRUE(mock.paths()[0].getLastPt(&last_point));
EXPECT_EQ(SkIntToScalar(74), last_point.x());
EXPECT_EQ(SkIntToScalar(77), last_point.y());
}
} // namespace
} // namespace gfx