1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/walkline-fontmaker-client

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
BitFont.cpp 3.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Walkline Wang Отправлено 3 лет назад 0039bb0
#include "StdAfx.h"
#include "BitFont.h"
CBitFont::CBitFont(void)
{
HDC hdc;
m_nOffsetX = 0;
m_nOffsetY = 0;
m_nWidth = 1;
m_nHeight = 1;
m_nCharWidth = 0;
m_nBytesPerLine = 0;
m_pPixels = 0;
m_hBitmap = NULL;
hdc = ::GetDC(NULL);
m_hdc = ::CreateCompatibleDC(hdc);
::ReleaseDC(NULL, hdc);
::SetTextColor(m_hdc, RGB(255, 255, 255));
::SetBkColor(m_hdc, RGB(0, 0, 0));
}
CBitFont::~CBitFont(void)
{
if (m_hdc) {::DeleteDC(m_hdc);}
if (m_hBitmap) {::DeleteObject(m_hBitmap);}
}
void CBitFont::CreateBitmap(void)
{
HBITMAP hBitmap;
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = m_nWidth;
bmi.bmiHeader.biHeight = m_nHeight;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 8;
bmi.bmiHeader.biCompression = BI_RGB;
hBitmap = ::CreateDIBSection(m_hdc, &bmi, DIB_RGB_COLORS, (void**)&m_pPixels, NULL, 0);
if (hBitmap != NULL) {
if (m_hBitmap != NULL) {::DeleteObject(m_hBitmap);}
::SelectObject(m_hdc, hBitmap);
m_hBitmap = hBitmap;
}
}
void CBitFont::SetFont(HFONT hFont) {::SelectObject(m_hdc, hFont);}
void CBitFont::SetOffset(INT dx, INT dy)
{
m_nOffsetX = dx;
m_nOffsetY = dy;
}
void CBitFont::SetSize(INT width, INT height)
{
m_nWidth = width;
m_nHeight = height;
m_nBytesPerLine = 4 * ((width + 3) / 4);
CreateBitmap();
}
void CBitFont::PaintChar(WCHAR ch)
{
RECT rc;
SIZE sz;
SetRect(&rc, 0, 0, m_nWidth, m_nHeight);
::FillRect(m_hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
::TextOut(m_hdc, m_nOffsetX, m_nOffsetY, &ch, 1);
::GetTextExtentPoint32W(m_hdc, &ch, 1, &sz);
m_nCharWidth = sz.cx;
}
HDC CBitFont::GetDC() {return m_hdc;}
BYTE CBitFont::GetPixel(int x, int y)
{
int line;
BYTE* pLine;
line = m_nHeight - 1 - y;
pLine = m_pPixels + m_nBytesPerLine * line;
return pLine[x];
}
INT CBitFont::GetBitsHorz(BYTE* pBits, INT size, BOOL msb, BOOL vw, INT reversed)
{
INT x;
INT y;
INT index;
INT ret;
const BYTE mask_msb[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
const BYTE mask_lsb[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
const BYTE* mask = msb ? mask_msb : mask_lsb;
ret = m_nHeight * ((m_nWidth + 7) / 8);
ret += vw ? 2 : 0;
if (size < ret) {return ret;}
if (vw) {
pBits[0] = m_nCharWidth >> 8;
pBits[1] = m_nCharWidth;
pBits += 2;
}
for (y = 0; y < m_nHeight; y++) {
index = 0;
for (x = 0; x < m_nWidth; x++) {
if (index == 0) {*pBits = 0;}
if (reversed) {
if (GetPixel(x, y) == 0) {*pBits |= mask[index];}
}
else {
if (GetPixel(x, y) != 0) {*pBits |= mask[index];}
}
index++;
if (index == 8) {
index = 0;
pBits++;
}
}
if (index != 0) {pBits++;}
}
return ret;
}
INT CBitFont::GetBitsVert(BYTE* pBits, INT size, BOOL msb, BOOL vw, INT reversed)
{
INT x;
INT y;
INT i;
INT ret;
const BYTE mask_lsb[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
const BYTE mask_msb[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
const BYTE* mask = msb ? mask_msb : mask_lsb;
ret = m_nHeight * ((m_nWidth + 7) / 8);
ret += vw ? 2 : 0;
if (size < ret) {return ret;}
if (vw) {
pBits[0] = m_nCharWidth >> 8;
pBits[1] = m_nCharWidth;
pBits += 2;
}
for(i=0;i<((m_nHeight-1)/8+1);i++) {
for (x = 0; x < m_nWidth; x++) {
for (y = 0; y < 8; y++) {
if (y == 0) {*pBits = 0;}
if (y + i * 8 < m_nHeight){
if (reversed) {
if (GetPixel(x, y + i * 8) == 0) {*pBits |= mask[y];}
}
else {
if (GetPixel(x, y + i * 8) != 0) {*pBits |= mask[y];}
}
}
if (y == 8) {pBits++;}
}
if (y != 0) {pBits++;}
}
}
return ret;
}
INT CBitFont::GetBits(BYTE* pBits, INT size, INT scan, BOOL msb, BOOL var, INT reversed)
{
switch (scan) {
case 0:
return GetBitsHorz(pBits, size, msb, var, reversed);
case 1:
return GetBitsVert(pBits, size, msb, var, reversed);
default:
return 0;
}
}

Комментарий ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/walkline-fontmaker-client.git
git@gitlife.ru:oschina-mirror/walkline-fontmaker-client.git
oschina-mirror
walkline-fontmaker-client
walkline-fontmaker-client
master