Неверная исходная ось SDL в разрешении 1080×1920

У меня проблема с библиотекой SDL и разрешением, отличным от 1920×1080.

Я хочу скопировать дисплей изображение размером 1080×608 в центре экран с разрешением 1080×1920 (портрет).

У меня только один подключенный экран монитора.

Я использовал следующую команду, чтобы переключить экран с 1920×1080 в 1080×1920 :

xrandr --output DP-1 --mode 1920x1080 --rotate left --primary

Я использую следующий код для инициализации средства визуализации SDL:

/**
* initialize everything so we are ready to display
*/
int SdlHandler::initialize(
unsigned int positionX,
unsigned int positionY,
unsigned int width,
unsigned int height,
bool showWindow,
std::string name) {
// Initialize SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl;

return -1;
}

// Size if the window
this->width = width;
this->height = height;
this->positionX = positionX;
this->positionY = positionY;

// Create the SDL window
// 0 and 0 are the position in X and Y
unsigned int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS;

if (showWindow) {
flags |= SDL_WINDOW_SHOWN;
} else {
flags |= SDL_WINDOW_HIDDEN;
}

this->window = SDL_CreateWindow(name.c_str(), this->positionX, this->positionY, this->width, this->height, flags);

// If there had been a problem, leave
if (!this->window) {
return -1;
}

// Create a new renderer
this->renderer = SDL_CreateRenderer(this->window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

// If there is an error creating it, just leave
if (!this->renderer) {
return -1;
}

// Setup the best for the SDL render quality
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "2");

return 0;
}

Затем я звоню SDL_RenderCopy функция для отображения изображения. Я передаю это созданное renderer создан сSDL_CreateRenderer по приведенному выше коду:

// Create a window at 0,0 of dimension 1080x1920
this->initialize(0, 0, 1080, 1920, true, SDL_BASE_DISPLAY_WINDOW);

// Create the SDL Rectangle that will contain the image, at the center of the window
SDL_Rect *howToDraw = new SDL_Rect();
howToDraw->x = this->positionX + floor((this->width - this->imageWidth) / 2);
howToDraw->y = this->positionY + floor((this->height - this->imageHeight) / 2);
howToDraw->w = this->imageWidth;
howToDraw->h = this->imageHeight;

SDL_RenderCopy(this->renderer, this->texture, NULL, howToDraw);

Но ось, кажется, находится в неправильном положении, получая следующий результат:
введите описание изображения здесь

 РЕДАКТИРОВАТЬ И РЕШЕНИЕ

Это была ошибка, связанная с Compton, оконным менеджером, все работает хорошо без Compton …

3

Решение

Поскольку вы вращаете свой дисплей с помощью xrandr, мы можем считать, что это шаг постобработки, который будет вращать все после того, как каждый кадровый буфер рендерится.

Поскольку этот шаг постобработки принимает разрешение изображения 1920×1080, вы должны использовать SDL с этим разрешением.

Что делать, если вы измените свой код для:

// Create a window at 0,0 of dimension 1920x1080
this->initialize(0, 0, 1920, 1080, true, SDL_BASE_DISPLAY_WINDOW);

РЕДАКТИРОВАТЬ: Я также понимаю, что вы хотите, чтобы ваше изображение начиналось в центре окна, но вы помещаете середину изображения в центр окна.

Вам также следует попробовать следующее:

howToDraw->x = this->positionX + this->imageWidth / 2;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]