예제 #1
0
void idle()
{
  //hack to make it only draw once
  static int once=0;
  if(!once)
  {
      draw_scene();
      if(mode == MODE_JPEG)
	save_jpg();
    }
  once=1;
}
예제 #2
0
int
main(void)
{
	BITMAP *bmp;

	allegro_init();
	install_keyboard();
	
	jpgalleg_init();

	set_color_depth(32);
	if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0)) {
		set_color_depth(16);
		if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0)) {
			set_color_depth(15);
			if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0)) {
				allegro_message("Unable to init truecolor 640x480 gfx mode: %s", allegro_error);
				return -1;
			}
		}
	}
	
	clear(screen);
	bmp = load_bitmap("cat.tga", NULL);
	if (!bmp) {
		set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
		allegro_message("Error loading cat.tga\n");
		return -1;
	}
	blit(bmp, screen, 0, 0, 0, 0, bmp->w, bmp->h);
	
	readkey();
	
	if (save_jpg("savedcat.jpg", bmp, NULL)) {
		set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
		allegro_message("Error saving savedcat.jpg (error code %d)\n", jpgalleg_error);
		return -1;
	}
	destroy_bitmap(bmp);
	
	return 0;
}
예제 #3
0
void grabber() {
	GLint viewport[4];
	glGetIntegerv(GL_VIEWPORT, viewport);

	int width = (int) viewport[2];
	int height = (int) viewport[3];

	int pixelsqty;
	int i, j, k;
	int fwdvalue;
	FILE *fp_bmp;
	GLubyte *pixels;
	GLubyte *revpixels;

	/* Determine pixels quantity */
	pixelsqty = 3 * width * height;

	/* Set up Alignment format for bitmaps */
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	glPixelStorei(GL_PACK_ALIGNMENT, 1);
	glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
	glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);

	/* Define pixel array for a no extra byte. Mode 1. */
	pixels = (GLubyte *) malloc(pixelsqty);
	if (pixels == NULL) {
		printf("No enough memory \n");
		exit(0);
	}

	/* Define revpixel array for a no extra byte. Mode 1. */
	revpixels = (GLubyte*) malloc(pixelsqty);
	if (revpixels == NULL) {
		printf("No enough memory \n");
		exit(0);
	}

	/* Store Full Image from the back buffer */
	glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);

	/* Store image in memory */
	glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels);

	/* Save pixels' RGB values inverse to an array */
	// TODO There has to be a better way than this.
	for (i = 0; i < height; i++) {
		for (j = 0; j < width; j++) {
			for (k = 0; k < 3; k++) {
				fwdvalue = getelem2d(i, j, k, (int) width, height, 3, pixels);
				putelem2d(fwdvalue, i, j, (2 - k), width, height, 3, revpixels);
			}
		}
	}

	/* Write 24-bit BMP file */
	save_jpg();

	/* Close file and free memory */
	fclose(fp_bmp);
	free(pixels);
	free(revpixels);
}
예제 #4
0
//MODIFY THIS FUNCTION
void draw_scene()
{
	double curY = topLeftCornerPos->getY();

	for(int i = 0; i < HEIGHT * MINIPIXELS; i++)
	{
		double curX = topLeftCornerPos->getX();
		for(int j = 0; j < WIDTH * MINIPIXELS; j++)
		{
			//DO RAY THINGS
			vector* currentPos = new vector(curX,curY,-1.0);
			vector* direction = eyePos->subtract(currentPos);
			direction->normalize();

			ray* curRay = new ray(direction->getX(),direction->getY(),direction->getZ());

			trace(curRay,j,i);

			delete curRay;
			delete currentPos;
			delete direction;

			curX += (screenWidth/(WIDTH * MINIPIXELS));
		}
		curY -= (screenHeight/(HEIGHT * MINIPIXELS));
	}

	int x = 0;
	int y = 0;

	for(int k = 0; k < HEIGHT * MINIPIXELS; k+= MINIPIXELS)
	{
		glPointSize(2.0);
		glBegin(GL_POINTS);
		x = 0;
		for(int l = 0; l < WIDTH * MINIPIXELS; l+= MINIPIXELS)
		{
			double rValue = 0.0;
			double gValue = 0.0;
			double bValue = 0.0;

			for(int m = 0; m < MINIPIXELS; m++)
			{
				for(int n = 0; n < MINIPIXELS; n++)
				{
					rValue += myImage->getPixel(l+m,k+n).getX();
					gValue += myImage->getPixel(l+m,k+n).getY();
					bValue += myImage->getPixel(l+m,k+n).getZ();
				}
			}

			rValue /= (MINIPIXELS*MINIPIXELS);
			gValue /= (MINIPIXELS*MINIPIXELS);
			bValue /= (MINIPIXELS*MINIPIXELS);

			//plot_pixel(l,((HEIGHT - 1) - k),myImage->getPixel(l,k).getX(),myImage->getPixel(l,k).getY(),myImage->getPixel(l,k).getZ());
			plot_pixel(x,((HEIGHT - 1) - y),rValue,gValue,bValue);
			buffer[y][x][0] = rValue;
			buffer[y][x][1] = gValue;
			buffer[y][x][2] = bValue;
			x++;
		}
		y++;
		glEnd();
		glFlush();
	}
	if(mode == MODE_JPEG)
	{
		save_jpg();
	}
}