Ejemplo n.º 1
0
Image *Image_newWithPath_(char *path)
{
	Image *self = Image_new();
	Image_path_(self, path);
	Image_load(self);
	return self;
}
Ejemplo n.º 2
0
void Image_loadFromFile_works(CuTest* tc)
{
    Image* image = Image_new();
    BOOL result = Image_loadFromFile(image, "res/test.png");
    CuAssert(tc, "Could not load image.", result == TRUE);
    Image_delete(image);
}
Ejemplo n.º 3
0
void Image_loadFromFile_shouldYieldCorrectImage(CuTest* tc)
{
    Image* image = Image_new();
    Image_loadFromFile(image, "res/test.png");

    CuAssert(tc, "Image contents incorrect.", memcmp(testImage, image->data, 6*8*4) == 0);

    Image_delete(image);
}
Ejemplo n.º 4
0
void compress_and_decompress(FILE *fp,bool lossy){
  Image_T img;

  img = Image_new(fp);
  Image_compress(img,lossy);
  Image_decompress(img,lossy);
  Image_write(img, stdout);
  Image_free(&img);
}
Ejemplo n.º 5
0
void Image_loadFromFile_shouldYieldRightDimensions(CuTest* tc)
{
    Image* image = Image_new();
    Image_loadFromFile(image, "res/test.png");
    CuAssert(tc, "Image dimensions incorrect.", image->width == 6 && image->height == 8);
    CuAssertTrue(tc, image->channels == 3);
    CuAssertTrue(tc, image->bpp == 4);
    CuAssert(tc, "Image size incorrect.", 6*8*4 == image->size);

    Image_delete(image);
}
Ejemplo n.º 6
0
int main()
{
    fprintf(stderr, "Testing image loading and saving.\n");
    Log_init();
    
    Image* myimage = Image_newFromData(reference, sizeof(reference), 4, 4, 4);
    
    if (!Image_saveToFile(myimage, "test-image.png"))
    {
        fprintf(stderr, "Saving image failed.\n");
        Image_delete(myimage);
        return 1;
    }
    
    Image* image = Image_new();
    if (!Image_loadFromFile(image, "test-image.png"))
    {
        fprintf(stderr, "Loading image failed.\n");
        Image_delete(image);
        return 1;
    }
    
    if (image->width * image->height * image->channels != image->size)
    {
        fprintf(stderr, "Image size incorrect.\n");
        fprintf(stderr, "Image width: %i, height: %i, channels: %i, size %i \n", image->width, image->height, image->channels, image->size);
        return 1;
    }
    
    int i;
    int j;
    int k;
    for(i = 0; i < image->height; i++)
    {
        for(j = 0; j < image->width; j++)
        {
            for(k = 0; k < image->channels; k++)
            {
                if (image->data[(i * image->channels * image->width) + (j * image->channels) + k] != reference[(i * image->channels * image->width) + (j * image->channels) + k])
                {
                    fprintf(stderr, "Image loaded is not the same as refrence at (%i, %i, %i)\n", i, j, k);
                    return 1;
                }
            }
        }
    }
    
    Image_delete(image);

    Log_terminate();

    return 0;
}
Ejemplo n.º 7
0
Image *Image_copyWithUArray_(Image *self, UArray *ba)
{
	Image *image = Image_new();

	Image_setExternalUArray_(image, ba);
	Image_path_(image, self->path);
	Image_error_(image, self->error);

	image->width = self->width;
	image->height = self->height;
	image->componentCount = self->componentCount;

	image->encodingQuality = self->encodingQuality;
	image->decodingWidthHint = self->decodingWidthHint;
	image->decodingHeightHint = self->decodingHeightHint;

	return image;
}
Ejemplo n.º 8
0
void init()
{
    // int glfwInit( void )
    if (glfwInit() != GL_TRUE)
    {
        exit(EXIT_FAILURE);
    }

    // int glfwOpenWindow( int width, int height,
    //      int redbits, int greenbits, int bluebits,
    //      int alphabits, int depthbits, int stencilbits,
    //      int mode )
    if (glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW) != GL_TRUE)
    {
        // void glfwTerminate( void )
        glfwTerminate();
        exit(EXIT_FAILURE);
    }
    glfwSetWindowSizeCallback(windowResize);
    glClearColor(0.5, 0.0, 0.5, 0.0);

    console = StdoutConsole_new();
    Log_init(console);

    renderBatch = RenderBatch_new(4, TRUE);

    image = Image_new();
    Image_loadFromFile(image, "res/box.png");
    texture = Texture_newFromImage(image);

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glEnable(GL_TEXTURE_2D);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
Ejemplo n.º 9
0
const char *FileBrowsePanel_Main(SDL_Surface *screen) {
	fprintf(stderr, "FileBrowsePanel_Main: Currently unsupported.\n");
	return NULL;
	@OLD main function stuff
	// Create font
	font = Static_getFont("fonts/ariblk.ttf", 20);
	
	// Create a fileInfo type array containing content of current folder
	prevClicked = 0xFFFFFFFF;
	firstScreenIndex = 0;
	selIndex = 0xFFFFFFFF;
	
	// initialize screen context
	Screen_init(&sc, screen, 0);
	Screen_setBackground(&sc, "img/green-design-background.jpg");
	sc.drag_on = false;
	
	tblist = NULL;
	
	getCurrentFolderContent(&tblist, &tblistCount, sc.screen, font, 
							FBP_FILE_INFO_BGCOLOR_UNSEL, 0x000000, fileTypes, &nameHeight,
							textblock_filename_clicked);
	//~ u32 i=0; for (; i < tblistCount; i++) 
		//~ fprintf(stderr, "widget[%u/%u] id=%u\t%s\n", i, tblistCount, 
			//~ tblist[i].text_block.widget.id, tblist[i].text_block.text);
	u32 i;
	nameHeight += 5;
	
	char current_dir[PATH_MAX_SIZE];
	getcwd(current_dir, PATH_MAX_SIZE);
	
	// Update actual folder path
	//~ TextBlock *tb_currentFolder = malloc(sizeof(TextBlock));
	//~ tb_currentFolder->text = (char*) malloc(PATH_MAX_SIZE*sizeof(char));
	//~ getcwd(tb_currentFolder->text, PATH_MAX_SIZE-1);
	//~ TextBlock_setFont(tb_currentFolder, font);
	//~ TextBlock_setBackgroundColor(tb_currentFolder, 0xD9FFAD);
	//~ TextBlock_setForegroundColor(tb_currentFolder, 0x000000);
	//~ TextBlock_refresh(tb_currentFolder);
	//~ Widget *tb_currentFolder_widget = &(tb_currentFolder->widget);
	//~ tb_currentFolder_widget->id = 4;
	//~ tb_currentFolder_widget->draggable = true;
	//~ tb_currentFolder_widget->mevent = true;
	
	border_rect = malloc(sizeof(Rectangle));
	Rectangle *border_rect2 = malloc(sizeof(Rectangle));
	Rectangle_new(border_rect, sc.screen, 0xE2F3D3);
	Rectangle_new(border_rect2, sc.screen, 0x2EAE00);
	border_rectWidget = &(border_rect->widget);
	border_rect2Widget = &(border_rect2->widget);
	
	u16 height = (W_SCREEN_HEIGHT<<1)/3;
	height -= (height-UPPER_RESERV)%nameHeight;
	border_rectWidget->pos.y = 100;
	border_rectWidget->pos.w = 850;
	border_rectWidget->pos.x = 100;
	border_rectWidget->pos.h = height;
	border_rect2Widget->pos.y = border_rectWidget->pos.y - 5;
	border_rect2Widget->pos.x = border_rectWidget->pos.x - 5;
	border_rect2Widget->pos.w = border_rectWidget->pos.w + 10;
	border_rect2Widget->pos.h = border_rectWidget->pos.h + 10;
	Rectangle_refresh(border_rect);
	Rectangle_refresh(border_rect2);
	
	// Preview view rectangle
	p_x = border_rect2Widget->maxx + 10;
	p_y = border_rect2Widget->pos.y + 10;
	p_w = W_SCREEN_WIDTH - border_rect2Widget->pos.w - border_rect2Widget->pos.x - 20;
	p_h = border_rect2Widget->pos.h - 20;
	
	Button *butOk = malloc(sizeof(Button));
	Button *butAnuluj = malloc(sizeof(Button));
	
	Button_new(butOk, sc.screen, "OK", true);
	Widget *butOk_widget = &(butOk->widget);
	butOk_widget->click_handler = button_ok_clicked;
	Button_applyDefaultStyle(butOk, 879, 874, font, 50, 5);
	Button_setFixedWidth(butOk, true);
	
	Button_new(butAnuluj, sc.screen, "Anuluj", true);
	Widget *butAnuluj_widget = &(butAnuluj->widget);
	butAnuluj_widget->click_handler = button_anuluj_clicked;
	Button_applyDefaultStyle(butAnuluj, 1061, 874, font, 33, 5);
	Button_setFixedWidth(butAnuluj, true);
	
	b8 got_event=false;
	sel = false;
	char *ret_path = NULL;

	preview = malloc(sizeof(Image));
	Image_new(preview, NULL, 0, 0); // invisible preview image
	
	//~ border_rectWidget->pos.y  = 100;
	//~ border_rectWidget->pos.w  = W_SCREEN_WIDTH-200;
	//~ border_rect2Widget->pos.y = border_rectWidget->pos.y - 5;
	//~ border_rect2Widget->pos.w = border_rectWidget->pos.w + 10;
	//~ border_rectWidget->pos.x  = (W_SCREEN_WIDTH-border_rectWidget->pos.w)>>1;
	//~ border_rect2Widget->pos.x = border_rectWidget->pos.x - 5;
	
	while (! sc.has_exited) {
		if (sc.need_reload) {
			sc.need_reload = false;
			SDL_BlitSurface(sc.background->widget.surf, NULL, sc.screen, NULL);
			if (preview->widget.visible) {
				Widget_draw(&(preview->widget), &sc, false);
			}
			u16 height = (W_SCREEN_HEIGHT<<1)/3;
			height -= (height-UPPER_RESERV)%nameHeight;
			border_rectWidget->pos.h = height;
			border_rect2Widget->pos.h = border_rectWidget->pos.h + 10;
			Rectangle_refresh(border_rect);
			Rectangle_refresh(border_rect2);
			
			
			Widget_draw(border_rect2Widget, &sc, false);
			Widget_draw(border_rectWidget, &sc, false);
			Widget_draw(butOk_widget, &sc, false);
			
			showFiles();
			Widget_draw(butOk_widget, &sc, false);
			Widget_draw(butAnuluj_widget, &sc, true);
		}
		

		while (SDL_WaitEvent(sc.pevent)) {
			got_event = true;
			switch (sc.event.type) {
				case SDL_KEYDOWN:	// only for testing purpouses
					if (sc.event.key.keysym.sym == SDLK_ESCAPE)
						sc.has_exited = true;
					else {
						if (sc.event.key.keysym.sym == SDLK_F2) {
							fprintf(stderr, "Debug list:\n");
							for (i = 0; i < tblistCount; i++) {
								fprintf(stderr, "TextBlock [%u/%u] id=%u text=%s\n", i, tblistCount, tblist[i].text_block.widget.id, tblist[i].text_block.text);
							}
						}
					}
					break;
				case SDL_QUIT:
						sc.has_exited = true;
					break;
				case SDL_MOUSEBUTTONDOWN:
					if (sc.event.button.button == 4) {	 // wheel up
						if (firstScreenIndex > 0) {
							firstScreenIndex--;
							sc.need_reload = true;
						}
						break;
					}
					else {
						if (sc.event.button.button == 5) { // wheel down
							if (lastScreenIndex < tblistCount-1) {
								firstScreenIndex++;
								sc.need_reload = true;
							}
							break;
						}
					}
				default:
					Widget_mevent(butOk_widget, &sc);// if (sc.event_handled) break;
					Widget_mevent(butAnuluj_widget, &sc); //if (sc.event_handled) break;
					
					if (sc.event.type != SDL_MOUSEMOTION) {
						for (i = firstScreenIndex; i <= lastScreenIndex; i++) {
							Widget_mevent(&(tblist[i].text_block.widget), &sc);
							//if (sc.event_handled) break;
						}
					}
					break;
			}
			if (got_event) break;
		}
		
		
	}
	to_end:
	
	if ((sel) || (selIndex != 0xFFFFFFFF)) {
		ret_path = realpath(tblist[selIndex].text_block.text, ret_path);
		if (! ret_path) {
			fprintf(stderr, "FileBrowsePanel_Main:FileBrowsePanel > Failed to realpath on selected path %s\n", tblist[selIndex].text_block.text);
		}
	}
	
	// Remember to copy text of selected file
	for (i = 0; i < tblistCount; i++) {
		fprintf(stderr, "Delete TextBlock %u, %s\n", i, tblist[i].text_block.text);
		delete(&(tblist[i].text_block));
	}
	
	free(tblist);
	
	delete(&sc);
	
	delete(butOk);
	delete(butAnuluj);
	delete(border_rect);
	delete(border_rect2);
	
	
	free(butOk);
	free(butAnuluj);
	free(border_rect);
	free(border_rect2);
	free(preview);
	if (chdir(current_dir)) {	// go back to previous directory
		fprintf(stderr, "FileBrowsePanel_Main:FileBrowsePanel > Failed to go back to previous directory %s\n", current_dir);
	}
	
	fprintf(stderr, "FileBrowsePanel: Exiting\n");
	return ret_path;
	**/
}
Ejemplo n.º 10
0
IoImage *IoImage_proto(void *state)
{
	IoObject *self = IoObject_new(state);
	IoObject_tag_(self, IoImage_newTag(state));

	IoObject_setDataPointer_(self, io_calloc(1, sizeof(IoImageData)));

	DATA(self)->buffer = IoSeq_newWithCString_(IOSTATE, "");
	DATA(self)->image = Image_new();
	Image_setExternalUArray_(DATA(self)->image, IoSeq_rawUArray(DATA(self)->buffer));

	IoState_registerProtoWithId_(state, self, protoId);

	{
		IoMethodTable methodTable[] = {
		{"setDataWidthHeightComponentCount", IoImage_setDataWidthHeightComponentCount},
		{"setPath", IoImage_setPath},
		{"open", IoImage_open},
		{"save", IoImage_save},

		{"width", IoImage_width},
		{"height", IoImage_height},

		{"data", IoImage_data},
		{"componentCount", IoImage_componentCount},
		{"isGrayscale", IoImage_isL8},
		{"isL8", IoImage_isL8},
		{"isLA8", IoImage_isLA8},
		{"isRGB8", IoImage_isRGB8},
		{"isRGBA8", IoImage_isRGBA8},
		{"error", IoImage_error},
		{"resizedTo", IoImage_resizedTo},
		{"crop", IoImage_crop},
		{"addAlpha", IoImage_addAlpha},
		{"removeAlpha", IoImage_removeAlpha},
		
		{"makeRGBA8", IoImage_makeRGBA8},
		{"makeL8", IoImage_makeL8},
		{"makeGrayscale", IoImage_makeGrayscale},

		// extras

		{"setEncodingQuality", IoImage_setEncodingQuality},
		{"encodingQuality", IoImage_encodingQuality},

		{"setDecodingWidthHint", IoImage_setDecodingWidthHint},
		{"decodingWidthHint", IoImage_decodingWidthHint},

		{"setDecodingHeightHint", IoImage_setDecodingHeightHint},
		{"decodingHeightHint", IoImage_decodingHeightHint},

		{"flipX", IoImage_flipX},
		{"flipY", IoImage_flipY},
		
		{"baselineHeight", IoImage_baselineHeight},
		{"averageColor", IoImage_averageColor},
		{"histogram", IoImage_histogram},
		{"equalizeHistogram", IoImage_equalizeHistogram},
		{"linearContrast", IoImage_linearContrast},
		{"bitPlain", IoImage_bitPlain},
		{"componentPlain", IoImage_componentPlain},
		
		{"thresholdByGradient", IoImage_thresholdByGradient},
		{"thresholdByHistogram", IoImage_thresholdByHistogram},
		{"thresholdByOtsu", IoImage_thresholdByOtsu},
		
		{"filterLinear", IoImage_filterLinear},
		{"filterUniformAverage", IoImage_filterUniformAverage},
		{"filterGauss", IoImage_filterGauss},
		{"filterKirsch", IoImage_filterKirsch},
		{"filterSobel", IoImage_filterSobel},
		{"filterUnsharpMask", IoImage_filterUnsharpMask},
		{"filterMin", IoImage_filterMin},
		{"filterMax", IoImage_filterMax},
		{"filterMedian", IoImage_filterMedian},
		{"filterWeightedMedian", IoImage_filterWeightedMedian},

		{"bounds", IoImage_bounds},

		{NULL, NULL},
		};
		IoObject_addMethodTable_(self, methodTable);
	}
	return self;
}
Ejemplo n.º 11
0
void convolution(int argc, char *argv[])
{
	if (argc != 3) {
		printf("Invalid number of arguments.\n");
		return;
	}

	Image *input_image;
	Image *output_image;
	int error;

	if ((error = TGA_readImage(argv[0], &input_image)) != 0) {
		printf("Error when opening image: %d\n", error);
		return;
	}

	if ((error = Image_new(input_image->width,
			       input_image->height,
			       input_image->channels,
			       &output_image)) != 0) {
		printf("Error when creating output image : %d\n", error);
		Image_delete(input_image);
		return;
	}

	Kernel kernel;

	if ((error = get_kernel(argv[1], &kernel)) != 0) {
		printf("Error when opening kernel : %d\n", error);
		Image_delete(input_image);
		Image_delete(output_image);
		return;
	}

	int radius_x, radius_y;
	int x, y, c;

	radius_x = (kernel.width - 1) / 2;
	radius_y = (kernel.height - 1) / 2;

	Benchmark bench;
	start_benchmark(&bench);

	for (c = 0; c < input_image->channels; ++c) {
		uint8_t *out_data = output_image->data[c];
		
		for (y = 0; y < input_image->height; ++y) {
			for (x = 0; x < input_image->width; ++x) {
				
				int kx, ky;
				float *kernel_data = kernel.data;
				float sum = 0;

				for (ky = -radius_y; ky <= radius_y; ++ky) {
					for (kx = -radius_x; kx <= radius_x; ++kx) {
						int xx = clip(x + kx, 0, input_image->width - 1);
						int yy = clip(y + ky, 0, input_image->height - 1);

						sum += Image_getPixel(input_image, xx, yy, c) * *kernel_data++;
					}
				}

				sum /= kernel.sum;
				*out_data++ = clip(sum, 0, 255);
			}
		}
	}

	end_benchmark(&bench);
	printf("%lu ", bench.elapsed_ticks);
	printf("%lf\n", bench.elapsed_time);

	if ((error = TGA_writeImage(argv[2], output_image)) != 0) {
		printf("Error when writing image: %d\n", error);
	}

	Image_delete(input_image);
	Image_delete(output_image);

	kernel_delete(kernel);
}