|
20 | 20 |
|
21 | 21 | #include <cmath>
|
22 | 22 |
|
23 |
| -void CairoHelper::applyRotate(cairo_t *cr, |
24 |
| - double rotate, |
25 |
| - XY origin) |
| 23 | +void |
| 24 | +CairoHelper::applyFlip(cairo_t *cr, |
| 25 | + const int &height) |
26 | 26 | {
|
27 |
| - if (!cr || rotate == 0.) { return; } |
| 27 | + if (!cr || height < 1) { return; } |
| 28 | + cairo_scale(cr, 1.0f, -1.0f); |
| 29 | + cairo_translate(cr, 0.0f, -height); |
| 30 | +} |
| 31 | + |
| 32 | +void |
| 33 | +CairoHelper::applyPosition(cairo_t *cr, |
| 34 | + const _XY &position) |
| 35 | +{ |
| 36 | + if (!cr) { return; } |
| 37 | + cairo_move_to(cr, position.x, position.y); |
| 38 | +} |
| 39 | + |
| 40 | +void |
| 41 | +CairoHelper::applyScale(cairo_t *cr, |
| 42 | + const _XY &scale) |
| 43 | +{ |
| 44 | + if (!cr || (scale.x == 0. && scale.y == 0.)) { return; } |
| 45 | + cairo_scale(cr, scale.x, scale.y); |
| 46 | +} |
28 | 47 |
|
| 48 | +void |
| 49 | +CairoHelper::applySkew(cairo_t *cr, |
| 50 | + const _XY &skew, |
| 51 | + const _XY &origin) |
| 52 | +{ |
| 53 | + if (!cr || (skew.x == 0. && skew.y == 0.)) { return; } |
| 54 | + double x = skew.x; |
| 55 | + double y = skew.y; |
| 56 | + if (x != 0.) { x = -x; } |
| 57 | + if (y != 0.) { y = -y; } |
| 58 | + cairo_matrix_t matrix = { |
| 59 | + 1.0, y, |
| 60 | + x , 1.0, |
| 61 | + 0.0, 0.0 |
| 62 | + }; |
29 | 63 | cairo_translate(cr, origin.x, origin.y);
|
30 |
| - cairo_rotate(cr, -rotate * (M_PI / 180.0)); |
| 64 | + cairo_transform(cr, &matrix); |
31 | 65 | cairo_translate(cr, -origin.x, -origin.y);
|
32 | 66 | }
|
33 | 67 |
|
34 |
| -void CairoHelper::applyFlip(cairo_t *cr, |
35 |
| - int height) |
| 68 | +void |
| 69 | +CairoHelper::applyRotate(cairo_t *cr, |
| 70 | + const double &rotate, |
| 71 | + const _XY &origin) |
36 | 72 | {
|
37 |
| - if (!cr || height < 1) { return; } |
| 73 | + if (!cr || rotate == 0.) { return; } |
| 74 | + cairo_translate(cr, origin.x, origin.y); |
| 75 | + cairo_rotate(cr, -rotate * (M_PI / 180.0)); |
| 76 | + cairo_translate(cr, -origin.x, -origin.y); |
| 77 | +} |
38 | 78 |
|
39 |
| - cairo_scale(cr, 1.0f, -1.0f); |
40 |
| - cairo_translate(cr, 0.0f, -height); |
| 79 | +void |
| 80 | +CairoHelper::applyTransform(cairo_t *cr, |
| 81 | + const _Transform &transform) |
| 82 | +{ |
| 83 | + if (!cr) { return; } |
| 84 | + if (transform.flip) { applyFlip(cr, transform.height); } |
| 85 | + if (transform.position) { applyPosition(cr, transform.origin); } |
| 86 | + applyScale(cr, transform.scale); |
| 87 | + applySkew(cr, transform.skew, transform.origin); |
| 88 | + applyRotate(cr, transform.rotate, transform.origin); |
41 | 89 | }
|
0 commit comments