Кажется, вам интересно сравнить два SDL_Surfaces
, так что вот как вы это делаете.Возможно, есть лучший способ решить вашу конкретную проблему, но в любом случае:
В SDL Wiki , SDL_Surface
есть заинтересованные участники format, w, h, pitch, pixels
.
format
представляет информацию о кодировании пикселей format->format
- это конкретная константа перечисления, задающая заданную кодировку
w
представляет количество пикселей встрока пикселей на поверхности h
представляет количество строк пикселей на поверхности pitch
представляет длину байта строки pixels
это массив со всеми данными пикселей
Если вы хотите сравнить два SDL_Surfaces
, вам нужно сравнить пиксели друг с другом.Но сначала мы должны убедиться, что кодировка пикселя и размеры совпадают:
int SDL_Surfaces_comparable(SDL_Surface *s1, SDL_Surface *s2) {
return (s1->format.format == s2->format.format && s1->w == s2->w && s1->h == s2->h);
}
Если SDL_Surfaces_comparable
оценивается как true
, мы можем проверить, равны ли две поверхности, сравнивая байты полей pixels
поbyte.
int SDL_Surfaces_equal(SDL_Surface *s1, SDL_Surface *s2) {
if (!SDL_Surfaces_comparable(s1, s2) {
return 0;
}
// the # of bytes we want to check is bytes_per_pixel * pixels_per_row * rows
int len = s1->format->BytesPerPixel * s1->pitch * s1->h;
for (int i = 0; i < len; i++) {
// check if any two pixel bytes are unequal
if (*(uint8_t *)(s1->pixels + i) != *(uint8_t *)(s2->pixels + i))
break;
}
// return true if we finished our loop without finding non-matching data
return i == len;
}
Предполагается, что данные пикселей сериализуются как байты без какого-либо дополнения или что заполнение обнуляется.Я не смог найти структуру SDLPixel
, поэтому я предполагаю, что это стандартный способ сравнения пикселей.Я нашел эту ссылку , которая, кажется, подтверждает мой подход.