Sign in to follow this  
solinent

putpixel help (SDL)

Recommended Posts

This code gives me a solid blue line accoss the screen, rather than the expected white line. I am using SDL to try and draw pixels, and only the blue component of the color seems to be working. I got putpixel from elsewhere, so I was wondering if someone could help me out. If someone could tell me what's wrong or put this into a compiler, that would be great.
#include <iostream>
#include "SDL/SDL.h"
#include <cmath>

const int WIDTH=512, HEIGHT=512;
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
using namespace std;

void quitExecution (int code) {
	SDL_Quit();
	exit (code);
}

void handleKeyUp (SDL_keysym* keysym) {
	switch (keysym->sym) {
		case SDLK_ESCAPE:
			quitExecution(0);
			break;
		default:
			break;
	}
}


void handleKeyDown (SDL_keysym* keysym) {
	switch (keysym->sym) {
		case SDLK_ESCAPE:
			quitExecution(0);
			break;
		default:
			break;
	}
}

SDL_Surface* initSDL () {

	SDL_Surface* screen;
	/* Initialize SDL for video */
	const SDL_VideoInfo* video;
	int bpp;

	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
		fprintf(stderr,
				"Couldn't initialize SDL: %s\n", SDL_GetError());
		exit(1);
	}
	
	/* Call this when we quit */
	atexit(SDL_Quit);
	
	/* Get video information and then set the video mode for a hardware surface */
	video = SDL_GetVideoInfo();
	if (!video) {
		fprintf(stderr,
				"Couldn't get video information: %s\n", SDL_GetError());
		exit(1);
	}
	int flags = SDL_HWSURFACE|SDL_DOUBLEBUF;
	bpp = video->vfmt->BitsPerPixel;
	cout << bpp << endl;
	screen = SDL_SetVideoMode( WIDTH, HEIGHT, bpp, flags);
	if( screen == 0 ) {
		fprintf(stderr, 
				"Couldn't set video mode: %s\n", SDL_GetError());
		exit(1);
	}

	return screen;
}

void processEvents () {
	SDL_Event event;

	while( SDL_PollEvent( &event ) ) {

		switch( event.type ) {
		case SDL_KEYDOWN:
			handleKeyDown( &event.key.keysym );
			break;
		case SDL_KEYUP:
			handleKeyUp( &event.key.keysym );
			break;
		case SDL_QUIT:
			quitExecution( 0 );
			break;
		}

	}

}

void drawScreen (SDL_Surface* screen) {
	Uint8 pixelColor;
	pixelColor = SDL_MapRGB(screen->format, 0xff, 0xff, 0xff);

	/* First, lock the screen */
	if (SDL_MUSTLOCK(screen)) 
		if (SDL_LockSurface(screen) < 0)
			cerr << "Couldn't lock screen: " << SDL_GetError() << endl;
	
	putpixel (screen, WIDTH/2, HEIGHT/2, pixelColor);

	for (int i=0; i<min(HEIGHT,WIDTH); i++)
		putpixel (screen, i, i, pixelColor);

	if (SDL_MUSTLOCK(screen))
		SDL_UnlockSurface(screen);

	SDL_Flip(screen);
}

int main( int argc, char* argv[]) {
	SDL_Surface* screen = initSDL ();

	while (true) {
		drawScreen(screen);	
		processEvents();
	}
	
	return 0;
}

void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
    int bpp = surface->format->BytesPerPixel;
    /* Here p is the address to the pixel we want to set */
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

    switch(bpp) {
    case 1:
        *p = pixel;
        break;

    case 2:
        *(Uint16 *)p = pixel;
        break;

    case 3:
        if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
            p[0] = (pixel >> 16) & 0xff;
            p[1] = (pixel >> 8) & 0xff;
            p[2] = pixel & 0xff;
        } else {
            p[0] = pixel & 0xff;
            p[1] = (pixel >> 8) & 0xff;
            p[2] = (pixel >> 16) & 0xff;
        }
        break;

    case 4:
        *(Uint32 *)p = pixel;
        break;
    }
}
If that's too much code, then simply look a the drawScreen method. I've looked at it alot, so I think there's a problem with how I initialize the code. My goal is to build a simple raytracer (just for kicks) and I need to be able to set a pixel to a certain color. This was supposed to do that, but it doesn't. I'm going to be using C++ (I know, this code isn't OO, but I'm going to use OOP when I actually do the real code).

Share this post


Link to post
Share on other sites
In drawScreen(), the variable "pixelColour" is of type Uint8, which cannot hold all the values of a pixel. If you change this to a Uint32 type, it should work (it works on my machine anyway).

Share this post


Link to post
Share on other sites
Quote:
Original post by rip-off
In drawScreen(), the variable "pixelColour" is of type Uint8, which cannot hold all the values of a pixel. If you change this to a Uint32 type, it should work (it works on my machine anyway).


Thanks alot, I knew it was some stupid problem like that.

I spent like 30 mins trying to figure it out, but usually after that, you'll never find the problem until you stop for a while and look at it later.

Thanks, again. There should really be a compiler warning, I don't know why I didn't get any.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this