diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/installer/shared/scripts/textRect.nsh | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/installer/shared/scripts/textRect.nsh')
-rw-r--r-- | Src/installer/shared/scripts/textRect.nsh | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/Src/installer/shared/scripts/textRect.nsh b/Src/installer/shared/scripts/textRect.nsh new file mode 100644 index 00000000..fd23eb84 --- /dev/null +++ b/Src/installer/shared/scripts/textRect.nsh @@ -0,0 +1,186 @@ +!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)
\ No newline at end of file |