{
linedraw_internal_t*i = (linedraw_internal_t*)d->internal;
gfxline_t*l = rfx_alloc(sizeof(gfxline_t));
+
+ if(!i->start) {
+ /* starts with a line, not with a moveto. That needs we first
+ need an explicit moveto to (0,0) */
+ linedraw_moveTo(d, 0, 0);
+ }
+
l->type = gfx_lineTo;
d->x = l->x = x;
d->y = l->y = y;
+
l->next = 0;
if(i->next)
i->next->next = l;
{
linedraw_internal_t*i = (linedraw_internal_t*)d->internal;
gfxline_t*l = rfx_alloc(sizeof(gfxline_t));
+
+ if(!i->start) {
+ /* starts with a line, not with a moveto. That needs we first
+ need an explicit moveto to (0,0) */
+ linedraw_moveTo(d, 0, 0);
+ }
+
l->type = gfx_splineTo;
d->x = l->x = x;
d->y = l->y = y;
void gfxdrawer_target_gfxline(gfxdrawer_t*d)
{
linedraw_internal_t*i = (linedraw_internal_t*)rfx_calloc(sizeof(linedraw_internal_t));
+ d->x = 0x7fffffff;
+ d->y = 0x7fffffff;
d->internal = i;
d->moveTo = linedraw_moveTo;
d->lineTo = linedraw_lineTo;
void gfxline_show(gfxline_t*l, FILE*fi)
{
while(l) {
- if(l->type == moveTo) {
+ if(l->type == gfx_moveTo) {
fprintf(fi, "moveTo %.2f,%.2f\n", l->x, l->y);
}
- if(l->type == lineTo) {
+ if(l->type == gfx_lineTo) {
fprintf(fi, "lineTo %.2f,%.2f\n", l->x, l->y);
}
- if(l->type == splineTo) {
+ if(l->type == gfx_splineTo) {
fprintf(fi, "splineTo %.2f,%.2f %.2f,%.2f\n", l->sx, l->sy, l->x, l->y);
}
l = l->next;
return num;
}
-void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy)
+void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy, double quality)
{
double c1x = (draw->x + 2 * cx) / 3;
double c1y = (draw->y + 2 * cy) / 3;
double c2x = (2 * cx + tox) / 3;
double c2y = (2 * cy + toy) / 3;
- gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy);
+ gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy, quality);
}
-void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y)
+void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y, double quality)
{
qspline_t q[128];
cspline_t c;
- double maxerror = 0.01;
+ double maxerror = quality>0 ? quality : 1.0;
int t,num;
c.start.x = draw->x;
fprintf(fi, "%f %f | %f\n", m->m00, m->m10, m->tx);
fprintf(fi, "%f %f | %f\n", m->m01, m->m11, m->ty);
}
+
+void gfxmatrix_transform(gfxmatrix_t*m, double* v, double*dest)
+{
+ dest[0] = m->m00*v[0] + m->m10*v[1] + m->tx;
+ dest[1] = m->m01*v[0] + m->m11*v[1] + m->ty;
+}
+void gfxmatrix_invert(gfxmatrix_t*m, gfxmatrix_t*dest)
+{
+ double det = m->m00 * m->m11 - m->m10 * m->m01;
+ if(!det) {
+ memset(dest, 0, sizeof(gfxmatrix_t));
+ return;
+ }
+ det = 1/det;
+ dest->m00 = m->m11 * det;
+ dest->m01 = -m->m01 * det;
+ dest->m10 = -m->m10 * det;
+ dest->m11 = m->m00 * det;
+ dest->tx = -(dest->m00 * m->tx + dest->m10 * m->ty);
+ dest->ty = -(dest->m01 * m->tx + dest->m11 * m->ty);
+}