FX_BOOL CPDF_CalGray::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { CPDF_Dictionary* pDict = pArray->GetDict(1); CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint")); int i; for (i = 0; i < 3; i++) { m_WhitePoint[i] = pParam ? pParam->GetNumber(i) : 0; } pParam = pDict->GetArray(FX_BSTRC("BlackPoint")); for (i = 0; i < 3; i++) { m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0; } m_Gamma = pDict->GetNumber(FX_BSTRC("Gamma")); if (m_Gamma == 0) { m_Gamma = 1.0f; } return TRUE; }
FX_BOOL CPDF_TilingPattern::Load() { if (m_pForm != NULL) { return TRUE; } CPDF_Dictionary* pDict = m_pPatternObj->GetDict(); if (pDict == NULL) { return FALSE; } m_bColored = pDict->GetInteger(FX_BSTRC("PaintType")) == 1; m_XStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("XStep"))); m_YStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("YStep"))); if (m_pPatternObj->GetType() != PDFOBJ_STREAM) { return FALSE; } CPDF_Stream* pStream = (CPDF_Stream*)m_pPatternObj; m_pForm = FX_NEW CPDF_Form(m_pDocument, NULL, pStream); m_pForm->ParseContent(NULL, &m_ParentMatrix, NULL, NULL); m_BBox = pDict->GetRect(FX_BSTRC("BBox")); return TRUE; }
void CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device, const CPDF_RenderOptions* pOptions) { if (GetSubType() == "Popup") { return; } FX_DWORD annot_flags = GetFlags(); if (annot_flags & ANNOTFLAG_HIDDEN) { return; } FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { return; } if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { return; } CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS"); char style_char; FX_FLOAT width; CPDF_Array* pDashArray = NULL; if (pBS == NULL) { CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border"); style_char = 'S'; if (pBorderArray) { width = pBorderArray->GetNumber(2); if (pBorderArray->GetCount() == 4) { pDashArray = pBorderArray->GetArray(3); if (pDashArray == NULL) { return; } int nLen = pDashArray->GetCount(); int i = 0; for (; i < nLen; ++i) { CPDF_Object*pObj = pDashArray->GetElementValue(i); if (pObj && pObj->GetInteger()) { break; } } if (i == nLen) { return; } style_char = 'D'; } } else { width = 1; } } else { CFX_ByteString style = pBS->GetString("S"); pDashArray = pBS->GetArray("D"); style_char = style[1]; width = pBS->GetNumber("W"); } if (width <= 0) { return; } CPDF_Array* pColor = m_pAnnotDict->GetArray("C"); FX_DWORD argb = 0xff000000; if (pColor != NULL) { int R = (FX_INT32)(pColor->GetNumber(0) * 255); int G = (FX_INT32)(pColor->GetNumber(1) * 255); int B = (FX_INT32)(pColor->GetNumber(2) * 255); argb = ArgbEncode(0xff, R, G, B); } CPDF_GraphStateData graph_state; graph_state.m_LineWidth = width; if (style_char == 'D') { if (pDashArray) { FX_DWORD dash_count = pDashArray->GetCount(); if (dash_count % 2) { dash_count ++; } graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count); if (graph_state.m_DashArray == NULL) { return ; } graph_state.m_DashCount = dash_count; FX_DWORD i; for (i = 0; i < pDashArray->GetCount(); i ++) { graph_state.m_DashArray[i] = pDashArray->GetNumber(i); } if (i < dash_count) { graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1]; } } else { graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2); if (graph_state.m_DashArray == NULL) { return ; } graph_state.m_DashCount = 2; graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f; } } CFX_FloatRect rect; GetRect(rect); CPDF_PathData path; width /= 2; path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width); int fill_type = 0; if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) { fill_type |= FXFILL_NOPATHSMOOTH; } pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type); }
CPDF_PageObject* CPDF_Annot::GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions) { if (GetSubType() == "Popup") { return NULL; } FX_DWORD annot_flags = GetFlags(); if (annot_flags & ANNOTFLAG_HIDDEN) { return NULL; } FX_BOOL bPrinting = bPrint || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { return NULL; } if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { return NULL; } CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS"); char style_char; FX_FLOAT width; CPDF_Array* pDashArray = NULL; if (pBS == NULL) { CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border"); style_char = 'S'; if (pBorderArray) { width = pBorderArray->GetNumber(2); if (pBorderArray->GetCount() == 4) { pDashArray = pBorderArray->GetArray(3); if (pDashArray == NULL) { return NULL; } style_char = 'D'; } } else { width = 1; } } else { CFX_ByteString style = pBS->GetString("S"); pDashArray = pBS->GetArray("D"); style_char = style[1]; width = pBS->GetNumber("W"); } if (width <= 0) { return NULL; } CPDF_Array* pColor = m_pAnnotDict->GetArray("C"); FX_DWORD argb = 0xff000000; if (pColor != NULL) { int R = (FX_INT32)(pColor->GetNumber(0) * 255); int G = (FX_INT32)(pColor->GetNumber(1) * 255); int B = (FX_INT32)(pColor->GetNumber(2) * 255); argb = ArgbEncode(0xff, R, G, B); } nonstd::unique_ptr<CPDF_PathObject> pPathObject(new CPDF_PathObject()); CPDF_GraphStateData *pGraphState = pPathObject->m_GraphState.GetModify(); if (!pGraphState) { return NULL; } pGraphState->m_LineWidth = width; CPDF_ColorStateData *pColorData = pPathObject->m_ColorState.GetModify(); if (!pColorData) { return NULL; } pColorData->m_StrokeRGB = argb; pPathObject->m_bStroke = TRUE; pPathObject->m_FillType = 0; if (style_char == 'D') { if (pDashArray) { FX_DWORD dash_count = pDashArray->GetCount(); if (dash_count % 2) { dash_count ++; } pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, dash_count); if (pGraphState->m_DashArray == NULL) { return NULL; } pGraphState->m_DashCount = dash_count; FX_DWORD i; for (i = 0; i < pDashArray->GetCount(); i ++) { pGraphState->m_DashArray[i] = pDashArray->GetNumber(i); } if (i < dash_count) { pGraphState->m_DashArray[i] = pGraphState->m_DashArray[i - 1]; } } else { pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, 2); if (pGraphState->m_DashArray == NULL) { return NULL; } pGraphState->m_DashCount = 2; pGraphState->m_DashArray[0] = pGraphState->m_DashArray[1] = 3 * 1.0f; } } CFX_FloatRect rect; GetRect(rect); width /= 2; CPDF_PathData *pPathData = pPathObject->m_Path.GetModify(); if (pPathData) { pPathData->AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width); } pPathObject->CalcBoundingBox(); return pPathObject.release(); }