winamp/Src/installer/shared/scripts/textRect.nsh
2024-09-24 14:54:57 +02:00

186 lines
3.6 KiB
Plaintext

!ifndef NULLSOFT_NX_TEXT_RECT_NSIS_HEADER
!define NULLSOFT_NX_TEXT_RECT_NSIS_HEADER
!include "util.nsh"
!include "logicLib.nsh"
!include "system.nsh"
!macro NX_CalculateTextRectInternal
!define hwnd_ $R0
!define text_ $R1
!define style_ $R2
!define maxWidth_ $R3
!define hdc_ $R4
!define font_ $R5
!define previousFont_ $R6
!define width_ $R7
!define height_ $R8
!define averageCharWidth_ $R9
Exch ${hwnd_}
Exch 1
Exch ${text_}
Exch 2
Exch ${style_}
Exch 3
Exch ${maxWidth_}
Push ${hdc_}
Push ${font_}
Push ${previousFont_}
Push ${width_}
Push ${height_}
Push ${averageCharWidth_}
StrCpy ${width_} 0
StrCpy ${height_} 0
StrCpy ${averageCharWidth_} 0
System::Call "${fnGetDCEx}(${hwnd_}, 0, ${DCX_CACHE}|${DCX_NORESETATTRS}).s"
Pop ${hdc_}
SendMessage ${hwnd_} ${WM_GETFONT} 0 0 ${font_}
System::Call "${fnSelectObject}(${hdc_}, ${font_}).s"
Pop ${previousFont_}
; Get Text Metrics (in case of empty line)
Push $0
Push $1
System::Call "*${stTEXTMETRIC} .r1"
System::Call "${fnGetTextMetrics}(${hdc_}, $1).r0"
${If} $0 != 0
Push $2
System::Call "*$1${stTEXTMETRIC}(.r0, ., ., ., ., .r2, _)"
StrCpy ${height_} $0
StrCpy ${averageCharWidth_} $2
Pop $2
${EndIf}
System::Free $1
Pop $1
Pop $0
; Calculate Text Rect
Push $0
StrLen $0 ${text_}
${If} $0 != 0
Push $1 ; rect
Push $2 ; text flags
; build text flags
StrCpy $2 ${DT_CALCRECT}|${DT_LEFT}|${DT_TOP}
IntOp $2 $2 | ${style_}
System::Call "*${stRECT}(0, 0, ${maxWidth_}, $0) .r1"
System::Call "${fnDrawText}(${hdc_}, '${text_}', -1, $1, $2).r0"
${if} $0 != 0
Push $3
Push $4
Push $5
System::Call "*$1${stRECT}(.r2, .r3, .r4, .r5)"
IntOp ${width_} $4 - $2
IntOp $3 $5 - $3
${if} $3 > ${height_}
StrCpy ${height_} $3
${EndIf}
IntOp $4 ${averageCharWidth_} / 2
IntOp ${width_} ${width_} + $4
Pop $5
Pop $4
Pop $3
${EndIf}
System::Free $1
Pop $2 ; text flags
Pop $1 ; rect
${EndIf}
Pop $0
${If} ${previousFont_} != 0
System::Call "${fnSelectObject}(${hdc_}, ${previousFont_})"
${EndIf}
System::Call "${fnReleaseDC}(${hwnd_}, ${hdc_})"
StrCpy ${style_} ${width_}
StrCpy ${text_} ${height_}
Pop ${averageCharWidth_}
Pop ${height_}
Pop ${width_}
Pop ${previousFont_}
Pop ${font_}
Pop ${hdc_}
Pop ${maxWidth_}
Pop ${hwnd_}
Exch ${text_}
Exch
Exch ${style_}
!undef hwnd_
!undef text_
!undef style_
!undef maxWidth_
!undef hdc_
!undef font_
!undef previousFont_
!undef width_
!undef height_
!undef averageCharWidth_
!macroend
!macro NX_CalculateTextRect __hwnd __text __style __maxWidth __width __height
Push "${__maxWidth}"
Push "${__style}"
Push "${__text}"
Push "${__hwnd}"
${CallArtificialFunction} NX_CalculateTextRectInternal
Pop "${__width}"
Pop "${__height}"
!macroend
!define NX_CalculateTextRect `!insertmacro NX_CalculateTextRect`
!macro NX_GetLabelIdealSize __hwnd __maxWidth __width __height
Push "${__maxWidth}"
System::Call "${fnGetWindowLong}(${__hwnd}, ${GWL_STYLE}).s"
Exch $0
Push $1
Push $2
StrCpy $2 0
IntOp $1 $0 & ${SS_EDITCONTROL}
${If} $1 != 0
IntOp $2 $2 | ${DT_EDITCONTROL}
${EndIf}
IntOp $1 $0 & ${SS_NOPREFIX}
${If} $1 != 0
IntOp $2 $2 | ${DT_NOPREFIX}
${EndIf}
IntOp $1 $0 & ${SS_SIMPLE}
${If} $1 != 0
IntOp $2 $2 | ${DT_SINGLELINE}
${Else}
IntOp $2 $2 | ${DT_WORDBREAK}
${EndIf}
StrCpy $0 $2
Pop $2
Pop $1
Exch $0
System::Call "${fnGetWindowText}(${__hwnd}, .s, ${NSIS_MAX_STRLEN})"
Push "${__hwnd}"
${CallArtificialFunction} NX_CalculateTextRectInternal
Pop "${__width}"
Pop "${__height}"
!macroend
!define NX_GetLabelIdealSize `!insertmacro NX_GetLabelIdealSize`
!endif ; defined(NULLSOFT_NX_TEXT_RECT_NSIS_HEADER)