SDL Размещение пикселей на экране Переполнение стека

Я начинаю с SDL, и я читал введение, и я пытаюсь drawPixel метод у них есть. Что я делаю, так это просмотрщик ppm, поэтому у меня есть значения rgb в массиве, и они правильно хранятся (я проверил их, напечатав массив и убедившись, что они соответствуют их положению в файле ppm), и я хочу использовать SDL нарисовать картину. Пока код, который я написал (это main.cpp файл, если ppm.hpp а также ppm.cpp нужны подскажите пожалуйста чтобы их добавить)

#include <iostream>
#include <SDL/SDL.h>

#include "ppm.hpp"
using namespace std;

void drawPixel (SDL_Surface*, Uint8, Uint8, Uint8, int, int);

int main (int argc, char** argv) {
PPM ppm ("res/cake.ppm");

if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0) {
cerr << "Unable to init SDL: " << SDL_GetError() << endl;
exit(1);
}

atexit(SDL_Quit); // to automatically call SDL_Quit() when the program terminates

SDL_Surface* screen;
screen = SDL_SetVideoMode(ppm.width(), ppm.height(), 32, SDL_SWSURFACE);
if (screen == nullptr) {
cerr << "Unable to set " << ppm.width() << "x" << ppm.height() << " video: " << SDL_GetError() << endl;
exit(1);
}

for (int i = 0; i < ppm.width(); i++) {
for(int j = 0; j < ppm.height(); j++) {
drawPixel(screen, ppm.red(i,j), ppm.green(i,j), ppm.blue(i,j), i, j);
}
}

return 0;
}

void drawPixel (SDL_Surface* screen, Uint8 R, Uint8 G, Uint8 B, int x, int y) {
Uint32 color = SDL_MapRGB(screen->format, R, G, B);

if (SDL_MUSTLOCK(screen)) {
if (SDL_LockSurface(screen) < 0) {
return;
}
}

switch (screen->format->BytesPerPixel) {
case 1: { // Assuming 8-bpp
Uint8* bufp;

bufp = (Uint8*)screen->pixels + y * screen->pitch + x;
*bufp = color;
}
break;

case 2: { // Probably 15-bpp or 16-bpp
Uint16 *bufp;

bufp = (Uint16*)screen->pixels + y * screen->pitch / 2 + x;
*bufp = color;
}
break;

case 3: { // Slow 24-bpp mode, usually not used
Uint8* bufp;

bufp = (Uint8*)screen->pixels + y * screen->pitch + x;
*(bufp + screen->format->Rshift / 8) = R;
*(bufp + screen->format->Gshift / 8) = G;
*(bufp + screen->format->Bshift / 8) = B;
}
break;

case 4: { // Probably 32-bpp
Uint32* bufp;

bufp = (Uint32*)screen->pixels + y * screen->pitch / 4 + x;
*bufp = color;
}
break;
}

if (SDL_MUSTLOCK(screen)) {
SDL_UnlockSurface(screen);
}

SDL_UpdateRect(screen, x, y, 1, 1);
}

drawPixel как предусмотрено введением, теперь называется файл ppm, который я пытаюсь использовать cake.ppm и его 720×540, однако, когда я собираю и запускаю этот код, я получаю, что приложение не отвечает. Я попробовал это на меньшем файле ppm, который является 426×299, и это показало окно с цветами, помещаемыми в окно.

  1. Почему это не работает на cake.ppm файл и на других это работает? Это из-за размера?
  2. Когда я пробую файл ppm, второй файл 426×299 или другие файлы ppm, цвета появляются совершенно по-другому, почему это так?
  3. Когда я запускаю приложение, после того как пиксели вставлены, окно закрывается, как мне его сохранить?

Попытка в файле squares.ppmвот что должно быть:
что это должно быть

Но это то, что я получаю
что я'm getting

2

Решение

Задача ещё не решена.

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

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

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