1// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#include "xfa/src/foxitlib.h"
8#define FWLTHEME_CAPACITY_CXFormBorder 3
9#define FWLTHEME_CAPACITY_CYFormBorder 3
10#define FWLTHEME_CAPACITY_CYNarrowCaption 18
11#define FWLTHEME_CAPACITY_CYCaption 29
12#define FWLTHEME_CAPACITY_BigIconSize 32
13#define FWLTHEME_CAPACITY_SmallIconSize 16
14#define FWLTHEME_CAPACITY_FormTextColor 0xFFFFFFFF
15#define FWLTHEME_FORMBTN_Margin 5
16#define FWLTHEME_FORMBTN_Span 2
17#define FWLTHEME_FORMBTN_Size 21
18CFWL_FormTP::CFWL_FormTP() : m_pActiveBitmap(NULL), m_pDeactivebitmap(NULL) {
19  m_pThemeData = new SBThemeData;
20  SetThemeData(0);
21  m_rtDisLBorder.Reset();
22  m_rtDisRBorder.Reset();
23  m_rtDisBBorder.Reset();
24  m_rtDisCaption.Reset();
25}
26CFWL_FormTP::~CFWL_FormTP() {
27  if (m_pThemeData) {
28    delete m_pThemeData;
29    m_pThemeData = NULL;
30  }
31}
32FWL_ERR CFWL_FormTP::Initialize() {
33  InitTTO();
34  InitCaption(TRUE);
35  InitCaption(FALSE);
36  return CFWL_WidgetTP::Initialize();
37}
38FWL_ERR CFWL_FormTP::Finalize() {
39  FinalizeTTO();
40  if (m_pActiveBitmap) {
41    delete m_pActiveBitmap;
42    m_pActiveBitmap = NULL;
43  }
44  if (m_pDeactivebitmap) {
45    delete m_pDeactivebitmap;
46    m_pDeactivebitmap = NULL;
47  }
48  return CFWL_WidgetTP::Finalize();
49}
50FX_BOOL CFWL_FormTP::IsValidWidget(IFWL_Widget* pWidget) {
51  if (!pWidget)
52    return FALSE;
53  FX_DWORD dwHash = pWidget->GetClassID();
54  return dwHash == FWL_CLASSHASH_Form;
55}
56FX_DWORD CFWL_FormTP::SetThemeID(IFWL_Widget* pWidget,
57                                 FX_DWORD dwThemeID,
58                                 FX_BOOL bChildren) {
59  if (m_pThemeData) {
60    SetThemeData(FWL_GetThemeColor(dwThemeID));
61  }
62  InitCaption(TRUE);
63  InitCaption(FALSE);
64  return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
65}
66FX_BOOL CFWL_FormTP::DrawBackground(CFWL_ThemeBackground* pParams) {
67  if (!pParams)
68    return FALSE;
69  int32_t iActive = 0;
70  if (pParams->m_dwStates & FWL_PARTSTATE_FRM_Inactive) {
71    iActive = 1;
72  }
73  FWLTHEME_STATE eState = FWLTHEME_STATE_Normal;
74  switch (pParams->m_dwStates & 0x03) {
75    case FWL_PARTSTATE_FRM_Hover: {
76      eState = FWLTHEME_STATE_Hover;
77      break;
78    }
79    case FWL_PARTSTATE_FRM_Pressed: {
80      eState = FWLTHEME_STATE_Pressed;
81      break;
82    }
83    case FWL_PARTSTATE_FRM_Disabled: {
84      eState = FWLTHEME_STATE_Disabale;
85      break;
86    }
87    default: {}
88  }
89  switch (pParams->m_iPart) {
90    case FWL_PART_FRM_Border: {
91      DrawFormBorder(pParams->m_pGraphics, &pParams->m_rtPart, eState,
92                     &pParams->m_matrix, iActive);
93      break;
94    }
95    case FWL_PART_FRM_Edge: {
96      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
97               &pParams->m_rtPart, &pParams->m_matrix);
98      break;
99    }
100    case FWL_PART_FRM_Background: {
101      FillBackground(pParams->m_pGraphics, &pParams->m_rtPart,
102                     &pParams->m_matrix);
103      break;
104    }
105    case FWL_PART_FRM_Caption: {
106      DrawCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
107                  &pParams->m_matrix, iActive);
108      break;
109    }
110    case FWL_PART_FRM_NarrowCaption: {
111      DrawNarrowCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
112                        &pParams->m_matrix, iActive);
113      break;
114    }
115    case FWL_PART_FRM_CloseBox: {
116      DrawCloseBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
117                   &pParams->m_matrix, iActive);
118      break;
119    }
120    case FWL_PART_FRM_MinimizeBox: {
121      DrawMinimizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
122                      &pParams->m_matrix, iActive);
123      break;
124    }
125    case FWL_PART_FRM_MaximizeBox: {
126      DrawMaximizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
127                      pParams->m_dwData, &pParams->m_matrix, iActive);
128      break;
129    }
130    case FWL_PART_FRM_Icon: {
131      DrawIconImage(pParams->m_pGraphics, pParams->m_pImage, &pParams->m_rtPart,
132                    eState, &pParams->m_matrix, iActive);
133      break;
134    }
135    default: {}
136  }
137  return TRUE;
138}
139FX_BOOL CFWL_FormTP::DrawText(CFWL_ThemeText* pParams) {
140  if (!m_pTextOut)
141    return FALSE;
142  if (pParams->m_iPart == FWL_PART_FRM_Caption) {
143    m_pTextOut->SetTextColor(0xFFFFFFFF);
144  } else {
145    m_pTextOut->SetTextColor(0xFF000000);
146  }
147  return CFWL_WidgetTP::DrawText(pParams);
148}
149void* CFWL_FormTP::GetCapacity(CFWL_ThemePart* pThemePart,
150                               FX_DWORD dwCapacity) {
151  FX_BOOL bDefPro = FALSE;
152  FX_BOOL bDwordVal = FALSE;
153  switch (dwCapacity) {
154    case FWL_WGTCAPACITY_CXBorder: {
155      m_fValue = FWLTHEME_CAPACITY_CXFormBorder;
156      break;
157    }
158    case FWL_WGTCAPACITY_CYBorder: {
159      m_fValue = FWLTHEME_CAPACITY_CYFormBorder;
160      break;
161    }
162    case FWL_WGTCAPACITY_FRM_CYCaption: {
163      m_fValue = FWLTHEME_CAPACITY_CYCaption;
164      break;
165    }
166    case FWL_WGTCAPACITY_FRM_CYNarrowCaption: {
167      m_fValue = FWLTHEME_CAPACITY_CYCaption;
168      break;
169    }
170    case FWL_WGTCAPACITY_TextColor: {
171      bDwordVal = TRUE;
172      m_dwValue = FWLTHEME_CAPACITY_FormTextColor;
173      break;
174    }
175    case FWL_WGTCAPACITY_FRM_BigIcon: {
176      m_fValue = FWLTHEME_CAPACITY_BigIconSize;
177      break;
178    }
179    case FWL_WGTCAPACITY_FRM_SmallIcon: {
180      m_fValue = FWLTHEME_CAPACITY_SmallIconSize;
181      break;
182    }
183    default: { bDefPro = TRUE; }
184  }
185  if (!bDefPro) {
186    if (bDwordVal) {
187      return &m_dwValue;
188    }
189    return &m_fValue;
190  }
191  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
192}
193FWL_ERR CFWL_FormTP::GetPartRect(CFWL_ThemePart* pThemePart,
194                                 CFX_RectF& rtPart) {
195  switch (pThemePart->m_iPart) {
196    case FWL_PART_FRM_CloseBox: {
197      CalCloseBox(pThemePart->m_pWidget, rtPart);
198      break;
199    }
200    case FWL_PART_FRM_MaximizeBox: {
201      CalMaxBox(pThemePart->m_pWidget, rtPart);
202      break;
203    }
204    case FWL_PART_FRM_MinimizeBox: {
205      CalMinBox(pThemePart->m_pWidget, rtPart);
206      break;
207    }
208    case FWL_PART_FRM_HeadText: {
209      CalCaption(pThemePart->m_pWidget, rtPart);
210      break;
211    }
212    case FWL_PART_FRM_Icon: {
213      CalIcon(pThemePart->m_pWidget, rtPart);
214      break;
215    }
216    default: {}
217  }
218  return FWL_ERR_Succeeded;
219}
220void CFWL_FormTP::CalCloseBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
221  FX_DWORD dwStyles = pWidget->GetStyles();
222  CFX_RectF rtWidget;
223  pWidget->GetWidgetRect(rtWidget);
224  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
225  if (dwStyles & FWL_WGTSTYLE_CloseBox) {
226    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span,
227             rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
228             FWLTHEME_FORMBTN_Size);
229  } else {
230    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span,
231             rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
232  }
233}
234void CFWL_FormTP::CalMaxBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
235  FX_DWORD dwStyles = pWidget->GetStyles();
236  CFX_RectF rtWidget;
237  pWidget->GetWidgetRect(rtWidget);
238  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
239  if (dwStyles & FWL_WGTSTYLE_MaximizeBox) {
240    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size +
241                 FWLTHEME_FORMBTN_Span * 2,
242             rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
243             FWLTHEME_FORMBTN_Size);
244  } else {
245    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size +
246                 FWLTHEME_FORMBTN_Span * 2,
247             rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
248  }
249}
250void CFWL_FormTP::CalMinBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
251  FX_DWORD dwStyles = pWidget->GetStyles();
252  CFX_RectF rtWidget;
253  pWidget->GetWidgetRect(rtWidget);
254  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
255  if (dwStyles & FWL_WGTSTYLE_MinimizeBox) {
256    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin +
257                 FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3,
258             rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
259             FWLTHEME_FORMBTN_Size);
260  } else {
261    rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin +
262                 FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3,
263             rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
264  }
265}
266void CFWL_FormTP::CalCaption(IFWL_Widget* pWidget, CFX_RectF& rect) {
267  CFX_RectF rtWidget;
268  pWidget->GetWidgetRect(rtWidget);
269  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
270  rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin,
271           rtWidget.top + FWLTHEME_FORMBTN_Margin - 2,
272           rtWidget.width - FWLTHEME_FORMBTN_Margin * 2,
273           FWLTHEME_FORMBTN_Size + 2 * FWLTHEME_FORMBTN_Margin + 4);
274}
275void CFWL_FormTP::CalIcon(IFWL_Widget* pWidget, CFX_RectF& rect) {}
276void CFWL_FormTP::DrawFormBorder(CFX_Graphics* pGraphics,
277                                 const CFX_RectF* pRect,
278                                 FWLTHEME_STATE eState,
279                                 CFX_Matrix* pMatrix,
280                                 int32_t iActive) {
281  CFX_RectF rt;
282  rt.Set(pRect->left, pRect->top, 1, pRect->height);
283  FX_FLOAT fBottom, fRight;
284  fBottom = pRect->bottom();
285  fRight = pRect->right();
286  CFX_Path path;
287  path.Create();
288  CFX_Color clrLine;
289  path.Clear();
290  path.MoveTo(pRect->left, pRect->top);
291  path.LineTo(pRect->left, fBottom - 1);
292  path.LineTo(fRight - 1, fBottom - 1);
293  path.LineTo(fRight - 1, pRect->top);
294  clrLine = m_pThemeData->clrFormBorder[iActive][2];
295  pGraphics->SetStrokeColor(&clrLine);
296  pGraphics->StrokePath(&path, pMatrix);
297  path.Clear();
298  path.MoveTo(pRect->left + 1, pRect->top);
299  path.LineTo(pRect->left + 1, fBottom - 2);
300  path.LineTo(fRight - 2, fBottom - 2);
301  path.LineTo(fRight - 2, pRect->top);
302  clrLine = m_pThemeData->clrFormBorder[iActive][1];
303  pGraphics->SetStrokeColor(&clrLine);
304  pGraphics->StrokePath(&path, pMatrix);
305  path.Clear();
306  path.MoveTo(pRect->left + 2, pRect->top);
307  path.LineTo(pRect->left + 2, fBottom - 3);
308  path.LineTo(fRight - 3, fBottom - 3);
309  path.LineTo(fRight - 3, pRect->top);
310  clrLine = m_pThemeData->clrFormBorder[iActive][0];
311  pGraphics->SetStrokeColor(&clrLine);
312  pGraphics->StrokePath(&path, pMatrix);
313  path.Clear();
314  path.MoveTo(pRect->left + 3, pRect->top);
315  path.LineTo(pRect->left + 3, fBottom - 4);
316  path.LineTo(fRight - 4, fBottom - 4);
317  path.LineTo(fRight - 4, pRect->top);
318  clrLine = m_pThemeData->clrFormBorder[iActive][4];
319  pGraphics->SetStrokeColor(&clrLine);
320  pGraphics->StrokePath(&path, pMatrix);
321  m_rtDisLBorder.Set(pRect->left, pRect->top + 29, 4, pRect->height - 29);
322  m_rtDisRBorder.Set(pRect->right() - 4, pRect->top + 29, 4,
323                     pRect->height - 29);
324  m_rtDisBBorder.Set(pRect->left, pRect->bottom() - 4, pRect->width, 4);
325  m_rtDisCaption.Set(pRect->left, pRect->top, pRect->width, 29);
326}
327void CFWL_FormTP::DrawCaption(CFX_Graphics* pGraphics,
328                              const CFX_RectF* pRect,
329                              FWLTHEME_STATE eState,
330                              CFX_Matrix* pMatrix,
331                              int32_t iActive) {
332  CFX_RectF rt;
333  FX_FLOAT fBottom, fRight;
334  fBottom = pRect->bottom();
335  fRight = pRect->right();
336  rt.Set(pRect->left, pRect->top, pRect->width, 1);
337  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][0], &rt,
338                pMatrix);
339  rt.Offset(0, 1);
340  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][1], &rt,
341                pMatrix);
342  rt.Offset(0, 1);
343  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][2], &rt,
344                pMatrix);
345  rt.Set(pRect->left, pRect->bottom() - 1, pRect->width, 1);
346  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][2], &rt,
347                pMatrix);
348  rt.Offset(0, -1);
349  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][1], &rt,
350                pMatrix);
351  rt.Set(pRect->left, pRect->top, 1, pRect->height);
352  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][2], &rt,
353                pMatrix);
354  rt.Set(pRect->left + 1, pRect->top + 1, 1, fBottom - 1);
355  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][1], &rt,
356                pMatrix);
357  rt.Set(pRect->left + 2, pRect->top + 2, 1, fBottom - 2);
358  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][0], &rt,
359                pMatrix);
360  rt.Set(fRight - 1, pRect->top, pRect->width, pRect->height);
361  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][2], &rt,
362                pMatrix);
363  rt.Set(fRight - 2, pRect->top + 1, 1, fBottom - 1);
364  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][1], &rt,
365                pMatrix);
366  rt.Set(fRight - 3, pRect->top + 2, 1, fBottom - 2);
367  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][0], &rt,
368                pMatrix);
369  CFX_RectF rect(*pRect);
370  rect.Set(rect.left + 3, rect.top + 3, rect.width - 6, rect.height - 5);
371  if (iActive == 0) {
372    pGraphics->StretchImage(m_pActiveBitmap, rect, pMatrix);
373  } else {
374    pGraphics->StretchImage(m_pDeactivebitmap, rect, pMatrix);
375  }
376}
377void CFWL_FormTP::DrawNarrowCaption(CFX_Graphics* pGraphics,
378                                    const CFX_RectF* pRect,
379                                    FWLTHEME_STATE eState,
380                                    CFX_Matrix* pMatrix,
381                                    int32_t iActive) {}
382void CFWL_FormTP::DrawCloseBox(CFX_Graphics* pGraphics,
383                               const CFX_RectF* pRect,
384                               FWLTHEME_STATE eState,
385                               CFX_Matrix* pMatrix,
386                               int32_t iActive) {
387  FX_FLOAT fRight = pRect->right();
388  FX_FLOAT fBottom = pRect->bottom();
389  FX_FLOAT fWidth = pRect->width;
390  FX_FLOAT fHeight = pRect->height;
391  pGraphics->SaveGraphState();
392  CFX_RectF rt(*pRect);
393  pGraphics->SetLineWidth(1.0f);
394  CFX_Path path;
395  path.Create();
396  path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
397  path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
398  path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
399  path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
400  CFX_Color crFill;
401  crFill = m_pThemeData->clrBtnEdgeOut[iActive];
402  pGraphics->SetFillColor(&crFill);
403  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
404  path.Clear();
405  path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
406  path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
407  path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
408  path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
409  crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
410  pGraphics->SetFillColor(&crFill);
411  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
412  path.Clear();
413  path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
414  path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
415  crFill = m_pThemeData->clrCloseBtEdgeLight[iActive][eState - 1];
416  pGraphics->SetFillColor(&crFill);
417  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
418  path.Clear();
419  path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
420  path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
421  crFill = m_pThemeData->clrCloseBtEdgeDark[iActive][eState - 1];
422  pGraphics->SetFillColor(&crFill);
423  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
424  path.Clear();
425  path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
426  DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
427                   fBottom - 2,
428                   m_pThemeData->clrCloseBtBKStart[iActive][eState - 1],
429                   m_pThemeData->clrCloseBtBKEnd[iActive][eState - 1], &path,
430                   FXFILL_WINDING, pMatrix);
431  CFX_RectF rtX(*pRect);
432  rtX.Inflate(-5, -5);
433  path.Clear();
434  FX_FLOAT frtXRight = rtX.right();
435  FX_FLOAT frtXBottom = rtX.bottom();
436  path.AddLine(rtX.left, rtX.top + 1, frtXRight - 1, frtXBottom);
437  path.AddLine(rtX.left, rtX.top, frtXRight, frtXBottom);
438  path.AddLine(rtX.left + 1, rtX.top, frtXRight, frtXBottom - 1);
439  path.AddLine(rtX.left, frtXBottom - 1, frtXRight - 1, rtX.top);
440  path.AddLine(rtX.left, frtXBottom, frtXRight, rtX.top);
441  path.AddLine(rtX.left + 1, frtXBottom, frtXRight, rtX.top + 1);
442  CFX_Color clrLine(0xffffffff);
443  pGraphics->SetLineWidth(1.0f);
444  pGraphics->SetStrokeColor(&clrLine);
445  pGraphics->StrokePath(&path, pMatrix);
446  pGraphics->RestoreGraphState();
447}
448void CFWL_FormTP::DrawMinMaxBoxCommon(CFX_Graphics* pGraphics,
449                                      const CFX_RectF* pRect,
450                                      FWLTHEME_STATE eState,
451                                      CFX_Matrix* pMatrix,
452                                      int32_t iActive) {
453  pGraphics->SaveGraphState();
454  FX_FLOAT fRight = pRect->right();
455  FX_FLOAT fBottom = pRect->bottom();
456  FX_FLOAT fWidth = pRect->width;
457  FX_FLOAT fHeight = pRect->height;
458  CFX_RectF rt(*pRect);
459  pGraphics->SetLineWidth(1.0f);
460  CFX_Path path;
461  path.Create();
462  path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
463  path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
464  path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
465  path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
466  CFX_Color crFill;
467  crFill = m_pThemeData->clrBtnEdgeOut[iActive];
468  pGraphics->SetFillColor(&crFill);
469  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
470  path.Clear();
471  path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
472  path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
473  path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
474  path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
475  crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
476  pGraphics->SetFillColor(&crFill);
477  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
478  path.Clear();
479  path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
480  path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
481  crFill = m_pThemeData->clrNormalBtEdgeLight[iActive][eState - 1];
482  pGraphics->SetFillColor(&crFill);
483  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
484  path.Clear();
485  path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
486  path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
487  crFill = m_pThemeData->clrNormalBtEdgeDark[iActive][eState - 1];
488  pGraphics->SetFillColor(&crFill);
489  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
490  pGraphics->RestoreGraphState();
491  path.Clear();
492  path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
493  DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
494                   fBottom - 2,
495                   m_pThemeData->clrNormalBtBKStart[iActive][eState - 1],
496                   m_pThemeData->clrNormalBtBKEnd[iActive][eState - 1], &path,
497                   FXFILL_WINDING, pMatrix);
498}
499void CFWL_FormTP::DrawMinimizeBox(CFX_Graphics* pGraphics,
500                                  const CFX_RectF* pRect,
501                                  FWLTHEME_STATE eState,
502                                  CFX_Matrix* pMatrix,
503                                  int32_t iActive) {
504  DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
505  CFX_RectF rtMin;
506  rtMin.Set(pRect->left + 5, pRect->top + 13, pRect->width - 14,
507            pRect->height - 18);
508  FillSoildRect(pGraphics, 0xFFFFFFFF, &rtMin, pMatrix);
509}
510void CFWL_FormTP::DrawMaximizeBox(CFX_Graphics* pGraphics,
511                                  const CFX_RectF* pRect,
512                                  FWLTHEME_STATE eState,
513                                  FX_BOOL bMax,
514                                  CFX_Matrix* pMatrix,
515                                  int32_t iActive) {
516  DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
517  FX_FLOAT fWidth = pRect->width;
518  FX_FLOAT fHeight = pRect->height;
519  if (bMax) {
520    CFX_Path path;
521    path.Create();
522    path.AddLine(pRect->left + 7, pRect->top + 6, pRect->left + 14,
523                 pRect->top + 6);
524    path.AddLine(pRect->left + 4, pRect->top + 9, pRect->left + 11,
525                 pRect->top + 9);
526    pGraphics->SaveGraphState();
527    pGraphics->SetLineWidth(2);
528    CFX_Color crStroke(0xFFFFFFFF);
529    pGraphics->SetStrokeColor(&crStroke);
530    pGraphics->StrokePath(&path, pMatrix);
531    pGraphics->SetLineWidth(1);
532    path.Clear();
533    path.AddLine(pRect->left + 4, pRect->top + 10, pRect->left + 4,
534                 pRect->top + 14);
535    path.AddLine(pRect->left + 10, pRect->top + 10, pRect->left + 10,
536                 pRect->top + 14);
537    path.AddLine(pRect->left + 13, pRect->top + 7, pRect->left + 13,
538                 pRect->top + 11);
539    path.AddLine(pRect->left + 4, pRect->top + 14, pRect->left + 10,
540                 pRect->top + 14);
541    path.AddLine(pRect->left + 12, pRect->top + 11, pRect->left + 12,
542                 pRect->top + 11);
543    pGraphics->StrokePath(&path, pMatrix);
544    pGraphics->RestoreGraphState();
545  } else {
546    CFX_RectF rtMax(*pRect);
547    rtMax.Inflate(-5, -5);
548    CFX_Path path;
549    path.Create();
550    path.AddRectangle(pRect->left + 5, pRect->top + 5, fWidth - 10,
551                      fHeight - 10);
552    path.AddRectangle(pRect->left + 6, pRect->top + 8, fWidth - 12,
553                      fHeight - 14);
554    pGraphics->SaveGraphState();
555    CFX_Color crFill(0xFFFFFFFF);
556    pGraphics->SetFillColor(&crFill);
557    pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
558    pGraphics->RestoreGraphState();
559  }
560}
561void CFWL_FormTP::DrawIconImage(CFX_Graphics* pGraphics,
562                                CFX_DIBitmap* pDIBitmap,
563                                const CFX_RectF* pRect,
564                                FWLTHEME_STATE eState,
565                                CFX_Matrix* pMatrix,
566                                int32_t iActive) {
567  pGraphics->StretchImage(pDIBitmap, *pRect, pMatrix);
568}
569void CFWL_FormTP::SetThemeData(FX_DWORD dwID) {
570  m_pThemeData->clrTransWhite = ArgbEncode(0x65, 255, 255, 255);
571  m_pThemeData->clrCloseBtBKStart[0][0] = ArgbEncode(0xff, 240, 166, 148);
572  m_pThemeData->clrCloseBtBKEnd[0][0] = ArgbEncode(0xff, 228, 61, 5);
573  m_pThemeData->clrCloseBtBKStart[0][1] = ArgbEncode(0xff, 255, 184, 176);
574  m_pThemeData->clrCloseBtBKEnd[0][1] = ArgbEncode(0xff, 252, 107, 71);
575  m_pThemeData->clrCloseBtBKStart[0][2] = ArgbEncode(0xff, 141, 44, 20);
576  m_pThemeData->clrCloseBtBKEnd[0][2] = ArgbEncode(0xff, 202, 72, 33);
577  m_pThemeData->clrCloseBtEdgeLight[0][0] = ArgbEncode(0xff, 255, 122, 107);
578  m_pThemeData->clrCloseBtEdgeDark[0][0] = ArgbEncode(0xff, 218, 77, 54);
579  m_pThemeData->clrCloseBtEdgeLight[0][1] = ArgbEncode(0xff, 255, 93, 74);
580  m_pThemeData->clrCloseBtEdgeDark[0][1] = ArgbEncode(0xff, 218, 74, 51);
581  m_pThemeData->clrCloseBtEdgeLight[0][2] = ArgbEncode(0xff, 191, 61, 28);
582  m_pThemeData->clrCloseBtEdgeDark[0][2] = ArgbEncode(0xff, 93, 30, 13);
583  if (dwID) {
584    m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 194, 205, 149);
585    m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 170, 184, 131);
586    m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 168, 182, 128);
587    m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 194, 205, 149);
588    m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 117, 141, 94);
589    m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 139, 161, 105);
590    m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 171, 189, 133);
591    m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 155, 175, 125);
592    m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 128, 146, 103);
593    m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 94, 118, 79);
594    m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 139, 161, 105);
595    m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 234, 245, 201);
596    m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 194, 205, 149);
597    m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 175, 189, 133);
598    m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 153, 168, 121);
599    m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 150, 168, 103);
600    m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 182, 195, 162);
601    m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 128, 144, 84);
602    m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 234, 241, 208);
603    m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 169, 186, 112);
604    m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 199, 199, 190);
605    m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 133, 148, 88);
606    m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 163, 176, 137);
607    m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 118, 135, 83);
608    m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 154, 174, 105);
609    m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 154, 174, 105);
610    m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 172, 193, 123);
611    m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 154, 174, 105);
612    m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
613    m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
614    m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
615    m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
616    m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 117, 141, 94);
617    m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 139, 161, 105);
618    m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 171, 189, 133);
619    m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 164, 178, 127);
620    m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
621    m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 171, 189, 133);
622  } else {
623    m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 3, 114, 255);
624    m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 0, 85, 226);
625    m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 0, 85, 226);
626    m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 3, 114, 255);
627    m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 0, 32, 200);
628    m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 0, 61, 220);
629    m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 0, 54, 210);
630    m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 0, 56, 234);
631    m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 0, 50, 193);
632    m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 0, 19, 139);
633    m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 0, 88, 238);
634    m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 63, 151, 255);
635    m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 3, 114, 255);
636    m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 0, 96, 252);
637    m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 63, 151, 255);
638    m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 0, 67, 207);
639    m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 0, 49, 112);
640    m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 0, 87, 188);
641    m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 154, 183, 250);
642    m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 17, 110, 248);
643    m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 164, 194, 255);
644    m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 29, 158, 255);
645    m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 68, 120, 245);
646    m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 24, 72, 187);
647    m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 72, 122, 245);
648    m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 35, 87, 195);
649    m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 60, 114, 244);
650    m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 21, 70, 185);
651    m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
652    m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
653    m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
654    m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
655    m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 0, 72, 241);
656    m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 0, 61, 220);
657    m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 0, 30, 160);
658    m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 0, 19, 140);
659    m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
660    m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 22, 106, 239);
661  }
662  m_pThemeData->clrCloseBtBKStart[1][0] = m_pThemeData->clrCloseBtBKStart[0][0];
663  m_pThemeData->clrCloseBtBKEnd[1][0] = m_pThemeData->clrCloseBtBKEnd[0][0];
664  m_pThemeData->clrCloseBtBKStart[1][1] = m_pThemeData->clrCloseBtBKStart[0][1];
665  m_pThemeData->clrCloseBtBKEnd[1][1] = m_pThemeData->clrCloseBtBKEnd[0][1];
666  m_pThemeData->clrCloseBtBKStart[1][2] = m_pThemeData->clrCloseBtBKStart[0][2];
667  m_pThemeData->clrCloseBtBKEnd[1][2] = m_pThemeData->clrCloseBtBKEnd[0][2];
668  m_pThemeData->clrCloseBtEdgeLight[1][0] =
669      m_pThemeData->clrCloseBtEdgeLight[0][0];
670  m_pThemeData->clrCloseBtEdgeDark[1][0] =
671      m_pThemeData->clrCloseBtEdgeDark[0][0];
672  m_pThemeData->clrCloseBtEdgeLight[1][1] =
673      m_pThemeData->clrCloseBtEdgeLight[0][1];
674  m_pThemeData->clrCloseBtEdgeDark[1][1] =
675      m_pThemeData->clrCloseBtEdgeDark[0][1];
676  m_pThemeData->clrCloseBtEdgeLight[1][2] =
677      m_pThemeData->clrCloseBtEdgeLight[0][2];
678  m_pThemeData->clrCloseBtEdgeDark[1][2] =
679      m_pThemeData->clrCloseBtEdgeDark[0][2];
680  m_pThemeData->clrHeadBK[1][0] = m_pThemeData->clrHeadBK[0][0];
681  m_pThemeData->clrHeadBK[1][1] = m_pThemeData->clrHeadBK[0][1];
682  m_pThemeData->clrHeadBK[1][2] = m_pThemeData->clrHeadBK[0][2];
683  m_pThemeData->clrHeadBK[1][3] = m_pThemeData->clrHeadBK[0][3];
684  m_pThemeData->clrHeadEdgeLeft[1][2] = m_pThemeData->clrHeadEdgeLeft[0][2];
685  m_pThemeData->clrHeadEdgeLeft[1][1] = m_pThemeData->clrHeadEdgeLeft[0][1];
686  m_pThemeData->clrHeadEdgeLeft[1][0] = m_pThemeData->clrHeadEdgeLeft[0][0];
687  m_pThemeData->clrHeadEdgeRight[1][0] = m_pThemeData->clrHeadEdgeRight[0][0];
688  m_pThemeData->clrHeadEdgeRight[1][1] = m_pThemeData->clrHeadEdgeRight[0][1];
689  m_pThemeData->clrHeadEdgeRight[1][2] = m_pThemeData->clrHeadEdgeRight[0][2];
690  m_pThemeData->clrHeadEdgeTop[1][0] = m_pThemeData->clrHeadEdgeTop[0][0];
691  m_pThemeData->clrHeadEdgeTop[1][1] = m_pThemeData->clrHeadEdgeTop[0][1];
692  m_pThemeData->clrHeadEdgeTop[1][2] = m_pThemeData->clrHeadEdgeTop[0][2];
693  m_pThemeData->clrHeadEdgeBottom[1][0] = m_pThemeData->clrHeadEdgeBottom[0][0];
694  m_pThemeData->clrHeadEdgeBottom[1][1] = m_pThemeData->clrHeadEdgeBottom[0][1];
695  m_pThemeData->clrHeadEdgeBottom[1][2] = m_pThemeData->clrHeadEdgeBottom[0][2];
696  m_pThemeData->clrNormalBtBKStart[1][2] =
697      m_pThemeData->clrNormalBtBKStart[0][2];
698  m_pThemeData->clrNormalBtBKEnd[1][2] = m_pThemeData->clrNormalBtBKEnd[0][2];
699  m_pThemeData->clrNormalBtBKStart[1][0] =
700      m_pThemeData->clrNormalBtBKStart[0][0];
701  m_pThemeData->clrNormalBtBKEnd[1][0] = m_pThemeData->clrNormalBtBKEnd[1][0];
702  m_pThemeData->clrNormalBtBKStart[1][1] =
703      m_pThemeData->clrNormalBtBKStart[0][1];
704  m_pThemeData->clrNormalBtBKEnd[1][1] = m_pThemeData->clrNormalBtBKEnd[0][1];
705  m_pThemeData->clrNormalBtEdgeLight[1][0] =
706      m_pThemeData->clrNormalBtEdgeLight[0][0];
707  m_pThemeData->clrNormalBtEdgeDark[1][0] =
708      m_pThemeData->clrNormalBtEdgeDark[0][0];
709  m_pThemeData->clrNormalBtEdgeLight[1][1] =
710      m_pThemeData->clrNormalBtEdgeLight[0][1];
711  m_pThemeData->clrNormalBtEdgeDark[1][1] =
712      m_pThemeData->clrNormalBtEdgeDark[0][1];
713  m_pThemeData->clrNormalBtEdgeLight[1][2] =
714      m_pThemeData->clrNormalBtEdgeLight[0][2];
715  m_pThemeData->clrNormalBtEdgeDark[1][2] =
716      m_pThemeData->clrNormalBtEdgeDark[0][2];
717  m_pThemeData->clrBtnCornerLight[1][0] = m_pThemeData->clrBtnCornerLight[0][0];
718  m_pThemeData->clrBtnCornerLight[1][1] = m_pThemeData->clrBtnCornerLight[0][1];
719  m_pThemeData->clrBtnCornerLight[1][2] = m_pThemeData->clrBtnCornerLight[0][2];
720  m_pThemeData->clrBtnEdgeOut[1] = m_pThemeData->clrBtnEdgeOut[0];
721  m_pThemeData->clrFormBorder[1][0] = m_pThemeData->clrFormBorder[0][0];
722  m_pThemeData->clrFormBorder[1][1] = m_pThemeData->clrFormBorder[0][1];
723  m_pThemeData->clrFormBorder[1][2] = m_pThemeData->clrFormBorder[0][2];
724  m_pThemeData->clrFormBorder[1][3] = m_pThemeData->clrFormBorder[0][3];
725  m_pThemeData->clrFormBorder[1][4] = m_pThemeData->clrFormBorder[0][4];
726  m_pThemeData->clrFormBorderLight[1] = m_pThemeData->clrFormBorderLight[0];
727  DeactiveForm();
728}
729void CFWL_FormTP::DeactiveForm() {
730  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][0]);
731  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][1]);
732  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][2]);
733  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][3]);
734  TransModeColor(m_pThemeData->clrTransWhite,
735                 m_pThemeData->clrHeadEdgeLeft[1][0]);
736  TransModeColor(m_pThemeData->clrTransWhite,
737                 m_pThemeData->clrHeadEdgeLeft[1][1]);
738  TransModeColor(m_pThemeData->clrTransWhite,
739                 m_pThemeData->clrHeadEdgeLeft[1][2]);
740  TransModeColor(m_pThemeData->clrTransWhite,
741                 m_pThemeData->clrHeadEdgeRight[1][0]);
742  TransModeColor(m_pThemeData->clrTransWhite,
743                 m_pThemeData->clrHeadEdgeRight[1][1]);
744  TransModeColor(m_pThemeData->clrTransWhite,
745                 m_pThemeData->clrHeadEdgeRight[1][2]);
746  TransModeColor(m_pThemeData->clrTransWhite,
747                 m_pThemeData->clrHeadEdgeTop[1][0]);
748  TransModeColor(m_pThemeData->clrTransWhite,
749                 m_pThemeData->clrHeadEdgeTop[1][1]);
750  TransModeColor(m_pThemeData->clrTransWhite,
751                 m_pThemeData->clrHeadEdgeTop[1][2]);
752  TransModeColor(m_pThemeData->clrTransWhite,
753                 m_pThemeData->clrHeadEdgeBottom[1][0]);
754  TransModeColor(m_pThemeData->clrTransWhite,
755                 m_pThemeData->clrHeadEdgeBottom[1][1]);
756  TransModeColor(m_pThemeData->clrTransWhite,
757                 m_pThemeData->clrHeadEdgeBottom[1][2]);
758  TransModeColor(m_pThemeData->clrTransWhite,
759                 m_pThemeData->clrNormalBtBKStart[1][0]);
760  TransModeColor(m_pThemeData->clrTransWhite,
761                 m_pThemeData->clrNormalBtBKStart[1][1]);
762  TransModeColor(m_pThemeData->clrTransWhite,
763                 m_pThemeData->clrNormalBtBKStart[1][2]);
764  TransModeColor(m_pThemeData->clrTransWhite,
765                 m_pThemeData->clrNormalBtBKEnd[1][0]);
766  TransModeColor(m_pThemeData->clrTransWhite,
767                 m_pThemeData->clrNormalBtBKEnd[1][1]);
768  TransModeColor(m_pThemeData->clrTransWhite,
769                 m_pThemeData->clrNormalBtBKEnd[1][2]);
770  TransModeColor(m_pThemeData->clrTransWhite,
771                 m_pThemeData->clrNormalBtEdgeLight[1][0]);
772  TransModeColor(m_pThemeData->clrTransWhite,
773                 m_pThemeData->clrNormalBtEdgeLight[1][1]);
774  TransModeColor(m_pThemeData->clrTransWhite,
775                 m_pThemeData->clrNormalBtEdgeLight[1][2]);
776  TransModeColor(m_pThemeData->clrTransWhite,
777                 m_pThemeData->clrNormalBtEdgeDark[1][0]);
778  TransModeColor(m_pThemeData->clrTransWhite,
779                 m_pThemeData->clrNormalBtEdgeDark[1][1]);
780  TransModeColor(m_pThemeData->clrTransWhite,
781                 m_pThemeData->clrNormalBtEdgeDark[1][2]);
782  TransModeColor(m_pThemeData->clrTransWhite,
783                 m_pThemeData->clrBtnCornerLight[1][0]);
784  TransModeColor(m_pThemeData->clrTransWhite,
785                 m_pThemeData->clrBtnCornerLight[1][1]);
786  TransModeColor(m_pThemeData->clrTransWhite,
787                 m_pThemeData->clrBtnCornerLight[1][2]);
788  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrBtnEdgeOut[1]);
789  TransModeColor(m_pThemeData->clrTransWhite,
790                 m_pThemeData->clrFormBorder[1][0]);
791  TransModeColor(m_pThemeData->clrTransWhite,
792                 m_pThemeData->clrFormBorder[1][1]);
793  TransModeColor(m_pThemeData->clrTransWhite,
794                 m_pThemeData->clrFormBorder[1][2]);
795  TransModeColor(m_pThemeData->clrTransWhite,
796                 m_pThemeData->clrFormBorder[1][3]);
797  TransModeColor(m_pThemeData->clrTransWhite,
798                 m_pThemeData->clrFormBorder[1][4]);
799  TransModeColor(m_pThemeData->clrTransWhite,
800                 m_pThemeData->clrFormBorderLight[1]);
801  TransModeColor(m_pThemeData->clrTransWhite,
802                 m_pThemeData->clrCloseBtBKStart[1][0]);
803  TransModeColor(m_pThemeData->clrTransWhite,
804                 m_pThemeData->clrCloseBtBKStart[1][1]);
805  TransModeColor(m_pThemeData->clrTransWhite,
806                 m_pThemeData->clrCloseBtBKStart[1][2]);
807  TransModeColor(m_pThemeData->clrTransWhite,
808                 m_pThemeData->clrCloseBtBKEnd[1][0]);
809  TransModeColor(m_pThemeData->clrTransWhite,
810                 m_pThemeData->clrCloseBtBKEnd[1][1]);
811  TransModeColor(m_pThemeData->clrTransWhite,
812                 m_pThemeData->clrCloseBtBKEnd[1][2]);
813  TransModeColor(m_pThemeData->clrTransWhite,
814                 m_pThemeData->clrCloseBtEdgeLight[1][0]);
815  TransModeColor(m_pThemeData->clrTransWhite,
816                 m_pThemeData->clrCloseBtEdgeLight[1][1]);
817  TransModeColor(m_pThemeData->clrTransWhite,
818                 m_pThemeData->clrCloseBtEdgeLight[1][2]);
819  TransModeColor(m_pThemeData->clrTransWhite,
820                 m_pThemeData->clrCloseBtEdgeDark[1][0]);
821  TransModeColor(m_pThemeData->clrTransWhite,
822                 m_pThemeData->clrCloseBtEdgeDark[1][1]);
823  TransModeColor(m_pThemeData->clrTransWhite,
824                 m_pThemeData->clrCloseBtEdgeDark[1][2]);
825}
826void CFWL_FormTP::TransModeColor(FX_ARGB clrFore, FX_ARGB& clrBack) {
827  int32_t iAlfaF, iRF, iGF, iBF;
828  int32_t iAlfaB, iRB, iGB, iBB;
829  ArgbDecode(clrFore, iAlfaF, iRF, iGF, iBF);
830  ArgbDecode(clrBack, iAlfaB, iRB, iGB, iBB);
831  clrBack = ArgbEncode(0xff, iRB + (iRF - iRB) * iAlfaF / 255,
832                       iGB + (iGF - iGB) * iAlfaF / 255,
833                       iBB + (iBF - iBB) * iAlfaF / 255);
834}
835void CFWL_FormTP::InitCaption(FX_BOOL bActive) {
836  if (bActive) {
837    CFX_FxgeDevice dev;
838    CFX_Graphics gs;
839    CFX_Path path;
840    path.Create();
841    if (m_pActiveBitmap) {
842      delete m_pActiveBitmap;
843      m_pActiveBitmap = NULL;
844    }
845    m_pActiveBitmap = new CFX_DIBitmap;
846    m_pActiveBitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb);
847    dev.Attach(m_pActiveBitmap);
848    gs.Create(&dev);
849    path.AddRectangle(0, 0, 1, 5);
850    DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[0][0],
851                     m_pThemeData->clrHeadBK[0][1], &path);
852    path.Clear();
853    path.AddRectangle(0, 5, 1, 15);
854    DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[0][1],
855                     m_pThemeData->clrHeadBK[0][2], &path);
856    path.Clear();
857    path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19);
858    DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption,
859                     m_pThemeData->clrHeadBK[0][2],
860                     m_pThemeData->clrHeadBK[0][3], &path);
861  } else {
862    CFX_FxgeDevice dev;
863    CFX_Graphics gs;
864    CFX_Path path;
865    path.Create();
866    if (m_pDeactivebitmap) {
867      delete m_pDeactivebitmap;
868      m_pDeactivebitmap = NULL;
869    }
870    m_pDeactivebitmap = new CFX_DIBitmap;
871    m_pDeactivebitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb);
872    dev.Attach(m_pDeactivebitmap);
873    gs.Create(&dev);
874    path.AddRectangle(0, 0, 1, 5);
875    DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[1][0],
876                     m_pThemeData->clrHeadBK[1][1], &path);
877    path.Clear();
878    path.AddRectangle(0, 5, 1, 15);
879    DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[1][1],
880                     m_pThemeData->clrHeadBK[1][2], &path);
881    path.Clear();
882    path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19);
883    DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption,
884                     m_pThemeData->clrHeadBK[1][2],
885                     m_pThemeData->clrHeadBK[1][3], &path);
886  }
887}
888