206 lines
5.9 KiB
C++
206 lines
5.9 KiB
C++
//// DspDraws.CPP - Display plaintext using DrawString API
|
|
//
|
|
//
|
|
|
|
|
|
#include "precomp.hxx"
|
|
#include "global.h"
|
|
#include "gdiplus.h"
|
|
|
|
|
|
|
|
void PaintGlyphs(
|
|
HDC hdc,
|
|
int *piY,
|
|
RECT *prc,
|
|
int iLineHeight) {
|
|
|
|
int icpLineStart; // First character of line
|
|
int icpLineEnd; // End of line (end of buffer or index of CR character)
|
|
HFONT hFont;
|
|
HFONT hOldFont;
|
|
LOGFONT lf;
|
|
INT row;
|
|
INT column;
|
|
|
|
|
|
|
|
// Establish available width and height in device coordinates
|
|
|
|
int DrawingWidth = prc->right - prc->left;
|
|
int DrawingHeight = prc->bottom - *piY;
|
|
|
|
// Establish a Graphics with 0,0 at the top left of the drawing area
|
|
|
|
Graphics g(hdc);
|
|
Matrix matrix;
|
|
|
|
g.ResetTransform();
|
|
g.SetPageUnit(UnitPixel);
|
|
g.TranslateTransform(REAL(prc->left), REAL(*piY));
|
|
|
|
// Clear the background
|
|
|
|
RectF rEntire(0, 0, REAL(DrawingWidth), REAL(DrawingHeight));
|
|
SolidBrush whiteBrush(Color(0xff, 0xff, 0xff));
|
|
g.FillRectangle(&whiteBrush, rEntire);
|
|
|
|
|
|
// Leave a little space for right and bottom margins
|
|
|
|
DrawingWidth -= DrawingWidth/40;
|
|
DrawingHeight -= DrawingHeight/40;
|
|
|
|
|
|
// Fill in a grid
|
|
|
|
SolidBrush grayBrush(Color(0xc0, 0xc0, 0xc0));
|
|
Pen grayPen(&grayBrush, 2.0);
|
|
|
|
SolidBrush darkGrayBrush(Color(0x80, 0x80, 0x80));
|
|
Pen darkGrayPen(&darkGrayBrush, 2.0);
|
|
|
|
Color blackColor(0, 0, 0);
|
|
SolidBrush blackBrush(blackColor);
|
|
Pen blackPen(&blackBrush, 2.0);
|
|
|
|
for (row = 0; row <= g_GlyphRows; row++)
|
|
{
|
|
g.DrawLine(&grayPen,
|
|
0, row*(DrawingHeight-1)/g_GlyphRows,
|
|
DrawingWidth-1, row*(DrawingHeight-1)/g_GlyphRows);
|
|
}
|
|
for (column = 0; column <= g_GlyphColumns; column++)
|
|
{
|
|
g.DrawLine(&grayPen,
|
|
column*(DrawingWidth-1)/g_GlyphColumns, 0,
|
|
column*(DrawingWidth-1)/g_GlyphColumns, DrawingHeight-1);
|
|
}
|
|
|
|
|
|
// Identify cell dimensions
|
|
|
|
INT cellHeight = (DrawingHeight-1)/g_GlyphRows;
|
|
INT cellWidth = (DrawingWidth-1)/g_GlyphColumns;
|
|
|
|
Font font(&FontFamily(g_style[0].faceName), REAL(cellHeight)*2/3, 0, UnitWorld);
|
|
|
|
REAL zero = 0;
|
|
|
|
INT DriverStringFlags = 0;
|
|
|
|
if (g_CmapLookup)
|
|
{
|
|
DriverStringFlags |= DriverStringOptionsCmapLookup;
|
|
}
|
|
if (g_VerticalForms)
|
|
{
|
|
DriverStringFlags |= DriverStringOptionsVertical;
|
|
}
|
|
|
|
// Loop through each character cell
|
|
|
|
for (row = 0; row < g_GlyphRows; row++)
|
|
{
|
|
for (column = 0; column < g_GlyphColumns; column++)
|
|
{
|
|
UINT16 glyphIndex;
|
|
|
|
if (g_HorizontalChart)
|
|
{
|
|
glyphIndex = g_GlyphFirst + row*g_GlyphColumns + column;
|
|
}
|
|
else
|
|
{
|
|
glyphIndex = g_GlyphFirst + column*g_GlyphRows + row;
|
|
}
|
|
|
|
// Set world transform to apply to individual glyphs (excludes translation)
|
|
|
|
g.ResetTransform();
|
|
g.SetTransform(&g_WorldTransform);
|
|
|
|
// Translate world transform to centre of glyph cell
|
|
|
|
REAL cellOriginX = float(prc->left + column*(DrawingWidth-1)/g_GlyphColumns) + float(cellWidth)/2;
|
|
REAL cellOriginY = float(*piY + row*(DrawingHeight-1)/g_GlyphRows) + float(cellHeight)/2;
|
|
|
|
g.TranslateTransform(cellOriginX, cellOriginY, MatrixOrderAppend);
|
|
|
|
// Get glyph bounding box
|
|
|
|
RectF untransformedBoundingBox; // Without font transform
|
|
RectF transformedBoundingBox; // With font transform
|
|
|
|
g.MeasureDriverString(
|
|
&glyphIndex, 1,
|
|
&font,
|
|
&PointF(0,0),
|
|
DriverStringFlags,
|
|
NULL,
|
|
&untransformedBoundingBox
|
|
);
|
|
|
|
g.MeasureDriverString(
|
|
&glyphIndex, 1,
|
|
&font,
|
|
&PointF(0,0),
|
|
DriverStringFlags,
|
|
&g_FontTransform,
|
|
&transformedBoundingBox
|
|
);
|
|
|
|
REAL glyphOriginX = - transformedBoundingBox.Width/2 - transformedBoundingBox.X;
|
|
REAL glyphOriginY = - transformedBoundingBox.Height/2 - transformedBoundingBox.Y;
|
|
|
|
if (g_ShowCell)
|
|
{
|
|
// Show cell around transformed glyph
|
|
|
|
transformedBoundingBox.X = - transformedBoundingBox.Width/2;
|
|
transformedBoundingBox.Y = - transformedBoundingBox.Height/2;
|
|
g.DrawRectangle(&darkGrayPen, transformedBoundingBox);
|
|
}
|
|
|
|
// Display the glyph
|
|
|
|
g.DrawDriverString(
|
|
&glyphIndex, 1,
|
|
&font,
|
|
&blackBrush,
|
|
&PointF(glyphOriginX, glyphOriginY),
|
|
DriverStringFlags,
|
|
&g_FontTransform
|
|
);
|
|
|
|
if (g_ShowCell)
|
|
{
|
|
// Show transformed cell around untransformed glyph
|
|
|
|
g.MultiplyTransform(&g_FontTransform);
|
|
|
|
glyphOriginX = - untransformedBoundingBox.Width/2 - untransformedBoundingBox.X;
|
|
glyphOriginY = - untransformedBoundingBox.Height/2 - untransformedBoundingBox.Y;
|
|
|
|
untransformedBoundingBox.X = - untransformedBoundingBox.Width/2;
|
|
untransformedBoundingBox.Y = - untransformedBoundingBox.Height/2;
|
|
g.DrawRectangle(&darkGrayPen, untransformedBoundingBox);
|
|
|
|
// Show baseline
|
|
|
|
g.DrawLine(
|
|
&darkGrayPen,
|
|
glyphOriginX - cellWidth/20,
|
|
glyphOriginY,
|
|
glyphOriginX + untransformedBoundingBox.Width + cellWidth/20 + 1,
|
|
glyphOriginY
|
|
);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
*piY += DrawingHeight;
|
|
}
|