#include "SDL.h"
#include <math.h>
#include "common.h"
#define BRUSH_SIZE 32
#define PIXELS_PER_ITERATION 5
static SDL_Texture *brush = 0;
void
drawLine(SDL_Renderer *renderer, float startx, float starty, float dx, float dy)
{
float distance = SDL_sqrt(dx * dx + dy * dy);
int iterations = distance / PIXELS_PER_ITERATION + 1;
float dx_prime = dx / iterations;
float dy_prime = dy / iterations;
SDL_Rect dstRect;
float x;
float y;
int i;
dstRect.w = BRUSH_SIZE;
dstRect.h = BRUSH_SIZE;
x = startx - BRUSH_SIZE / 2.0f;
y = starty - BRUSH_SIZE / 2.0f;
for (i = 0; i < iterations; i++) {
dstRect.x = x;
dstRect.y = y;
x += dx_prime;
y += dy_prime;
SDL_RenderCopy(renderer, brush, NULL, &dstRect);
}
}
void
initializeTexture(SDL_Renderer *renderer)
{
SDL_Surface *bmp_surface;
bmp_surface = SDL_LoadBMP("stroke.bmp");
if (bmp_surface == NULL) {
fatalError("could not load stroke.bmp");
}
brush =
SDL_CreateTextureFromSurface(renderer, bmp_surface);
SDL_FreeSurface(bmp_surface);
if (!brush) {
fatalError("could not create brush texture");
}
SDL_SetTextureBlendMode(brush, SDL_BLENDMODE_ADD);
SDL_SetTextureColorMod(brush, 255, 100, 100);
}
int
main(int argc, char *argv[])
{
int x, y, dx, dy;
Uint8 state;
SDL_Event event;
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *target;
int done;
int w, h;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fatalError("Could not initialize SDL");
}
window = SDL_CreateWindow(NULL, 0, 0, 320, 480, SDL_WINDOW_BORDERLESS | SDL_WINDOW_ALLOW_HIGHDPI);
renderer = SDL_CreateRenderer(window, 0, 0);
SDL_GetWindowSize(window, &w, &h);
SDL_RenderSetLogicalSize(renderer, w, h);
initializeTexture(renderer);
target = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, w, h);
SDL_SetRenderTarget(renderer, target);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, NULL);
done = 0;
while (!done) {
while (SDL_PollEvent(&event) == 1) {
switch (event.type) {
case SDL_QUIT:
done = 1;
break;
case SDL_MOUSEMOTION:
state = SDL_GetMouseState(&x, &y);
SDL_GetRelativeMouseState(&dx, &dy);
if (state & SDL_BUTTON_LMASK) {
SDL_SetRenderTarget(renderer, target);
drawLine(renderer, x - dx, y - dy, dx, dy);
SDL_SetRenderTarget(renderer, NULL);
}
break;
}
}
SDL_RenderCopy(renderer, target, NULL, NULL);
SDL_RenderPresent(renderer);
}
SDL_DestroyTexture(brush);
SDL_DestroyTexture(target);
SDL_Quit();
return 0;
}