blob: f1e5adcb60c5ee3a07a8092ee7b82adf3971fe34 [file] [log] [blame] [edit]
/*
* Copyright 2019 Google Inc.
* Copyright 2022 Rive
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm.hpp"
#include "gmutils.hpp"
#include "rive/renderer.hpp"
using namespace rivegm;
using namespace rive;
/*
* Canvas example. Expected large blue stroked circle, white middle, small red
* circle. GPU-accelerated canvas produces large blue stroked circle, white
* middle, NO red circle. 1: var c = document.getElementById("myCanvas"); 2:
* var ctx = c.getContext("2d"); 3: ctx.beginPath(); 4: ctx.scale(203.20,
* 203.20); 5: ctx.translate(-14.55, -711.51); 6: ctx.fillStyle = "red"; 7:
* ctx.strokeStyle = "blue"; 8: //ctx.lineWidth = 1/203.20; 9: ctx.arc(19.221,
* 720-6.76,0.0295275590551181,0,2*Math.PI); 10: ctx.stroke(); 11: ctx.fill();
* 12: ctx.closePath();
*/
DEF_SIMPLE_GM(crbug_996140, 300, 300, renderer)
{
// Specific parameters taken from the canvas minimum working example
float cx = 19.221f;
float cy = 720 - 6.76f;
float radius = 0.0295275590551181f;
float s = 203.20f;
float tx = -14.55f;
float ty = -711.51f;
// 0: The test canvas was 1920x574 and the circle was located in the bottom
// left, but that's not necessary to reproduce the problem, so translate to
// make a smaller GM.
renderer->translate(-800, -200);
// 3: ctx.beginPath();
// 4: ctx.scale(203.20, 203.20);
renderer->scale(s, s);
// 5: ctx.translate(-14.55, -711.51);
renderer->translate(tx, ty);
// 6: ctx.fillStyle = "red";
Paint fill;
fill->color(0xff0000ff);
fill->style(RenderPaintStyle::fill);
// 7: ctx.strokeStyle = "blue";
Paint stroke;
stroke->color(0xffff0000);
stroke->thickness(1.f);
stroke->style(RenderPaintStyle::stroke);
// 9: ctx.arc(19.221, 720-6.76,0.0295275590551181,0,2*Math.PI);
// This matches how Canvas prepares an arc(x, y, radius, 0, 2pi) call
auto boundingBox = AABB(cx - radius, cy - radius, cx + radius, cy + radius);
Path path;
path_addOval(path, boundingBox);
// 12: ctx.closePath();
// path.close();
// 10: ctx.stroke(); (NOT NEEDED TO REPRODUCE FAILING RED CIRCLE)
renderer->drawPath(path, stroke);
// 11: ctx.fill()
renderer->drawPath(path, fill);
}