annotate foosdk/sdk/libPPUI/PaintUtils.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "stdafx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include <vsstyle.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "PaintUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "gdiplus_helpers.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "GDIUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "win32_op.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #include "wtl-pp.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 namespace PaintUtils {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 static t_uint16 extractChannel16(t_uint32 p_color,int p_which) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 return (t_uint16)( ((p_color >> (p_which * 8)) & 0xFF) << 8 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 static t_uint8 extractbyte(t_uint32 p_val,t_size p_which) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 return (t_uint8) ( (p_val >> (p_which * 8)) & 0xFF );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 t_uint32 BlendColorEx(t_uint32 p_color1, t_uint32 p_color2, double mix) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 PFC_ASSERT(mix >= 0 && mix <= 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 t_uint32 ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 for(t_size walk = 0; walk < 3; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 int val1 = extractbyte(p_color1,walk), val2 = extractbyte(p_color2,walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 int val = val1 + pfc::rint32((val2 - val1) * mix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 ret |= (t_uint32)val << (walk * 8);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 t_uint32 BlendColor(t_uint32 p_color1, t_uint32 p_color2, int p_percentage) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 PFC_ASSERT(p_percentage <= 100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 t_uint32 ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 for(t_size walk = 0; walk < 3; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 int val1 = extractbyte(p_color1,walk), val2 = extractbyte(p_color2,walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 int val = val1 + MulDiv(val2 - val1,p_percentage,100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 ret |= (t_uint32)val << (walk * 8);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 t_uint32 DriftColor(t_uint32 p_color,unsigned p_delta,bool p_direction) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 t_uint32 ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 for(t_size walk = 0; walk < 3; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 unsigned val = extractbyte(p_color,walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (p_direction) val = 0xFF - val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 if (val < p_delta) val = p_delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 val += p_delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 if (val > 0xFF) val = 0xFF;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 if (p_direction) val = 0xFF - val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 ret |= (t_uint32)val << (walk * 8);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 void FillVertexColor(TRIVERTEX & p_vertex,t_uint32 p_color,t_uint16 p_alpha) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 p_vertex.Red = extractChannel16(p_color,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 p_vertex.Green = extractChannel16(p_color,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 p_vertex.Blue = extractChannel16(p_color,2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 p_vertex.Alpha = p_alpha;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 void FillRectSimple(CDCHandle p_dc,const CRect & p_rect,t_uint32 p_color) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 p_dc.FillSolidRect(p_rect, p_color);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 void GradientFillRect(CDCHandle p_dc,const CRect & p_rect,t_uint32 p_color1, t_uint32 p_color2, bool p_horizontal) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 TRIVERTEX verticies[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 GRADIENT_RECT element = {0,1};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 FillVertexColor(verticies[0],p_color1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 FillVertexColor(verticies[1],p_color2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 verticies[0].x = p_rect.left; verticies[0].y = p_rect.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 verticies[1].x = p_rect.right; verticies[1].y = p_rect.bottom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 p_dc.GradientFill(verticies,tabsize(verticies),&element,1,p_horizontal ? GRADIENT_FILL_RECT_H : GRADIENT_FILL_RECT_V);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 void GradientSplitRect(CDCHandle p_dc,const CRect & p_rect,t_uint32 p_bkColor, t_uint32 p_gradientColor,int p_splitPercent) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 const long split = p_rect.top + MulDiv(p_rect.Height(),p_splitPercent,100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 CRect rcTemp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 rcTemp = p_rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 rcTemp.bottom = split;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 GradientFillRect(p_dc,rcTemp,p_bkColor,p_gradientColor,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 rcTemp = p_rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 rcTemp.top = split;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 GradientFillRect(p_dc,rcTemp,p_gradientColor,p_bkColor,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 void GradientBar(CDCHandle p_dc,const CRect & p_rect,t_uint32 p_exterior, t_uint32 p_interior, int p_percentage) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 const int gradientPix = MulDiv(p_rect.Height(),p_percentage,100);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 CRect rcTemp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 rcTemp = p_rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 rcTemp.bottom = rcTemp.top + gradientPix;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 GradientFillRect(p_dc,rcTemp,p_exterior,p_interior,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 rcTemp = p_rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 rcTemp.top += gradientPix; rcTemp.bottom -= gradientPix;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 FillRectSimple(p_dc,rcTemp,p_interior);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 rcTemp = p_rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 rcTemp.top = rcTemp.bottom - gradientPix;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 GradientFillRect(p_dc,rcTemp,p_interior,p_exterior,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 void RenderItemBackground(CDCHandle p_dc,const CRect & p_itemRect,t_size p_item,t_uint32 p_color) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 const DWORD bkColor_base = p_color;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 const DWORD bkColor = DriftColor(bkColor_base,3, (p_item&1) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 //GradientSplitRect(p_dc,p_itemRect,bkColor,BlendColor(bkColor,textColor,7),80);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 GradientBar(p_dc,p_itemRect,bkColor_base,bkColor,10);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 double Luminance(t_uint32 color) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 double r = extractbyte(color,0), g = extractbyte(color,1), b = extractbyte(color,2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255.0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 //return (r * 0.3 + g * 0.59 + b * 0.11) / 255.0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 t_uint32 DetermineTextColor(t_uint32 bk) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 double l = Luminance(bk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 if ( l > 0.6 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 return 0; // black
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 return 0xFFFFFF; // white
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 void AddRectToRgn(HRGN p_rgn,CRect const & p_rect) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 CRgn temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 WIN32_OP_D( temp.CreateRectRgnIndirect(p_rect) != NULL );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 CRgnHandle(p_rgn).CombineRgn(temp,RGN_OR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 void FocusRect2(CDCHandle dc, CRect const & rect, COLORREF bkColor) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 COLORREF txColor = DetermineTextColor( bkColor );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 COLORREF useColor = BlendColor(bkColor, txColor, 50);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 CDCBrush brush(dc, useColor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 WIN32_OP_D( dc.FrameRect(rect,brush) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 void FocusRect(CDCHandle dc, CRect const & rect) throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 CDCBrush brush(dc, 0x7F7F7F);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 WIN32_OP_D( dc.FrameRect(rect,brush) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 //dc.DrawFocusRect(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 namespace TrackBar {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 void DrawThumb(HTHEME theme,HDC dc,int state,const RECT * rcThumb, const RECT * rcUpdate) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 if (theme == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 RECT blah = *rcThumb;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 int flags = DFCS_BUTTONPUSH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 switch(state) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 case TUS_NORMAL:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 case TUS_DISABLED:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 flags |= DFCS_INACTIVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 case TUS_PRESSED:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 flags |= DFCS_PUSHED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 DrawFrameControl(dc,&blah,DFC_BUTTON,flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 DrawThemeBackground(theme,dc,TKP_THUMB,state,rcThumb,rcUpdate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 void DrawTrack(HTHEME theme,HDC dc,const RECT * rcTrack, const RECT * rcUpdate) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 if (theme == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 RECT blah = *rcTrack;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 DrawFrameControl(dc,&blah,DFC_BUTTON,DFCS_BUTTONPUSH|DFCS_PUSHED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 DrawThemeBackground(theme,dc,TKP_TRACK,TKS_NORMAL,rcTrack,rcUpdate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 void DrawTrack2(HDC p_dc, const CRect& rcTrack, const CRect& rcUpdate, COLORREF clrHighlight, COLORREF clrShadow) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 CRect rc(*rcTrack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 #if 1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 CDCHandle dc(p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 SelectObjectScope scope(dc, GetStockObject(DC_PEN));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 dc.SetDCPenColor(clrHighlight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 dc.MoveTo(rc.left, rc.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 dc.LineTo(rc.right, rc.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 dc.LineTo(rc.right, rc.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 dc.SetDCPenColor(clrShadow);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 dc.LineTo(rc.left, rc.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 dc.LineTo(rc.left, rc.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 Gdiplus::Point points[] = { Gdiplus::Point(rc.left, rc.bottom), Gdiplus::Point(rc.right, rc.bottom), Gdiplus::Point(rc.right, rc.top), Gdiplus::Point(rc.left, rc.top)};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 GdiplusErrorHandler eh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 Gdiplus::Graphics graphics(p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 eh << graphics.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 Gdiplus::Color c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 c.SetFromCOLORREF(clrHighlight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 Gdiplus::Pen penHL(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 c.SetFromCOLORREF(clrShadow);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 Gdiplus::Pen penSH(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 eh << graphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 eh << graphics.DrawLine(&penHL, points[0], points[1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 eh << graphics.DrawLine(&penHL, points[1], points[2]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 eh << graphics.DrawLine(&penSH, points[2], points[3]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 eh << graphics.DrawLine(&penSH, points[3], points[0]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 } catch (std::exception const& e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 (void)e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 PFC_ASSERT(!"???");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 // console::print(e.what());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 void DrawTrackVolume2(HDC p_dc, const CRect& rcTrack, const CRect& rcUpdate, COLORREF clrHighlight, COLORREF clrShadow) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 CRect rc(rcTrack);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 Gdiplus::Point points[] = { Gdiplus::Point(rc.left, rc.bottom), Gdiplus::Point(rc.right, rc.bottom), Gdiplus::Point(rc.right, rc.top) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 GdiplusErrorHandler eh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 Gdiplus::Graphics graphics(p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 eh << graphics.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 Gdiplus::Color c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 c.SetFromCOLORREF(clrHighlight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 Gdiplus::Pen penHL(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 c.SetFromCOLORREF(clrShadow);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 Gdiplus::Pen penSH(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 eh << graphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 //graphics.DrawPolygon(&pen,points,tabsize(points));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 eh << graphics.DrawLine(&penSH, points[0], points[0] + Gdiplus::Point(0, -1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 eh << graphics.DrawLine(&penHL, points[0], points[1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 eh << graphics.DrawLine(&penHL, points[1], points[2]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 eh << graphics.DrawLine(&penSH, points[2], points[0] + Gdiplus::Point(0, -1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 } catch (std::exception const& e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 (void)e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 PFC_ASSERT(!"???");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 // console::print(e.what());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 void DrawTrackVolume(HTHEME theme,HDC p_dc,const CRect & rcTrack, const CRect & rcUpdate) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 (void)theme; // disregarded
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 DrawTrackVolume2(p_dc, rcTrack, rcUpdate, GetSysColor(COLOR_BTNHIGHLIGHT), GetSysColor(COLOR_BTNSHADOW));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 void DrawSmoothedLine(HDC dc, CPoint pt1, CPoint pt2, COLORREF col, double width) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 Gdiplus::Point points[] = { Gdiplus::Point(pt1.x,pt1.y), Gdiplus::Point(pt2.x,pt2.y) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 GdiplusErrorHandler eh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 Gdiplus::Graphics graphics(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 eh << graphics.GetLastStatus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 Gdiplus::Color c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 c.SetFromCOLORREF( col );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 Gdiplus::Pen pen(c, (Gdiplus::REAL)( width ));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 eh << graphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 //graphics.DrawPolygon(&pen,points,tabsize(points));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 eh << graphics.DrawLine(&pen, points[0], points[1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 } catch(std::exception const & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 (void) e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 PFC_ASSERT(!"???");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 // console::print(e.what());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 static int get_text_width(HDC dc,const TCHAR * src,int len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 if (len<=0) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 SIZE goatse;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 GetTextExtentPoint32(dc,src,len,&goatse);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 return goatse.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 static t_uint32 TextOutColors_TranslateColor(const t_uint32 colors[3], int offset) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 const double v = (double)offset / 3.0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 if (v <= -1) return colors[0];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 else if (v < 0) return BlendColorEx(colors[0], colors[1], v + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 else if (v == 0) return colors[1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 else if (v < 1) return BlendColorEx(colors[1], colors[2], v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 else return colors[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 void TextOutColors_StripCodesAppend(pfc::string_formatter & out, const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 t_size done = 0, walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 if (in[walk] == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 if (walk > done) out.add_string_nc(in + done, walk - done);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 if ((unsigned)in[walk] < 32) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 if (walk > done) {out.add_string_nc(in + done, walk - done);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 done = walk + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 void TextOutColors_StripCodes(pfc::string_formatter & out, const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 out.reset(); TextOutColors_StripCodesAppend(out, in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 static bool IsControlChar(TCHAR c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 return (unsigned)c < 32;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 static int MatchTruncat(HDC dc, int & pixels, const TCHAR * text, int textLen) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 int min = 0, max = textLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 int minWidth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 while(min + 1 < max) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 const int probe = (min + max) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 CSize size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 WIN32_OP( GetTextExtentPoint32(dc, text, probe, &size) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 if (size.cx <= pixels) {min = probe; minWidth = size.cx;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 else max = probe;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 pixels = minWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 return min;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 static int TruncatHeadroom(HDC dc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 CSize size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 WIN32_OP( GetTextExtentPoint32(dc, _T("\x2026"), 1, &size) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 return size.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 static void ExtTextOut_Truncat(HDC dc, int x, int y, CRect const & clip, const TCHAR * text, int textLen) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 int width = pfc::max_t<int>(0, clip.right - x - TruncatHeadroom(dc));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 int truncat = MatchTruncat(dc, width, text, textLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 WIN32_OP( ExtTextOut(dc, x, y, ETO_CLIPPED, &clip, text, truncat, NULL) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 WIN32_OP( ExtTextOut(dc, x + width, y, ETO_CLIPPED, &clip, _T("\x2026"), 1, NULL) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 bool TextContainsCodes(const TCHAR * src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 if (*src == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 if ((unsigned)*src < 32) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 ++src;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 void TextOutColorsEx(HDC dc,const TCHAR * src,const CRect & target,DWORD flags,const t_uint32 colors[3]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 if (!TextContainsCodes(src)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 SetTextColorScope cs(dc, colors[1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 CRect rc(target);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 CDCHandle(dc).DrawText(src,(int)_tcslen(src),rc,DT_NOPREFIX | DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER | flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 const CSize textSize = PaintUtils::TextOutColors_CalcSize(dc, src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 CPoint origin = target.TopLeft();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 origin.y = (target.top + target.bottom - textSize.cy) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 switch(flags & (DT_LEFT | DT_RIGHT | DT_CENTER)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 case DT_LEFT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 case DT_RIGHT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 if (textSize.cx < target.Width()) origin.x = target.right - textSize.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 case DT_CENTER:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 if (textSize.cx < target.Width()) origin.x = (target.right + target.left - textSize.cx) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 TextOutColors(dc, src, (int)_tcslen(src), origin, target, colors);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 void TextOutColors(HDC dc,const TCHAR * src,int len,CPoint offset,const CRect & clip,const t_uint32 colors[3], int tabWidthTotal, int tabWidthDiv) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 SetTextAlign(dc,TA_LEFT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 SetBkMode(dc,TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 int walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 int position = offset.x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 int colorOffset = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 int tabs = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 int positionTabDelta = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 int base = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 while(walk < len && !IsControlChar(src[walk])) ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 if (walk>base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 SetTextColor(dc,TextOutColors_TranslateColor(colors, colorOffset));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 int width = get_text_width(dc,src+base,walk-base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 if (position + width > clip.right) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 ExtTextOut_Truncat(dc, position, offset.y, clip, src + base, walk - base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 WIN32_OP( ExtTextOut(dc,position,offset.y,ETO_CLIPPED,&clip,src+base,walk-base,0) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 position += width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 if (walk>=len) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 while(walk < len && IsControlChar(src[walk])) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 if (src[walk] == TextOutColors_Dim) --colorOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 else if (src[walk] == TextOutColors_Highlight) ++colorOffset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 else if (src[walk] == '\t') {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 int newDelta = MulDiv(++tabs, tabWidthTotal, tabWidthDiv);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 position += newDelta - positionTabDelta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 positionTabDelta = newDelta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 CSize TextOutColors_CalcSize(HDC dc, const TCHAR * src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 CSize acc(0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 for(int walk = 0;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 const int done = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 while(!IsControlChar(src[walk])) ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 if (walk > done) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 CSize temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 WIN32_OP( GetTextExtentPoint32(dc,src + done, walk - done, &temp) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 acc.cx += temp.cx; pfc::max_acc(acc.cy, temp.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 if (src[walk] == 0) return acc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 while(src[walk] != 0 && IsControlChar(src[walk])) ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 t_uint32 TextOutColors_CalcWidth(HDC dc, const TCHAR * src) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 t_uint32 acc = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 for(int walk = 0;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 const int done = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 while(!IsControlChar(src[walk])) ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 acc += get_text_width(dc, src + done, walk - done);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 if (src[walk] == 0) return acc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 while(src[walk] != 0 && IsControlChar(src[walk])) ++walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 pfc::string TextOutColors_ImportScript(pfc::string script) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 pfc::string_formatter temp; TextOutColors_ImportScript(temp, script.ptr()); return temp.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 void TextOutColors_ImportScript(pfc::string_base & out, const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 t_size delta; t_uint32 c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 delta = pfc::utf8_decode_char(in, c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 if (delta == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 switch(c) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 case '>':
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 c = PaintUtils::TextOutColors_Highlight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 case '<':
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 c = PaintUtils::TextOutColors_Dim;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 out.add_char(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 in += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 t_uint32 DrawText_TranslateHeaderAlignment(t_uint32 val) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 switch(val & HDF_JUSTIFYMASK) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 case HDF_LEFT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 return DT_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 case HDF_RIGHT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 return DT_RIGHT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 case HDF_CENTER:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 return DT_CENTER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 void RenderButton(HWND wnd_, HDC dc_, CRect rcUpdate, bool bPressed) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 CDCHandle dc(dc_); CWindow wnd(wnd_);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 CTheme theme; theme.OpenThemeData(wnd, L"BUTTON");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 RelayEraseBkgnd(wnd, wnd.GetParent(), dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 const int part = BP_PUSHBUTTON;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 stNormal = PBS_NORMAL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 stHot = PBS_HOT,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 stDisabled = PBS_DISABLED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 stPressed = PBS_PRESSED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 int state = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 if (!wnd.IsWindowEnabled()) state = stDisabled;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 else if (bPressed) state = stPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 else state = stNormal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 CRect rcClient; WIN32_OP_D( wnd.GetClientRect(rcClient) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 if (theme != NULL && IsThemePartDefined(theme, part, 0)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 DrawThemeBackground(theme, dc, part, state, rcClient, &rcUpdate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 int stateEx = DFCS_BUTTONPUSH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 switch(state) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 case stPressed: stateEx |= DFCS_PUSHED; break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 case stDisabled: stateEx |= DFCS_INACTIVE; break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 DrawFrameControl(dc, rcClient, DFC_BUTTON, stateEx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 void PaintSeparatorControl(HWND wnd_) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 CWindow wnd(wnd_);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 CPaintDC dc(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 TCHAR buffer[512] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 wnd.GetWindowText(buffer, _countof(buffer));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 const int txLen = (int) pfc::strlen_max_t(buffer, _countof(buffer));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 CRect contentRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 WIN32_OP_D(wnd.GetClientRect(contentRect));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 dc.SetBkMode(TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 CBrushHandle brush = (HBRUSH)wnd.GetParent().SendMessage(WM_CTLCOLORSTATIC, (WPARAM)(HDC)dc, (LPARAM)wnd.m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 if (brush != NULL) dc.FillRect(contentRect, brush);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 SelectObjectScope scopeFont(dc, wnd.GetFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 if (txLen > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 CRect rcText(contentRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 if (!wnd.IsWindowEnabled()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 dc.SetTextColor(GetSysColor(COLOR_GRAYTEXT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 WIN32_OP_D(dc.DrawText(buffer, txLen, rcText, DT_NOPREFIX | DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER | DT_LEFT) > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 // WIN32_OP_D( dc.GrayString(NULL, NULL, (LPARAM) buffer, txLen, rcText.left, rcText.top, rcText.Width(), rcText.Height() ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 SIZE txSize, probeSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 const TCHAR probe[] = _T("#");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 if (dc.GetTextExtent(buffer, txLen, &txSize) && dc.GetTextExtent(probe, _countof(probe), &probeSize)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 int spacing = txSize.cx > 0 ? (probeSize.cx / 4) : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 if (txSize.cx + spacing < contentRect.Width()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 const CPoint center = contentRect.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 CRect rcEdge(contentRect.left + txSize.cx + spacing, center.y, contentRect.right, contentRect.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 WIN32_OP_D(dc.DrawEdge(rcEdge, EDGE_ETCHED, BF_TOP));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523