Wiki Page Content

Differences between revisions 17 and 18
Revision 17 as of 2013-01-20 19:48:53
Size: 4268
Comment: Added stretching semantics.
Revision 18 as of 2013-02-12 13:05:48
Size: 4458
Editor: JonasThiem
Comment: Cleaned up code & comments, added more line breaks for better readability
Deletions are marked like this. Additions are marked like this.
Line 39: Line 39:

/*For loop counters*/
  int i;
  int n;


/*Rects for drawing. Probably overkill, but defining too much is certainly better than errors from uninitilization*/
  /* Rectangles for drawing which will specify source (inside the texture)
  and target (on the screen) for rendering our textures. */
Line 48: Line 43:
Line 54: Line 48:
Line 62: Line 55:
/*The creation of all the necessary stuff*/
  Main_Window = SDL_CreateWindow("SDL_RenderCopy Example", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 580, SDL_WINDOW_SHOWN);
  /* Before we can render anything, we need a window and a renderer */
  Main_Window = SDL_CreateWindow("SDL_RenderCopy Example",
 
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 580, SDL_WINDOW_SHOWN);
Line 66: Line 60:

/*The loading of the background texture. I think using CreateTextureFromSurface
is the best way to do this without using SDL_image. My background of choice is a calming field picture*/
  /* The loading of the background texture. Since SDL_LoadBMP returns
  a surface, we convert it to a texture afterwards for fast accelerated
  blitting. */
Line 71: Line 65:
  SDL_FreeSurface(Loading_Surf); // we got the texture now -> free surface
Line 72: Line 67:

/*Clear the loading surface, load a new one, and creating the second texture.
This one has a 2x2 grid of blue shapes on a black background.*/
  Loading_Surf = NULL;
  /* Load an additional texture */
Line 78: Line 70:
  SDL_FreeSurface(Loading_Surf); //always good to free stuff as soon as you're done with it   SDL_FreeSurface(Loading_Surf);
Line 80: Line 72:

/*now onto the fun part. This will render a rotating selection of the blue shapes in the middle of the screen*/
  /* now onto the fun part.
 
This will render a rotating selection of the blue shapes
 
in the middle of the screen */
  int i;
  int n;
Line 95: Line 90:
      SDL_RenderCopy (Main_Renderer,Background_Tx,NULL,NULL);
      SDL_RenderCopy (Main_Renderer,BlueShapes,&SrcR,&DestR);

      /* render background, whereas NULL for source and destination
      rectangles just means "use the default" */
SDL_RenderCopy(Main_Renderer, Background_Tx, NULL, NULL);

      /* render the current animation step of our shape */
SDL_RenderCopy(Main_Renderer, BlueShapes, &SrcR, &DestR);  
Line 103: Line 103:
/* in my mind, I think of the renderer as a big canvis, and when you RenderCopy you are adding paint on it, each time adding it over top. You can change how it blends with the stuff that the new data goes over. If you're stuck on the whole renderer idea, coming from 1.2 surfaces and bliting, think of the renderer as your main surface, and RenderCopy as the blit function to that main surface, with RenderPresent as the old flip function.*/   /* The renderer works pretty much like a big canvas:
  when you RenderCopy you are adding paint, each time adding it
  on top.
  You can change how it blends with the stuff that
  the new data goes over.
  When your 'picture' is complete, you show it
  by using SDL_RenderPresent. */
Line 105: Line 111:
  /* SDL 1.2 hint: If you're stuck on the whole renderer idea coming
  from 1.2 surfaces and blitting, think of the renderer as your
  main surface, and SDL_RenderCopy as the blit function to that main
  surface, with SDL_RenderPresent as the old SDL_Flip function.*/

SDL_RenderCopy

Use this function to copy a portion of the texture to the current rendering target.

Syntax

int SDL_RenderCopy(SDL_Renderer*   renderer,
                   SDL_Texture*    texture,
                   const SDL_Rect* srcrect,
                   const SDL_Rect* dstrect)

Function Parameters

renderer

the rendering context

texture

the source texture; see Remarks for details

srcrect

the source SDL_Rect structure or NULL for the entire texture

dstrect

