Add method to split surface into 4 pieces
This commit is contained in:
parent
4b0521bdfa
commit
5cc1e108e6
1 changed files with 54 additions and 1 deletions
|
@ -10,6 +10,10 @@ QuadTree::QuadTree(SDL_Surface * image, short niveau_p): niveau(niveau_p), coule
|
|||
nord_est = new QuadTree(image_coupe.at(1), niveau + 1);
|
||||
sud_ouest = new QuadTree(image_coupe.at(2), niveau + 1);
|
||||
sud_est = new QuadTree(image_coupe.at(3), niveau + 1);
|
||||
|
||||
for(SDL_Surface * it: image_coupe) {
|
||||
SDL_FreeSurface(it);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -46,4 +50,53 @@ SDL_Color QuadTree::calculeCouleur(SDL_Surface *) { /* return SDL_Color(); */ }
|
|||
|
||||
bool QuadTree::verificationEgalitee(SDL_Surface *) { /* return true; */ }
|
||||
|
||||
std::array<SDL_Surface *, 4> QuadTree::coupeEnQuatre(SDL_Surface *) { /* return std::array<SDL_Surface *, 4>(); */ }
|
||||
std::array<SDL_Surface *, 4> QuadTree::coupeEnQuatre(SDL_Surface * s) {
|
||||
// Coordonnées des extrémités de chaque quadrant
|
||||
std::array<std::array<int, 4>, 4> coordonnes_quadrants;
|
||||
coordonnes_quadrants[0] = {0 , 0 , s->w / 2, s->h / 2};
|
||||
coordonnes_quadrants[1] = {0 , s->h / 2, s->w / 2, s->h};
|
||||
coordonnes_quadrants[2] = {s->w / 2, 0 , s->w , s->h / 2};
|
||||
coordonnes_quadrants[3] = {s->w / 2, s->h / 2, s->w , s->h};
|
||||
|
||||
// Masque dépend de l'ordre des octets de la machine
|
||||
Uint32 r_mask, g_mask, b_mask, a_mask;
|
||||
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
|
||||
r_mask = 0xff000000;
|
||||
g_mask = 0x00ff0000;
|
||||
b_mask = 0x0000ff00;
|
||||
a_mask = 0x000000ff;
|
||||
} else {
|
||||
r_mask = 0x000000ff;
|
||||
g_mask = 0x0000ff00;
|
||||
b_mask = 0x00ff0000;
|
||||
a_mask = 0xff000000;
|
||||
}
|
||||
|
||||
std::array<SDL_Surface *, 4> resultat;
|
||||
for(Uint32 i = 0; i < 4; ++i) {
|
||||
// Création d'une nouvelle surface
|
||||
// Copie pixel par pixel de la surface mère vers la surface fille
|
||||
// Stockage de la nouvelle surface dans l'array `resultat`
|
||||
SDL_Surface * nouvelle_image = SDL_CreateRGBSurface(0,
|
||||
coordonnes_quadrants[i][2] - coordonnes_quadrants[i][0],
|
||||
coordonnes_quadrants[i][3] - coordonnes_quadrants[i][1],
|
||||
32, r_mask, g_mask, b_mask, a_mask);
|
||||
|
||||
if(SDL_LockSurface(nouvelle_image) == 0) {
|
||||
for(int x = 0; x < nouvelle_image->w; ++x) {
|
||||
for(int y = 0; y < nouvelle_image->h; ++y) {
|
||||
*reinterpret_cast<Uint32 *>(
|
||||
static_cast<Uint8 *>(nouvelle_image->pixels) + y * nouvelle_image->pitch + x * nouvelle_image->format->BytesPerPixel
|
||||
) = *reinterpret_cast<Uint32 *>(
|
||||
static_cast<Uint8 *>(s->pixels) + (coordonnes_quadrants[i][1] + y) * s->pitch + (coordonnes_quadrants[i][0] + x) * s->format->BytesPerPixel
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
SDL_UnlockSurface(nouvelle_image);
|
||||
resultat[i] = nouvelle_image;
|
||||
}
|
||||
}
|
||||
|
||||
return resultat;
|
||||
}
|
||||
|
|
Reference in a new issue