IFACEMETHODIMP InternalDWriteTextRenderer::DrawUnderline( void*, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle, DWRITE_UNDERLINE const* underline, IUnknown* customDrawingObject) { return ExceptionBoundary( [&] { // // The renderer isn't required to specify a locale name. // WinString localeName; if (underline->localeName) localeName = WinString(underline->localeName); auto customDrawingObjectInspectable = GetCustomDrawingObjectInspectable(m_device.Get(), customDrawingObject); ThrowIfFailed(m_textRenderer->DrawUnderline( Vector2{ baselineOriginX, baselineOriginY }, underline->width, underline->thickness, underline->offset, underline->runHeight, DWriteToCanvasTextDirection::Lookup(underline->readingDirection, underline->flowDirection)->TextDirection, customDrawingObjectInspectable.Get(), ToCanvasTextMeasuringMode(underline->measuringMode), localeName, ToCanvasGlyphOrientation(orientationAngle))); }); }
IFACEMETHODIMP InternalDWriteTextRenderer::DrawStrikethrough( void*, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle, DWRITE_STRIKETHROUGH const* strikethrough, IUnknown* customDrawingObject) { return ExceptionBoundary( [&] { WinString localeName; if (strikethrough->localeName) localeName = WinString(strikethrough->localeName); auto customDrawingObjectInspectable = GetCustomDrawingObjectInspectable(m_device.Get(), customDrawingObject); ThrowIfFailed(m_textRenderer->DrawStrikethrough( Vector2{ baselineOriginX, baselineOriginY }, strikethrough->width, strikethrough->thickness, strikethrough->offset, DWriteToCanvasTextDirection::Lookup(strikethrough->readingDirection, strikethrough->flowDirection)->TextDirection, customDrawingObjectInspectable.Get(), ToCanvasTextMeasuringMode(strikethrough->measuringMode), localeName, ToCanvasGlyphOrientation(orientationAngle))); }); }
static WinString ToCanvasTrimmingDelimiter(uint32_t value) { // TODO #1658: Do the unicode conversion properly. // http://www.unicode.org/faq/utf_bom.html#utf16-3. This code needs its // own set of tests. WinStringBuilder builder; if (value == 0) { return WinString(); } else if (value <= 0x0000FFFF) { auto buffer = builder.Allocate(1); buffer[0] = static_cast<wchar_t>(value); } else { auto buffer = builder.Allocate(2); *(reinterpret_cast<uint32_t*>(buffer)) = value; } return builder.Get(); }
MSG BottomlineProc( HWND HWnd, MSG Msg, MPARAM MP1, MPARAM MP2 ) { switch( Msg ) { case WM_CREATE: return( WM_PROCESSED ); case WM_HELP: { struct HelpKey *HelpKeys; BYTE LineCounter; WinColor( HWnd, KEYHELP, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); HelpKeys = (struct HelpKey *)MP1; for( LineCounter = 0; LineCounter < (BYTE)MP2; LineCounter++ ) WinString( HWnd, HelpKeys[LineCounter].Text, LEFT, HelpKeys[LineCounter].x, HelpKeys[LineCounter].y ); return( WM_PROCESSED ); } case WM_MESSAGE: { WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); if( (VOID *)MP1 != NULL ) WinString( HWnd, (CHAR *)MP1, CENTER, 0, 0 ); if( (VOID *)MP2 != NULL ) WinString( HWnd, (CHAR *)MP2, CENTER, 0, 1 ); return( WM_PROCESSED ); } } return( WinDefWindowProc( HWnd, Msg, MP1, MP2 ) ); }
MSG InactiveProc( HWND HWnd, MSG Msg, MPARAM MP1, MPARAM MP2 ) { switch( Msg ) { case WM_CREATE: return( WM_PROCESSED ); case WM_SHOW: { WinColor( HWnd, PANEL, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); WinString( HWnd, "Dieser Menupunkt ist noch nicht aktiv.", LEFT, 0, 0 ); } case WM_CHAR: return( MP1 ); } return( WinDefWindowProc( HWnd, Msg, MP1, MP2 ) ); }
MSG MenuProc( HWND HWnd, MSG Msg, MPARAM MP1, MPARAM MP2 ) { static struct MenuPoint MenuPoints[NUMMENUPOINTS] = { { DOT, 0, "Einstellungen", EinstellungenProc, NULL }, { 0, 0, "", NULL, NULL }, { 0, 0, "", NULL, NULL }, { 0, 0, "Durchschnitt", DurchschnittProc, NULL }, { 0, 0, "������������", NULL, NULL }, { DOT, 1, "Periode", PeriodeProc, NULL }, { DOT, 1, "Abteilungen", AbteilungenProc, NULL }, { DOT, 1, "Begr�ndungen", BegruendungenProc, NULL }, { 0, 0, "", NULL, NULL }, { 0, 0, "�bersicht", UebersichtProc, NULL }, { 0, 0, "���������", NULL, NULL }, { DOT, 1, "Periode", PeriodeProc, NULL }, { DOT, 1, "Person(en)", PersonenProc, NULL }, { DOT, 1, "Begr�ndungen", BegruendungenProc, NULL }, { 0, 0, "", NULL, NULL }, { 0, 0, "Grenzwerte �berschritten", UeberzeitProc, NULL }, { 0, 0, "������������������������", NULL, NULL }, { DOT, 1, "Periode", PeriodeProc, NULL }, { DOT, 1, "Abteilungen", AbteilungenProc, NULL }, { DOT, 1, "Begr�ndungen", PMBegruendungenProc, NULL }, { 0, 0, "", NULL, NULL }, { 0, 0, "Summierung Zeitkonti", ZeitKontiSumProc, NULL }, { 0, 0, "��������������������", NULL, NULL }, { DOT, 1, "Periode", PeriodeProc, NULL }, { DOT, 1, "Zeitkonti", ZeitKontiProc, NULL } }; static struct HelpKey HelpKeys[NUMMENUHELPKEYS] = { { 0, 0, "</> Men�punkt anw�hlen" }, { 0, 1, "<Enter> Men�punkt ausf�hren" }, { 40, 1, "<Esc> Programm verlassen" } }; static BYTE Selection; static BYTE TopLine; static BOOL PanelFocus; switch( Msg ) { case WM_CREATE: { MenuPoints[5].Data = &ConfigData->Perioden[0]; MenuPoints[11].Data = &ConfigData->Perioden[1]; MenuPoints[17].Data = &ConfigData->Perioden[2]; MenuPoints[23].Data = &ConfigData->Perioden[3]; MenuPoints[6].Data = (VOID FAR *)0; MenuPoints[12].Data = (VOID FAR *)1; MenuPoints[18].Data = (VOID FAR *)2; MenuPoints[7].Data = (VOID FAR *)0; MenuPoints[13].Data = (VOID FAR *)1; MenuPoints[19].Data = (VOID FAR *)2; MenuPoints[24].Data = (VOID FAR *)3; WinCreateWindow( HWnd, &MenuArrows, MenuArrowsProc, 0, 0, 25, -1, 25, 20 ); Selection = 0; TopLine = 0; PanelFocus = FALSE; return( WM_PROCESSED ); } case WM_SHOW: { BYTE LineCounter; WinColor( HWnd, MENU, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); for( LineCounter = 0; LineCounter <= WinGety2( HWnd ); LineCounter++ ) { if( LineCounter + TopLine == NUMMENUPOINTS ) break; if( MenuPoints[LineCounter + TopLine].Style & DOT ) { WinString( HWnd, "� ", LEFT, (BYTE)(MenuPoints[LineCounter + TopLine].Indent + 1), LineCounter ); WinString( HWnd, MenuPoints[LineCounter + TopLine].Text, LEFT, (BYTE)(MenuPoints[LineCounter + TopLine].Indent + 3), LineCounter ); } else WinString( HWnd, MenuPoints[LineCounter + TopLine].Text, LEFT, (BYTE)(MenuPoints[LineCounter + TopLine].Indent + 1), LineCounter ); } return( WM_PROCESSED ); } case WM_SETFOCUS: { BYTE Length; WinSendMsg( MenuArrows, WM_SET, (TopLine == 0 ? FALSE : TRUE ), ((BYTE)(NUMMENUPOINTS - 1 - TopLine) <= WinGety2( HWnd ) ? FALSE : TRUE ) ); WinSendMsg( MenuArrows, WM_SHOW, 0, 0 ); Length = (BYTE)strlen( MenuPoints[Selection].Text ); if( MenuPoints[Selection].Style & DOT ) Length += 2; WinColor( HWnd, HIGHLIGHT, (BYTE)(MenuPoints[Selection].Indent), (BYTE)(Selection - TopLine), (BYTE)(MenuPoints[Selection].Indent + Length + 1), (BYTE)(Selection - TopLine) ); WinSendMsg( Bottomline, WM_HELP, (WORD)&HelpKeys, NUMMENUHELPKEYS ); WinCreateWindow( HWnd, &Panel, MenuPoints[Selection].Proc, SEG(MenuPoints[Selection].Data), OFS(MenuPoints[Selection].Data), PANELX1, PANELY1, PANELX2, PANELY2 ); WinSendMsg( Panel, WM_SHOW, 0, 0 ); return( WM_PROCESSED ); } case WM_CLEARFOCUS: WinDestroyWindow( Panel ); WinColor( HWnd, MENU, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); return( WM_PROCESSED ); case WM_CHAR: if( PanelFocus ) if( WinSendMsg( Panel, Msg, MP1, MP2 ) == WM_PROCESSED ) return( WM_PROCESSED ); switch( (WORD)MP1 ) { case KBDOWN: case KBRIGHT: case KBTAB: WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 ); do { if( Selection == NUMMENUPOINTS - 1) break; Selection++; if( Selection - TopLine > WinGety2( HWnd ) ) { TopLine++; WinSendMsg( HWnd, WM_SHOW, 0, 0 ); } } while( MenuPoints[Selection].Proc == NULL ); WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); break; case KBUP: case KBLEFT: case KBSHTAB: WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 ); do { if( Selection == 0) break; Selection--; if( Selection < TopLine ) { TopLine--; WinSendMsg( HWnd, WM_SHOW, 0, 0 ); } } while( MenuPoints[Selection].Proc == NULL ); WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); break; case KBHOME: WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 ); TopLine = 0; Selection = 0; WinSendMsg( HWnd, WM_SHOW, 0, 0 ); WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); break; case KBEND: WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 ); Selection = NUMMENUPOINTS - 1; if( NUMMENUPOINTS - 1 < WinGety2( HWnd ) ) TopLine = 0; else TopLine = (BYTE)(NUMMENUPOINTS - 1 - WinGety2( HWnd )); WinSendMsg( HWnd, WM_SHOW, 0, 0 ); WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); break; case KBENTER: if( !PanelFocus ) { WinSendMsg( Panel, WM_SETFOCUS, 0, 0 ); PanelFocus = TRUE; return( WM_PROCESSED ); } else WinSendMsg( HWnd, WM_CHAR, (MPARAM)KBESC, 0 ); case KBESC: if( PanelFocus ) { WinSendMsg( Panel, WM_CLEARFOCUS, 0, 0 ); PanelFocus = FALSE; WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); return( WM_PROCESSED ); } default: return( MP1 ); } return( WM_PROCESSED ); case WM_DESTROY: WinDestroyWindow( MenuArrows ); return( WM_PROCESSED ); } return( WinDefWindowProc( HWnd, Msg, MP1, MP2 ) ); }
VOID _cdecl Main( WORD NumArgs, CHAR *Args[], CHAR *EnvStrings[] ) { MSG Msg; WORD Key; CHAR FileName[65]; CHAR PrinterPort[65]; HFILE TMSBegrFile; HFILE TMSAbtFile; HFILE TMSZKontFile; DWORD EffTime; WinInitialize( MAXNUMWINDOWS ); WinCreateWindow( Desktop, &Desktop, NULL, 0, 0, 0, 0, 0, 0 ); WinHideCursor(); WinColor( Desktop, NORMAL, 0, 0, WinGetx2( Desktop ), WinGety2( Desktop ) ); WinCreateWindow( Desktop, &Bottomline, BottomlineProc, 0, 0, BOTTOMLINEX1, BOTTOMLINEY1, BOTTOMLINEX2, BOTTOMLINEY2 ); if( !ReadConfigData() ) { static struct HelpKey HelpKeys[NUMLAUFWERKHELPKEYS] = { { 0, 0, "</> Wert erh�hen/erniedrigen" }, { 0, 1, "<Enter> Wert akzeptieren" }, { 40, 1, "<Esc> Programm verlassen" } }; HWND TMSLaufwerk; BOOL LaufwerkOK; WinFill( Desktop, '�', 0, 22, 79, 22 ); InitConfigData(); WinString( Desktop, "TMS Laufwerk", CENTER, 0, 7 ); WinString( Desktop, "������������", CENTER, 0, 8 ); WinColor( Desktop, HIGHLIGHT, 33, 7, 46, 7 ); WinCreateWindow( Desktop, &TMSLaufwerk, TMSLaufWerkProc, 0, 0, 37, 10, 40, 10 ); WinString( Desktop, "Geben Sie bitte an, in welchem Laufwerk sich TMS befindet.", CENTER, 0, 14 ); WinSendMsg( Bottomline, WM_HELP, (WORD)&HelpKeys, NUMLAUFWERKHELPKEYS ); WinSendMsg( TMSLaufwerk, WM_SHOW, 0, 0 ); WinSendMsg( TMSLaufwerk, WM_SETFOCUS, 0, 0 ); do { LaufwerkOK = TRUE; do { Key = BiosGetKey(); Msg = WinSendMsg( TMSLaufwerk, WM_CHAR, (MPARAM)Key, 0 ); } while( (WORD)Msg != KBENTER && (WORD)Msg != KBESC ); if( (WORD)Msg == KBESC ) { DosFreeFarMem( ConfigData ); WinDestroyWindow( TMSLaufwerk ); WinDestroyWindow( Bottomline ); WinDestroyWindow( Desktop ); return; } if( !OpenPathFile() ) { LaufwerkOK = FALSE; } } while( !LaufwerkOK ); ClosePathFile(); WinDestroyWindow( TMSLaufwerk ); WinColor( Desktop, NORMAL, 0, 0, WinGetx2( Desktop ), 21 ); WinFill( Desktop, SPACECHAR, 0, 0, WinGetx2( Desktop ), WinGety2( Desktop ) ); } switch( NumArgs ) { case 2: StdStrLwr( Args[1] ); if( StdStrCmp( Args[1], "exportfile" ) == 0 || StdStrCmp( Args[1], "export" ) == 0 ) { WinFill( Desktop, '�', 0, 22, 79, 22 ); ExportFileConversion(); } else { ; // Debug!!!! } break; case 1: if( !OpenPathFile() ) ; // Debug!!!!! ReadPathFileEntry( TMSBEGRUENDNO, FileName, FALSE ); DosOpen( FileName, &TMSBegrFile, OPEN_RDONLY ); DosLastModTime( TMSBegrFile, &EffTime ); if( ConfigData->TMSBegruendungsDatum != EffTime ) { if( !CreateList( TMSBegrFile, BEGRUENDUNGEN ) ) { WinString( Desktop, "In TMS sind 0 Begr�ndungen verzeichnet!", LEFT, 0, 0 ); return; // Debug-Version!!!!! } SortList( BEGRUENDUNGEN ); ConfigData->TMSBegruendungsDatum = EffTime; StdFarMemSet( ConfigData->BegrCheckListe, TRUE, sizeof( ConfigData->BegrCheckListe ) ); } DosClose( TMSBegrFile ); ReadPathFileEntry( TMSABTEILNO, FileName, FALSE ); DosOpen( FileName, &TMSAbtFile, OPEN_RDONLY ); DosLastModTime( TMSAbtFile, &EffTime ); if( ConfigData->TMSAbteilungsDatum != EffTime ) { if( !CreateList( TMSAbtFile, ABTEILUNGEN ) ) { WinString( Desktop, "In TMS sind 0 Abteilungen verzeichnet!", LEFT, 0, 0 ); return; // Debug-Version!!!!! } SortList( ABTEILUNGEN ); ConfigData->TMSAbteilungsDatum = EffTime; StdFarMemSet( ConfigData->AbtCheckListe, TRUE, sizeof( ConfigData->AbtCheckListe ) ); } DosClose( TMSAbtFile ); ReadPathFileEntry( TMSZEITKNO, FileName, FALSE ); DosOpen( FileName, &TMSZKontFile, OPEN_RDONLY ); DosLastModTime( TMSZKontFile, &EffTime ); if( ConfigData->TMSZeitKontiDatum != EffTime ) { if( !CreateList( TMSZKontFile, ZEITKONTI ) ) { WinString( Desktop, "In TMS sind 0 Zeitkonti verzeichnet!", LEFT, 0, 0 ); return; // Debug-Version!!!!! } // SortList( ZEITKONTI ); ConfigData->TMSZeitKontiDatum = EffTime; StdFarMemSet( ConfigData->ZKontCheckListe, TRUE, sizeof( ConfigData->ZKontCheckListe ) ); } DosClose( TMSZKontFile ); ReadPathFileEntry( TMSPRINTERINFONO, FileName, FALSE ); ReadPathFileEntry( TMSPRINTERPORTNO, PrinterPort, TRUE ); GetPrinterInfo( FileName, PrinterPort ); ClosePathFile(); LoadList( BEGRUENDUNGEN ); LoadList( ABTEILUNGEN ); LoadList( ZEITKONTI ); WinString( Desktop, "������������������������������������Ŀ", CENTER, 0, 3 ); WinString( Desktop, "� �", CENTER, 0, 4 ); WinString( Desktop, "� Statistik - Generierung �", CENTER, 0, 5 ); WinString( Desktop, "� ����������������������� �", CENTER, 0, 6 ); WinString( Desktop, "� und �", CENTER, 0, 7 ); WinString( Desktop, "� ��� �", CENTER, 0, 8 ); WinString( Desktop, "� Verwaltung der Exportdaten �", CENTER, 0, 9 ); WinString( Desktop, "� �������������������������� �", CENTER, 0, 10 ); WinString( Desktop, "� �", CENTER, 0, 11 ); WinString( Desktop, "� von TMS �", CENTER, 0, 12 ); WinString( Desktop, "� �", CENTER, 0, 13 ); WinString( Desktop, "��������������������������������������", CENTER, 0, 14 ); WinString( Desktop, " (c) Copyright 1992, 1993 J.Skripsky ", CENTER, 0, 16 ); WinString( Desktop, " Designed and Developed by ", CENTER, 0, 18 ); WinString( Desktop, " Juraj Skripsky ", CENTER, 0, 19 ); WinString( Desktop, " CH-8952 Schlieren ", CENTER, 0, 20 ); BiosGetKey(); WinFill( Desktop, SPACECHAR, 0, 0, WinGetx2( Desktop ), WinGety2( Desktop ) ); WinFill( Desktop, '�', 0, 22, 79, 22 ); WinFill( Desktop, '�', 27, 0, 27, 21 ); WinFill( Desktop, '�', 0, 22, 79, 22 ); WinCreateWindow( Desktop, &Menu, MenuProc, 0, 0, 1, 1, 25, 20 ); WinSendMsg( Menu, WM_SHOW, 0, 0 ); WinSendMsg( Menu, WM_SETFOCUS, 0, 0 ); do { Key = BiosGetKey(); Msg = WinSendMsg( Menu, WM_CHAR, (MPARAM)Key, 0 ); } while( (WORD)Msg != KBESC ); FreeList( BEGRUENDUNGEN ); FreeList( ABTEILUNGEN ); FreeList( ZEITKONTI ); FreePrinterInfo(); WinDestroyWindow( Menu ); break; } if( !WriteConfigData() ) ; // Debug!!!!! WinDestroyWindow( Bottomline ); WinDestroyWindow( Desktop ); WinTerminate(); }
MSG CheckListeProc( HWND HWnd, MSG Msg, MPARAM MP1, MPARAM MP2 ) { static struct HelpKey HelpKeys[NUMCHECKLSTHELPKEYS] = { { 0, 0, "</> Wert erh�hen/erniedrigen" }, { 0, 1, "<Tab> Schaltfeld wechseln" }, { 40, 1, "<Esc> Schalttafel verlassen" } }; static HWND CheckLstArrows; static struct Eintrag FAR *Liste; static WORD NumEintraege; static BOOL FAR *CheckListe; static WORD Selection; static WORD TopLine; static BYTE Type; switch( Msg ) { case WM_CREATE: { WinCreateWindow( HWnd, &CheckLstArrows, CheckLstArrowsProc, 0, 0, -3, -4, -3, 20 ); Type = (BYTE)MP1; switch( Type ) { case BEGRUENDUNGEN: case PMBEGRUENDUNGEN: Liste = Begruendungen; NumEintraege = NumBegruendungen; CheckListe = ConfigData->BegrCheckListe[MP2]; break; case ABTEILUNGEN: Liste = Abteilungen; NumEintraege = NumAbteilungen; CheckListe = ConfigData->AbtCheckListe[MP2]; break; case ZEITKONTI: Liste = ZeitKonti; NumEintraege = NumZeitKonti; CheckListe = ConfigData->ZKontCheckListe[MP2]; break; } Selection = 0; TopLine = 0; return( WM_PROCESSED ); } case WM_DESTROY: WinDestroyWindow( CheckLstArrows ); return( WM_PROCESSED ); case WM_SHOW: { CHAR String[31]; BYTE LineCounter; WinColor( HWnd, PANEL, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); WinFill( HWnd, SPACECHAR, 0, 0, WinGetx2( HWnd ), WinGety2( HWnd ) ); WinString( HWnd, "�����������������������������������������", LEFT, 1, 0 ); WinString( HWnd, "�����������������������������������������", LEFT, 1, WinGety2( HWnd ) ); for( LineCounter = 0; LineCounter <= (BYTE)(WinGety2( HWnd ) - 2); LineCounter++ ) { if( LineCounter + TopLine == NumEintraege ) break; switch( Type ) { case PMBEGRUENDUNGEN: switch( CheckListe[LineCounter + TopLine] ) { case PLUS: WinString( HWnd, "+", LEFT, 1, (BYTE)(LineCounter + 1) ); break; case MINUS: WinString( HWnd, "-", LEFT, 1, (BYTE)(LineCounter + 1) ); break; } break; default: if( CheckListe[LineCounter + TopLine] ) WinString( HWnd, "�", LEFT, 1, (BYTE)(LineCounter + 1) ); } StdFarMemCpy( String, Liste[LineCounter + TopLine].Code, sizeof( Liste[LineCounter + TopLine].Code ) ); WinString( HWnd, String, LEFT, 3, (BYTE)(LineCounter + 1) ); StdFarMemCpy( String, Liste[LineCounter + TopLine].Description, sizeof( Liste[LineCounter + TopLine].Description ) ); WinString( HWnd, String, LEFT, 10, (BYTE)(LineCounter + 1) ); } return( WM_PROCESSED ); } case WM_SETFOCUS: WinColor( HWnd, HIGHLIGHT, 0, (BYTE)(Selection - TopLine + 1), WinGetx2( HWnd ), (BYTE)(Selection - TopLine + 1) ); return( WM_PROCESSED ); case WM_CLEARFOCUS: WinColor( HWnd, PANEL, 0, (BYTE)(Selection - TopLine + 1), WinGetx2( HWnd ), (BYTE)(Selection - TopLine + 1) ); return( WM_PROCESSED ); case WM_CHAR: switch( (WORD)MP1 ) { case KBDOWN: case KBRIGHT: if( Selection == NumEintraege - 1 ) break; WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 ); Selection++; if( Selection - TopLine + 1 > (WORD)(WinGety2( HWnd ) - 1) ) { TopLine++; WinSendMsg( HWnd, WM_SHOW, 0, 0 ); } WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); break; case KBUP: case KBLEFT: if( Selection == 0) break; WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 ); Selection--; if( Selection < TopLine ) { TopLine--; WinSendMsg( HWnd, WM_SHOW, 0, 0 ); } WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); break; case KBHOME: WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 ); TopLine = 0; Selection = 0; WinSendMsg( HWnd, WM_SHOW, 0, 0 ); WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); break; case KBEND: WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 ); Selection = NumEintraege - 1; if( NumEintraege - 1 < (WORD)(WinGety2( HWnd ) - 1) ) TopLine = 0; else TopLine = NumEintraege - (WinGety2( HWnd ) - 1); WinSendMsg( HWnd, WM_SHOW, 0, 0 ); WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); break; case KBSPACE: WinSendMsg( HWnd, WM_CLEARFOCUS, 0, 0 ); switch( Type ) { case PMBEGRUENDUNGEN: switch( CheckListe[Selection] ) { case FALSE: CheckListe[Selection] = PLUS; break; case PLUS: CheckListe[Selection] = MINUS; break; case MINUS: CheckListe[Selection] = FALSE; break; } break; default: CheckListe[Selection] = (BOOL)(!CheckListe[Selection]); } WinSendMsg( HWnd, WM_SHOW, 0, 0 ); WinSendMsg( HWnd, WM_SETFOCUS, 0, 0 ); break; default: return( MP1 ); } return( WM_PROCESSED ); } }
IFACEMETHODIMP InternalDWriteTextRenderer::DrawGlyphRun( void*, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_GLYPH_ORIENTATION_ANGLE orientationAngle, DWRITE_MEASURING_MODE measuringMode, DWRITE_GLYPH_RUN const* glyphRun, DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription, IUnknown* customDrawingObject) { return ExceptionBoundary( [&] { auto customDrawingObjectInspectable = GetCustomDrawingObjectInspectable(m_device.Get(), customDrawingObject); auto canvasFontFace = CanvasFontFace::GetOrCreate(As<IDWriteFontFace2>(glyphRun->fontFace).Get()); std::vector<CanvasGlyph> glyphs; glyphs.reserve(glyphRun->glyphCount); for (uint32_t i = 0; i < glyphRun->glyphCount; ++i) { CanvasGlyph glyph{}; glyph.Advance = glyphRun->glyphAdvances[i]; glyph.Index = glyphRun->glyphIndices[i]; if (glyphRun->glyphOffsets) { glyph.AdvanceOffset = glyphRun->glyphOffsets[i].advanceOffset; glyph.AscenderOffset = glyphRun->glyphOffsets[i].ascenderOffset; } glyphs.push_back(glyph); } WinString localeNameString; WinString textString; std::vector<int> clusterMapIndices; if (glyphRunDescription) { localeNameString = WinString(glyphRunDescription->localeName); textString = WinString(glyphRunDescription->string); clusterMapIndices.reserve(glyphRunDescription->stringLength); for (uint32_t i = 0; i < glyphRunDescription->stringLength; ++i) { clusterMapIndices.push_back(glyphRunDescription->clusterMap[i]); } } ThrowIfFailed(m_textRenderer->DrawGlyphRun( Vector2{ baselineOriginX, baselineOriginY }, canvasFontFace.Get(), glyphRun->fontEmSize, glyphRun->glyphCount, glyphs.data(), static_cast<boolean>(glyphRun->isSideways), glyphRun->bidiLevel, customDrawingObjectInspectable.Get(), ToCanvasTextMeasuringMode(measuringMode), localeNameString, textString, glyphRunDescription ? glyphRunDescription->stringLength : 0u, glyphRunDescription ? clusterMapIndices.data() : nullptr, glyphRunDescription ? glyphRunDescription->textPosition : 0u, ToCanvasGlyphOrientation(orientationAngle))); }); }
SwitchableTestBrushFixture(bool initializeWithBitmap = false) : m_transform(D2D1::Matrix3x2F(1, 2, 3, 4, 5, 6)) { auto canvasDevice = Make<MockCanvasDevice>(); auto adapter = std::make_shared<TestCanvasImageBrushAdapter>(); m_bitmapBrush = Make<MockD2DBitmapBrush>(); m_imageBrush = Make<MockD2DImageBrush>(); canvasDevice->MockCreateBitmap = [&]() { return Make<StubD2DBitmap>(); }; canvasDevice->MockCreateBitmapBrush = [&](ID2D1Bitmap1* bitmap) { m_bitmapBrush->MockGetBitmap = [&](ID2D1Bitmap** bitmap) { if (m_targetImage) m_targetImage.CopyTo(bitmap); else *bitmap = nullptr; }; m_bitmapBrush->MockSetBitmap = [&](ID2D1Bitmap* bitmap) { m_targetImage = bitmap; }; m_bitmapBrush->MockGetExtendModeX = [&]() { return D2D1_EXTEND_MODE_MIRROR; }; m_bitmapBrush->MockGetExtendModeY = [&]() { return D2D1_EXTEND_MODE_WRAP; }; m_bitmapBrush->MockGetInterpolationMode1 = [&]() { return D2D1_INTERPOLATION_MODE_ANISOTROPIC; }; m_bitmapBrush->MockGetOpacity = [&]() { return 0.1f; }; m_bitmapBrush->MockGetTransform = [&](D2D1_MATRIX_3X2_F* transform) {*transform = m_transform; }; m_bitmapBrush->MockSetExtendModeX = [&](D2D1_EXTEND_MODE extend) { Assert::AreEqual(D2D1_EXTEND_MODE_MIRROR, extend); }; m_bitmapBrush->MockSetExtendModeY = [&](D2D1_EXTEND_MODE extend) { Assert::AreEqual(D2D1_EXTEND_MODE_WRAP, extend); }; m_bitmapBrush->MockSetInterpolationMode1 = [&](D2D1_INTERPOLATION_MODE mode) { Assert::AreEqual(D2D1_INTERPOLATION_MODE_ANISOTROPIC, mode); }; m_bitmapBrush->MockSetOpacity = [&](float opacity) { Assert::AreEqual(0.1f, opacity); }; m_bitmapBrush->MockSetTransform = [&](const D2D1_MATRIX_3X2_F* transform) { m_transform = *transform; }; return m_bitmapBrush; }; canvasDevice->MockCreateImageBrush = [&](ID2D1Image* image) { m_imageBrush->MockGetImage = [&](ID2D1Image** image) { if (m_targetImage) m_targetImage.CopyTo(image); else *image = nullptr; }; m_imageBrush->MockSetImage = [&](ID2D1Image* image) { m_targetImage = image; }; m_imageBrush->MockGetExtendModeX = [&]() { return D2D1_EXTEND_MODE_MIRROR; }; m_imageBrush->MockGetExtendModeY = [&]() { return D2D1_EXTEND_MODE_WRAP; }; m_imageBrush->MockGetInterpolationMode = [&]() { return D2D1_INTERPOLATION_MODE_ANISOTROPIC; }; m_imageBrush->MockGetOpacity = [&]() { return 0.1f; }; m_imageBrush->MockGetTransform = [&](D2D1_MATRIX_3X2_F* transform) {*transform = m_transform; }; m_imageBrush->MockSetExtendModeX = [&](D2D1_EXTEND_MODE extend) { Assert::AreEqual(D2D1_EXTEND_MODE_MIRROR, extend); }; m_imageBrush->MockSetExtendModeY = [&](D2D1_EXTEND_MODE extend) { Assert::AreEqual(D2D1_EXTEND_MODE_WRAP, extend); }; m_imageBrush->MockSetInterpolationMode = [&](D2D1_INTERPOLATION_MODE mode) { Assert::AreEqual(D2D1_INTERPOLATION_MODE_ANISOTROPIC, mode); }; m_imageBrush->MockSetOpacity = [&](float opacity) { Assert::AreEqual(0.1f, opacity); }; m_imageBrush->MockSetTransform = [&](const D2D1_MATRIX_3X2_F* transform) { m_transform = *transform; }; m_imageBrush->MockSetSourceRectangle = [&](const D2D1_RECT_F* rect) { Assert::AreEqual(D2D1::RectF(0, 0, 10, 10), *rect); }; return m_imageBrush; }; ComPtr<ICanvasImage> canvasBitmap; if (initializeWithBitmap) { auto fileName = WinString(L"asdf"); auto wicConverter = Make<MockWICFormatConverter>(); auto bitmapAdapter = std::make_shared<TestBitmapResourceCreationAdapter>(wicConverter); canvasBitmap = Make<CanvasBitmap>(canvasDevice.Get(), fileName, bitmapAdapter); } m_canvasImageBrush = Make<CanvasImageBrush>(canvasDevice.Get(), canvasBitmap.Get(), adapter); }