the destination SDL_Rect structure or NULL for the entire rendering target. The texture will be stretched to fill the given rectangle.

Return Value

Returns 0 on success or a negative error code on failure; call SDL_GetError() for more information.

Code Examples

#include <SDL/SDL.h>
#define SHAPE_SIZE 16

int main()
{
  SDL_Window* Main_Window;
  SDL_Renderer* Main_Renderer;
  SDL_Surface* Loading_Surf;
  SDL_Texture* Background_Tx;
  SDL_Texture* BlueShapes;

  /* Rectangles for drawing which will specify source (inside the texture)
  and target (on the screen) for rendering our textures. */
  SDL_Rect SrcR;
  SDL_Rect DestR;

  SrcR.x = 0;
  SrcR.y = 0;
  SrcR.w = SHAPE_SIZE;
  SrcR.h = SHAPE_SIZE;

  DestR.x = 640 / 2 - SHAPE_SIZE / 2;
  DestR.y = 580 / 2 - SHAPE_SIZE / 2;
  DestR.w = SHAPE_SIZE;
  DestR.h = SHAPE_SIZE;


  /* Before we can render anything, we need a window and a renderer */
  Main_Window = SDL_CreateWindow("SDL_RenderCopy Example",
  SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 580, SDL_WINDOW_SHOWN);
  Main_Renderer = SDL_CreateRenderer(Main_Window, -1, SDL_RENDERER_ACCELERATED);

  /* The loading of the background texture. Since SDL_LoadBMP returns
  a surface, we convert it to a texture afterwards for fast accelerated
  blitting. */
  Loading_Surf = SDL_LoadBMP("Background.bmp");
  Background_Tx = SDL_CreateTextureFromSurface(Main_Renderer, Loading_Surf);
  SDL_FreeSurface(Loading_Surf);  // we got the texture now -> free surface

  /* Load an additional texture */
  Loading_Surf = SDL_LoadBMP("Blueshapes.bmp");
  BlueShapes = SDL_CreateTextureFromSurface(Main_Renderer, Loading_Surf);
  SDL_FreeSurface(Loading_Surf);

  /* now onto the fun part.
  This will render a rotating selection of the blue shapes
  in the middle of the screen */
  int i;
  int n;
  for(i=0;i<2;i++)
  {
    for(n=0;n<4;n++)
    {
      SrcR.x = SHAPE_SIZE * (n % 2);
      if(n > 1)
      {
        SrcR.y = SHAPE_SIZE;
      }
      else
      {
        SrcR.y = 0;
      }

      /* render background, whereas NULL for source and destination
      rectangles just means "use the default" */
      SDL_RenderCopy(Main_Renderer, Background_Tx, NULL, NULL);

      /* render the current animation step of our shape */
      SDL_RenderCopy(Main_Renderer, BlueShapes, &SrcR, &DestR);  
      SDL_RenderPresent(Main_Renderer);
      SDL_Delay(500);
    }
  }


  /* The renderer works pretty much like a big canvas:
  when you RenderCopy you are adding paint, each time adding it
  on top.
  You can change how it blends with the stuff that
  the new data goes over.
  When your 'picture' is complete, you show it
  by using SDL_RenderPresent. */

  /* SDL 1.2 hint: If you're stuck on the whole renderer idea coming
  from 1.2 surfaces and blitting, think of the renderer as your
  main surface, and SDL_RenderCopy as the blit function to that main
  surface, with SDL_RenderPresent as the old SDL_Flip function.*/

  SDL_DestroyTexture(BlueShapes);
  SDL_DestroyTexture(Background_Tx);
  SDL_DestroyRenderer(Main_Renderer);
  SDL_DestroyWindow(Main_Window);
  SDL_Quit();


  return 1;
}

Remarks

The texture is blended with the destination based on its blend mode set with SDL_SetTextureBlendMode().

The texture color is affected based on its color modulation set by SDL_SetTextureColorMod().

The texture alpha is affected based on its alpha modulation set by SDL_SetTextureAlphaMod().


CategoryAPI, CategoryRender

None: SDL_RenderCopy (last edited 2015-08-18 20:57:36 by PhilippWiesemann)

(Page Info.)
Feedback
Please include your contact information if you'd like to receive a reply.
Submit