Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
hugepath.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm/gm.h"
11#include "include/core/SkPath.h"
12#include "include/core/SkRect.h"
16
17DEF_SIMPLE_GM(path_huge_crbug_800804, canvas, 50, 600) {
19 paint.setAntiAlias(true);
21
22 // exercise various special-cases (e.g. hairlines or not)
23 const float widths[] = { 0.9f, 1.0f, 1.1f };
24
25 SkPath path;
26 for (float w : widths) {
27 paint.setStrokeWidth(w);
28
29 path.reset();
30 path.moveTo(-1000,12345678901234567890.f);
31 path.lineTo(10.5f,200);
32 canvas->drawPath(path, paint);
33
34 path.reset();
35 path.moveTo(30.5f,400);
36 path.lineTo(1000,-9.8765432109876543210e+19f);
37 canvas->drawPath(path, paint);
38
39 canvas->translate(3, 0);
40 }
41}
42
43// Test that we can draw into a huge surface ( > 64K ) and still retain paths and antialiasing.
44static void draw_huge_path(SkCanvas* canvas, int w, int h, bool manual) {
45 SkAutoCanvasRestore acr(canvas, true);
46
48 auto can = surf->getCanvas();
49
51 SkPath path;
52 path.addRoundRect(SkRect::MakeXYWH(4, 4, w - 8, h - 8), 12, 12);
53
54 canvas->save();
55 canvas->clipRect(SkRect::MakeXYWH(4, 4, 64, 64));
56 can->drawPath(path, paint);
57 if (manual) {
58 SkTiledImageUtils::DrawImage(canvas, surf->makeImageSnapshot(), 64 - w, 0);
59 } else {
60 canvas->drawImage(surf->makeImageSnapshot(), 64 - w, 0);
61 }
62 canvas->restore();
63
64 canvas->translate(80, 0);
65 canvas->save();
66 canvas->clipRect(SkRect::MakeXYWH(4, 4, 64, 64));
67 can->clear(0);
68 paint.setAntiAlias(true);
69 can->drawPath(path, paint);
70 if (manual) {
71 SkTiledImageUtils::DrawImage(canvas, surf->makeImageSnapshot(), 64 - w, 0);
72 } else {
73 canvas->drawImage(surf->makeImageSnapshot(), 64 - w, 0);
74 }
75 canvas->restore();
76};
77
78DEF_SIMPLE_GM(path_huge_aa, canvas, 200, 200) {
79 draw_huge_path(canvas, 100, 60, /* manual= */ false);
80 canvas->translate(0, 80);
81 draw_huge_path(canvas, 100 * 1024, 60, /* manual= */ false);
82}
83
84DEF_SIMPLE_GM(path_huge_aa_manual, canvas, 200, 200) {
85 draw_huge_path(canvas, 100, 60, /* manual= */ true);
86 canvas->translate(0, 80);
87 draw_huge_path(canvas, 100 * 1024, 60, /* manual= */ true);
88}
const SkScalar widths[]
void clipRect(const SkRect &rect, SkClipOp op, bool doAntiAlias)
void restore()
Definition SkCanvas.cpp:465
void translate(SkScalar dx, SkScalar dy)
int save()
Definition SkCanvas.cpp:451
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
Definition SkCanvas.h:1528
@ kStroke_Style
set to stroke geometry
Definition SkPaint.h:194
const Paint & paint
#define DEF_SIMPLE_GM(NAME, CANVAS, W, H)
Definition gm.h:50
static void draw_huge_path(SkCanvas *canvas, int w, int h, bool manual)
Definition hugepath.cpp:44
SK_API sk_sp< SkSurface > Raster(const SkImageInfo &imageInfo, size_t rowBytes, const SkSurfaceProps *surfaceProps)
void DrawImage(SkCanvas *canvas, const SkImage *image, SkScalar x, SkScalar y, const SkSamplingOptions &sampling={}, const SkPaint *paint=nullptr, SkCanvas::SrcRectConstraint constraint=SkCanvas::kFast_SrcRectConstraint)
SkScalar w
SkScalar h
static SkImageInfo MakeN32Premul(int width, int height)
static constexpr SkRect MakeXYWH(float x, float y, float w, float h)
Definition SkRect.h:659