aboutsummaryrefslogtreecommitdiff
path: root/Plugins/hist.cpp
blob: f525db13037fdb4b40e7518412c55b8055177df1 (plain)
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
//
// build an array where x=color intensity and y=number of colors with that intensity.
// use with fs.hist.pd.
//
// array is passed in a file, a better solution would be to use vframe...
//

#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include "plugin.h"
#include "pixels.h"

void perform_effect(_frame f, _args a)
{
	if(!a.s) return;

	// parameters: <color> <filename for output> <pd receivename to bang>
	// get gol
	byte col = atoi(a.s);

	// get filename
	char *t;
	if(!(t = strstr(a.s, " "))) return;
	char *filename = t+1;

	// get receivename
	if(!(t = strstr(t+1, " "))) return;
	char *retname = t+1;
	t[0]=0; // tell filename and receivename apart

	pixels p(f);
	signed short hist[256]; // 16bits, for read16 on pd

// count colors from zero up
	memset(hist, 0, sizeof(hist));
// or count from -2^15 (bottom of graph)?
//	short i, v=1<<15;
//	for(i=0; i<256; hist[i++]=v) ;

	while(!p.eof())
	{
		++hist[col==0 ? p.red() : col==1 ? p.green() : col==2 ? p.blue() : 0];
		p.next();
	}

	ofstream of(filename, ios::out|ios::binary);
	of.write((char *)&hist, sizeof(hist));
	of.close();

	sprintf(a.ret, "%s=1", retname); // bang to indicate we're done
}