我的字体渲染测试中有以下代码:
SDL_Surface* image = SDL_CreateRGBSurface(SDL_SWSURFACE,
face->glyph->bitmap.width,
face->glyph->bitmap.rows,
8,
0, 0, 0,
0);
if(!image)
{
throw std::runtime_error("Failed to generate 8 bit image");
}
//There's no better way to do this, right? Being it just sets up a basic grayscale palette
SDL_Color colors[256];
for(int i=0; i<256; ++i)
{
colors[i].r = i;
colors[i].g = i;
colors[i].b = i;
}
SDL_SetColors(image, colors, 0, 256);
SDL_LockSurface(image);
uint8_t* pixels = static_cast<uint8_t*>(image->pixels);
for(int i = 0; i<face->glyph->bitmap.rows; ++i)
{
for(int j = 0; j<face->glyph->bitmap.width; ++j)
{
pixels[i * face->glyph->bitmap.width + j] = face->glyph->bitmap.buffer[
i * face->glyph->bitmap.width + j];
}
}
###############################################################################
# Here's the spotlight #
# | #
# _________________/ #
# / #
###############################################################################
image->pitch = image->w;
SDL_UnlockSurface(image);
注意我将音高改为宽度,有效地使每像素字节等于1。这正是我所需要的,事实上,像我一样改变音调是决定我的信件是否歪曲的决定因素。
我的问题是:这是定义的,安全的和良好的做法吗?是否有功能帮助我,我不知道?有更安全的选择吗?
答案 0 :(得分:2)
写image-&gt;音高是错误的。它可能在某些情况下有效,但在其他情况下会导致显示损坏或段错误。这一切都取决于那块记忆的来源。
我认为你对像素[]的索引计算是错误的,应该是:
像素[i * image-&gt; pitch + j] = ...