//// 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; }