| Index: xfa/src/fwl/src/theme/widgettp.cpp
|
| diff --git a/xfa/src/fwl/src/theme/widgettp.cpp b/xfa/src/fwl/src/theme/widgettp.cpp
|
| index e1351b5a21648986df6be5fac828534199a43f92..1941694557181d6010f787947cdbd9d5d1c0cfcd 100644
|
| --- a/xfa/src/fwl/src/theme/widgettp.cpp
|
| +++ b/xfa/src/fwl/src/theme/widgettp.cpp
|
| @@ -1,846 +1,846 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "xfa/src/foxitlib.h"
|
| -static void FWL_SetChildThemeID(IFWL_Widget* pParent, FX_DWORD dwThemeID) {
|
| - IFWL_WidgetMgr* pWidgetMgr = FWL_GetWidgetMgr();
|
| - IFWL_Widget* pChild =
|
| - pWidgetMgr->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
|
| - while (pChild) {
|
| - IFWL_ThemeProvider* pTheme = pChild->GetThemeProvider();
|
| - if (pTheme) {
|
| - pTheme->SetThemeID(pChild, dwThemeID, FALSE);
|
| - }
|
| - FWL_SetChildThemeID(pChild, dwThemeID);
|
| - pChild = pWidgetMgr->GetWidget(pChild, FWL_WGTRELATION_NextSibling);
|
| - }
|
| -}
|
| -FX_BOOL CFWL_WidgetTP::IsValidWidget(IFWL_Widget* pWidget) {
|
| - return FALSE;
|
| -}
|
| -FX_DWORD CFWL_WidgetTP::GetThemeID(IFWL_Widget* pWidget) {
|
| - return m_dwThemeID;
|
| -}
|
| -FX_DWORD CFWL_WidgetTP::SetThemeID(IFWL_Widget* pWidget,
|
| - FX_DWORD dwThemeID,
|
| - FX_BOOL bChildren) {
|
| - FX_DWORD dwOld = m_dwThemeID;
|
| - m_dwThemeID = dwThemeID;
|
| - if (CFWL_ArrowData::IsInstance()) {
|
| - CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(dwThemeID));
|
| - }
|
| - if (bChildren) {
|
| - FWL_SetChildThemeID(pWidget, dwThemeID);
|
| - }
|
| - return dwOld;
|
| -}
|
| -FWL_ERR CFWL_WidgetTP::GetThemeMatrix(IFWL_Widget* pWidget,
|
| - CFX_Matrix& matrix) {
|
| - matrix.Set(_ctm.a, _ctm.b, _ctm.c, _ctm.d, _ctm.e, _ctm.f);
|
| - return FWL_ERR_Succeeded;
|
| -}
|
| -FWL_ERR CFWL_WidgetTP::SetThemeMatrix(IFWL_Widget* pWidget,
|
| - const CFX_Matrix& matrix) {
|
| - _ctm.Set(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
|
| - return FWL_ERR_Succeeded;
|
| -}
|
| -FX_BOOL CFWL_WidgetTP::DrawBackground(CFWL_ThemeBackground* pParams) {
|
| - return TRUE;
|
| -}
|
| -FX_BOOL CFWL_WidgetTP::DrawText(CFWL_ThemeText* pParams) {
|
| - if (!m_pTextOut) {
|
| - InitTTO();
|
| - }
|
| - int32_t iLen = pParams->m_wsText.GetLength();
|
| - if (iLen <= 0)
|
| - return FALSE;
|
| - CFX_Graphics* pGraphics = pParams->m_pGraphics;
|
| - m_pTextOut->SetRenderDevice(pGraphics->GetRenderDevice());
|
| - m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
|
| - m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
|
| - CFX_Matrix* pMatrix = &pParams->m_matrix;
|
| - pMatrix->Concat(*pGraphics->GetMatrix());
|
| - m_pTextOut->SetMatrix(*pMatrix);
|
| - m_pTextOut->DrawLogicText(pParams->m_wsText, iLen, pParams->m_rtPart);
|
| - return TRUE;
|
| -}
|
| -void* CFWL_WidgetTP::GetCapacity(CFWL_ThemePart* pThemePart,
|
| - FX_DWORD dwCapacity) {
|
| - switch (dwCapacity) {
|
| - case FWL_WGTCAPACITY_CXBorder: {
|
| - m_fValue = FWLTHEME_CAPACITY_CXBorder;
|
| - break;
|
| - }
|
| - case FWL_WGTCAPACITY_CYBorder: {
|
| - m_fValue = FWLTHEME_CAPACITY_CYBorder;
|
| - break;
|
| - }
|
| - case FWL_WGTCAPACITY_EdgeFlat: {
|
| - m_fValue = FWLTHEME_CAPACITY_EdgeFlat;
|
| - break;
|
| - }
|
| - case FWL_WGTCAPACITY_EdgeRaised: {
|
| - m_fValue = FWLTHEME_CAPACITY_EdgeRaised;
|
| - break;
|
| - }
|
| - case FWL_WGTCAPACITY_EdgeSunken: {
|
| - m_fValue = FWLTHEME_CAPACITY_EdgeSunken;
|
| - break;
|
| - }
|
| - case FWL_WGTCAPACITY_FontSize: {
|
| - m_fValue = FWLTHEME_CAPACITY_FontSize;
|
| - break;
|
| - }
|
| - case FWL_WGTCAPACITY_TextColor: {
|
| - m_dwValue = FWLTHEME_CAPACITY_TextColor;
|
| - return &m_dwValue;
|
| - }
|
| - case FWL_WGTCAPACITY_ScrollBarWidth: {
|
| - m_fValue = FWLTHEME_CAPACITY_ScrollBarWidth;
|
| - break;
|
| - }
|
| - case FWL_WGTCAPACITY_Font: {
|
| - return m_pFDEFont;
|
| - }
|
| - case FWL_WGTCAPACITY_TextSelColor: {
|
| - m_dwValue = (m_dwThemeID == 0) ? FWLTHEME_CAPACITY_TextSelColor
|
| - : FWLTHEME_COLOR_Green_BKSelected;
|
| - return &m_dwValue;
|
| - }
|
| - case FWL_WGTCAPACITY_LineHeight: {
|
| - m_fValue = FWLTHEME_CAPACITY_LineHeight;
|
| - break;
|
| - }
|
| - case FWL_WGTCAPACITY_UIMargin: {
|
| - m_rtMargin.Set(0, 0, 0, 0);
|
| - return &m_rtMargin;
|
| - }
|
| - default: { return NULL; }
|
| - }
|
| - return &m_fValue;
|
| -}
|
| -FX_BOOL CFWL_WidgetTP::IsCustomizedLayout(IFWL_Widget* pWidget) {
|
| - return FWL_GetThemeLayout(m_dwThemeID);
|
| -}
|
| -FWL_ERR CFWL_WidgetTP::GetPartRect(CFWL_ThemePart* pThemePart,
|
| - CFX_RectF& rect) {
|
| - return FWL_ERR_Succeeded;
|
| -}
|
| -FX_BOOL CFWL_WidgetTP::IsInPart(CFWL_ThemePart* pThemePart,
|
| - FX_FLOAT fx,
|
| - FX_FLOAT fy) {
|
| - return TRUE;
|
| -}
|
| -FX_BOOL CFWL_WidgetTP::CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) {
|
| - if (!pParams)
|
| - return FALSE;
|
| - if (!m_pTextOut)
|
| - return FALSE;
|
| - m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
|
| - m_pTextOut->SetStyles(pParams->m_dwTTOStyles | FDE_TTOSTYLE_ArabicContext);
|
| - m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(),
|
| - rect);
|
| - return TRUE;
|
| -}
|
| -FWL_ERR CFWL_WidgetTP::Initialize() {
|
| - m_dwThemeID = 0;
|
| - _ctm.SetIdentity();
|
| - return FWL_ERR_Succeeded;
|
| -}
|
| -FWL_ERR CFWL_WidgetTP::Finalize() {
|
| - if (!m_pTextOut) {
|
| - FinalizeTTO();
|
| - }
|
| - return FWL_ERR_Succeeded;
|
| -}
|
| -CFWL_WidgetTP::~CFWL_WidgetTP() {}
|
| -FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget* pWidget,
|
| - const FX_WCHAR* strFont,
|
| - FX_FLOAT fFontSize,
|
| - FX_ARGB rgbFont) {
|
| - if (!m_pTextOut) {
|
| - return FWL_ERR_Succeeded;
|
| - }
|
| - m_pFDEFont = FWL_GetFontManager()->FindFont(strFont, 0, 0);
|
| - m_pTextOut->SetFont(m_pFDEFont);
|
| - m_pTextOut->SetFontSize(fFontSize);
|
| - m_pTextOut->SetTextColor(rgbFont);
|
| - return FWL_ERR_Succeeded;
|
| -}
|
| -FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget* pWidget,
|
| - IFX_Font* pFont,
|
| - FX_FLOAT fFontSize,
|
| - FX_ARGB rgbFont) {
|
| - if (!m_pTextOut) {
|
| - return FWL_ERR_Succeeded;
|
| - }
|
| - m_pTextOut->SetFont(pFont);
|
| - m_pTextOut->SetFontSize(fFontSize);
|
| - m_pTextOut->SetTextColor(rgbFont);
|
| - return FWL_ERR_Succeeded;
|
| -}
|
| -IFX_Font* CFWL_WidgetTP::GetFont(IFWL_Widget* pWidget) {
|
| - return m_pFDEFont;
|
| -}
|
| -CFWL_WidgetTP::CFWL_WidgetTP()
|
| - : m_dwRefCount(1), m_pTextOut(NULL), m_pFDEFont(NULL), m_dwThemeID(0) {}
|
| -FX_ERR CFWL_WidgetTP::InitTTO() {
|
| - if (m_pTextOut) {
|
| - return FWL_ERR_Succeeded;
|
| - }
|
| - m_pFDEFont = FWL_GetFontManager()->FindFont(FX_WSTRC(L"Helvetica"), 0, 0);
|
| - m_pTextOut = IFDE_TextOut::Create();
|
| - m_pTextOut->SetFont(m_pFDEFont);
|
| - m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
|
| - m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
|
| - m_pTextOut->SetEllipsisString(L"...");
|
| - return FWL_ERR_Succeeded;
|
| -}
|
| -FX_ERR CFWL_WidgetTP::FinalizeTTO() {
|
| - if (m_pTextOut) {
|
| - m_pTextOut->Release();
|
| - m_pTextOut = NULL;
|
| - }
|
| - return FWL_ERR_Succeeded;
|
| -}
|
| -#ifdef THEME_XPSimilar
|
| -void CFWL_WidgetTP::DrawEdge(CFX_Graphics* pGraphics,
|
| - FX_DWORD dwStyles,
|
| - const CFX_RectF* pRect,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!pRect)
|
| - return;
|
| - pGraphics->SaveGraphState();
|
| - CFX_Color crStroke(FWL_GetThemeColor(m_dwThemeID) == 0
|
| - ? ArgbEncode(255, 127, 157, 185)
|
| - : FWLTHEME_COLOR_Green_BKSelected);
|
| - pGraphics->SetStrokeColor(&crStroke);
|
| - CFX_Path path;
|
| - path.Create();
|
| - path.AddRectangle(pRect->left, pRect->top, pRect->width - 1,
|
| - pRect->height - 1);
|
| - pGraphics->StrokePath(&path, pMatrix);
|
| - path.Clear();
|
| - crStroke = ArgbEncode(255, 255, 255, 255);
|
| - pGraphics->SetStrokeColor(&crStroke);
|
| - path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 3,
|
| - pRect->height - 3);
|
| - pGraphics->StrokePath(&path, pMatrix);
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -#else
|
| -void CFWL_WidgetTP::DrawEdge(CFX_Graphics* pGraphics,
|
| - FX_DWORD dwStyles,
|
| - const CFX_RectF* pRect,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!pRect)
|
| - return;
|
| - FWLTHEME_EDGE eType;
|
| - FX_FLOAT fWidth;
|
| - switch (dwStyles & FWL_WGTSTYLE_EdgeMask) {
|
| - case FWL_WGTSTYLE_EdgeRaised: {
|
| - eType = FWLTHEME_EDGE_Raised, fWidth = FWLTHEME_CAPACITY_EdgeRaised;
|
| - break;
|
| - }
|
| - case FWL_WGTSTYLE_EdgeSunken: {
|
| - eType = FWLTHEME_EDGE_Sunken, fWidth = FWLTHEME_CAPACITY_EdgeSunken;
|
| - break;
|
| - }
|
| - case FWL_WGTSTYLE_EdgeFlat:
|
| - default: { return; }
|
| - }
|
| - Draw3DRect(pGraphics, eType, fWidth, pRect, FWLTHEME_COLOR_EDGELT1,
|
| - FWLTHEME_COLOR_EDGELT2, FWLTHEME_COLOR_EDGERB1,
|
| - FWLTHEME_COLOR_EDGERB2, pMatrix);
|
| -}
|
| -#endif
|
| -void CFWL_WidgetTP::Draw3DRect(CFX_Graphics* pGraphics,
|
| - FWLTHEME_EDGE eType,
|
| - FX_FLOAT fWidth,
|
| - const CFX_RectF* pRect,
|
| - FX_ARGB cr1,
|
| - FX_ARGB cr2,
|
| - FX_ARGB cr3,
|
| - FX_ARGB cr4,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!pRect)
|
| - return;
|
| - pGraphics->SaveGraphState();
|
| - if (eType == FWLTHEME_EDGE_Flat) {
|
| - CFX_Path path;
|
| - path.Create();
|
| - path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| - path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
|
| - pRect->height - 2);
|
| - CFX_Color cr(ArgbEncode(255, 100, 100, 100));
|
| - pGraphics->SetFillColor(&cr);
|
| - pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| - path.Clear();
|
| - path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
|
| - pRect->height - 2);
|
| - path.AddRectangle(pRect->left + 2, pRect->top + 2, pRect->width - 4,
|
| - pRect->height - 4);
|
| - cr.Set(0xFFFFFFFF);
|
| - pGraphics->SetFillColor(&cr);
|
| - pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| - } else {
|
| - FX_FLOAT fLeft = pRect->left;
|
| - FX_FLOAT fRight = pRect->right();
|
| - FX_FLOAT fTop = pRect->top;
|
| - FX_FLOAT fBottom = pRect->bottom();
|
| - FX_FLOAT fHalfWidth = fWidth / 2.0f;
|
| - CFX_Color crLT(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1);
|
| - pGraphics->SetFillColor(&crLT);
|
| - CFX_Path pathLT;
|
| - pathLT.Create();
|
| - pathLT.MoveTo(fLeft, fBottom - fHalfWidth);
|
| - pathLT.LineTo(fLeft, fTop);
|
| - pathLT.LineTo(fRight - fHalfWidth, fTop);
|
| - pathLT.LineTo(fRight - fHalfWidth, fTop + fHalfWidth);
|
| - pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth);
|
| - pathLT.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth);
|
| - pathLT.LineTo(fLeft, fBottom - fHalfWidth);
|
| - pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
|
| - crLT = CFX_Color(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2);
|
| - pGraphics->SetFillColor(&crLT);
|
| - pathLT.Clear();
|
| - pathLT.MoveTo(fLeft + fHalfWidth, fBottom - fWidth);
|
| - pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth);
|
| - pathLT.LineTo(fRight - fWidth, fTop + fHalfWidth);
|
| - pathLT.LineTo(fRight - fWidth, fTop + fWidth);
|
| - pathLT.LineTo(fLeft + fWidth, fTop + fWidth);
|
| - pathLT.LineTo(fLeft + fWidth, fBottom - fWidth);
|
| - pathLT.LineTo(fLeft + fHalfWidth, fBottom - fWidth);
|
| - pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
|
| - CFX_Color crRB(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3);
|
| - pGraphics->SetFillColor(&crRB);
|
| - CFX_Path pathRB;
|
| - pathRB.Create();
|
| - pathRB.MoveTo(fRight - fHalfWidth, fTop + fHalfWidth);
|
| - pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth);
|
| - pathRB.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth);
|
| - pathRB.LineTo(fLeft + fHalfWidth, fBottom - fWidth);
|
| - pathRB.LineTo(fRight - fWidth, fBottom - fWidth);
|
| - pathRB.LineTo(fRight - fWidth, fTop + fHalfWidth);
|
| - pathRB.LineTo(fRight - fHalfWidth, fTop + fHalfWidth);
|
| - pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
|
| - crRB = CFX_Color(eType == FWLTHEME_EDGE_Raised ? cr2 : cr4);
|
| - pGraphics->SetFillColor(&crRB);
|
| - pathRB.Clear();
|
| - pathRB.MoveTo(fRight, fTop);
|
| - pathRB.LineTo(fRight, fBottom);
|
| - pathRB.LineTo(fLeft, fBottom);
|
| - pathRB.LineTo(fLeft, fBottom - fHalfWidth);
|
| - pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth);
|
| - pathRB.LineTo(fRight - fHalfWidth, fTop);
|
| - pathRB.LineTo(fRight, fTop);
|
| - pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
|
| - }
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -void CFWL_WidgetTP::Draw3DCircle(CFX_Graphics* pGraphics,
|
| - FWLTHEME_EDGE eType,
|
| - FX_FLOAT fWidth,
|
| - const CFX_RectF* pRect,
|
| - FX_ARGB cr1,
|
| - FX_ARGB cr2,
|
| - FX_ARGB cr3,
|
| - FX_ARGB cr4,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!pRect)
|
| - return;
|
| - pGraphics->SaveGraphState();
|
| - CFX_Path path;
|
| - path.Create();
|
| - path.AddArc(pRect->left, pRect->top, pRect->width, pRect->height,
|
| - FWLTHEME_PI * 3 / 4, FWLTHEME_PI);
|
| - CFX_Color crFill1(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1);
|
| - pGraphics->SetStrokeColor(&crFill1);
|
| - pGraphics->StrokePath(&path, pMatrix);
|
| - CFX_RectF rtInner(*pRect);
|
| - rtInner.Deflate(pRect->width / 4, pRect->height / 4);
|
| - path.Clear();
|
| - path.AddArc(rtInner.left, rtInner.top, rtInner.width, rtInner.height,
|
| - FWLTHEME_PI * 3 / 4, FWLTHEME_PI);
|
| - CFX_Color crFill2(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2);
|
| - pGraphics->SetStrokeColor(&crFill2);
|
| - pGraphics->StrokePath(&path, pMatrix);
|
| - path.Clear();
|
| - path.AddArc(pRect->left, pRect->top, pRect->width, pRect->height,
|
| - FWLTHEME_PI * 7 / 4, FWLTHEME_PI);
|
| - CFX_Color crFill3(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3);
|
| - pGraphics->SetStrokeColor(&crFill3);
|
| - pGraphics->StrokePath(&path, pMatrix);
|
| - path.AddArc(rtInner.left, rtInner.top, rtInner.width, rtInner.height,
|
| - FWLTHEME_PI * 7 / 4, FWLTHEME_PI);
|
| - CFX_Color crFill4(eType == FWLTHEME_EDGE_Raised ? cr2 : cr4);
|
| - pGraphics->SetStrokeColor(&crFill4);
|
| - pGraphics->StrokePath(&path, pMatrix);
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -void CFWL_WidgetTP::DrawBorder(CFX_Graphics* pGraphics,
|
| - const CFX_RectF* pRect,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!pRect)
|
| - return;
|
| - CFX_Path path;
|
| - path.Create();
|
| - path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| - path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
|
| - pRect->height - 2);
|
| - pGraphics->SaveGraphState();
|
| - CFX_Color crFill(ArgbEncode(255, 0, 0, 0));
|
| - pGraphics->SetFillColor(&crFill);
|
| - pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -void CFWL_WidgetTP::FillBackground(CFX_Graphics* pGraphics,
|
| - const CFX_RectF* pRect,
|
| - CFX_Matrix* pMatrix) {
|
| - FillSoildRect(pGraphics, FWLTHEME_COLOR_Background, pRect, pMatrix);
|
| -}
|
| -void CFWL_WidgetTP::FillSoildRect(CFX_Graphics* pGraphics,
|
| - FX_ARGB fillColor,
|
| - const CFX_RectF* pRect,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!pRect)
|
| - return;
|
| - pGraphics->SaveGraphState();
|
| - CFX_Color crFill(fillColor);
|
| - pGraphics->SetFillColor(&crFill);
|
| - CFX_Path path;
|
| - path.Create();
|
| - path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| - pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -void CFWL_WidgetTP::DrawAxialShading(CFX_Graphics* pGraphics,
|
| - FX_FLOAT fx1,
|
| - FX_FLOAT fy1,
|
| - FX_FLOAT fx2,
|
| - FX_FLOAT fy2,
|
| - FX_ARGB beginColor,
|
| - FX_ARGB endColor,
|
| - CFX_Path* path,
|
| - int32_t fillMode,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!path)
|
| - return;
|
| - CFX_PointF begPoint, endPoint;
|
| - begPoint.Set(fx1, fy1);
|
| - endPoint.Set(fx2, fy2);
|
| - CFX_Shading shading;
|
| - shading.CreateAxial(begPoint, endPoint, FALSE, FALSE, beginColor, endColor);
|
| - pGraphics->SaveGraphState();
|
| - CFX_Color color1(&shading);
|
| - pGraphics->SetFillColor(&color1);
|
| - pGraphics->FillPath(path, fillMode, pMatrix);
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -void CFWL_WidgetTP::DrawAnnulusRect(CFX_Graphics* pGraphics,
|
| - FX_ARGB fillColor,
|
| - const CFX_RectF* pRect,
|
| - FX_FLOAT fRingWidth,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!pRect)
|
| - return;
|
| - pGraphics->SaveGraphState();
|
| - CFX_Color cr(fillColor);
|
| - pGraphics->SetFillColor(&cr);
|
| - CFX_Path path;
|
| - path.Create();
|
| - CFX_RectF rtInner(*pRect);
|
| - rtInner.Deflate(fRingWidth, fRingWidth);
|
| - path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
|
| - path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| - pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -void CFWL_WidgetTP::DrawAnnulusCircle(CFX_Graphics* pGraphics,
|
| - FX_ARGB fillColor,
|
| - const CFX_RectF* pRect,
|
| - FX_FLOAT fWidth,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!pRect)
|
| - return;
|
| - if (fWidth > pRect->width / 2) {
|
| - return;
|
| - }
|
| - pGraphics->SaveGraphState();
|
| - CFX_Color cr(fillColor);
|
| - pGraphics->SetFillColor(&cr);
|
| - CFX_Path path;
|
| - path.Create();
|
| - path.AddEllipse(*pRect);
|
| - CFX_RectF rtIn(*pRect);
|
| - rtIn.Inflate(-fWidth, -fWidth);
|
| - path.AddEllipse(rtIn);
|
| - pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -void CFWL_WidgetTP::DrawFocus(CFX_Graphics* pGraphics,
|
| - const CFX_RectF* pRect,
|
| - CFX_Matrix* pMatrix) {
|
| - if (!pGraphics)
|
| - return;
|
| - if (!pRect)
|
| - return;
|
| - pGraphics->SaveGraphState();
|
| - CFX_Color cr(0xFF000000);
|
| - pGraphics->SetStrokeColor(&cr);
|
| - FX_FLOAT DashPattern[2] = {1, 1};
|
| - pGraphics->SetLineDash(0.0f, DashPattern, 2);
|
| - CFX_Path path;
|
| - path.Create();
|
| - path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| - pGraphics->StrokePath(&path, pMatrix);
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -#define FWLTHEME_ARROW_Denominator 3
|
| -void CFWL_WidgetTP::DrawArrow(CFX_Graphics* pGraphics,
|
| - const CFX_RectF* pRect,
|
| - FWLTHEME_DIRECTION eDict,
|
| - FX_ARGB argbFill,
|
| - FX_BOOL bPressed,
|
| - CFX_Matrix* pMatrix) {
|
| - CFX_RectF rtArrow(*pRect);
|
| - CFX_Path path;
|
| - path.Create();
|
| - FX_FLOAT fBtn =
|
| - std::min(pRect->width, pRect->height) / FWLTHEME_ARROW_Denominator;
|
| - rtArrow.left = pRect->left + (pRect->width - fBtn) / 2;
|
| - rtArrow.top = pRect->top + (pRect->height - fBtn) / 2;
|
| - rtArrow.width = fBtn;
|
| - rtArrow.height = fBtn;
|
| - if (bPressed) {
|
| - rtArrow.Offset(1, 1);
|
| - }
|
| - switch (eDict) {
|
| - case FWLTHEME_DIRECTION_Up: {
|
| - path.MoveTo(rtArrow.left, rtArrow.bottom());
|
| - path.LineTo(rtArrow.right(), rtArrow.bottom());
|
| - path.LineTo(rtArrow.left + fBtn / 2, rtArrow.top);
|
| - path.LineTo(rtArrow.left, rtArrow.bottom());
|
| - break;
|
| - }
|
| - case FWLTHEME_DIRECTION_Left: {
|
| - path.MoveTo(rtArrow.right(), rtArrow.top);
|
| - path.LineTo(rtArrow.right(), rtArrow.bottom());
|
| - path.LineTo(rtArrow.left, rtArrow.top + fBtn / 2);
|
| - path.LineTo(rtArrow.right(), rtArrow.top);
|
| - break;
|
| - }
|
| - case FWLTHEME_DIRECTION_Right: {
|
| - path.MoveTo(rtArrow.left, rtArrow.top);
|
| - path.LineTo(rtArrow.left, rtArrow.bottom());
|
| - path.LineTo(rtArrow.right(), rtArrow.top + fBtn / 2);
|
| - path.LineTo(rtArrow.left, rtArrow.top);
|
| - break;
|
| - }
|
| - case FWLTHEME_DIRECTION_Down:
|
| - default: {
|
| - path.MoveTo(rtArrow.left, rtArrow.top);
|
| - path.LineTo(rtArrow.right(), rtArrow.top);
|
| - path.LineTo(rtArrow.left + fBtn / 2, rtArrow.bottom());
|
| - path.LineTo(rtArrow.left, rtArrow.top);
|
| - }
|
| - }
|
| - pGraphics->SaveGraphState();
|
| - CFX_Color cr(argbFill);
|
| - pGraphics->SetFillColor(&cr);
|
| - pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| - pGraphics->RestoreGraphState();
|
| -}
|
| -void CFWL_WidgetTP::DrawArrow(CFX_Graphics* pGraphics,
|
| - const CFX_RectF* pRect,
|
| - FWLTHEME_DIRECTION eDict,
|
| - FX_ARGB argSign,
|
| - CFX_Matrix* pMatrix) {
|
| - FX_BOOL bVert =
|
| - (eDict == FWLTHEME_DIRECTION_Up || eDict == FWLTHEME_DIRECTION_Down);
|
| - FX_FLOAT fLeft =
|
| - (FX_FLOAT)(((pRect->width - (bVert ? 9 : 6)) / 2 + pRect->left) + 0.5);
|
| - FX_FLOAT fTop =
|
| - (FX_FLOAT)(((pRect->height - (bVert ? 6 : 9)) / 2 + pRect->top) + 0.5);
|
| - CFX_Path path;
|
| - path.Create();
|
| - switch (eDict) {
|
| - case FWLTHEME_DIRECTION_Down: {
|
| - path.MoveTo(fLeft, fTop + 1);
|
| - path.LineTo(fLeft + 4, fTop + 5);
|
| - path.LineTo(fLeft + 8, fTop + 1);
|
| - path.LineTo(fLeft + 7, fTop);
|
| - path.LineTo(fLeft + 4, fTop + 3);
|
| - path.LineTo(fLeft + 1, fTop);
|
| - break;
|
| - }
|
| - case FWLTHEME_DIRECTION_Up: {
|
| - path.MoveTo(fLeft, fTop + 4);
|
| - path.LineTo(fLeft + 4, fTop);
|
| - path.LineTo(fLeft + 8, fTop + 4);
|
| - path.LineTo(fLeft + 7, fTop + 5);
|
| - path.LineTo(fLeft + 4, fTop + 2);
|
| - path.LineTo(fLeft + 1, fTop + 5);
|
| - break;
|
| - }
|
| - case FWLTHEME_DIRECTION_Right: {
|
| - path.MoveTo(fLeft + 1, fTop);
|
| - path.LineTo(fLeft + 5, fTop + 4);
|
| - path.LineTo(fLeft + 1, fTop + 8);
|
| - path.LineTo(fLeft, fTop + 7);
|
| - path.LineTo(fLeft + 3, fTop + 4);
|
| - path.LineTo(fLeft, fTop + 1);
|
| - break;
|
| - }
|
| - case FWLTHEME_DIRECTION_Left: {
|
| - path.MoveTo(fLeft, fTop + 4);
|
| - path.LineTo(fLeft + 4, fTop);
|
| - path.LineTo(fLeft + 5, fTop + 1);
|
| - path.LineTo(fLeft + 2, fTop + 4);
|
| - path.LineTo(fLeft + 5, fTop + 7);
|
| - path.LineTo(fLeft + 4, fTop + 8);
|
| - break;
|
| - }
|
| - }
|
| - CFX_Color cr(argSign);
|
| - pGraphics->SetFillColor(&cr);
|
| - pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| -}
|
| -void CFWL_WidgetTP::DrawBtn(CFX_Graphics* pGraphics,
|
| - const CFX_RectF* pRect,
|
| - FWLTHEME_STATE eState,
|
| - CFX_Matrix* pMatrix) {
|
| - CFX_Path path;
|
| - path.Create();
|
| - if (!CFWL_ArrowData::IsInstance()) {
|
| - CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID));
|
| - }
|
| - CFWL_ArrowData::CColorData* pColorData =
|
| - CFWL_ArrowData::GetInstance()->m_pColorData;
|
| - FX_FLOAT fRight = pRect->right();
|
| - FX_FLOAT fBottom = pRect->bottom();
|
| - path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| - DrawAxialShading(pGraphics, pRect->left, pRect->top, fRight, fBottom,
|
| - pColorData->clrStart[eState - 1],
|
| - pColorData->clrEnd[eState - 1], &path, FXFILL_WINDING,
|
| - pMatrix);
|
| - CFX_Color rcStroke;
|
| - rcStroke.Set(pColorData->clrBorder[eState - 1]);
|
| - pGraphics->SetStrokeColor(&rcStroke);
|
| - pGraphics->StrokePath(&path, pMatrix);
|
| -}
|
| -void CFWL_WidgetTP::DrawArrowBtn(CFX_Graphics* pGraphics,
|
| - const CFX_RectF* pRect,
|
| - FWLTHEME_DIRECTION eDict,
|
| - FWLTHEME_STATE eState,
|
| - CFX_Matrix* pMatrix) {
|
| - DrawBtn(pGraphics, pRect, eState, pMatrix);
|
| - if (!CFWL_ArrowData::IsInstance()) {
|
| - CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID));
|
| - }
|
| - CFWL_ArrowData::CColorData* pColorData =
|
| - CFWL_ArrowData::GetInstance()->m_pColorData;
|
| - DrawArrow(pGraphics, pRect, eDict, pColorData->clrSign[eState - 1], pMatrix);
|
| -}
|
| -FWLCOLOR CFWL_WidgetTP::BlendColor(FWLCOLOR srcColor,
|
| - FWLCOLOR renderColor,
|
| - uint8_t scale) {
|
| - FWLCOLOR dstColor;
|
| - uint8_t n = 255 - scale;
|
| - dstColor.a = (uint8_t)(
|
| - ((FX_WORD)srcColor.a * n + (FX_WORD)renderColor.a * scale) >> 8);
|
| - dstColor.r = (uint8_t)(
|
| - ((FX_WORD)srcColor.r * n + (FX_WORD)renderColor.r * scale) >> 8);
|
| - dstColor.g = (uint8_t)(
|
| - ((FX_WORD)srcColor.g * n + (FX_WORD)renderColor.g * scale) >> 8);
|
| - dstColor.b = (uint8_t)(
|
| - ((FX_WORD)srcColor.b * n + (FX_WORD)renderColor.b * scale) >> 8);
|
| - return dstColor;
|
| -}
|
| -CFWL_ArrowData::CFWL_ArrowData() : m_pColorData(NULL) {
|
| - SetColorData(0);
|
| -}
|
| -CFWL_FontManager* FWL_GetFontManager() {
|
| - static CFWL_FontManager* _fontManager = NULL;
|
| - if (_fontManager == NULL) {
|
| - _fontManager = new CFWL_FontManager;
|
| - }
|
| - return _fontManager;
|
| -}
|
| -void FWL_ReleaseFontManager() {
|
| - CFWL_FontManager* fontManager = FWL_GetFontManager();
|
| - delete fontManager;
|
| -}
|
| -CFWL_FontData::CFWL_FontData()
|
| - : m_dwStyles(0),
|
| - m_dwCodePage(0),
|
| - m_pFont(0),
|
| - m_pFontMgr(NULL)
|
| -#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
|
| - ,
|
| - m_pFontSource(NULL)
|
| -#endif
|
| -{
|
| -}
|
| -CFWL_FontData::~CFWL_FontData() {
|
| - if (m_pFont) {
|
| - m_pFont->Release();
|
| - }
|
| - if (m_pFontMgr) {
|
| - m_pFontMgr->Release();
|
| - }
|
| -#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
|
| - if (m_pFontSource != NULL) {
|
| - m_pFontSource->Release();
|
| - }
|
| -#endif
|
| -}
|
| -FX_BOOL CFWL_FontData::Equal(const CFX_WideStringC& wsFontFamily,
|
| - FX_DWORD dwFontStyles,
|
| - FX_WORD wCodePage) {
|
| - return m_wsFamily == wsFontFamily && m_dwStyles == dwFontStyles &&
|
| - m_dwCodePage == wCodePage;
|
| -}
|
| -FX_BOOL CFWL_FontData::LoadFont(const CFX_WideStringC& wsFontFamily,
|
| - FX_DWORD dwFontStyles,
|
| - FX_WORD dwCodePage) {
|
| - m_wsFamily = wsFontFamily;
|
| - m_dwStyles = dwFontStyles;
|
| - m_dwCodePage = dwCodePage;
|
| - if (!m_pFontMgr) {
|
| -#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
|
| - m_pFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator());
|
| -#else
|
| - m_pFontSource = FX_CreateDefaultFontSourceEnum();
|
| - m_pFontMgr = IFX_FontMgr::Create(m_pFontSource);
|
| -#endif
|
| - }
|
| - m_pFont = IFX_Font::LoadFont(wsFontFamily.GetPtr(), dwFontStyles, dwCodePage,
|
| - m_pFontMgr);
|
| - return m_pFont != NULL;
|
| -}
|
| -CFWL_FontManager::CFWL_FontManager() {}
|
| -CFWL_FontManager::~CFWL_FontManager() {
|
| - for (int32_t i = 0; i < m_arrFonts.GetSize(); i++) {
|
| - delete static_cast<CFWL_FontData*>(m_arrFonts[i]);
|
| - }
|
| - m_arrFonts.RemoveAll();
|
| -}
|
| -IFX_Font* CFWL_FontManager::FindFont(const CFX_WideStringC& wsFontFamily,
|
| - FX_DWORD dwFontStyles,
|
| - FX_WORD wCodePage) {
|
| - for (int32_t i = 0; i < m_arrFonts.GetSize(); i++) {
|
| - CFWL_FontData* data = static_cast<CFWL_FontData*>(m_arrFonts[i]);
|
| - if (data->Equal(wsFontFamily, dwFontStyles, wCodePage)) {
|
| - return data->GetFont();
|
| - }
|
| - }
|
| - CFWL_FontData* fontData = new CFWL_FontData;
|
| - if (!fontData->LoadFont(wsFontFamily, dwFontStyles, wCodePage)) {
|
| - delete fontData;
|
| - return NULL;
|
| - }
|
| - m_arrFonts.Add(fontData);
|
| - return fontData->GetFont();
|
| -}
|
| -FX_BOOL FWLTHEME_Init() {
|
| - return TRUE;
|
| -}
|
| -void FWLTHEME_Release() {
|
| - CFWL_ArrowData::DestroyInstance();
|
| - FWL_ReleaseFontManager();
|
| -}
|
| -FX_DWORD FWL_GetThemeLayout(FX_DWORD dwThemeID) {
|
| - return 0xffff0000 & dwThemeID;
|
| -}
|
| -FX_DWORD FWL_GetThemeColor(FX_DWORD dwThemeID) {
|
| - return 0x0000ffff & dwThemeID;
|
| -}
|
| -FX_DWORD FWL_MakeThemeID(FX_DWORD dwLayout, FX_DWORD dwColor) {
|
| - return (dwLayout << 16) | (0x0000FFFF & dwColor);
|
| -}
|
| -CFWL_ArrowData* CFWL_ArrowData::m_pInstance = NULL;
|
| -CFWL_ArrowData* CFWL_ArrowData::GetInstance() {
|
| - if (!m_pInstance) {
|
| - m_pInstance = new CFWL_ArrowData;
|
| - }
|
| - return m_pInstance;
|
| -}
|
| -FX_BOOL CFWL_ArrowData::IsInstance() {
|
| - return (m_pInstance != NULL);
|
| -}
|
| -void CFWL_ArrowData::DestroyInstance() {
|
| - if (m_pInstance) {
|
| - delete m_pInstance;
|
| - m_pInstance = NULL;
|
| - }
|
| -}
|
| -CFWL_ArrowData::~CFWL_ArrowData() {
|
| - if (m_pColorData) {
|
| - delete m_pColorData;
|
| - m_pColorData = NULL;
|
| - }
|
| -}
|
| -void CFWL_ArrowData::SetColorData(FX_DWORD dwID) {
|
| - if (!m_pColorData) {
|
| - m_pColorData = new CColorData;
|
| - }
|
| - if (dwID) {
|
| - m_pColorData->clrBorder[0] = ArgbEncode(255, 142, 153, 125);
|
| - m_pColorData->clrBorder[1] = ArgbEncode(255, 157, 171, 119);
|
| - m_pColorData->clrBorder[2] = ArgbEncode(255, 118, 131, 97);
|
| - m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153);
|
| - m_pColorData->clrStart[0] = ArgbEncode(255, 203, 215, 186);
|
| - m_pColorData->clrStart[1] = ArgbEncode(255, 218, 232, 185);
|
| - m_pColorData->clrStart[2] = ArgbEncode(255, 203, 215, 186);
|
| - m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251);
|
| - m_pColorData->clrEnd[0] = ArgbEncode(255, 149, 167, 117);
|
| - m_pColorData->clrEnd[1] = ArgbEncode(255, 198, 211, 155);
|
| - m_pColorData->clrEnd[2] = ArgbEncode(255, 149, 167, 117);
|
| - m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236);
|
| - m_pColorData->clrSign[0] = ArgbEncode(255, 255, 255, 255);
|
| - m_pColorData->clrSign[1] = ArgbEncode(255, 255, 255, 255);
|
| - m_pColorData->clrSign[2] = ArgbEncode(255, 255, 255, 255);
|
| - m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128);
|
| - } else {
|
| - m_pColorData->clrBorder[0] = ArgbEncode(255, 202, 216, 249);
|
| - m_pColorData->clrBorder[1] = ArgbEncode(255, 171, 190, 233);
|
| - m_pColorData->clrBorder[2] = ArgbEncode(255, 135, 147, 219);
|
| - m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153);
|
| - m_pColorData->clrStart[0] = ArgbEncode(255, 225, 234, 254);
|
| - m_pColorData->clrStart[1] = ArgbEncode(255, 253, 255, 255);
|
| - m_pColorData->clrStart[2] = ArgbEncode(255, 110, 142, 241);
|
| - m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251);
|
| - m_pColorData->clrEnd[0] = ArgbEncode(255, 175, 204, 251);
|
| - m_pColorData->clrEnd[1] = ArgbEncode(255, 185, 218, 251);
|
| - m_pColorData->clrEnd[2] = ArgbEncode(255, 210, 222, 235);
|
| - m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236);
|
| - m_pColorData->clrSign[0] = ArgbEncode(255, 77, 97, 133);
|
| - m_pColorData->clrSign[1] = ArgbEncode(255, 77, 97, 133);
|
| - m_pColorData->clrSign[2] = ArgbEncode(255, 77, 97, 133);
|
| - m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128);
|
| - }
|
| -}
|
| +// Copyright 2014 PDFium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "xfa/src/foxitlib.h"
|
| +static void FWL_SetChildThemeID(IFWL_Widget* pParent, FX_DWORD dwThemeID) {
|
| + IFWL_WidgetMgr* pWidgetMgr = FWL_GetWidgetMgr();
|
| + IFWL_Widget* pChild =
|
| + pWidgetMgr->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
|
| + while (pChild) {
|
| + IFWL_ThemeProvider* pTheme = pChild->GetThemeProvider();
|
| + if (pTheme) {
|
| + pTheme->SetThemeID(pChild, dwThemeID, FALSE);
|
| + }
|
| + FWL_SetChildThemeID(pChild, dwThemeID);
|
| + pChild = pWidgetMgr->GetWidget(pChild, FWL_WGTRELATION_NextSibling);
|
| + }
|
| +}
|
| +FX_BOOL CFWL_WidgetTP::IsValidWidget(IFWL_Widget* pWidget) {
|
| + return FALSE;
|
| +}
|
| +FX_DWORD CFWL_WidgetTP::GetThemeID(IFWL_Widget* pWidget) {
|
| + return m_dwThemeID;
|
| +}
|
| +FX_DWORD CFWL_WidgetTP::SetThemeID(IFWL_Widget* pWidget,
|
| + FX_DWORD dwThemeID,
|
| + FX_BOOL bChildren) {
|
| + FX_DWORD dwOld = m_dwThemeID;
|
| + m_dwThemeID = dwThemeID;
|
| + if (CFWL_ArrowData::IsInstance()) {
|
| + CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(dwThemeID));
|
| + }
|
| + if (bChildren) {
|
| + FWL_SetChildThemeID(pWidget, dwThemeID);
|
| + }
|
| + return dwOld;
|
| +}
|
| +FWL_ERR CFWL_WidgetTP::GetThemeMatrix(IFWL_Widget* pWidget,
|
| + CFX_Matrix& matrix) {
|
| + matrix.Set(_ctm.a, _ctm.b, _ctm.c, _ctm.d, _ctm.e, _ctm.f);
|
| + return FWL_ERR_Succeeded;
|
| +}
|
| +FWL_ERR CFWL_WidgetTP::SetThemeMatrix(IFWL_Widget* pWidget,
|
| + const CFX_Matrix& matrix) {
|
| + _ctm.Set(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
|
| + return FWL_ERR_Succeeded;
|
| +}
|
| +FX_BOOL CFWL_WidgetTP::DrawBackground(CFWL_ThemeBackground* pParams) {
|
| + return TRUE;
|
| +}
|
| +FX_BOOL CFWL_WidgetTP::DrawText(CFWL_ThemeText* pParams) {
|
| + if (!m_pTextOut) {
|
| + InitTTO();
|
| + }
|
| + int32_t iLen = pParams->m_wsText.GetLength();
|
| + if (iLen <= 0)
|
| + return FALSE;
|
| + CFX_Graphics* pGraphics = pParams->m_pGraphics;
|
| + m_pTextOut->SetRenderDevice(pGraphics->GetRenderDevice());
|
| + m_pTextOut->SetStyles(pParams->m_dwTTOStyles);
|
| + m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
|
| + CFX_Matrix* pMatrix = &pParams->m_matrix;
|
| + pMatrix->Concat(*pGraphics->GetMatrix());
|
| + m_pTextOut->SetMatrix(*pMatrix);
|
| + m_pTextOut->DrawLogicText(pParams->m_wsText, iLen, pParams->m_rtPart);
|
| + return TRUE;
|
| +}
|
| +void* CFWL_WidgetTP::GetCapacity(CFWL_ThemePart* pThemePart,
|
| + FX_DWORD dwCapacity) {
|
| + switch (dwCapacity) {
|
| + case FWL_WGTCAPACITY_CXBorder: {
|
| + m_fValue = FWLTHEME_CAPACITY_CXBorder;
|
| + break;
|
| + }
|
| + case FWL_WGTCAPACITY_CYBorder: {
|
| + m_fValue = FWLTHEME_CAPACITY_CYBorder;
|
| + break;
|
| + }
|
| + case FWL_WGTCAPACITY_EdgeFlat: {
|
| + m_fValue = FWLTHEME_CAPACITY_EdgeFlat;
|
| + break;
|
| + }
|
| + case FWL_WGTCAPACITY_EdgeRaised: {
|
| + m_fValue = FWLTHEME_CAPACITY_EdgeRaised;
|
| + break;
|
| + }
|
| + case FWL_WGTCAPACITY_EdgeSunken: {
|
| + m_fValue = FWLTHEME_CAPACITY_EdgeSunken;
|
| + break;
|
| + }
|
| + case FWL_WGTCAPACITY_FontSize: {
|
| + m_fValue = FWLTHEME_CAPACITY_FontSize;
|
| + break;
|
| + }
|
| + case FWL_WGTCAPACITY_TextColor: {
|
| + m_dwValue = FWLTHEME_CAPACITY_TextColor;
|
| + return &m_dwValue;
|
| + }
|
| + case FWL_WGTCAPACITY_ScrollBarWidth: {
|
| + m_fValue = FWLTHEME_CAPACITY_ScrollBarWidth;
|
| + break;
|
| + }
|
| + case FWL_WGTCAPACITY_Font: {
|
| + return m_pFDEFont;
|
| + }
|
| + case FWL_WGTCAPACITY_TextSelColor: {
|
| + m_dwValue = (m_dwThemeID == 0) ? FWLTHEME_CAPACITY_TextSelColor
|
| + : FWLTHEME_COLOR_Green_BKSelected;
|
| + return &m_dwValue;
|
| + }
|
| + case FWL_WGTCAPACITY_LineHeight: {
|
| + m_fValue = FWLTHEME_CAPACITY_LineHeight;
|
| + break;
|
| + }
|
| + case FWL_WGTCAPACITY_UIMargin: {
|
| + m_rtMargin.Set(0, 0, 0, 0);
|
| + return &m_rtMargin;
|
| + }
|
| + default: { return NULL; }
|
| + }
|
| + return &m_fValue;
|
| +}
|
| +FX_BOOL CFWL_WidgetTP::IsCustomizedLayout(IFWL_Widget* pWidget) {
|
| + return FWL_GetThemeLayout(m_dwThemeID);
|
| +}
|
| +FWL_ERR CFWL_WidgetTP::GetPartRect(CFWL_ThemePart* pThemePart,
|
| + CFX_RectF& rect) {
|
| + return FWL_ERR_Succeeded;
|
| +}
|
| +FX_BOOL CFWL_WidgetTP::IsInPart(CFWL_ThemePart* pThemePart,
|
| + FX_FLOAT fx,
|
| + FX_FLOAT fy) {
|
| + return TRUE;
|
| +}
|
| +FX_BOOL CFWL_WidgetTP::CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) {
|
| + if (!pParams)
|
| + return FALSE;
|
| + if (!m_pTextOut)
|
| + return FALSE;
|
| + m_pTextOut->SetAlignment(pParams->m_iTTOAlign);
|
| + m_pTextOut->SetStyles(pParams->m_dwTTOStyles | FDE_TTOSTYLE_ArabicContext);
|
| + m_pTextOut->CalcLogicSize(pParams->m_wsText, pParams->m_wsText.GetLength(),
|
| + rect);
|
| + return TRUE;
|
| +}
|
| +FWL_ERR CFWL_WidgetTP::Initialize() {
|
| + m_dwThemeID = 0;
|
| + _ctm.SetIdentity();
|
| + return FWL_ERR_Succeeded;
|
| +}
|
| +FWL_ERR CFWL_WidgetTP::Finalize() {
|
| + if (!m_pTextOut) {
|
| + FinalizeTTO();
|
| + }
|
| + return FWL_ERR_Succeeded;
|
| +}
|
| +CFWL_WidgetTP::~CFWL_WidgetTP() {}
|
| +FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget* pWidget,
|
| + const FX_WCHAR* strFont,
|
| + FX_FLOAT fFontSize,
|
| + FX_ARGB rgbFont) {
|
| + if (!m_pTextOut) {
|
| + return FWL_ERR_Succeeded;
|
| + }
|
| + m_pFDEFont = FWL_GetFontManager()->FindFont(strFont, 0, 0);
|
| + m_pTextOut->SetFont(m_pFDEFont);
|
| + m_pTextOut->SetFontSize(fFontSize);
|
| + m_pTextOut->SetTextColor(rgbFont);
|
| + return FWL_ERR_Succeeded;
|
| +}
|
| +FWL_ERR CFWL_WidgetTP::SetFont(IFWL_Widget* pWidget,
|
| + IFX_Font* pFont,
|
| + FX_FLOAT fFontSize,
|
| + FX_ARGB rgbFont) {
|
| + if (!m_pTextOut) {
|
| + return FWL_ERR_Succeeded;
|
| + }
|
| + m_pTextOut->SetFont(pFont);
|
| + m_pTextOut->SetFontSize(fFontSize);
|
| + m_pTextOut->SetTextColor(rgbFont);
|
| + return FWL_ERR_Succeeded;
|
| +}
|
| +IFX_Font* CFWL_WidgetTP::GetFont(IFWL_Widget* pWidget) {
|
| + return m_pFDEFont;
|
| +}
|
| +CFWL_WidgetTP::CFWL_WidgetTP()
|
| + : m_dwRefCount(1), m_pTextOut(NULL), m_pFDEFont(NULL), m_dwThemeID(0) {}
|
| +FX_ERR CFWL_WidgetTP::InitTTO() {
|
| + if (m_pTextOut) {
|
| + return FWL_ERR_Succeeded;
|
| + }
|
| + m_pFDEFont = FWL_GetFontManager()->FindFont(FX_WSTRC(L"Helvetica"), 0, 0);
|
| + m_pTextOut = IFDE_TextOut::Create();
|
| + m_pTextOut->SetFont(m_pFDEFont);
|
| + m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
|
| + m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
|
| + m_pTextOut->SetEllipsisString(L"...");
|
| + return FWL_ERR_Succeeded;
|
| +}
|
| +FX_ERR CFWL_WidgetTP::FinalizeTTO() {
|
| + if (m_pTextOut) {
|
| + m_pTextOut->Release();
|
| + m_pTextOut = NULL;
|
| + }
|
| + return FWL_ERR_Succeeded;
|
| +}
|
| +#ifdef THEME_XPSimilar
|
| +void CFWL_WidgetTP::DrawEdge(CFX_Graphics* pGraphics,
|
| + FX_DWORD dwStyles,
|
| + const CFX_RectF* pRect,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!pRect)
|
| + return;
|
| + pGraphics->SaveGraphState();
|
| + CFX_Color crStroke(FWL_GetThemeColor(m_dwThemeID) == 0
|
| + ? ArgbEncode(255, 127, 157, 185)
|
| + : FWLTHEME_COLOR_Green_BKSelected);
|
| + pGraphics->SetStrokeColor(&crStroke);
|
| + CFX_Path path;
|
| + path.Create();
|
| + path.AddRectangle(pRect->left, pRect->top, pRect->width - 1,
|
| + pRect->height - 1);
|
| + pGraphics->StrokePath(&path, pMatrix);
|
| + path.Clear();
|
| + crStroke = ArgbEncode(255, 255, 255, 255);
|
| + pGraphics->SetStrokeColor(&crStroke);
|
| + path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 3,
|
| + pRect->height - 3);
|
| + pGraphics->StrokePath(&path, pMatrix);
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +#else
|
| +void CFWL_WidgetTP::DrawEdge(CFX_Graphics* pGraphics,
|
| + FX_DWORD dwStyles,
|
| + const CFX_RectF* pRect,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!pRect)
|
| + return;
|
| + FWLTHEME_EDGE eType;
|
| + FX_FLOAT fWidth;
|
| + switch (dwStyles & FWL_WGTSTYLE_EdgeMask) {
|
| + case FWL_WGTSTYLE_EdgeRaised: {
|
| + eType = FWLTHEME_EDGE_Raised, fWidth = FWLTHEME_CAPACITY_EdgeRaised;
|
| + break;
|
| + }
|
| + case FWL_WGTSTYLE_EdgeSunken: {
|
| + eType = FWLTHEME_EDGE_Sunken, fWidth = FWLTHEME_CAPACITY_EdgeSunken;
|
| + break;
|
| + }
|
| + case FWL_WGTSTYLE_EdgeFlat:
|
| + default: { return; }
|
| + }
|
| + Draw3DRect(pGraphics, eType, fWidth, pRect, FWLTHEME_COLOR_EDGELT1,
|
| + FWLTHEME_COLOR_EDGELT2, FWLTHEME_COLOR_EDGERB1,
|
| + FWLTHEME_COLOR_EDGERB2, pMatrix);
|
| +}
|
| +#endif
|
| +void CFWL_WidgetTP::Draw3DRect(CFX_Graphics* pGraphics,
|
| + FWLTHEME_EDGE eType,
|
| + FX_FLOAT fWidth,
|
| + const CFX_RectF* pRect,
|
| + FX_ARGB cr1,
|
| + FX_ARGB cr2,
|
| + FX_ARGB cr3,
|
| + FX_ARGB cr4,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!pRect)
|
| + return;
|
| + pGraphics->SaveGraphState();
|
| + if (eType == FWLTHEME_EDGE_Flat) {
|
| + CFX_Path path;
|
| + path.Create();
|
| + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| + path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
|
| + pRect->height - 2);
|
| + CFX_Color cr(ArgbEncode(255, 100, 100, 100));
|
| + pGraphics->SetFillColor(&cr);
|
| + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| + path.Clear();
|
| + path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
|
| + pRect->height - 2);
|
| + path.AddRectangle(pRect->left + 2, pRect->top + 2, pRect->width - 4,
|
| + pRect->height - 4);
|
| + cr.Set(0xFFFFFFFF);
|
| + pGraphics->SetFillColor(&cr);
|
| + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| + } else {
|
| + FX_FLOAT fLeft = pRect->left;
|
| + FX_FLOAT fRight = pRect->right();
|
| + FX_FLOAT fTop = pRect->top;
|
| + FX_FLOAT fBottom = pRect->bottom();
|
| + FX_FLOAT fHalfWidth = fWidth / 2.0f;
|
| + CFX_Color crLT(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1);
|
| + pGraphics->SetFillColor(&crLT);
|
| + CFX_Path pathLT;
|
| + pathLT.Create();
|
| + pathLT.MoveTo(fLeft, fBottom - fHalfWidth);
|
| + pathLT.LineTo(fLeft, fTop);
|
| + pathLT.LineTo(fRight - fHalfWidth, fTop);
|
| + pathLT.LineTo(fRight - fHalfWidth, fTop + fHalfWidth);
|
| + pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth);
|
| + pathLT.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth);
|
| + pathLT.LineTo(fLeft, fBottom - fHalfWidth);
|
| + pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
|
| + crLT = CFX_Color(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2);
|
| + pGraphics->SetFillColor(&crLT);
|
| + pathLT.Clear();
|
| + pathLT.MoveTo(fLeft + fHalfWidth, fBottom - fWidth);
|
| + pathLT.LineTo(fLeft + fHalfWidth, fTop + fHalfWidth);
|
| + pathLT.LineTo(fRight - fWidth, fTop + fHalfWidth);
|
| + pathLT.LineTo(fRight - fWidth, fTop + fWidth);
|
| + pathLT.LineTo(fLeft + fWidth, fTop + fWidth);
|
| + pathLT.LineTo(fLeft + fWidth, fBottom - fWidth);
|
| + pathLT.LineTo(fLeft + fHalfWidth, fBottom - fWidth);
|
| + pGraphics->FillPath(&pathLT, FXFILL_WINDING, pMatrix);
|
| + CFX_Color crRB(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3);
|
| + pGraphics->SetFillColor(&crRB);
|
| + CFX_Path pathRB;
|
| + pathRB.Create();
|
| + pathRB.MoveTo(fRight - fHalfWidth, fTop + fHalfWidth);
|
| + pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth);
|
| + pathRB.LineTo(fLeft + fHalfWidth, fBottom - fHalfWidth);
|
| + pathRB.LineTo(fLeft + fHalfWidth, fBottom - fWidth);
|
| + pathRB.LineTo(fRight - fWidth, fBottom - fWidth);
|
| + pathRB.LineTo(fRight - fWidth, fTop + fHalfWidth);
|
| + pathRB.LineTo(fRight - fHalfWidth, fTop + fHalfWidth);
|
| + pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
|
| + crRB = CFX_Color(eType == FWLTHEME_EDGE_Raised ? cr2 : cr4);
|
| + pGraphics->SetFillColor(&crRB);
|
| + pathRB.Clear();
|
| + pathRB.MoveTo(fRight, fTop);
|
| + pathRB.LineTo(fRight, fBottom);
|
| + pathRB.LineTo(fLeft, fBottom);
|
| + pathRB.LineTo(fLeft, fBottom - fHalfWidth);
|
| + pathRB.LineTo(fRight - fHalfWidth, fBottom - fHalfWidth);
|
| + pathRB.LineTo(fRight - fHalfWidth, fTop);
|
| + pathRB.LineTo(fRight, fTop);
|
| + pGraphics->FillPath(&pathRB, FXFILL_WINDING, pMatrix);
|
| + }
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +void CFWL_WidgetTP::Draw3DCircle(CFX_Graphics* pGraphics,
|
| + FWLTHEME_EDGE eType,
|
| + FX_FLOAT fWidth,
|
| + const CFX_RectF* pRect,
|
| + FX_ARGB cr1,
|
| + FX_ARGB cr2,
|
| + FX_ARGB cr3,
|
| + FX_ARGB cr4,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!pRect)
|
| + return;
|
| + pGraphics->SaveGraphState();
|
| + CFX_Path path;
|
| + path.Create();
|
| + path.AddArc(pRect->left, pRect->top, pRect->width, pRect->height,
|
| + FWLTHEME_PI * 3 / 4, FWLTHEME_PI);
|
| + CFX_Color crFill1(eType == FWLTHEME_EDGE_Raised ? cr4 : cr1);
|
| + pGraphics->SetStrokeColor(&crFill1);
|
| + pGraphics->StrokePath(&path, pMatrix);
|
| + CFX_RectF rtInner(*pRect);
|
| + rtInner.Deflate(pRect->width / 4, pRect->height / 4);
|
| + path.Clear();
|
| + path.AddArc(rtInner.left, rtInner.top, rtInner.width, rtInner.height,
|
| + FWLTHEME_PI * 3 / 4, FWLTHEME_PI);
|
| + CFX_Color crFill2(eType == FWLTHEME_EDGE_Raised ? cr3 : cr2);
|
| + pGraphics->SetStrokeColor(&crFill2);
|
| + pGraphics->StrokePath(&path, pMatrix);
|
| + path.Clear();
|
| + path.AddArc(pRect->left, pRect->top, pRect->width, pRect->height,
|
| + FWLTHEME_PI * 7 / 4, FWLTHEME_PI);
|
| + CFX_Color crFill3(eType == FWLTHEME_EDGE_Raised ? cr1 : cr3);
|
| + pGraphics->SetStrokeColor(&crFill3);
|
| + pGraphics->StrokePath(&path, pMatrix);
|
| + path.AddArc(rtInner.left, rtInner.top, rtInner.width, rtInner.height,
|
| + FWLTHEME_PI * 7 / 4, FWLTHEME_PI);
|
| + CFX_Color crFill4(eType == FWLTHEME_EDGE_Raised ? cr2 : cr4);
|
| + pGraphics->SetStrokeColor(&crFill4);
|
| + pGraphics->StrokePath(&path, pMatrix);
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +void CFWL_WidgetTP::DrawBorder(CFX_Graphics* pGraphics,
|
| + const CFX_RectF* pRect,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!pRect)
|
| + return;
|
| + CFX_Path path;
|
| + path.Create();
|
| + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| + path.AddRectangle(pRect->left + 1, pRect->top + 1, pRect->width - 2,
|
| + pRect->height - 2);
|
| + pGraphics->SaveGraphState();
|
| + CFX_Color crFill(ArgbEncode(255, 0, 0, 0));
|
| + pGraphics->SetFillColor(&crFill);
|
| + pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +void CFWL_WidgetTP::FillBackground(CFX_Graphics* pGraphics,
|
| + const CFX_RectF* pRect,
|
| + CFX_Matrix* pMatrix) {
|
| + FillSoildRect(pGraphics, FWLTHEME_COLOR_Background, pRect, pMatrix);
|
| +}
|
| +void CFWL_WidgetTP::FillSoildRect(CFX_Graphics* pGraphics,
|
| + FX_ARGB fillColor,
|
| + const CFX_RectF* pRect,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!pRect)
|
| + return;
|
| + pGraphics->SaveGraphState();
|
| + CFX_Color crFill(fillColor);
|
| + pGraphics->SetFillColor(&crFill);
|
| + CFX_Path path;
|
| + path.Create();
|
| + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +void CFWL_WidgetTP::DrawAxialShading(CFX_Graphics* pGraphics,
|
| + FX_FLOAT fx1,
|
| + FX_FLOAT fy1,
|
| + FX_FLOAT fx2,
|
| + FX_FLOAT fy2,
|
| + FX_ARGB beginColor,
|
| + FX_ARGB endColor,
|
| + CFX_Path* path,
|
| + int32_t fillMode,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!path)
|
| + return;
|
| + CFX_PointF begPoint, endPoint;
|
| + begPoint.Set(fx1, fy1);
|
| + endPoint.Set(fx2, fy2);
|
| + CFX_Shading shading;
|
| + shading.CreateAxial(begPoint, endPoint, FALSE, FALSE, beginColor, endColor);
|
| + pGraphics->SaveGraphState();
|
| + CFX_Color color1(&shading);
|
| + pGraphics->SetFillColor(&color1);
|
| + pGraphics->FillPath(path, fillMode, pMatrix);
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +void CFWL_WidgetTP::DrawAnnulusRect(CFX_Graphics* pGraphics,
|
| + FX_ARGB fillColor,
|
| + const CFX_RectF* pRect,
|
| + FX_FLOAT fRingWidth,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!pRect)
|
| + return;
|
| + pGraphics->SaveGraphState();
|
| + CFX_Color cr(fillColor);
|
| + pGraphics->SetFillColor(&cr);
|
| + CFX_Path path;
|
| + path.Create();
|
| + CFX_RectF rtInner(*pRect);
|
| + rtInner.Deflate(fRingWidth, fRingWidth);
|
| + path.AddRectangle(rtInner.left, rtInner.top, rtInner.width, rtInner.height);
|
| + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| + pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +void CFWL_WidgetTP::DrawAnnulusCircle(CFX_Graphics* pGraphics,
|
| + FX_ARGB fillColor,
|
| + const CFX_RectF* pRect,
|
| + FX_FLOAT fWidth,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!pRect)
|
| + return;
|
| + if (fWidth > pRect->width / 2) {
|
| + return;
|
| + }
|
| + pGraphics->SaveGraphState();
|
| + CFX_Color cr(fillColor);
|
| + pGraphics->SetFillColor(&cr);
|
| + CFX_Path path;
|
| + path.Create();
|
| + path.AddEllipse(*pRect);
|
| + CFX_RectF rtIn(*pRect);
|
| + rtIn.Inflate(-fWidth, -fWidth);
|
| + path.AddEllipse(rtIn);
|
| + pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +void CFWL_WidgetTP::DrawFocus(CFX_Graphics* pGraphics,
|
| + const CFX_RectF* pRect,
|
| + CFX_Matrix* pMatrix) {
|
| + if (!pGraphics)
|
| + return;
|
| + if (!pRect)
|
| + return;
|
| + pGraphics->SaveGraphState();
|
| + CFX_Color cr(0xFF000000);
|
| + pGraphics->SetStrokeColor(&cr);
|
| + FX_FLOAT DashPattern[2] = {1, 1};
|
| + pGraphics->SetLineDash(0.0f, DashPattern, 2);
|
| + CFX_Path path;
|
| + path.Create();
|
| + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| + pGraphics->StrokePath(&path, pMatrix);
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +#define FWLTHEME_ARROW_Denominator 3
|
| +void CFWL_WidgetTP::DrawArrow(CFX_Graphics* pGraphics,
|
| + const CFX_RectF* pRect,
|
| + FWLTHEME_DIRECTION eDict,
|
| + FX_ARGB argbFill,
|
| + FX_BOOL bPressed,
|
| + CFX_Matrix* pMatrix) {
|
| + CFX_RectF rtArrow(*pRect);
|
| + CFX_Path path;
|
| + path.Create();
|
| + FX_FLOAT fBtn =
|
| + std::min(pRect->width, pRect->height) / FWLTHEME_ARROW_Denominator;
|
| + rtArrow.left = pRect->left + (pRect->width - fBtn) / 2;
|
| + rtArrow.top = pRect->top + (pRect->height - fBtn) / 2;
|
| + rtArrow.width = fBtn;
|
| + rtArrow.height = fBtn;
|
| + if (bPressed) {
|
| + rtArrow.Offset(1, 1);
|
| + }
|
| + switch (eDict) {
|
| + case FWLTHEME_DIRECTION_Up: {
|
| + path.MoveTo(rtArrow.left, rtArrow.bottom());
|
| + path.LineTo(rtArrow.right(), rtArrow.bottom());
|
| + path.LineTo(rtArrow.left + fBtn / 2, rtArrow.top);
|
| + path.LineTo(rtArrow.left, rtArrow.bottom());
|
| + break;
|
| + }
|
| + case FWLTHEME_DIRECTION_Left: {
|
| + path.MoveTo(rtArrow.right(), rtArrow.top);
|
| + path.LineTo(rtArrow.right(), rtArrow.bottom());
|
| + path.LineTo(rtArrow.left, rtArrow.top + fBtn / 2);
|
| + path.LineTo(rtArrow.right(), rtArrow.top);
|
| + break;
|
| + }
|
| + case FWLTHEME_DIRECTION_Right: {
|
| + path.MoveTo(rtArrow.left, rtArrow.top);
|
| + path.LineTo(rtArrow.left, rtArrow.bottom());
|
| + path.LineTo(rtArrow.right(), rtArrow.top + fBtn / 2);
|
| + path.LineTo(rtArrow.left, rtArrow.top);
|
| + break;
|
| + }
|
| + case FWLTHEME_DIRECTION_Down:
|
| + default: {
|
| + path.MoveTo(rtArrow.left, rtArrow.top);
|
| + path.LineTo(rtArrow.right(), rtArrow.top);
|
| + path.LineTo(rtArrow.left + fBtn / 2, rtArrow.bottom());
|
| + path.LineTo(rtArrow.left, rtArrow.top);
|
| + }
|
| + }
|
| + pGraphics->SaveGraphState();
|
| + CFX_Color cr(argbFill);
|
| + pGraphics->SetFillColor(&cr);
|
| + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| + pGraphics->RestoreGraphState();
|
| +}
|
| +void CFWL_WidgetTP::DrawArrow(CFX_Graphics* pGraphics,
|
| + const CFX_RectF* pRect,
|
| + FWLTHEME_DIRECTION eDict,
|
| + FX_ARGB argSign,
|
| + CFX_Matrix* pMatrix) {
|
| + FX_BOOL bVert =
|
| + (eDict == FWLTHEME_DIRECTION_Up || eDict == FWLTHEME_DIRECTION_Down);
|
| + FX_FLOAT fLeft =
|
| + (FX_FLOAT)(((pRect->width - (bVert ? 9 : 6)) / 2 + pRect->left) + 0.5);
|
| + FX_FLOAT fTop =
|
| + (FX_FLOAT)(((pRect->height - (bVert ? 6 : 9)) / 2 + pRect->top) + 0.5);
|
| + CFX_Path path;
|
| + path.Create();
|
| + switch (eDict) {
|
| + case FWLTHEME_DIRECTION_Down: {
|
| + path.MoveTo(fLeft, fTop + 1);
|
| + path.LineTo(fLeft + 4, fTop + 5);
|
| + path.LineTo(fLeft + 8, fTop + 1);
|
| + path.LineTo(fLeft + 7, fTop);
|
| + path.LineTo(fLeft + 4, fTop + 3);
|
| + path.LineTo(fLeft + 1, fTop);
|
| + break;
|
| + }
|
| + case FWLTHEME_DIRECTION_Up: {
|
| + path.MoveTo(fLeft, fTop + 4);
|
| + path.LineTo(fLeft + 4, fTop);
|
| + path.LineTo(fLeft + 8, fTop + 4);
|
| + path.LineTo(fLeft + 7, fTop + 5);
|
| + path.LineTo(fLeft + 4, fTop + 2);
|
| + path.LineTo(fLeft + 1, fTop + 5);
|
| + break;
|
| + }
|
| + case FWLTHEME_DIRECTION_Right: {
|
| + path.MoveTo(fLeft + 1, fTop);
|
| + path.LineTo(fLeft + 5, fTop + 4);
|
| + path.LineTo(fLeft + 1, fTop + 8);
|
| + path.LineTo(fLeft, fTop + 7);
|
| + path.LineTo(fLeft + 3, fTop + 4);
|
| + path.LineTo(fLeft, fTop + 1);
|
| + break;
|
| + }
|
| + case FWLTHEME_DIRECTION_Left: {
|
| + path.MoveTo(fLeft, fTop + 4);
|
| + path.LineTo(fLeft + 4, fTop);
|
| + path.LineTo(fLeft + 5, fTop + 1);
|
| + path.LineTo(fLeft + 2, fTop + 4);
|
| + path.LineTo(fLeft + 5, fTop + 7);
|
| + path.LineTo(fLeft + 4, fTop + 8);
|
| + break;
|
| + }
|
| + }
|
| + CFX_Color cr(argSign);
|
| + pGraphics->SetFillColor(&cr);
|
| + pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
|
| +}
|
| +void CFWL_WidgetTP::DrawBtn(CFX_Graphics* pGraphics,
|
| + const CFX_RectF* pRect,
|
| + FWLTHEME_STATE eState,
|
| + CFX_Matrix* pMatrix) {
|
| + CFX_Path path;
|
| + path.Create();
|
| + if (!CFWL_ArrowData::IsInstance()) {
|
| + CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID));
|
| + }
|
| + CFWL_ArrowData::CColorData* pColorData =
|
| + CFWL_ArrowData::GetInstance()->m_pColorData;
|
| + FX_FLOAT fRight = pRect->right();
|
| + FX_FLOAT fBottom = pRect->bottom();
|
| + path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height);
|
| + DrawAxialShading(pGraphics, pRect->left, pRect->top, fRight, fBottom,
|
| + pColorData->clrStart[eState - 1],
|
| + pColorData->clrEnd[eState - 1], &path, FXFILL_WINDING,
|
| + pMatrix);
|
| + CFX_Color rcStroke;
|
| + rcStroke.Set(pColorData->clrBorder[eState - 1]);
|
| + pGraphics->SetStrokeColor(&rcStroke);
|
| + pGraphics->StrokePath(&path, pMatrix);
|
| +}
|
| +void CFWL_WidgetTP::DrawArrowBtn(CFX_Graphics* pGraphics,
|
| + const CFX_RectF* pRect,
|
| + FWLTHEME_DIRECTION eDict,
|
| + FWLTHEME_STATE eState,
|
| + CFX_Matrix* pMatrix) {
|
| + DrawBtn(pGraphics, pRect, eState, pMatrix);
|
| + if (!CFWL_ArrowData::IsInstance()) {
|
| + CFWL_ArrowData::GetInstance()->SetColorData(FWL_GetThemeColor(m_dwThemeID));
|
| + }
|
| + CFWL_ArrowData::CColorData* pColorData =
|
| + CFWL_ArrowData::GetInstance()->m_pColorData;
|
| + DrawArrow(pGraphics, pRect, eDict, pColorData->clrSign[eState - 1], pMatrix);
|
| +}
|
| +FWLCOLOR CFWL_WidgetTP::BlendColor(FWLCOLOR srcColor,
|
| + FWLCOLOR renderColor,
|
| + uint8_t scale) {
|
| + FWLCOLOR dstColor;
|
| + uint8_t n = 255 - scale;
|
| + dstColor.a = (uint8_t)(
|
| + ((FX_WORD)srcColor.a * n + (FX_WORD)renderColor.a * scale) >> 8);
|
| + dstColor.r = (uint8_t)(
|
| + ((FX_WORD)srcColor.r * n + (FX_WORD)renderColor.r * scale) >> 8);
|
| + dstColor.g = (uint8_t)(
|
| + ((FX_WORD)srcColor.g * n + (FX_WORD)renderColor.g * scale) >> 8);
|
| + dstColor.b = (uint8_t)(
|
| + ((FX_WORD)srcColor.b * n + (FX_WORD)renderColor.b * scale) >> 8);
|
| + return dstColor;
|
| +}
|
| +CFWL_ArrowData::CFWL_ArrowData() : m_pColorData(NULL) {
|
| + SetColorData(0);
|
| +}
|
| +CFWL_FontManager* FWL_GetFontManager() {
|
| + static CFWL_FontManager* _fontManager = NULL;
|
| + if (_fontManager == NULL) {
|
| + _fontManager = new CFWL_FontManager;
|
| + }
|
| + return _fontManager;
|
| +}
|
| +void FWL_ReleaseFontManager() {
|
| + CFWL_FontManager* fontManager = FWL_GetFontManager();
|
| + delete fontManager;
|
| +}
|
| +CFWL_FontData::CFWL_FontData()
|
| + : m_dwStyles(0),
|
| + m_dwCodePage(0),
|
| + m_pFont(0),
|
| + m_pFontMgr(NULL)
|
| +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
|
| + ,
|
| + m_pFontSource(NULL)
|
| +#endif
|
| +{
|
| +}
|
| +CFWL_FontData::~CFWL_FontData() {
|
| + if (m_pFont) {
|
| + m_pFont->Release();
|
| + }
|
| + if (m_pFontMgr) {
|
| + m_pFontMgr->Release();
|
| + }
|
| +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
|
| + if (m_pFontSource != NULL) {
|
| + m_pFontSource->Release();
|
| + }
|
| +#endif
|
| +}
|
| +FX_BOOL CFWL_FontData::Equal(const CFX_WideStringC& wsFontFamily,
|
| + FX_DWORD dwFontStyles,
|
| + FX_WORD wCodePage) {
|
| + return m_wsFamily == wsFontFamily && m_dwStyles == dwFontStyles &&
|
| + m_dwCodePage == wCodePage;
|
| +}
|
| +FX_BOOL CFWL_FontData::LoadFont(const CFX_WideStringC& wsFontFamily,
|
| + FX_DWORD dwFontStyles,
|
| + FX_WORD dwCodePage) {
|
| + m_wsFamily = wsFontFamily;
|
| + m_dwStyles = dwFontStyles;
|
| + m_dwCodePage = dwCodePage;
|
| + if (!m_pFontMgr) {
|
| +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
|
| + m_pFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator());
|
| +#else
|
| + m_pFontSource = FX_CreateDefaultFontSourceEnum();
|
| + m_pFontMgr = IFX_FontMgr::Create(m_pFontSource);
|
| +#endif
|
| + }
|
| + m_pFont = IFX_Font::LoadFont(wsFontFamily.GetPtr(), dwFontStyles, dwCodePage,
|
| + m_pFontMgr);
|
| + return m_pFont != NULL;
|
| +}
|
| +CFWL_FontManager::CFWL_FontManager() {}
|
| +CFWL_FontManager::~CFWL_FontManager() {
|
| + for (int32_t i = 0; i < m_arrFonts.GetSize(); i++) {
|
| + delete static_cast<CFWL_FontData*>(m_arrFonts[i]);
|
| + }
|
| + m_arrFonts.RemoveAll();
|
| +}
|
| +IFX_Font* CFWL_FontManager::FindFont(const CFX_WideStringC& wsFontFamily,
|
| + FX_DWORD dwFontStyles,
|
| + FX_WORD wCodePage) {
|
| + for (int32_t i = 0; i < m_arrFonts.GetSize(); i++) {
|
| + CFWL_FontData* data = static_cast<CFWL_FontData*>(m_arrFonts[i]);
|
| + if (data->Equal(wsFontFamily, dwFontStyles, wCodePage)) {
|
| + return data->GetFont();
|
| + }
|
| + }
|
| + CFWL_FontData* fontData = new CFWL_FontData;
|
| + if (!fontData->LoadFont(wsFontFamily, dwFontStyles, wCodePage)) {
|
| + delete fontData;
|
| + return NULL;
|
| + }
|
| + m_arrFonts.Add(fontData);
|
| + return fontData->GetFont();
|
| +}
|
| +FX_BOOL FWLTHEME_Init() {
|
| + return TRUE;
|
| +}
|
| +void FWLTHEME_Release() {
|
| + CFWL_ArrowData::DestroyInstance();
|
| + FWL_ReleaseFontManager();
|
| +}
|
| +FX_DWORD FWL_GetThemeLayout(FX_DWORD dwThemeID) {
|
| + return 0xffff0000 & dwThemeID;
|
| +}
|
| +FX_DWORD FWL_GetThemeColor(FX_DWORD dwThemeID) {
|
| + return 0x0000ffff & dwThemeID;
|
| +}
|
| +FX_DWORD FWL_MakeThemeID(FX_DWORD dwLayout, FX_DWORD dwColor) {
|
| + return (dwLayout << 16) | (0x0000FFFF & dwColor);
|
| +}
|
| +CFWL_ArrowData* CFWL_ArrowData::m_pInstance = NULL;
|
| +CFWL_ArrowData* CFWL_ArrowData::GetInstance() {
|
| + if (!m_pInstance) {
|
| + m_pInstance = new CFWL_ArrowData;
|
| + }
|
| + return m_pInstance;
|
| +}
|
| +FX_BOOL CFWL_ArrowData::IsInstance() {
|
| + return (m_pInstance != NULL);
|
| +}
|
| +void CFWL_ArrowData::DestroyInstance() {
|
| + if (m_pInstance) {
|
| + delete m_pInstance;
|
| + m_pInstance = NULL;
|
| + }
|
| +}
|
| +CFWL_ArrowData::~CFWL_ArrowData() {
|
| + if (m_pColorData) {
|
| + delete m_pColorData;
|
| + m_pColorData = NULL;
|
| + }
|
| +}
|
| +void CFWL_ArrowData::SetColorData(FX_DWORD dwID) {
|
| + if (!m_pColorData) {
|
| + m_pColorData = new CColorData;
|
| + }
|
| + if (dwID) {
|
| + m_pColorData->clrBorder[0] = ArgbEncode(255, 142, 153, 125);
|
| + m_pColorData->clrBorder[1] = ArgbEncode(255, 157, 171, 119);
|
| + m_pColorData->clrBorder[2] = ArgbEncode(255, 118, 131, 97);
|
| + m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153);
|
| + m_pColorData->clrStart[0] = ArgbEncode(255, 203, 215, 186);
|
| + m_pColorData->clrStart[1] = ArgbEncode(255, 218, 232, 185);
|
| + m_pColorData->clrStart[2] = ArgbEncode(255, 203, 215, 186);
|
| + m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251);
|
| + m_pColorData->clrEnd[0] = ArgbEncode(255, 149, 167, 117);
|
| + m_pColorData->clrEnd[1] = ArgbEncode(255, 198, 211, 155);
|
| + m_pColorData->clrEnd[2] = ArgbEncode(255, 149, 167, 117);
|
| + m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236);
|
| + m_pColorData->clrSign[0] = ArgbEncode(255, 255, 255, 255);
|
| + m_pColorData->clrSign[1] = ArgbEncode(255, 255, 255, 255);
|
| + m_pColorData->clrSign[2] = ArgbEncode(255, 255, 255, 255);
|
| + m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128);
|
| + } else {
|
| + m_pColorData->clrBorder[0] = ArgbEncode(255, 202, 216, 249);
|
| + m_pColorData->clrBorder[1] = ArgbEncode(255, 171, 190, 233);
|
| + m_pColorData->clrBorder[2] = ArgbEncode(255, 135, 147, 219);
|
| + m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153);
|
| + m_pColorData->clrStart[0] = ArgbEncode(255, 225, 234, 254);
|
| + m_pColorData->clrStart[1] = ArgbEncode(255, 253, 255, 255);
|
| + m_pColorData->clrStart[2] = ArgbEncode(255, 110, 142, 241);
|
| + m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251);
|
| + m_pColorData->clrEnd[0] = ArgbEncode(255, 175, 204, 251);
|
| + m_pColorData->clrEnd[1] = ArgbEncode(255, 185, 218, 251);
|
| + m_pColorData->clrEnd[2] = ArgbEncode(255, 210, 222, 235);
|
| + m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236);
|
| + m_pColorData->clrSign[0] = ArgbEncode(255, 77, 97, 133);
|
| + m_pColorData->clrSign[1] = ArgbEncode(255, 77, 97, 133);
|
| + m_pColorData->clrSign[2] = ArgbEncode(255, 77, 97, 133);
|
| + m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128);
|
| + }
|
| +}
|
|
|