Я создавал средство визуализации шрифтов для DirectX9 для рисования текста. Фактическая проблема возникла из-за другой проблемы, мне было интересно, почему текстура ничего не рисовала (мой неправильный рисунок), поэтому я попытался скопировать рисунок в файл и понял, что текущая проблема. ура
Что именно я делаю не так? Я имею в виду, что я просто копирую свой массив пикселей CURRENT в моей растровой оболочке в файл с некоторым другим содержимым (информация о растровых изображениях), я видел в шестнадцатеричном редакторе, что после заголовков растровых изображений есть цвета.
Это результат растрового изображения, которое я записал в файловую систему
CFont :: DrawGlyphToBitmap
Этот код копирует из растрового изображения FreeType глиф (который, между прочим, имеет формат пикселя FT_PIXEL_MODE_BGRA) к
экземпляр класса растрового шрифта
void CFont::DrawGlyphToBitmap ( unsigned char * buffer, int rows, int pitch, int destx, int desty, int format )
{
CColor color = CColor ( 0 );for ( int row = 0; row < rows; row++ )
{
int x = 0;
for ( int left = 0; left < pitch * 3; left += 3,x++ )
{
int y = row;
unsigned char* cursor = &buffer [ ( row*pitch ) + left ];
color.SetAlphab ( 255 );
color.SetBlueb ( cursor [ 0 ] );
color.SetGreenb ( cursor [ 1 ] );
color.SetRedb ( cursor [ 2 ] );
m_pBitmap->SetPixelColor ( color, destx + x, desty + y );
}
}
}
CBitmap :: SetPixelColor
Этот код устанавливает один «пиксель» / цвет в своем локальном пиксельном хранилище.
void CBitmap::SetPixelColor ( const CColor & color, int left, int top )
{
unsigned char* cursor = &m_pBuffer [ ( m_iPitch * top ) + ( left * bytes_per_px ) ];
cursor [ px_red ] = color.GetRedb ( );
cursor [ px_green ] = color.GetGreenb ( );
cursor [ px_blue ] = color.GetBlueb ( );
if ( px_alpha != 0xFFFFFFFF )
cursor [ px_alpha ] = color.GetAlphab ( );
}
CBitmap :: Сохранить
Вот выход функции, которая пишет
растровое изображение в файловой системе, это показывает, как
я инициализирую битовый информационный контейнер (заголовок файла & заголовок «dib»)
void CBitmap::Save ( const std::wstring & path )
{
BITMAPFILEHEADER bitmap_header;
BITMAPV5HEADER bitmap_info;
memset ( &bitmap_header, 0, sizeof ( BITMAPFILEHEADER ) );
memset ( &bitmap_info, 0, /**/sizeof ( BITMAPV5HEADER ) );
bitmap_header.bfType = 'B' + ( 'M' << 8 );//0x424D;
bitmap_header.bfSize = bitmap_header.bfOffBits + ( m_iRows * m_iPitch ) * 3;
bitmap_header.bfOffBits = sizeof ( BITMAPFILEHEADER ) + sizeof ( BITMAPV5HEADER );
double _1px_p_m = 0.0002645833333333f;
bitmap_info.bV5Size = sizeof ( BITMAPV5HEADER );
bitmap_info.bV5Width = m_iPitch;
bitmap_info.bV5Height = m_iRows;
bitmap_info.bV5Planes = 1;
bitmap_info.bV5BitCount = bytes_per_px * 8;
bitmap_info.bV5Compression = BI_BITFIELDS;
bitmap_info.bV5SizeImage = ( m_iPitch * m_iRows ) * 3;
bitmap_info.bV5XPelsPerMeter = m_iPitch * _1px_p_m;
bitmap_info.bV5YPelsPerMeter = m_iRows * _1px_p_m;
bitmap_info.bV5ClrUsed = 0;
bitmap_info.bV5ClrImportant = 0;
bitmap_info.bV5RedMask = 0xFF000000;
bitmap_info.bV5GreenMask = 0x00FF0000;
bitmap_info.bV5BlueMask = 0x0000FF00;
bitmap_info.bV5AlphaMask = 0x000000FF;
bitmap_info.bV5CSType = LCS_WINDOWS_COLOR_SPACE;
...
-> the other part does just write those structures & my px array to file
}
CBitmap «полезные» макросы
я сделал макросы для массива пикселей, потому что я «изменил»
«форматировать» пиксель много раз -> чтобы сделать его «проще», я сделал те макросы, которые облегчают выполнение этого
#define bytes_per_px 4
#define px_red 0
#define px_green 1
#define px_blue 2
#define px_alpha 3
Этот расчет неверен:
&m_pBuffer [ ( m_iPitch * top ) + ( left * bytes_per_px ) ]
Так должно быть:
&m_pBuffer [ ( ( m_iPitch * top ) + left ) * bytes_per_px ]
Каждый ряд m_iPitch * bytes_per_px
байт в ширину. Если вы просто умножить на m_iPitch
тогда ваши «строки» перекрывают друг друга.
Других решений пока нет …