📄 cviewbinary.cpp
字号:
/*
* HView [c]2004 Marcin Skoczylas, All rights reserved
*
* This file is under GPL license, see gpl.txt file
*
*/
#include "SymDefs.h"
#include "CViewBinary.h"
CViewBinary::CViewBinary(CHVContainer *iContainer)
{
this->iContainer=iContainer;
hexTable = "0123456789abcdef";
}
CViewBinary::~CViewBinary()
{
}
void CViewBinary::SetupArrays(TInt filePos)
{
char *buf;
// prepare binary arrays
int xNumbers, xAscii, y;
iContainer->numCharsX = 0; // number of ascii (not binary doubles: 00) chars per row
iContainer->numCharsY = iContainer->screenRect.Height() / HVFONT_HEIGHT;
// calc num bin numbers
xAscii = iContainer->screenRect.Width();
for (xNumbers = 0; xNumbers < (xAscii-3); )
{
xNumbers += (int)(HVFONT_WIDTH*2+HVFONT_BINSPACE_WIDTH);
xAscii -= HVFONT_WIDTH;
iContainer->numCharsX++;
}
iContainer->numCharsX--;
xAscii = binaryAsciiStartX = iContainer->screenRect.Width()-(iContainer->numCharsX*HVFONT_WIDTH);
LOGF("preparing char arrays for bin view: numCharsX=%d numCharsY=%d\n", iContainer->numCharsX, iContainer->numCharsY);
// binary
// prepare the char arrays knowing the screen and font size
// filePosArray not needed: filePos of the line = (global filePos) * numCharX
binaryFilePos = filePos;
iContainer->appUi->fileLoader->Seek(binaryFilePos);
//LOGF("setuparrays - !charsArray?\n");
if (!iContainer->charsArray)
{
iContainer->charsArray = new char* [iContainer->numCharsY];
for (y = 0; y < iContainer->numCharsY; y++)
{
iContainer->charsArray[y] = NULL;
}
}
for (y = 0; y < iContainer->numCharsY; y++)
{
buf = new char[iContainer->numCharsX+1]; //DEBUG!!!
buf[iContainer->numCharsX-1] = 0x00;
iContainer->appUi->fileLoader->Read(buf, iContainer->numCharsX);
if (iContainer->charsArray[y])
delete iContainer->charsArray[y];
iContainer->charsArray[y] = buf;
}
}
void CViewBinary::DrawWholeBackBuffer()
{
int xNumbers, i, j, filePos, maxY;
// line is darker
iContainer->backBufferGc->SetPenStyle(CGraphicsContext::EDottedPen);
iContainer->backBufferGc->SetPenSize(TSize(1,1));
iContainer->backBufferGc->SetPenColor(TRgb(LINE_COLORR, LINE_COLORG, LINE_COLORB));
filePos = binaryFilePos;
maxY = 0;
// draw ascii
for (i = 0; i < iContainer->numCharsY; i++)
{
for (j = 0; j < iContainer->numCharsX; j++)
{
if (filePos < iContainer->appUi->fileLoader->fileSize)
{
iContainer->backBufferGc->BitBlt(
TPoint(j * HVFONT_WIDTH + binaryAsciiStartX, i*HVFONT_HEIGHT),
iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)iContainer->charsArray[i][j]));
maxY = i;
}
filePos++;
}
}
maxY++;
filePos = binaryFilePos;
// draw hex
for (i = 0; i < iContainer->numCharsY; i++)
{
xNumbers = 0;
for (j = 0; j < iContainer->numCharsX; j++)
{
if (filePos < iContainer->appUi->fileLoader->fileSize)
{
unsigned char c1;
unsigned char c2;
unsigned char c=(unsigned char)iContainer->charsArray[i][j];
c1 = (unsigned char)(c & 0xF0);
c1 = (unsigned char)(c >> 4);
c2 = (unsigned char)(c & 0x0F);
c1 = (unsigned char)hexTable[c1];
c2 = (unsigned char)hexTable[c2];
iContainer->backBufferGc->BitBlt(
TPoint(xNumbers, i * HVFONT_HEIGHT),
iContainer->fontBitmap,
iContainer->GetFontRectByChar(c1));
xNumbers += HVFONT_WIDTH;
iContainer->backBufferGc->BitBlt(
TPoint(xNumbers, i * HVFONT_HEIGHT),
iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)c2));
xNumbers += (int)(HVFONT_WIDTH + HVFONT_BINSPACE_WIDTH);
filePos++;
}
}
}
//draw grid
for (j = 0; j < iContainer->numCharsX; j++)
{
iContainer->backBufferGc->DrawLine(
TPoint((j * ((HVFONT_WIDTH*2+HVFONT_BINSPACE_WIDTH)) - HVFONT_BINSPACE_WIDTH/2-1),
0),
TPoint((j * ((HVFONT_WIDTH*2+HVFONT_BINSPACE_WIDTH)) - HVFONT_BINSPACE_WIDTH/2-1),
(maxY)*HVFONT_HEIGHT));
}
}
void CViewBinary::ScrollRight()
{
if (binaryFilePos < (iContainer->appUi->fileLoader->fileSize-1))
{
SetupArrays(binaryFilePos+1);
iContainer->DrawWholeBackBuffer();
iContainer->DrawNow();
}
}
void CViewBinary::ScrollLeft()
{
if (binaryFilePos > 0)
{
SetupArrays(binaryFilePos-1);
iContainer->DrawWholeBackBuffer();
iContainer->DrawNow();
}
}
void CViewBinary::ScrollPageDown()
{
for (int i = 0; i < iContainer->numCharsY; i++)
{
ScrollDown(false);
}
iContainer->DrawWholeBackBuffer();
iContainer->DrawNow();
}
void CViewBinary::ScrollPageUp()
{
for (int i = 0; i < iContainer->numCharsY; i++)
{
ScrollUp(false);
}
iContainer->DrawWholeBackBuffer();
iContainer->DrawNow();
}
void CViewBinary::ScrollDown(bool draw)
{
int y;
// binary
// already at end of file?
int nextLineFilePos = binaryFilePos+iContainer->numCharsY*iContainer->numCharsX;
int numCharsToRead;
if (nextLineFilePos >= iContainer->appUi->fileLoader->fileSize)
{
return;
}
delete [] iContainer->charsArray[0];
// scroll arrays
for (y = 1; y < iContainer->numCharsY; y++)
{
iContainer->charsArray[y-1] = iContainer->charsArray[y];
}
iContainer->charsArray[iContainer->numCharsY-1] = new char[iContainer->numCharsX+1]; //DEBUG!!!!!!
iContainer->charsArray[iContainer->numCharsY-1][iContainer->numCharsX-1] = 0x00;
iContainer->appUi->fileLoader->Seek(nextLineFilePos);
// check end of file
if (nextLineFilePos + iContainer->numCharsX > iContainer->appUi->fileLoader->fileSize)
{
numCharsToRead = iContainer->appUi->fileLoader->fileSize - nextLineFilePos;
}
else
{
numCharsToRead = iContainer->numCharsX;
}
iContainer->appUi->fileLoader->Read(iContainer->charsArray[iContainer->numCharsY-1], numCharsToRead);
//LOGF("line readed: '%s' pos=%d next=%d\n", charsArray[numCharsY-1], filePosArray[numCharsY-1], afterLastLinePos);
binaryFilePos += iContainer->numCharsX;
if (!draw)
return;
// move lines up, starting on second line (bitmap copy from backbuffer)
TRect src(0, HVFONT_HEIGHT, iContainer->screenRect.Width(), iContainer->numCharsY * HVFONT_HEIGHT);
iContainer->backBufferGc2->BitBlt(TPoint(0, 0), iContainer->backBuffer, src);
// clear last line
iContainer->backBufferGc2->SetPenStyle(CGraphicsContext::ENullPen);
iContainer->backBufferGc2->SetBrushColor(TRgb(149, 149, 239));
iContainer->backBufferGc2->SetBrushStyle(CGraphicsContext::ESolidBrush);
iContainer->backBufferGc2->DrawRect(
TRect(0,
(iContainer->numCharsY-1) * HVFONT_HEIGHT,
iContainer->screenRect.Width(),
iContainer->numCharsY * HVFONT_HEIGHT));
// draw last line
int xNumbers, j;
// line is darker
iContainer->backBufferGc2->SetPenStyle(CGraphicsContext::EDottedPen);
iContainer->backBufferGc2->SetPenSize(TSize(1,1));
iContainer->backBufferGc2->SetPenColor(TRgb(LINE_COLORR, LINE_COLORG, LINE_COLORB));
// draw ascii
for (j = 0; j < numCharsToRead; j++)
{
iContainer->backBufferGc2->BitBlt(
TPoint(j * HVFONT_WIDTH + binaryAsciiStartX, (iContainer->numCharsY-1)*HVFONT_HEIGHT),
iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)iContainer->charsArray[iContainer->numCharsY-1][j]));
}
// draw hex
xNumbers = 0;
for (j = 0; j < numCharsToRead; j++)
{
unsigned char c1;
unsigned char c2;
unsigned char c=(unsigned char)iContainer->charsArray[iContainer->numCharsY-1][j];
c1 = (unsigned char)(c & 0xF0);
c1 = (unsigned char)(c >> 4);
c2 = (unsigned char)(c & 0x0F);
c1 = (unsigned char)hexTable[c1];
c2 = (unsigned char)hexTable[c2];
iContainer->backBufferGc2->BitBlt(
TPoint(xNumbers, (iContainer->numCharsY-1) * HVFONT_HEIGHT),
iContainer->fontBitmap,
iContainer->GetFontRectByChar(c1));
xNumbers += HVFONT_WIDTH;
iContainer->backBufferGc2->BitBlt(
TPoint(xNumbers, (iContainer->numCharsY-1) * HVFONT_HEIGHT),
iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)c2));
xNumbers += (int)(HVFONT_WIDTH + HVFONT_BINSPACE_WIDTH);
}
//draw grid
for (j = 0; j < numCharsToRead; j++)
{
iContainer->backBufferGc2->DrawLine(
TPoint((j * ((HVFONT_WIDTH*2+HVFONT_BINSPACE_WIDTH)) - HVFONT_BINSPACE_WIDTH/2-1),
(iContainer->numCharsY-1)*HVFONT_HEIGHT),
TPoint((j * ((HVFONT_WIDTH*2+HVFONT_BINSPACE_WIDTH)) - HVFONT_BINSPACE_WIDTH/2-1),
(iContainer->numCharsY)*HVFONT_HEIGHT));
}
iContainer->backBufferGc->BitBlt(TPoint(0, 0), iContainer->backBuffer2);
iContainer->DrawNow();
}
void CViewBinary::ScrollUp(bool draw)
{
// binary
int y, x;
if (binaryFilePos == 0)
{
LOGF("scrollup: already at beginning of file\n");
return;
}
LOGF("bin scrollup: pos %d -> %d\n", binaryFilePos, binaryFilePos-iContainer->numCharsX);
binaryFilePos -= iContainer->numCharsX;
if (binaryFilePos < 0)
{
binaryFilePos = 0;
LOGF("setup arrays\n");
SetupArrays(0);
DrawWholeBackBuffer();
iContainer->DrawNow();
return;
}
delete [] iContainer->charsArray[iContainer->numCharsY-1];
for (y = (iContainer->numCharsY-2); y > -1; y--)
{
iContainer->charsArray[y+1] = iContainer->charsArray[y];
}
iContainer->charsArray[0] = new char[iContainer->numCharsX+1]; //DEBUG!!!!!!
iContainer->charsArray[0][iContainer->numCharsX-1] = 0x00;
iContainer->appUi->fileLoader->Seek(binaryFilePos);
iContainer->appUi->fileLoader->Read(iContainer->charsArray[0], iContainer->numCharsX);
//LOGF("line readed: '%s' pos=%d next=%d\n", charsArray[numCharsY-1], filePosArray[numCharsY-1], afterLastLinePos);
if (!draw)
return;
// move lines down, starting on previous before last line (bitmap copy from backbuffer)
TRect src(0, 0, iContainer->screenRect.Width(), (iContainer->numCharsY-1) * HVFONT_HEIGHT);
iContainer->backBufferGc2->BitBlt(TPoint(0, HVFONT_HEIGHT), iContainer->backBuffer, src);
// clear first line
iContainer->backBufferGc2->SetPenStyle(CGraphicsContext::ENullPen);
iContainer->backBufferGc2->SetBrushColor(TRgb(149, 149, 239));
iContainer->backBufferGc2->SetBrushStyle(CGraphicsContext::ESolidBrush);
iContainer->backBufferGc2->DrawRect(TRect(0, 0, iContainer->numCharsX * HVFONT_WIDTH, HVFONT_HEIGHT));
// draw first line
for (x = 0; x < iContainer->numCharsX; x++)
{
// draw first line
int xNumbers, j;
// line is darker
iContainer->backBufferGc2->SetPenStyle(CGraphicsContext::EDottedPen);
iContainer->backBufferGc2->SetPenSize(TSize(1,1));
iContainer->backBufferGc2->SetPenColor(TRgb(LINE_COLORR, LINE_COLORG, LINE_COLORB));
//draw grid
for (j = 0; j < iContainer->numCharsX; j++)
{
iContainer->backBufferGc2->DrawLine(
TPoint((j * ((HVFONT_WIDTH*2+HVFONT_BINSPACE_WIDTH)) - HVFONT_BINSPACE_WIDTH/2-1),
0),
TPoint((j * ((HVFONT_WIDTH*2+HVFONT_BINSPACE_WIDTH)) - HVFONT_BINSPACE_WIDTH/2-1),
HVFONT_HEIGHT));
}
// draw ascii
for (j = 0; j < iContainer->numCharsX; j++)
{
iContainer->backBufferGc2->BitBlt(
TPoint(j * HVFONT_WIDTH + binaryAsciiStartX, 0),
iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)iContainer->charsArray[0][j]));
}
// draw hex
xNumbers = 0;
for (j = 0; j < iContainer->numCharsX; j++)
{
unsigned char c1;
unsigned char c2;
unsigned char c=(unsigned char)iContainer->charsArray[0][j];
c1 = (unsigned char)(c & 0xF0);
c1 = (unsigned char)(c >> 4);
c2 = (unsigned char)(c & 0x0F);
c1 = (unsigned char)hexTable[c1];
c2 = (unsigned char)hexTable[c2];
iContainer->backBufferGc2->BitBlt(
TPoint(xNumbers, 0),
iContainer->fontBitmap,
iContainer->GetFontRectByChar(c1));
xNumbers += HVFONT_WIDTH;
iContainer->backBufferGc2->BitBlt(
TPoint(xNumbers, 0),
iContainer->fontBitmap,
iContainer->GetFontRectByChar((unsigned int)c2));
xNumbers += (int)(HVFONT_WIDTH + HVFONT_BINSPACE_WIDTH);
}
}
iContainer->backBufferGc->BitBlt(TPoint(0, 0), iContainer->backBuffer2);
iContainer->DrawNow();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -