Added pixels
Signed-off-by: Tyrolyean <tyrolyean@tyrolyean.net>
This commit is contained in:
parent
64431dbd07
commit
86a257f566
2 changed files with 72776 additions and 0 deletions
72543
pixelflut/pic.h
Normal file
72543
pixelflut/pic.h
Normal file
File diff suppressed because it is too large
Load diff
233
pixelflut/pixel.c
Normal file
233
pixelflut/pixel.c
Normal file
|
@ -0,0 +1,233 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <stdlib.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#include "pic.h"
|
||||
|
||||
#if 1
|
||||
#define HOST "151.217.40.82"
|
||||
#define PORT 1234
|
||||
|
||||
#else
|
||||
#define HOST "127.0.0.1"
|
||||
#define PORT 1337
|
||||
|
||||
#endif
|
||||
#define MAX_Y_THREADS 2
|
||||
#define MAX_X_THREADS 5
|
||||
|
||||
#define Y_RES (gimp_image.height)
|
||||
#define X_RES (gimp_image.width)
|
||||
|
||||
#define ROW_WISE 0
|
||||
#define COL_WISE 1
|
||||
#define PARTIAL_WISE 2
|
||||
|
||||
#define RENDERALG PARTIAL_WISE
|
||||
|
||||
uint8_t image[1920][1080][3];
|
||||
|
||||
unsigned int offset_x = 1000, offset_y = 500;
|
||||
|
||||
pthread_mutex_t get_lock;
|
||||
|
||||
size_t thcnt = 0;
|
||||
|
||||
int perform_px(int y_segment, int x_segment);
|
||||
|
||||
int write_px_to_fd(int fd, uint16_t x, uint16_t y, uint8_t r, uint8_t g, uint8_t b){
|
||||
char intm[100];
|
||||
|
||||
snprintf(intm, sizeof(intm), "PX %d %d %.2x%.2x%.2x\n", x + offset_x,
|
||||
y + offset_y , r, g, b);
|
||||
|
||||
return write(fd, intm, strlen(intm));
|
||||
}
|
||||
|
||||
int open_fd(){
|
||||
|
||||
#ifndef TEST
|
||||
int fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
||||
struct sockaddr_in their_addr;
|
||||
|
||||
struct hostent *he;
|
||||
if ((he=gethostbyname(HOST)) == NULL) { /* get the host info */
|
||||
perror("gethostbyname");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
their_addr.sin_family = AF_INET; /* host byte order */
|
||||
their_addr.sin_port = htons(PORT); /* short, network byte order */
|
||||
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
|
||||
bzero(&(their_addr.sin_zero), 8); /* zero the rest of the struct */
|
||||
|
||||
int n = connect(fd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr));
|
||||
|
||||
if( n < 0){
|
||||
perror("Connect");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef TEST
|
||||
int fd = 0;
|
||||
#endif
|
||||
|
||||
return fd;
|
||||
|
||||
}
|
||||
|
||||
void* bootstrap_perf(){
|
||||
|
||||
|
||||
pthread_mutex_lock(&get_lock);
|
||||
|
||||
size_t me = thcnt++;
|
||||
|
||||
size_t x_frame = me / MAX_X_THREADS;
|
||||
size_t y_frame = me % MAX_X_THREADS;
|
||||
|
||||
printf("I am %li/%li! \n", x_frame, y_frame);
|
||||
|
||||
pthread_mutex_unlock(&get_lock);
|
||||
|
||||
perform_px(x_frame, y_frame);
|
||||
|
||||
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char** argv){
|
||||
|
||||
printf("INIT \n");
|
||||
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
printf("Allocating a %li sized buffer\n", 3 * Y_RES * X_RES * sizeof(unsigned char ));
|
||||
|
||||
printf("Original picture measurements: %i * %i \n", gimp_image.width, gimp_image.height);
|
||||
|
||||
if(gimp_image.pixel_data == NULL){
|
||||
printf("Failed to read image\n");
|
||||
return EXIT_FAILURE;
|
||||
|
||||
}
|
||||
|
||||
for(size_t px = 0; px < sizeof(gimp_image.pixel_data);
|
||||
px+=gimp_image.bytes_per_pixel){
|
||||
|
||||
size_t pixn = px / gimp_image.bytes_per_pixel;
|
||||
size_t x = pixn % gimp_image.width;
|
||||
size_t y = pixn / gimp_image.width;
|
||||
|
||||
memcpy(image[x][y], &gimp_image.pixel_data[px], 3);
|
||||
|
||||
}
|
||||
|
||||
//memset(image, 0 , sizeof(image));
|
||||
|
||||
printf("Starting program from: %s\n", argv[0]);
|
||||
|
||||
#ifndef TEST
|
||||
printf("Attempted file: %s\n", argv[1]);
|
||||
|
||||
#endif
|
||||
pthread_mutex_init(&get_lock, NULL);
|
||||
|
||||
for(size_t i = 0; i < (MAX_Y_THREADS * MAX_X_THREADS); i++){
|
||||
|
||||
printf("Creating thread %li...\n", i);
|
||||
|
||||
pthread_t th;
|
||||
|
||||
if(pthread_create(&th,NULL,bootstrap_perf,NULL)){
|
||||
|
||||
i--;
|
||||
}
|
||||
|
||||
}
|
||||
for(;;){
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int perform_px(int y_segment, int x_segment){
|
||||
|
||||
int fd = open_fd();
|
||||
|
||||
printf("I am thread at %i/%i strting up! \n", x_segment, y_segment);
|
||||
|
||||
|
||||
|
||||
for(;;){
|
||||
|
||||
int xmin = (X_RES / MAX_X_THREADS) * x_segment;
|
||||
int ymin = (Y_RES / MAX_Y_THREADS) * y_segment;
|
||||
|
||||
int xmax = (X_RES / MAX_X_THREADS) * (x_segment + 1) ;
|
||||
int ymax = (Y_RES / MAX_Y_THREADS) * (y_segment + 1) ;
|
||||
|
||||
#if RENDERALG==ROW_WISE
|
||||
|
||||
for(int x = xmin ; x < xmax ; x++){
|
||||
for(int y = ymin ; y < ymax; y++){
|
||||
if(write_px_to_fd(fd, x, y, image[x][y][0], image[x][y][1], image[x][y][2]) < 0){
|
||||
perror("Failed to write to socket");
|
||||
close(fd);
|
||||
fd = open_fd();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#elif RENDERALG==COL_WISE
|
||||
|
||||
for(int y = ymin ; y < ymax; y++){
|
||||
for(int x = xmin ; x < xmax ; x++){
|
||||
if(write_px_to_fd(fd, x, y, image[x][y][0], image[x][y][1], image[x][y][2]) < 0){
|
||||
perror("Failed to write to socket");
|
||||
close(fd);
|
||||
fd = open_fd();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#elif RENDERALG==PARTIAL_WISE
|
||||
|
||||
#define PARTIAL_RUNTIME 3
|
||||
|
||||
for(size_t offs = 0; offs < PARTIAL_RUNTIME; offs++){
|
||||
for(int y = ymin ; y < ymax; y++){
|
||||
for(int x = xmin + offs; x < xmax ; x+=2){
|
||||
if(write_px_to_fd(fd, x, y, image[x][y][0], image[x][y][1], image[x][y][2]) < 0){
|
||||
perror("Failed to write to socket");
|
||||
close(fd);
|
||||
fd = open_fd();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in a new issue