Index: xfa/fde/fde_gedevice.cpp |
diff --git a/xfa/fde/fde_gedevice.cpp b/xfa/fde/fde_gedevice.cpp |
index 1338dc4a8e0607ccd0980e149db3a4cc4840a778..28bf889e1facb78c1a6d08dd1ef8bb3d3f7cb1fc 100644 |
--- a/xfa/fde/fde_gedevice.cpp |
+++ b/xfa/fde/fde_gedevice.cpp |
@@ -9,22 +9,11 @@ |
#include <algorithm> |
#include "xfa/fde/fde_brush.h" |
-#include "xfa/fde/fde_devbasic.h" |
#include "xfa/fde/fde_geobject.h" |
#include "xfa/fde/fde_image.h" |
+#include "xfa/fde/fde_object.h" |
#include "xfa/fde/fde_pen.h" |
-FX_BOOL FDE_GetStockHatchMask(int32_t iHatchStyle, CFX_DIBitmap& hatchMask) { |
- FDE_LPCHATCHDATA pData = FDE_DEVGetHatchData(iHatchStyle); |
- if (!pData) { |
- return FALSE; |
- } |
- hatchMask.Create(pData->iWidth, pData->iHeight, FXDIB_1bppMask); |
- FXSYS_memcpy(hatchMask.GetBuffer(), pData->MaskBits, |
- hatchMask.GetPitch() * pData->iHeight); |
- return TRUE; |
-} |
- |
IFDE_RenderDevice* IFDE_RenderDevice::Create(CFX_DIBitmap* pBitmap, |
FX_BOOL bRgbByteOrder) { |
if (pBitmap == NULL) { |
@@ -378,196 +367,26 @@ FX_BOOL CFDE_FxgeDevice::CreatePen(IFDE_Pen* pPen, |
} |
return TRUE; |
} |
-typedef FX_BOOL (CFDE_FxgeDevice::*pfFillPath)(IFDE_Brush* pBrush, |
- const CFX_PathData* pPath, |
- const CFX_Matrix* pMatrix); |
-static const pfFillPath gs_FillPath[] = { |
- &CFDE_FxgeDevice::FillSolidPath, &CFDE_FxgeDevice::FillHatchPath, |
- &CFDE_FxgeDevice::FillTexturePath, &CFDE_FxgeDevice::FillLinearGradientPath, |
-}; |
+ |
FX_BOOL CFDE_FxgeDevice::FillPath(IFDE_Brush* pBrush, |
const IFDE_Path* pPath, |
const CFX_Matrix* pMatrix) { |
CFDE_Path* pGePath = (CFDE_Path*)pPath; |
- if (pGePath == NULL) { |
+ if (!pGePath) |
return FALSE; |
- } |
- if (pBrush == NULL) { |
- return FALSE; |
- } |
- int32_t iType = pBrush->GetType(); |
- if (iType < 0 || iType > FDE_BRUSHTYPE_MAX) { |
+ |
+ if (!pBrush) |
return FALSE; |
- } |
- return (this->*gs_FillPath[iType])(pBrush, &pGePath->m_Path, pMatrix); |
+ |
+ return FillSolidPath(pBrush, &pGePath->m_Path, pMatrix); |
} |
+ |
FX_BOOL CFDE_FxgeDevice::FillSolidPath(IFDE_Brush* pBrush, |
const CFX_PathData* pPath, |
const CFX_Matrix* pMatrix) { |
FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Solid); |
- IFDE_SolidBrush* pSolidBrush = (IFDE_SolidBrush*)pBrush; |
+ |
+ IFDE_SolidBrush* pSolidBrush = static_cast<IFDE_SolidBrush*>(pBrush); |
return m_pDevice->DrawPath(pPath, (const CFX_Matrix*)pMatrix, NULL, |
pSolidBrush->GetColor(), 0, FXFILL_WINDING); |
} |
-FX_BOOL CFDE_FxgeDevice::FillHatchPath(IFDE_Brush* pBrush, |
- const CFX_PathData* pPath, |
- const CFX_Matrix* pMatrix) { |
- FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Hatch); |
- IFDE_HatchBrush* pHatchBrush = (IFDE_HatchBrush*)pBrush; |
- int32_t iStyle = pHatchBrush->GetHatchStyle(); |
- if (iStyle < FDE_HATCHSTYLE_Min || iStyle > FDE_HATCHSTYLE_Max) { |
- return FALSE; |
- } |
- CFX_DIBitmap mask; |
- if (!FDE_GetStockHatchMask(iStyle, mask)) { |
- return FALSE; |
- } |
- FX_ARGB dwForeColor = pHatchBrush->GetColor(TRUE); |
- FX_ARGB dwBackColor = pHatchBrush->GetColor(FALSE); |
- CFX_FloatRect rectf = pPath->GetBoundingBox(); |
- if (pMatrix) { |
- rectf.Transform((const CFX_Matrix*)pMatrix); |
- } |
- FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top), |
- FXSYS_round(rectf.right), FXSYS_round(rectf.bottom)); |
- m_pDevice->SaveState(); |
- m_pDevice->StartRendering(); |
- m_pDevice->SetClip_PathFill(pPath, (const CFX_Matrix*)pMatrix, |
- FXFILL_WINDING); |
- m_pDevice->FillRect(&rect, dwBackColor); |
- for (int32_t j = rect.bottom; j < rect.top; j += mask.GetHeight()) |
- for (int32_t i = rect.left; i < rect.right; i += mask.GetWidth()) { |
- m_pDevice->SetBitMask(&mask, i, j, dwForeColor); |
- } |
- m_pDevice->EndRendering(); |
- m_pDevice->RestoreState(); |
- return TRUE; |
-} |
-FX_BOOL CFDE_FxgeDevice::FillTexturePath(IFDE_Brush* pBrush, |
- const CFX_PathData* pPath, |
- const CFX_Matrix* pMatrix) { |
- FXSYS_assert(pPath && pBrush && pBrush->GetType() == FDE_BRUSHTYPE_Texture); |
- IFDE_TextureBrush* pTextureBrush = static_cast<IFDE_TextureBrush*>(pBrush); |
- IFDE_Image* pImage = pTextureBrush->GetImage(); |
- if (!pImage) |
- return FALSE; |
- |
- CFX_Size size(pImage->GetImageWidth(), pImage->GetImageHeight()); |
- CFX_DIBitmap bmp; |
- bmp.Create(size.x, size.y, FXDIB_Argb); |
- if (!pImage->StartLoadImage(&bmp, 0, 0, size.x, size.y, 0, 0, size.x, |
- size.y)) { |
- return FALSE; |
- } |
- if (pImage->DoLoadImage() < 100) { |
- return FALSE; |
- } |
- pImage->StopLoadImage(); |
- return WrapTexture(pTextureBrush->GetWrapMode(), &bmp, pPath, pMatrix); |
-} |
-FX_BOOL CFDE_FxgeDevice::WrapTexture(int32_t iWrapMode, |
- const CFX_DIBitmap* pBitmap, |
- const CFX_PathData* pPath, |
- const CFX_Matrix* pMatrix) { |
- CFX_FloatRect rectf = pPath->GetBoundingBox(); |
- if (pMatrix) { |
- rectf.Transform((const CFX_Matrix*)pMatrix); |
- } |
- FX_RECT rect(FXSYS_round(rectf.left), FXSYS_round(rectf.top), |
- FXSYS_round(rectf.right), FXSYS_round(rectf.bottom)); |
- rect.Normalize(); |
- if (rect.IsEmpty()) { |
- return FALSE; |
- } |
- m_pDevice->SaveState(); |
- m_pDevice->StartRendering(); |
- m_pDevice->SetClip_PathFill(pPath, (const CFX_Matrix*)pMatrix, |
- FXFILL_WINDING); |
- switch (iWrapMode) { |
- case FDE_WRAPMODE_Tile: |
- case FDE_WRAPMODE_TileFlipX: |
- case FDE_WRAPMODE_TileFlipY: |
- case FDE_WRAPMODE_TileFlipXY: { |
- FX_BOOL bFlipX = iWrapMode == FDE_WRAPMODE_TileFlipXY || |
- iWrapMode == FDE_WRAPMODE_TileFlipX; |
- FX_BOOL bFlipY = iWrapMode == FDE_WRAPMODE_TileFlipXY || |
- iWrapMode == FDE_WRAPMODE_TileFlipY; |
- const CFX_DIBitmap* pFlip[2][2]; |
- pFlip[0][0] = pBitmap; |
- pFlip[0][1] = bFlipX ? pBitmap->FlipImage(TRUE, FALSE) : pBitmap; |
- pFlip[1][0] = bFlipY ? pBitmap->FlipImage(FALSE, TRUE) : pBitmap; |
- pFlip[1][1] = |
- (bFlipX || bFlipY) ? pBitmap->FlipImage(bFlipX, bFlipY) : pBitmap; |
- int32_t iCounterY = 0; |
- for (int32_t j = rect.top; j < rect.bottom; j += pBitmap->GetHeight()) { |
- int32_t indexY = iCounterY++ % 2; |
- int32_t iCounterX = 0; |
- for (int32_t i = rect.left; i < rect.right; i += pBitmap->GetWidth()) { |
- int32_t indexX = iCounterX++ % 2; |
- m_pDevice->SetDIBits(pFlip[indexY][indexX], i, j); |
- } |
- } |
- if (pFlip[0][1] != pFlip[0][0]) { |
- delete pFlip[0][1]; |
- } |
- if (pFlip[1][0] != pFlip[0][0]) { |
- delete pFlip[1][0]; |
- } |
- if (pFlip[1][1] != pFlip[0][0]) { |
- delete pFlip[1][1]; |
- } |
- } break; |
- case FDE_WRAPMODE_Clamp: { |
- m_pDevice->SetDIBits(pBitmap, rect.left, rect.bottom); |
- } break; |
- } |
- m_pDevice->EndRendering(); |
- m_pDevice->RestoreState(); |
- return TRUE; |
-} |
-FX_BOOL CFDE_FxgeDevice::FillLinearGradientPath(IFDE_Brush* pBrush, |
- const CFX_PathData* pPath, |
- const CFX_Matrix* pMatrix) { |
- FXSYS_assert(pPath && pBrush && |
- pBrush->GetType() == FDE_BRUSHTYPE_LinearGradient); |
- IFDE_LinearGradientBrush* pLinearBrush = (IFDE_LinearGradientBrush*)pBrush; |
- CFX_PointF pt0, pt1; |
- pLinearBrush->GetLinearPoints(pt0, pt1); |
- CFX_VectorF fDiagonal(pt0, pt1); |
- FX_FLOAT fTheta = FXSYS_atan2(fDiagonal.y, fDiagonal.x); |
- FX_FLOAT fLength = fDiagonal.Length(); |
- FX_FLOAT fTotalX = fLength / FXSYS_cos(fTheta); |
- FX_FLOAT fTotalY = fLength / FXSYS_cos(FX_PI / 2 - fTheta); |
- FX_FLOAT fSteps = std::max(fTotalX, fTotalY); |
- FX_FLOAT dx = fTotalX / fSteps; |
- FX_FLOAT dy = fTotalY / fSteps; |
- FX_ARGB cr0, cr1; |
- pLinearBrush->GetLinearColors(cr0, cr1); |
- FX_FLOAT a0 = FXARGB_A(cr0); |
- FX_FLOAT r0 = FXARGB_R(cr0); |
- FX_FLOAT g0 = FXARGB_G(cr0); |
- FX_FLOAT b0 = FXARGB_B(cr0); |
- FX_FLOAT da = (FXARGB_A(cr1) - a0) / fSteps; |
- FX_FLOAT dr = (FXARGB_R(cr1) - r0) / fSteps; |
- FX_FLOAT dg = (FXARGB_G(cr1) - g0) / fSteps; |
- FX_FLOAT db = (FXARGB_B(cr1) - b0) / fSteps; |
- CFX_DIBitmap bmp; |
- bmp.Create(FXSYS_round(FXSYS_fabs(fDiagonal.x)), |
- FXSYS_round(FXSYS_fabs(fDiagonal.y)), FXDIB_Argb); |
- CFX_FxgeDevice dev; |
- dev.Attach(&bmp); |
- pt1 = pt0; |
- int32_t iSteps = FXSYS_round(FXSYS_ceil(fSteps)); |
- while (--iSteps >= 0) { |
- cr0 = ArgbEncode(FXSYS_round(a0), FXSYS_round(r0), FXSYS_round(g0), |
- FXSYS_round(b0)); |
- dev.DrawCosmeticLine(pt0.x, pt0.y, pt1.x, pt1.y, cr0); |
- pt1.x += dx; |
- pt0.y += dy; |
- a0 += da; |
- r0 += dr; |
- g0 += dg; |
- b0 += db; |
- } |
- return WrapTexture(pLinearBrush->GetWrapMode(), &bmp, pPath, pMatrix); |
-} |