Как определить, имеет ли индексированный режим SDL_Surface прозрачность или нет? - PullRequest
1 голос
/ 04 декабря 2009

У меня есть код, с которым я работаю для загрузки и преобразования SDL_Surface s в текстуры OpenGL, однако я понял, что они работают только с поверхностями RGB (A). Мне нужно расширить поддержку изображений в индексированном режиме (с прозрачностью или без нее).

Изначально я изучал ::SDL_SetColorKey(), однако, похоже, он работает только с блитами SDL. Я прочитал SDL_Surface, SDL_PixelFormat и SDL_Color, а затем начал набрасывать следующее (// # - псевдокод):

SDL_Surface *pSurf(::IMG_Load(image));
::SDL_LockSurface(pSurf);

Uint32 bytesPerPixel(pSurf->format->bytesPerPixel);
GLenum pixelFormat;

Uint8  *pixelData(pSurf->pixels);
bool   allocated(false); // pixelData isn't allocated

if(pSurf->format->palette != 0) // indexed mode image
{
  //# Determine transparency. // HOW?
  //# bytesPerPixel = 3 or 4 depending on transparency being present;
  //# pixelFormat = GL_RGB or GL_RGBA depending on bytesPerPixel;

  Uint32 blockSize(pSurf->w * pSurf->h * bytesPerPixel);
  pixelData = new Uint8[blockSize];
  allocated = true;

  //# traverse pSurf->pixels, look up pSurf->format->palette references and copy
  // colors into pixelData;
}
else
{
  //# Determine pixelFormat based on bytesPerPixel and pSurf->format->Rmask
  // (GL_RGB(A) or GL_BGR(A)).
}

//# Pass bytesPerPixel, pixelFormat and pixelData to OpenGL (generate texture,
// set texture parameters, glTexImage2D etc).

if(allocated)
{
  delete[] pixelData;
  pixelData = 0;
}

::SDL_UnlockSurface(pSurf);
::SDL_FreeSurface(pSurf);

Итак, вопрос: как я могу определить, имеет ли изображение в индексированном режиме, которое я передаю этой подпрограмме, прозрачность?

1 Ответ

1 голос
/ 04 декабря 2009

Типичный способ, которым это делается для индексированного режима, это либо иметь полную 32-битную палитру RGBA, так что у вас есть 8 бит альфа на индексированный цветной слот. Или вы можете просто определить определенный (диапазон) индекс палитры как прозрачный.

OpenGL поддерживает последнее через таблицу GL_PIXEL_MAP_I_TO_A, доступную через <a href="http://www.talisman.org/opengl-1.1/Reference/glPixelMap.html" rel="nofollow noreferrer">glPixelMap()</a>. См. <a href="http://www.talisman.org/opengl-1.1/Reference/glPixelTransfer.html" rel="nofollow noreferrer">glPixelTransfer()</a> для описания логики перевода.

...