forked from mypaint/libmypaint
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mypaint-surface.c
134 lines (119 loc) · 3.86 KB
/
mypaint-surface.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* libmypaint - The MyPaint Brush Library
* Copyright (C) 2008 Martin Renold <[email protected]>
* Copyright (C) 2012 Jon Nordby <[email protected]>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "config.h"
#include <assert.h>
#include "mypaint-surface.h"
#include "helpers.h"
int
mypaint_surface_draw_dab(MyPaintSurface *self,
float x, float y,
float radius,
float color_r, float color_g, float color_b,
float opaque, float hardness, float softness,
float alpha_eraser,
float aspect_ratio, float angle,
float lock_alpha,
float colorize,
float posterize,
float posterize_num,
float paint
)
{
assert(self->draw_dab);
return self->draw_dab(self, x, y, radius, color_r, color_g, color_b,
opaque, hardness, softness, alpha_eraser, aspect_ratio, angle,
lock_alpha, colorize, posterize, posterize_num, paint);
}
void
mypaint_surface_get_color(MyPaintSurface *self,
float x, float y,
float radius,
float * color_r, float * color_g, float * color_b, float * color_a,
float paint
)
{
assert(self->get_color);
self->get_color(self, x, y, radius, color_r, color_g, color_b, color_a, paint);
}
/**
* mypaint_surface_init: (skip)
*
* Initialize the surface. The reference count will be set to 1.
* Note: Only intended to be called from subclasses of #MyPaintSurface
**/
void
mypaint_surface_init(MyPaintSurface *self)
{
self->refcount = 1;
}
/**
* mypaint_surface_ref: (skip)
*
* Increase the reference count.
**/
void
mypaint_surface_ref(MyPaintSurface *self)
{
self->refcount++;
}
/**
* mypaint_surface_unref: (skip)
*
* Decrease the reference count.
**/
void
mypaint_surface_unref(MyPaintSurface *self)
{
self->refcount--;
if (self->refcount == 0) {
assert(self->destroy);
self->destroy(self);
}
}
float mypaint_surface_get_alpha (MyPaintSurface *self, float x, float y, float radius)
{
float color_r, color_g, color_b, color_a;
mypaint_surface_get_color (self, x, y, radius, &color_r, &color_g, &color_b, &color_a, 1.0);
return color_a;
}
void
mypaint_surface_save_png(MyPaintSurface *self, const char *path, int x, int y, int width, int height)
{
if (self->save_png) {
self->save_png(self, path, x, y, width, height);
}
}
void
mypaint_surface_begin_atomic(MyPaintSurface *self)
{
if (self->begin_atomic)
self->begin_atomic(self);
}
/**
* mypaint_surface_end_atomic:
* @roi: (out) (allow-none) (transfer none): Invalidated rectangles will be stored here.
* The value of roi->num_rectangles must be at least 1, and roi->rectangles must point to
* sufficient accessible memory to contain n = roi->num_rectangles of MyPaintRectangle structs.
*
* Returns: s
*/
void
mypaint_surface_end_atomic(MyPaintSurface *self, MyPaintRectangles *roi)
{
assert(self->end_atomic);
self->end_atomic(self, roi);
}