A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
1#include "../src/m_pd.h"
2#include "g_canvas.h"
3
4#ifdef NT
5#pragma warning( disable : 4244 )
6#pragma warning( disable : 4305 )
7#endif
8
9/* ------------------------ image ----------------------------- */
10
11static t_class *image_class;
12
13typedef struct _image
14{
15 t_object x_obj;
16 t_glist * x_glist;
17 int x_width;
18 int x_height;
19 t_symbol* x_fname;
20} t_image;
21
22/* widget helper functions */
23
24void image_drawme(t_image *x, t_glist *glist, int firsttime)
25{
26#ifdef ROCKBOX
27 (void) x;
28 (void) glist;
29 (void) firsttime;
30#else /* ROCKBOX */
31 if (firsttime) {
32 char fname[MAXPDSTRING];
33 canvas_makefilename(glist_getcanvas(x->x_glist), x->x_fname->s_name,
34 fname, MAXPDSTRING);
35
36 sys_vgui("image create photo img%x -file %s\n",x,fname);
37 sys_vgui(".x%x.c create image %d %d -image img%x -tags %xS\n",
38 glist_getcanvas(glist),text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist),x,x);
39
40 /* TODO callback from gui
41 sys_vgui("image_size logo");
42 */
43 }
44 else {
45 sys_vgui(".x%x.c coords %xS \
46%d %d\n",
47 glist_getcanvas(glist), x,
48 text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist));
49 }
50#endif /* ROCKBOX */
51}
52
53
54void image_erase(t_image* x,t_glist* glist)
55{
56#ifdef ROCKBOX
57 (void) x;
58 (void) glist;
59#else /* ROCKBOX */
60 int n;
61 sys_vgui(".x%x.c delete %xS\n",
62 glist_getcanvas(glist), x);
63#endif /* ROCKBOX */
64}
65
66
67
68/* ------------------------ image widgetbehaviour----------------------------- */
69
70
71static void image_getrect(t_gobj *z, t_glist *glist,
72 int *xp1, int *yp1, int *xp2, int *yp2)
73{
74 int width, height;
75 t_image* x = (t_image*)z;
76
77
78 width = x->x_width;
79 height = x->x_height;
80 *xp1 = text_xpix(&x->x_obj, glist);
81 *yp1 = text_ypix(&x->x_obj, glist);
82 *xp2 = text_xpix(&x->x_obj, glist) + width;
83 *yp2 = text_ypix(&x->x_obj, glist) + height;
84}
85
86static void image_displace(t_gobj *z, t_glist *glist,
87 int dx, int dy)
88{
89 t_image *x = (t_image *)z;
90 x->x_obj.te_xpix += dx;
91 x->x_obj.te_ypix += dy;
92#ifndef ROCKBOX
93 sys_vgui(".x%x.c coords %xSEL %d %d %d %d\n",
94 glist_getcanvas(glist), x,
95 text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist),
96 text_xpix(&x->x_obj, glist) + x->x_width, text_ypix(&x->x_obj, glist) + x->x_height);
97#endif
98 image_drawme(x, glist, 0);
99 canvas_fixlinesfor(glist_getcanvas(glist),(t_text*) x);
100}
101
102static void image_select(t_gobj *z, t_glist *glist, int state)
103{
104#ifdef ROCKBOX
105 (void) z;
106 (void) glist;
107 (void) state;
108#else /* ROCKBOX */
109 t_image *x = (t_image *)z;
110 if (state) {
111 sys_vgui(".x%x.c create rectangle \
112%d %d %d %d -tags %xSEL -outline blue\n",
113 glist_getcanvas(glist),
114 text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist),
115 text_xpix(&x->x_obj, glist) + x->x_width, text_ypix(&x->x_obj, glist) + x->x_height,
116 x);
117 }
118 else {
119 sys_vgui(".x%x.c delete %xSEL\n",
120 glist_getcanvas(glist), x);
121 }
122#endif /* ROCKBOX */
123}
124
125
126static void image_activate(t_gobj *z, t_glist *glist, int state)
127{
128#ifdef ROCKBOX
129 (void) z;
130 (void) glist;
131 (void) state;
132#endif
133/* t_text *x = (t_text *)z;
134 t_rtext *y = glist_findrtext(glist, x);
135 if (z->g_pd != gatom_class) rtext_activate(y, state);*/
136}
137
138static void image_delete(t_gobj *z, t_glist *glist)
139{
140 t_text *x = (t_text *)z;
141 canvas_deletelinesfor(glist_getcanvas(glist), x);
142}
143
144
145static void image_vis(t_gobj *z, t_glist *glist, int vis)
146{
147 t_image* s = (t_image*)z;
148 if (vis)
149 image_drawme(s, glist, 1);
150 else
151 image_erase(s,glist);
152}
153
154/* can we use the normal text save function ?? */
155
156static void image_save(t_gobj *z, t_binbuf *b)
157{
158 t_image *x = (t_image *)z;
159 binbuf_addv(b, "ssiiss", gensym("#X"),gensym("obj"),
160 x->x_obj.te_xpix, x->x_obj.te_ypix,
161 gensym("image"),x->x_fname);
162 binbuf_addv(b, ";");
163}
164
165
166t_widgetbehavior image_widgetbehavior;
167
168void image_size(t_image* x,t_floatarg w,t_floatarg h) {
169 x->x_width = w;
170 x->x_height = h;
171}
172
173void image_color(t_image* x,t_symbol* col)
174{
175#ifdef ROCKBOX
176 (void) x;
177 (void) col;
178#endif
179/* outlet_bang(x->x_obj.ob_outlet); only bang if there was a bang ..
180 so color black does the same as bang, but doesn't forward the bang
181*/
182}
183
184static void image_setwidget(void)
185{
186 image_widgetbehavior.w_getrectfn = image_getrect;
187 image_widgetbehavior.w_displacefn = image_displace;
188 image_widgetbehavior.w_selectfn = image_select;
189 image_widgetbehavior.w_activatefn = image_activate;
190 image_widgetbehavior.w_deletefn = image_delete;
191 image_widgetbehavior.w_visfn = image_vis;
192#if defined(PD_VERSION_MINOR) && (PD_VERSION_MINOR > 31)
193 image_widgetbehavior.w_clickfn = NULL;
194 image_widgetbehavior.w_propertiesfn = NULL;
195#endif
196#if defined(PD_VERSION_MINOR) && PD_MINOR_VERSION < 37
197 image_widgetbehavior.w_savefn = image_save;
198#endif
199}
200
201
202static void *image_new(t_symbol* fname)
203{
204 t_image *x = (t_image *)pd_new(image_class);
205
206 x->x_glist = (t_glist*) canvas_getcurrent();
207
208 x->x_width = 15;
209 x->x_height = 15;
210
211 x->x_fname = fname;
212 outlet_new(&x->x_obj, &s_float);
213 return (x);
214}
215
216void image_setup(void)
217{
218 image_class = class_new(gensym("image"), (t_newmethod)image_new, 0,
219 sizeof(t_image),0, A_DEFSYM,0);
220
221/*
222 class_addmethod(image_class, (t_method)image_size, gensym("size"),
223 A_FLOAT, A_FLOAT, 0);
224
225 class_addmethod(image_class, (t_method)image_color, gensym("color"),
226 A_SYMBOL, 0);
227*/
228/*
229 class_addmethod(image_class, (t_method)image_open, gensym("open"),
230 A_SYMBOL, 0);
231*/
232 image_setwidget();
233 class_setwidget(image_class,&image_widgetbehavior);
234#if PD_MINOR_VERSION >= 37
235 class_setsavefn(image_class,&image_save);
236#endif
237}
238
239