WindowsXP-SP1/windows/richedit/re41/_render.h
2020-09-30 16:53:49 +02:00

211 lines
7.6 KiB
C++

/*
* _RENDER.H
*
* Purpose:
* CRenderer class
*
* Authors:
* RichEdit 1.0 code: David R. Fulmer
* Christian Fortini (initial conversion to C++)
* Murray Sargent
*
* Copyright (c) 1995-2000, Microsoft Corporation. All rights reserved.
*/
#ifndef _RENDER_H
#define _RENDER_H
#include "_measure.h"
#include "_rtext.h"
#include "_osdc.h"
BOOL IsTooSimilar(COLORREF cr1, COLORREF cr2);
class CDisplay;
// ========================== CRenderer ==================================
// CRenderer - specialized text pointer used for rendering text
class CRenderer : public CMeasurer
{
friend struct COls;
friend struct CLsrun;
#ifndef NOLINESERVICES
friend LSERR OlsDrawGlyphs(POLS,PLSRUN,BOOL,BOOL,PCGINDEX,const int*,const int*,PGOFFSET,PGPROP,
PCEXPTYPE,DWORD,LSTFLOW,UINT,const POINT*,PCHEIGHTS,long,long,const RECT*);
friend LSERR WINAPI OlsOleDisplay(PDOBJ pdobj, PCDISPIN pcdispin);
friend LSERR WINAPI OlsDrawTextRun(POLS, PLSRUN, BOOL, BOOL, const POINT *,LPCWSTR, const int *,DWORD,LSTFLOW,
UINT, const POINT *, PCHEIGHTS, long, long, const RECT *);
#endif
private:
RECTUV _rcView; // View rect (_hdc logical coords)
RECTUV _rcRender; // Rendered rect (_hdc logical coords)
RECTUV _rc; // Running clip/erase rect (_hdc logical coords)
RECTUV _rcErase; // Rectangle to use for erasing iff _fEraseOnFirstDraw
LONG _dupLine; // Total width of line REVIEW (keithcu) still needed
LONG _cpAccelerator; // Accelerator cp if any (-1 if none).
COLORREF _crBackground; // Default background color
COLORREF _crForeDisabled; // Foreground color for disabled text
COLORREF _crShadowDisabled; // Shadow color for disabled text
COLORREF _crTextColor; // Default text color
COLORREF _crCurBackground; // Current background color
COLORREF _crCurTextColor; // Current text color
COffscreenDC _osdc; // Manager for offscreen DC
HDC _hdc; // Current hdc
HDC _hdcBitmap; // Memory hdc for background BitBlts
HBITMAP _hbitmapSave; // Saved hbitmap when _hdcMem being used
SHORT _dxBitmap; // Background bitmap width
SHORT _dyBitmap; // Background bitmap height
union
{
DWORD _dwFlags; // All together now
struct
{
DWORD _fDisabled:1; // Draw text with disabled effects?
DWORD _fErase:1; // Erase background (non transparent)
DWORD _fSelected:1; // Render run with selection colors
DWORD _fLastChunk:1; // Rendering last chunk
DWORD _fSelectToEOL:1; // Whether selection runs to end of line
DWORD _fRenderSelection:1;// Render selection?
DWORD _fBackgroundColor:1;// Some text in the line has non-default
// background color.
DWORD _fEnhancedMetafileDC:1; // Use ExtTextOutA to hack around all
// sort of Win95FE EMF or font problems
DWORD _fFEFontOnNonFEWin9x:1; // have to use ExtTextOutW even for EMF.
DWORD _fSelectedPrev:1; // TRUE if prev run selected
DWORD _fStrikeOut:1; // TRUE if current run is struckout
DWORD _fEraseOnFirstDraw:1;//Draw opaquely for first run?
DWORD _fDisplayDC:1; // Display dc
};
};
LOGPALETTE *_plogpalette;
POINTUV _ptCur; // Current rendering position on screen
BYTE _bUnderlineType; // Underline type
COLORREF _crUnderlineClr; // Underline color
void Init(); // Initialize most members to zero
void UpdatePalette(COleObject *pobj);
void RenderText(const WCHAR* pch, LONG cch);
BOOL SetNewFont();
BOOL FindDrawEntry(LONG cp);
//Rotation wrappers;
void EraseTextOut(HDC hdc, const RECTUV *prc, BOOL fSimple = FALSE);
BOOL RenderChunk(LONG &cchChunk, const WCHAR *pchRender, LONG cch);
LONG RenderTabs(LONG cchChunk);
BOOL RenderBullet();
public:
CRenderer (const CDisplay * const pdp);
CRenderer (const CDisplay * const pdp, const CRchTxtPtr &rtp);
~CRenderer ();
void operator =(const CLine& li) {*(CLine*)this = li;}
BOOL IsSimpleBackground() const;
void RenderExtTextOut(POINTUV ptuv, UINT fuOptions, RECT *prc, PCWSTR pch, UINT cch, const INT *rgdxp);
BOOL EraseRect(const RECTUV *prc, COLORREF crBack);
void EraseLine();
COLORREF GetDefaultBackColor() const {return _crBackground;}
COLORREF GetDefaultTextColor() const {return _crTextColor;}
COLORREF GetTextColor(const CCharFormat *pCF);
void SetDefaultBackColor(COLORREF cr);
void SetDefaultTextColor(COLORREF cr);
void SetTextColor(COLORREF cr);
void SetSelected(BOOL f) {_fSelected = f;}
void SetErase(BOOL f) {_fErase = f;}
const POINTUV& GetCurPoint() const {return _ptCur;}
void SetCurPoint(const POINTUV &pt) {_ptCur = pt;}
void SetRcView(const RECTUV *prcView){_rcView = *prcView; _rcRender = *prcView;}
void SetRcViewTop(LONG top) {_rcView.top = top;}
void SetRcBottoms(LONG botv, LONG botr) {_rcView.bottom = botv; _rcRender.bottom = botr;}
const RECTUV& GetRcRender() {return _rcRender;}
const RECTUV& GetRcView() {return _rcView;}
const RECTUV& GetClipRect() const {return _rc;}
void SetClipRect(void);
void SetClipLeftRight(LONG dup);
HDC GetDC() const {return _hdc;}
BOOL StartRender(const RECTUV &rcView, const RECTUV &rcRender);
LONG DrawTableBorders(const CParaFormat *pPF, LONG x, LONG yHeightRow,
LONG iDrawBottomLine, LONG dulRow,
const CParaFormat *pPFAbove);
COLORREF GetColorFromIndex(LONG icr, BOOL fForeColor,
const CParaFormat *pPF) const;
COLORREF GetShadedColorFromIndices(LONG icrf, LONG icrb, LONG iShading, //@parm Shading in .01 percent
const CParaFormat *pPF) const;
void DrawWrappedObjects(CLine *pliFirst, CLine *pliLast, LONG cpFirst, const POINTUV &ptFirst);
void EndRender(CLine *pliFirst, CLine *pliLast, LONG cpFirst, const POINTUV &ptFirst);
void FillRectWithColor(const RECTUV *prc, COLORREF cr);
void NewLine (const CLine &li);
BOOL RenderLine(CLine &li, BOOL fLastLine);
void RenderOffscreenBitmap(HDC hdc, LONG dup, LONG dvp);
BOOL RenderOutlineSymbol();
HDC StartLine(CLine &li, BOOL fLastLine, LONG &cpSelMin, LONG &cpSelMost, LONG &dup, LONG &dvp);
void EraseToBottom();
void EndLine(HDC hdcSave, LONG dup, LONG dvp);
void RenderStrikeOut(LONG upStart, LONG vpStart, LONG dup, LONG dvp);
void RenderUnderline(LONG upStart, LONG vpStart, LONG dup, LONG dvp);
void DrawLine(const POINTUV &ptStart, const POINTUV &ptEnd);
void SetFontAndColor(const CCharFormat *pCF);
HDC SetupOffscreenDC(LONG& dup, LONG& dvp, BOOL fLastLine);
void SetupUnderline(BYTE bULType, BYTE bULColorIdx, COLORREF crULColor = tomAutoColor);
CONVERTMODE GetConvertMode();
BOOL fFEFontOnNonFEWin9x() {return _fFEFontOnNonFEWin9x;}
BOOL UseXOR(COLORREF cr);
BOOL fDisplayDC() { return _fDisplayDC; }
};
/*
* BottomOfRender (rcView, rcRender)
*
* @mfunc
* Calculate maximum logical unit to render.
*
* @rdesc
* Maximum pixel to render
*
* @devnote
* This function exists to allow the renderer and dispml to be able
* to calculate the maximum pixel for rendering in exactly the same
* way.
*/
inline LONG BottomOfRender(const RECTUV& rcView, const RECTUV& rcRender)
{
return min(rcView.bottom, rcRender.bottom);
}
class CBrush
{
COLORREF _cr; // Current color
HBRUSH _hbrushOld; // HBRUSH when CBrush is created
HBRUSH _hbrush; // Current HBRUSH
CRenderer * _pre; // Renderer to use (for rotation)
public:
CBrush(CRenderer *pre) {_pre = pre; _hbrush = 0;}
~CBrush();
void Draw(LONG u1, LONG v1, LONG u2, LONG v2, LONG dxpLine,
COLORREF cr, BOOL fHideGridlines);
};
#endif