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 CHECKBOX_SIZE_SIGNMARGIN 3 9 #define CHECKBOX_SIZE_SIGNBORDER 2 10 #define CHECKBOX_SIZE_SIGNPATH 100 11 #define CHECKBOX_COLOR_BOXLT1 (ArgbEncode(255, 172, 168, 153)) 12 #define CHECKBOX_COLOR_BOXLT2 (ArgbEncode(255, 113, 111, 100)) 13 #define CHECKBOX_COLOR_BOXRB1 (ArgbEncode(255, 241, 239, 226)) 14 #define CHECKBOX_COLOR_BOXRB2 (ArgbEncode(255, 255, 255, 255)) 15 #define CHECKBOX_FXGE_CoordinatesAdjust 16 CFWL_CheckBoxTP::CFWL_CheckBoxTP() : m_pCheckPath(NULL) { 17 m_pThemeData = new CKBThemeData; 18 SetThemeData(0); 19 } 20 CFWL_CheckBoxTP::~CFWL_CheckBoxTP() { 21 if (m_pThemeData) { 22 delete m_pThemeData; 23 m_pThemeData = NULL; 24 } 25 if (m_pCheckPath) { 26 m_pCheckPath->Clear(); 27 delete m_pCheckPath; 28 m_pCheckPath = NULL; 29 } 30 } 31 FX_BOOL CFWL_CheckBoxTP::IsValidWidget(IFWL_Widget* pWidget) { 32 return pWidget && pWidget->GetClassID() == FWL_CLASSHASH_CheckBox; 33 } 34 FX_DWORD CFWL_CheckBoxTP::SetThemeID(IFWL_Widget* pWidget, 35 FX_DWORD dwThemeID, 36 FX_BOOL bChildren) { 37 if (m_pThemeData) { 38 SetThemeData(FWL_GetThemeColor(dwThemeID)); 39 } 40 return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren); 41 } 42 FX_BOOL CFWL_CheckBoxTP::DrawText(CFWL_ThemeText* pParams) { 43 if (!m_pTextOut) 44 return FALSE; 45 FX_BOOL bDisable = (pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask1) == 46 FWL_PARTSTATE_CKB_Disabled; 47 FX_ARGB argText = 48 bDisable ? FWLTHEME_CAPACITY_TextDisColor : FWLTHEME_CAPACITY_TextColor; 49 m_pTextOut->SetTextColor(argText); 50 return CFWL_WidgetTP::DrawText(pParams); 51 } 52 FX_BOOL CFWL_CheckBoxTP::DrawBackground(CFWL_ThemeBackground* pParams) { 53 if (!pParams) 54 return FALSE; 55 switch (pParams->m_iPart) { 56 case FWL_PART_CKB_Border: { 57 DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); 58 break; 59 } 60 case FWL_PART_CKB_Edge: { 61 DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), 62 &pParams->m_rtPart, &pParams->m_matrix); 63 break; 64 } 65 case FWL_PART_CKB_Background: { 66 FillBackground(pParams->m_pGraphics, &pParams->m_rtPart, 67 &pParams->m_matrix); 68 if (pParams->m_dwStates & FWL_PARTSTATE_CKB_Focused) { 69 pParams->m_rtPart = *(CFX_RectF*)pParams->m_pData; 70 DrawFocus(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); 71 } 72 break; 73 } 74 case FWL_PART_CKB_CheckBox: { 75 DrawBoxBk(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart, 76 pParams->m_dwStates, &pParams->m_matrix); 77 if (((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) == 78 FWL_PARTSTATE_CKB_Checked) | 79 ((pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask2) == 80 FWL_PARTSTATE_CKB_Neutral)) { 81 DrawSign(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart, 82 pParams->m_dwStates, &pParams->m_matrix); 83 } 84 FX_BOOL bDisable = (pParams->m_dwStates & FWL_PARTSTATE_CKB_Mask1) == 85 FWL_PARTSTATE_CKB_Disabled; 86 DrawSignBorder(pParams->m_pWidget, pParams->m_pGraphics, 87 &pParams->m_rtPart, bDisable, &pParams->m_matrix); 88 break; 89 } 90 default: { return FALSE; } 91 } 92 return TRUE; 93 } 94 FWL_ERR CFWL_CheckBoxTP::Initialize() { 95 InitTTO(); 96 return CFWL_WidgetTP::Initialize(); 97 } 98 FWL_ERR CFWL_CheckBoxTP::Finalize() { 99 FinalizeTTO(); 100 return CFWL_WidgetTP::Finalize(); 101 } 102 void CFWL_CheckBoxTP::DrawBoxBk(IFWL_Widget* pWidget, 103 CFX_Graphics* pGraphics, 104 const CFX_RectF* pRect, 105 FX_DWORD dwStates, 106 CFX_Matrix* pMatrix) { 107 dwStates &= 0x03; 108 int32_t fillMode = FXFILL_WINDING; 109 FX_DWORD dwStyleEx = pWidget->GetStylesEx(); 110 dwStyleEx &= FWL_STYLEEXT_CKB_ShapeMask; 111 CFX_Path path; 112 path.Create(); 113 FX_FLOAT fRight = pRect->right(); 114 FX_FLOAT fBottom = pRect->bottom(); 115 FX_BOOL bClipSign = 116 (dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Hovered; 117 if ((dwStyleEx == FWL_STYLEEXT_CKB_ShapeSolidSquare) || 118 (dwStyleEx == FWL_STYLEEXT_CKB_ShapeSunkenSquare)) { 119 path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height); 120 if (bClipSign) { 121 fillMode = FXFILL_ALTERNATE; 122 path.AddRectangle(pRect->left + CHECKBOX_SIZE_SIGNMARGIN, 123 pRect->top + CHECKBOX_SIZE_SIGNMARGIN, 124 pRect->width - CHECKBOX_SIZE_SIGNMARGIN * 2, 125 pRect->height - CHECKBOX_SIZE_SIGNMARGIN * 2); 126 } 127 } else { 128 #ifdef CHECKBOX_FXGE_CoordinatesAdjust 129 CFX_RectF rect(*pRect); 130 rect.Deflate(0, 0, 1, 1); 131 path.AddEllipse(rect); 132 #else 133 path.AddEllipse(*pRect); 134 #endif 135 if (bClipSign) { 136 fillMode = FXFILL_ALTERNATE; 137 #ifdef CHECKBOX_FXGE_CoordinatesAdjust 138 CFX_RectF rtClip(rect); 139 #else 140 CFX_RectF rtClip(*pRect); 141 #endif 142 rtClip.Deflate(CHECKBOX_SIZE_SIGNMARGIN - 1, 143 CHECKBOX_SIZE_SIGNMARGIN - 1); 144 path.AddEllipse(rtClip); 145 } 146 } 147 int32_t iTheme = 1; 148 if ((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Hovered) { 149 iTheme = 2; 150 } else if ((dwStates & FWL_PARTSTATE_CKB_Mask1) == 151 FWL_PARTSTATE_CKB_Pressed) { 152 iTheme = 3; 153 } else if ((dwStates & FWL_PARTSTATE_CKB_Mask1) == 154 FWL_PARTSTATE_CKB_Disabled) { 155 iTheme = 4; 156 } 157 if ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked) { 158 iTheme += 4; 159 } else if ((dwStates & FWL_PARTSTATE_CKB_Mask2) == 160 FWL_PARTSTATE_CKB_Neutral) { 161 iTheme += 8; 162 } 163 DrawAxialShading(pGraphics, pRect->left - 1, pRect->top - 1, fRight, fBottom, 164 m_pThemeData->clrBoxBk[iTheme][0], 165 m_pThemeData->clrBoxBk[iTheme][1], &path, fillMode, pMatrix); 166 } 167 void CFWL_CheckBoxTP::DrawSign(IFWL_Widget* pWidget, 168 CFX_Graphics* pGraphics, 169 const CFX_RectF* pRtBox, 170 FX_DWORD dwStates, 171 CFX_Matrix* pMatrix) { 172 CFX_RectF rtSign(*pRtBox); 173 rtSign.Deflate(CHECKBOX_SIZE_SIGNMARGIN, CHECKBOX_SIZE_SIGNMARGIN); 174 FX_DWORD dwColor = m_pThemeData->clrSignCheck; 175 FX_BOOL bCheck = TRUE; 176 if (((dwStates & FWL_PARTSTATE_CKB_Mask1) == FWL_PARTSTATE_CKB_Disabled) && 177 ((dwStates & FWL_PARTSTATE_CKB_Mask2) == FWL_PARTSTATE_CKB_Checked)) { 178 dwColor = m_pThemeData->clrSignBorderDisable; 179 } else if ((dwStates & FWL_PARTSTATE_CKB_Mask2) == 180 FWL_PARTSTATE_CKB_Neutral) { 181 switch (dwStates & FWL_PARTSTATE_CKB_Mask1) { 182 case FWL_PARTSTATE_CKB_Normal: { 183 bCheck = FALSE; 184 dwColor = m_pThemeData->clrSignNeutralNormal; 185 break; 186 } 187 case FWL_PARTSTATE_CKB_Hovered: { 188 bCheck = FALSE; 189 dwColor = m_pThemeData->clrSignNeutralHover; 190 break; 191 } 192 case FWL_PARTSTATE_CKB_Pressed: { 193 bCheck = FALSE, dwColor = m_pThemeData->clrSignNeutralPressed; 194 break; 195 } 196 case FWL_PARTSTATE_CKB_Disabled: { 197 bCheck = FALSE, dwColor = m_pThemeData->clrSignBorderDisable; 198 break; 199 } 200 } 201 } 202 if (bCheck) { 203 FX_DWORD dwStyle = pWidget->GetStylesEx(); 204 switch (dwStyle & FWL_STYLEEXT_CKB_SignShapeMask) { 205 case FWL_STYLEEXT_CKB_SignShapeCheck: { 206 DrawSignCheck(pGraphics, &rtSign, dwColor, pMatrix); 207 break; 208 } 209 case FWL_STYLEEXT_CKB_SignShapeCircle: { 210 rtSign.Deflate(1, 1); 211 DrawSignCircle(pGraphics, &rtSign, dwColor, pMatrix); 212 break; 213 } 214 case FWL_STYLEEXT_CKB_SignShapeCross: { 215 DrawSignCross(pGraphics, &rtSign, dwColor, pMatrix); 216 break; 217 } 218 case FWL_STYLEEXT_CKB_SignShapeDiamond: { 219 DrawSignDiamond(pGraphics, &rtSign, dwColor, pMatrix); 220 break; 221 } 222 case FWL_STYLEEXT_CKB_SignShapeSquare: { 223 DrawSignSquare(pGraphics, &rtSign, dwColor, pMatrix); 224 break; 225 } 226 case FWL_STYLEEXT_CKB_SignShapeStar: { 227 DrawSignStar(pGraphics, &rtSign, dwColor, pMatrix); 228 break; 229 } 230 } 231 } else { 232 FillSoildRect(pGraphics, ArgbEncode(255, 33, 161, 33), &rtSign, pMatrix); 233 } 234 } 235 void CFWL_CheckBoxTP::DrawSignNeutral(CFX_Graphics* pGraphics, 236 const CFX_RectF* pRtSign, 237 CFX_Matrix* pMatrix) { 238 ((CFX_RectF*)pRtSign)->Inflate(-3, -3); 239 FillSoildRect(pGraphics, m_pThemeData->clrSignNeutral, pRtSign, pMatrix); 240 } 241 void CFWL_CheckBoxTP::DrawSignCheck(CFX_Graphics* pGraphics, 242 const CFX_RectF* pRtSign, 243 FX_ARGB argbFill, 244 CFX_Matrix* pMatrix) { 245 if (!m_pCheckPath) { 246 initCheckPath(pRtSign->width); 247 } 248 CFX_Matrix mt; 249 mt.SetIdentity(); 250 mt.Translate(pRtSign->left, pRtSign->top); 251 mt.Concat(*pMatrix); 252 CFX_Color crFill(argbFill); 253 pGraphics->SaveGraphState(); 254 pGraphics->SetFillColor(&crFill); 255 pGraphics->FillPath(m_pCheckPath, FXFILL_WINDING, &mt); 256 pGraphics->RestoreGraphState(); 257 } 258 void CFWL_CheckBoxTP::DrawSignCircle(CFX_Graphics* pGraphics, 259 const CFX_RectF* pRtSign, 260 FX_ARGB argbFill, 261 CFX_Matrix* pMatrix) { 262 CFX_Path path; 263 path.Create(); 264 path.AddEllipse(*pRtSign); 265 CFX_Color crFill(argbFill); 266 pGraphics->SaveGraphState(); 267 pGraphics->SetFillColor(&crFill); 268 pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); 269 pGraphics->RestoreGraphState(); 270 } 271 void CFWL_CheckBoxTP::DrawSignCross(CFX_Graphics* pGraphics, 272 const CFX_RectF* pRtSign, 273 FX_ARGB argbFill, 274 CFX_Matrix* pMatrix) { 275 CFX_Path path; 276 path.Create(); 277 FX_FLOAT fRight = pRtSign->right(); 278 FX_FLOAT fBottom = pRtSign->bottom(); 279 path.AddLine(pRtSign->left, pRtSign->top, fRight, fBottom); 280 path.AddLine(pRtSign->left, fBottom, fRight, pRtSign->top); 281 CFX_Color crFill(argbFill); 282 pGraphics->SaveGraphState(); 283 pGraphics->SetStrokeColor(&crFill); 284 pGraphics->SetLineWidth(1.0f); 285 pGraphics->StrokePath(&path, pMatrix); 286 pGraphics->RestoreGraphState(); 287 } 288 void CFWL_CheckBoxTP::DrawSignDiamond(CFX_Graphics* pGraphics, 289 const CFX_RectF* pRtSign, 290 FX_ARGB argbFill, 291 CFX_Matrix* pMatrix) { 292 CFX_Path path; 293 path.Create(); 294 FX_FLOAT fWidth = pRtSign->width; 295 FX_FLOAT fHeight = pRtSign->height; 296 FX_FLOAT fBottom = pRtSign->bottom(); 297 path.MoveTo(pRtSign->left + fWidth / 2, pRtSign->top); 298 path.LineTo(pRtSign->left, pRtSign->top + fHeight / 2); 299 path.LineTo(pRtSign->left + fWidth / 2, fBottom); 300 path.LineTo(pRtSign->right(), pRtSign->top + fHeight / 2); 301 path.LineTo(pRtSign->left + fWidth / 2, pRtSign->top); 302 CFX_Color crFill(argbFill); 303 pGraphics->SaveGraphState(); 304 pGraphics->SetFillColor(&crFill); 305 pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); 306 pGraphics->RestoreGraphState(); 307 } 308 void CFWL_CheckBoxTP::DrawSignSquare(CFX_Graphics* pGraphics, 309 const CFX_RectF* pRtSign, 310 FX_ARGB argbFill, 311 CFX_Matrix* pMatrix) { 312 CFX_Path path; 313 path.Create(); 314 path.AddRectangle(pRtSign->left, pRtSign->top, pRtSign->width, 315 pRtSign->height); 316 CFX_Color crFill(argbFill); 317 pGraphics->SaveGraphState(); 318 pGraphics->SetFillColor(&crFill); 319 pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); 320 pGraphics->RestoreGraphState(); 321 } 322 void CFWL_CheckBoxTP::DrawSignStar(CFX_Graphics* pGraphics, 323 const CFX_RectF* pRtSign, 324 FX_ARGB argbFill, 325 CFX_Matrix* pMatrix) { 326 CFX_Path path; 327 path.Create(); 328 FX_FLOAT fBottom = pRtSign->bottom(); 329 FX_FLOAT fRadius = 330 (pRtSign->top - fBottom) / (1 + (FX_FLOAT)cos(FX_PI / 5.0f)); 331 CFX_PointF ptCenter; 332 ptCenter.Set((pRtSign->left + pRtSign->right()) / 2.0f, 333 (pRtSign->top + fBottom) / 2.0f); 334 FX_FLOAT px[5], py[5]; 335 FX_FLOAT fAngel = FX_PI / 10.0f; 336 for (int32_t i = 0; i < 5; i++) { 337 px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel); 338 py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel); 339 fAngel += FX_PI * 2 / 5.0f; 340 } 341 path.MoveTo(px[0], py[0]); 342 int32_t nNext = 0; 343 for (int32_t j = 0; j < 5; j++) { 344 nNext += 2; 345 if (nNext >= 5) { 346 nNext -= 5; 347 } 348 path.LineTo(px[nNext], py[nNext]); 349 } 350 CFX_Color crFill(argbFill); 351 pGraphics->SaveGraphState(); 352 pGraphics->SetFillColor(&crFill); 353 pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); 354 pGraphics->RestoreGraphState(); 355 } 356 void CFWL_CheckBoxTP::DrawSignBorder(IFWL_Widget* pWidget, 357 CFX_Graphics* pGraphics, 358 const CFX_RectF* pRtBox, 359 FX_BOOL bDisable, 360 CFX_Matrix* pMatrix) { 361 switch (pWidget->GetStylesEx() & FWL_STYLEEXT_CKB_ShapeMask) { 362 case FWL_STYLEEXT_CKB_ShapeSolidSquare: { 363 DrawAnnulusRect(pGraphics, bDisable ? m_pThemeData->clrSignBorderDisable 364 : m_pThemeData->clrSignBorderNormal, 365 pRtBox, 1, pMatrix); 366 break; 367 } 368 case FWL_STYLEEXT_CKB_ShapeSunkenSquare: { 369 Draw3DRect(pGraphics, FWLTHEME_EDGE_Sunken, CHECKBOX_SIZE_SIGNBORDER, 370 pRtBox, CHECKBOX_COLOR_BOXLT1, CHECKBOX_COLOR_BOXLT2, 371 CHECKBOX_COLOR_BOXRB1, CHECKBOX_COLOR_BOXRB2, pMatrix); 372 break; 373 } 374 case FWL_STYLEEXT_CKB_ShapeSolidCircle: { 375 DrawAnnulusCircle(pGraphics, bDisable ? m_pThemeData->clrSignBorderDisable 376 : m_pThemeData->clrSignBorderNormal, 377 pRtBox, 1, pMatrix); 378 break; 379 } 380 case FWL_STYLEEXT_CKB_ShapeSunkenCircle: { 381 Draw3DCircle(pGraphics, FWLTHEME_EDGE_Sunken, CHECKBOX_SIZE_SIGNBORDER, 382 pRtBox, CHECKBOX_COLOR_BOXLT1, CHECKBOX_COLOR_BOXLT2, 383 CHECKBOX_COLOR_BOXRB1, CHECKBOX_COLOR_BOXRB2, pMatrix); 384 break; 385 } 386 } 387 } 388 void CFWL_CheckBoxTP::SetThemeData(FX_DWORD dwID) { 389 FX_DWORD* pData = (FX_DWORD*)&m_pThemeData->clrBoxBk; 390 if (dwID) { 391 *pData++ = 0, *pData++ = 0, *pData++ = ArgbEncode(255, 220, 220, 215), 392 *pData++ = ArgbEncode(255, 255, 255, 255), 393 *pData++ = ArgbEncode(255, 255, 240, 207), 394 *pData++ = ArgbEncode(255, 248, 179, 48), 395 *pData++ = ArgbEncode(255, 176, 176, 167), 396 *pData++ = ArgbEncode(255, 241, 239, 239), 397 *pData++ = ArgbEncode(255, 255, 255, 255), 398 *pData++ = ArgbEncode(255, 255, 255, 255), 399 *pData++ = ArgbEncode(255, 220, 220, 215), 400 *pData++ = ArgbEncode(255, 255, 255, 255), 401 *pData++ = ArgbEncode(255, 255, 240, 207), 402 *pData++ = ArgbEncode(255, 248, 179, 48), 403 *pData++ = ArgbEncode(255, 176, 176, 167), 404 *pData++ = ArgbEncode(255, 241, 239, 239), 405 *pData++ = ArgbEncode(255, 255, 255, 255), 406 *pData++ = ArgbEncode(255, 255, 255, 255), 407 *pData++ = ArgbEncode(255, 220, 220, 215), 408 *pData++ = ArgbEncode(255, 255, 255, 255), 409 *pData++ = ArgbEncode(255, 255, 240, 207), 410 *pData++ = ArgbEncode(255, 248, 179, 48), 411 *pData++ = ArgbEncode(255, 176, 176, 167), 412 *pData++ = ArgbEncode(255, 241, 239, 239), 413 *pData++ = ArgbEncode(255, 255, 255, 255), 414 *pData++ = ArgbEncode(255, 255, 255, 255); 415 m_pThemeData->clrSignBorderNormal = ArgbEncode(255, 154, 167, 114); 416 m_pThemeData->clrSignBorderDisable = ArgbEncode(255, 202, 200, 187); 417 m_pThemeData->clrSignCheck = ArgbEncode(255, 164, 180, 138); 418 m_pThemeData->clrSignNeutral = ArgbEncode(2255, 28, 134, 26); 419 m_pThemeData->clrSignNeutralNormal = ArgbEncode(255, 114, 192, 113); 420 m_pThemeData->clrSignNeutralHover = ArgbEncode(255, 33, 161, 33); 421 m_pThemeData->clrSignNeutralPressed = ArgbEncode(255, 28, 134, 26); 422 } else { 423 *pData++ = 0, *pData++ = 0, *pData++ = ArgbEncode(255, 220, 220, 215), 424 *pData++ = ArgbEncode(255, 255, 255, 255), 425 *pData++ = ArgbEncode(255, 255, 240, 207), 426 *pData++ = ArgbEncode(255, 248, 179, 48), 427 *pData++ = ArgbEncode(255, 176, 176, 167), 428 *pData++ = ArgbEncode(255, 241, 239, 239), 429 *pData++ = ArgbEncode(255, 255, 255, 255), 430 *pData++ = ArgbEncode(255, 255, 255, 255), 431 *pData++ = ArgbEncode(255, 220, 220, 215), 432 *pData++ = ArgbEncode(255, 255, 255, 255), 433 *pData++ = ArgbEncode(255, 255, 240, 207), 434 *pData++ = ArgbEncode(255, 248, 179, 48), 435 *pData++ = ArgbEncode(255, 176, 176, 167), 436 *pData++ = ArgbEncode(255, 241, 239, 239), 437 *pData++ = ArgbEncode(255, 255, 255, 255), 438 *pData++ = ArgbEncode(255, 255, 255, 255), 439 *pData++ = ArgbEncode(255, 220, 220, 215), 440 *pData++ = ArgbEncode(255, 255, 255, 255), 441 *pData++ = ArgbEncode(255, 255, 240, 207), 442 *pData++ = ArgbEncode(255, 248, 179, 48), 443 *pData++ = ArgbEncode(255, 176, 176, 167), 444 *pData++ = ArgbEncode(255, 241, 239, 239), 445 *pData++ = ArgbEncode(255, 255, 255, 255), 446 *pData++ = ArgbEncode(255, 255, 255, 255); 447 m_pThemeData->clrSignBorderNormal = ArgbEncode(255, 28, 81, 128); 448 m_pThemeData->clrSignBorderDisable = ArgbEncode(255, 202, 200, 187); 449 m_pThemeData->clrSignCheck = ArgbEncode(255, 28, 81, 128); 450 m_pThemeData->clrSignNeutral = ArgbEncode(255, 28, 134, 26); 451 m_pThemeData->clrSignNeutralNormal = ArgbEncode(255, 114, 192, 113); 452 m_pThemeData->clrSignNeutralHover = ArgbEncode(255, 33, 161, 33); 453 m_pThemeData->clrSignNeutralPressed = ArgbEncode(255, 28, 134, 26); 454 } 455 } 456 void CFWL_CheckBoxTP::initCheckPath(FX_FLOAT fCheckLen) { 457 if (!m_pCheckPath) { 458 m_pCheckPath = new CFX_Path; 459 m_pCheckPath->Create(); 460 FX_FLOAT fWidth = CHECKBOX_SIZE_SIGNPATH; 461 FX_FLOAT fHeight = -CHECKBOX_SIZE_SIGNPATH; 462 FX_FLOAT fBottom = CHECKBOX_SIZE_SIGNPATH; 463 FX_FLOAT px1, py1, px2, py2; 464 CFX_PointF pt1; 465 pt1.Set(fWidth / 15.0f, fBottom + fHeight * 2 / 5.0f); 466 CFX_PointF pt2; 467 pt2.Set(fWidth / 4.5f, fBottom + fHeight / 16.0f); 468 CFX_PointF pt3; 469 pt3.Set(fWidth / 3.0f, fBottom); 470 CFX_PointF pt4; 471 pt4.Set(fWidth * 14 / 15.0f, fBottom + fHeight * 15 / 16.0f); 472 CFX_PointF pt5; 473 pt5.Set(fWidth / 3.6f, fBottom + fHeight / 3.5f); 474 CFX_PointF pt12; 475 pt12.Set(fWidth / 7.0f, fBottom + fHeight * 2 / 7.0f); 476 CFX_PointF pt21; 477 pt21.Set(fWidth / 5.0f, fBottom + fHeight / 5.0f); 478 CFX_PointF pt23; 479 pt23.Set(fWidth / 4.4f, fBottom + fHeight * 0 / 16.0f); 480 CFX_PointF pt32; 481 pt32.Set(fWidth / 4.0f, fBottom); 482 CFX_PointF pt34; 483 pt34.Set(fWidth * (1 / 7.0f + 7 / 15.0f), fBottom + fHeight * 4 / 5.0f); 484 CFX_PointF pt43; 485 pt43.Set(fWidth * (1 / 7.0f + 7 / 15.0f), fBottom + fHeight * 4 / 5.0f); 486 CFX_PointF pt45; 487 pt45.Set(fWidth * 7 / 15.0f, fBottom + fHeight * 8 / 7.0f); 488 CFX_PointF pt54; 489 pt54.Set(fWidth / 3.4f, fBottom + fHeight / 3.5f); 490 CFX_PointF pt51; 491 pt51.Set(fWidth / 3.6f, fBottom + fHeight / 4.0f); 492 CFX_PointF pt15; 493 pt15.Set(fWidth / 3.5f, fBottom + fHeight * 3.5f / 5.0f); 494 m_pCheckPath->MoveTo(pt1.x, pt1.y); 495 px1 = pt12.x - pt1.x; 496 py1 = pt12.y - pt1.y; 497 px2 = pt21.x - pt2.x; 498 py2 = pt21.y - pt2.y; 499 m_pCheckPath->BezierTo(pt1.x + px1 * FWLTHEME_BEZIER, 500 pt1.y + py1 * FWLTHEME_BEZIER, 501 pt2.x + px2 * FWLTHEME_BEZIER, 502 pt2.y + py2 * FWLTHEME_BEZIER, pt2.x, pt2.y); 503 px1 = pt23.x - pt2.x; 504 py1 = pt23.y - pt2.y; 505 px2 = pt32.x - pt3.x; 506 py2 = pt32.y - pt3.y; 507 m_pCheckPath->BezierTo(pt2.x + px1 * FWLTHEME_BEZIER, 508 pt2.y + py1 * FWLTHEME_BEZIER, 509 pt3.x + px2 * FWLTHEME_BEZIER, 510 pt3.y + py2 * FWLTHEME_BEZIER, pt3.x, pt3.y); 511 px1 = pt34.x - pt3.x; 512 py1 = pt34.y - pt3.y; 513 px2 = pt43.x - pt4.x; 514 py2 = pt43.y - pt4.y; 515 m_pCheckPath->BezierTo(pt3.x + px1 * FWLTHEME_BEZIER, 516 pt3.y + py1 * FWLTHEME_BEZIER, 517 pt4.x + px2 * FWLTHEME_BEZIER, 518 pt4.y + py2 * FWLTHEME_BEZIER, pt4.x, pt4.y); 519 px1 = pt45.x - pt4.x; 520 py1 = pt45.y - pt4.y; 521 px2 = pt54.x - pt5.x; 522 py2 = pt54.y - pt5.y; 523 m_pCheckPath->BezierTo(pt4.x + px1 * FWLTHEME_BEZIER, 524 pt4.y + py1 * FWLTHEME_BEZIER, 525 pt5.x + px2 * FWLTHEME_BEZIER, 526 pt5.y + py2 * FWLTHEME_BEZIER, pt5.x, pt5.y); 527 px1 = pt51.x - pt5.x; 528 py1 = pt51.y - pt5.y; 529 px2 = pt15.x - pt1.x; 530 py2 = pt15.y - pt1.y; 531 m_pCheckPath->BezierTo(pt5.x + px1 * FWLTHEME_BEZIER, 532 pt5.y + py1 * FWLTHEME_BEZIER, 533 pt1.x + px2 * FWLTHEME_BEZIER, 534 pt1.y + py2 * FWLTHEME_BEZIER, pt1.x, pt1.y); 535 FX_FLOAT fScale = fCheckLen / CHECKBOX_SIZE_SIGNPATH; 536 CFX_Matrix mt; 537 mt.Set(1, 0, 0, 1, 0, 0); 538 mt.Scale(fScale, fScale); 539 CFX_PathData* pData = m_pCheckPath->GetPathData(); 540 pData->Transform(&mt); 541 } 542 } 543