Index: core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp |
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp |
index b4d030e67902d14f412a29995f1194b1ab936c76..e010a28b0205d9bdd17cb6adeae8c93de4831b40 100644 |
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp |
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp |
@@ -11,699 +11,682 @@ |
#include "../fpdf_render/render_int.h" |
#include "pageint.h" |
-void CPDF_GraphicStates::DefaultStates() |
-{ |
- m_ColorState.New()->Default(); |
-} |
-void CPDF_GraphicStates::CopyStates(const CPDF_GraphicStates& src) |
-{ |
- m_ClipPath = src.m_ClipPath; |
- m_GraphState = src.m_GraphState; |
- m_ColorState = src.m_ColorState; |
- m_TextState = src.m_TextState; |
- m_GeneralState = src.m_GeneralState; |
-} |
-CPDF_ClipPathData::CPDF_ClipPathData() |
-{ |
- m_PathCount = 0; |
+void CPDF_GraphicStates::DefaultStates() { |
+ m_ColorState.New()->Default(); |
+} |
+void CPDF_GraphicStates::CopyStates(const CPDF_GraphicStates& src) { |
+ m_ClipPath = src.m_ClipPath; |
+ m_GraphState = src.m_GraphState; |
+ m_ColorState = src.m_ColorState; |
+ m_TextState = src.m_TextState; |
+ m_GeneralState = src.m_GeneralState; |
+} |
+CPDF_ClipPathData::CPDF_ClipPathData() { |
+ m_PathCount = 0; |
+ m_pPathList = NULL; |
+ m_pTypeList = NULL; |
+ m_TextCount = 0; |
+ m_pTextList = NULL; |
+} |
+CPDF_ClipPathData::~CPDF_ClipPathData() { |
+ int i; |
+ delete[] m_pPathList; |
+ if (m_pTypeList) { |
+ FX_Free(m_pTypeList); |
+ } |
+ for (i = m_TextCount - 1; i > -1; i--) |
+ delete m_pTextList[i]; |
+ if (m_pTextList) { |
+ FX_Free(m_pTextList); |
+ } |
+} |
+CPDF_ClipPathData::CPDF_ClipPathData(const CPDF_ClipPathData& src) { |
+ m_pPathList = NULL; |
+ m_pPathList = NULL; |
+ m_pTextList = NULL; |
+ m_PathCount = src.m_PathCount; |
+ if (m_PathCount) { |
+ int alloc_size = m_PathCount; |
+ if (alloc_size % 8) { |
+ alloc_size += 8 - (alloc_size % 8); |
+ } |
+ m_pPathList = new CPDF_Path[alloc_size]; |
+ for (int i = 0; i < m_PathCount; i++) { |
+ m_pPathList[i] = src.m_pPathList[i]; |
+ } |
+ m_pTypeList = FX_Alloc(uint8_t, alloc_size); |
+ FXSYS_memcpy(m_pTypeList, src.m_pTypeList, m_PathCount); |
+ } else { |
m_pPathList = NULL; |
m_pTypeList = NULL; |
- m_TextCount = 0; |
+ } |
+ m_TextCount = src.m_TextCount; |
+ if (m_TextCount) { |
+ m_pTextList = FX_Alloc(CPDF_TextObject*, m_TextCount); |
+ for (int i = 0; i < m_TextCount; i++) { |
+ if (src.m_pTextList[i]) { |
+ m_pTextList[i] = new CPDF_TextObject; |
+ m_pTextList[i]->Copy(src.m_pTextList[i]); |
+ } else { |
+ m_pTextList[i] = NULL; |
+ } |
+ } |
+ } else { |
m_pTextList = NULL; |
-} |
-CPDF_ClipPathData::~CPDF_ClipPathData() |
-{ |
- int i; |
- delete[] m_pPathList; |
- if (m_pTypeList) { |
- FX_Free(m_pTypeList); |
- } |
- for (i = m_TextCount - 1; i > -1; i --) |
- delete m_pTextList[i]; |
- if (m_pTextList) { |
- FX_Free(m_pTextList); |
- } |
-} |
-CPDF_ClipPathData::CPDF_ClipPathData(const CPDF_ClipPathData& src) |
-{ |
- m_pPathList = NULL; |
- m_pPathList = NULL; |
- m_pTextList = NULL; |
- m_PathCount = src.m_PathCount; |
- if (m_PathCount) { |
- int alloc_size = m_PathCount; |
- if (alloc_size % 8) { |
- alloc_size += 8 - (alloc_size % 8); |
+ } |
+} |
+void CPDF_ClipPathData::SetCount(int path_count, int text_count) { |
+ ASSERT(m_TextCount == 0 && m_PathCount == 0); |
+ if (path_count) { |
+ m_PathCount = path_count; |
+ int alloc_size = (path_count + 7) / 8 * 8; |
+ m_pPathList = new CPDF_Path[alloc_size]; |
+ m_pTypeList = FX_Alloc(uint8_t, alloc_size); |
+ } |
+ if (text_count) { |
+ m_TextCount = text_count; |
+ m_pTextList = FX_Alloc(CPDF_TextObject*, text_count); |
+ } |
+} |
+CPDF_Rect CPDF_ClipPath::GetClipBox() const { |
+ CPDF_Rect rect; |
+ FX_BOOL bStarted = FALSE; |
+ int count = GetPathCount(); |
+ if (count) { |
+ rect = GetPath(0).GetBoundingBox(); |
+ for (int i = 1; i < count; i++) { |
+ CPDF_Rect path_rect = GetPath(i).GetBoundingBox(); |
+ rect.Intersect(path_rect); |
+ } |
+ bStarted = TRUE; |
+ } |
+ count = GetTextCount(); |
+ if (count) { |
+ CPDF_Rect layer_rect; |
+ FX_BOOL bLayerStarted = FALSE; |
+ for (int i = 0; i < count; i++) { |
+ CPDF_TextObject* pTextObj = GetText(i); |
+ if (pTextObj == NULL) { |
+ if (!bStarted) { |
+ rect = layer_rect; |
+ bStarted = TRUE; |
+ } else { |
+ rect.Intersect(layer_rect); |
} |
- m_pPathList = new CPDF_Path[alloc_size]; |
- for (int i = 0; i < m_PathCount; i ++) { |
- m_pPathList[i] = src.m_pPathList[i]; |
+ bLayerStarted = FALSE; |
+ } else { |
+ if (!bLayerStarted) { |
+ layer_rect = pTextObj->GetBBox(NULL); |
+ bLayerStarted = TRUE; |
+ } else { |
+ layer_rect.Union(pTextObj->GetBBox(NULL)); |
} |
- m_pTypeList = FX_Alloc(uint8_t, alloc_size); |
- FXSYS_memcpy(m_pTypeList, src.m_pTypeList, m_PathCount); |
- } else { |
- m_pPathList = NULL; |
- m_pTypeList = NULL; |
- } |
- m_TextCount = src.m_TextCount; |
- if (m_TextCount) { |
- m_pTextList = FX_Alloc(CPDF_TextObject*, m_TextCount); |
- for (int i = 0; i < m_TextCount; i ++) { |
- if (src.m_pTextList[i]) { |
- m_pTextList[i] = new CPDF_TextObject; |
- m_pTextList[i]->Copy(src.m_pTextList[i]); |
- } else { |
- m_pTextList[i] = NULL; |
- } |
- } |
- } else { |
- m_pTextList = NULL; |
- } |
-} |
-void CPDF_ClipPathData::SetCount(int path_count, int text_count) |
-{ |
- ASSERT(m_TextCount == 0 && m_PathCount == 0); |
- if (path_count) { |
- m_PathCount = path_count; |
- int alloc_size = (path_count + 7) / 8 * 8; |
- m_pPathList = new CPDF_Path[alloc_size]; |
- m_pTypeList = FX_Alloc(uint8_t, alloc_size); |
- } |
- if (text_count) { |
- m_TextCount = text_count; |
- m_pTextList = FX_Alloc(CPDF_TextObject*, text_count); |
- } |
-} |
-CPDF_Rect CPDF_ClipPath::GetClipBox() const |
-{ |
- CPDF_Rect rect; |
- FX_BOOL bStarted = FALSE; |
- int count = GetPathCount(); |
- if (count) { |
- rect = GetPath(0).GetBoundingBox(); |
- for (int i = 1; i < count; i ++) { |
- CPDF_Rect path_rect = GetPath(i).GetBoundingBox(); |
- rect.Intersect(path_rect); |
- } |
- bStarted = TRUE; |
- } |
- count = GetTextCount(); |
- if (count) { |
- CPDF_Rect layer_rect; |
- FX_BOOL bLayerStarted = FALSE; |
- for (int i = 0; i < count; i ++) { |
- CPDF_TextObject* pTextObj = GetText(i); |
- if (pTextObj == NULL) { |
- if (!bStarted) { |
- rect = layer_rect; |
- bStarted = TRUE; |
- } else { |
- rect.Intersect(layer_rect); |
- } |
- bLayerStarted = FALSE; |
- } else { |
- if (!bLayerStarted) { |
- layer_rect = pTextObj->GetBBox(NULL); |
- bLayerStarted = TRUE; |
- } else { |
- layer_rect.Union(pTextObj->GetBBox(NULL)); |
- } |
- } |
- } |
- } |
- return rect; |
-} |
-void CPDF_ClipPath::AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge) |
-{ |
- CPDF_ClipPathData* pData = GetModify(); |
- if (pData->m_PathCount && bAutoMerge) { |
- CPDF_Path old_path = pData->m_pPathList[pData->m_PathCount - 1]; |
- if (old_path.IsRect()) { |
- CPDF_Rect old_rect(old_path.GetPointX(0), old_path.GetPointY(0), |
- old_path.GetPointX(2), old_path.GetPointY(2)); |
- CPDF_Rect new_rect = path.GetBoundingBox(); |
- if (old_rect.Contains(new_rect)) { |
- pData->m_PathCount --; |
- pData->m_pPathList[pData->m_PathCount].SetNull(); |
- } |
- } |
- } |
- if (pData->m_PathCount % 8 == 0) { |
- CPDF_Path* pNewPath = new CPDF_Path[pData->m_PathCount + 8]; |
- for (int i = 0; i < pData->m_PathCount; i ++) { |
- pNewPath[i] = pData->m_pPathList[i]; |
- } |
- delete[] pData->m_pPathList; |
- uint8_t* pNewType = FX_Alloc(uint8_t, pData->m_PathCount + 8); |
- FXSYS_memcpy(pNewType, pData->m_pTypeList, pData->m_PathCount); |
- if (pData->m_pTypeList) { |
- FX_Free(pData->m_pTypeList); |
- } |
- pData->m_pPathList = pNewPath; |
- pData->m_pTypeList = pNewType; |
- } |
- pData->m_pPathList[pData->m_PathCount] = path; |
- pData->m_pTypeList[pData->m_PathCount] = (uint8_t)type; |
- pData->m_PathCount ++; |
-} |
-void CPDF_ClipPath::DeletePath(int index) |
-{ |
- CPDF_ClipPathData* pData = GetModify(); |
- if (index >= pData->m_PathCount) { |
- return; |
- } |
- pData->m_pPathList[index].SetNull(); |
- for (int i = index; i < pData->m_PathCount - 1; i ++) { |
- pData->m_pPathList[i] = pData->m_pPathList[i + 1]; |
- } |
- pData->m_pPathList[pData->m_PathCount - 1].SetNull(); |
- FXSYS_memmove(pData->m_pTypeList + index, pData->m_pTypeList + index + 1, pData->m_PathCount - index - 1); |
- pData->m_PathCount --; |
+ } |
+ } |
+ } |
+ return rect; |
+} |
+void CPDF_ClipPath::AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge) { |
+ CPDF_ClipPathData* pData = GetModify(); |
+ if (pData->m_PathCount && bAutoMerge) { |
+ CPDF_Path old_path = pData->m_pPathList[pData->m_PathCount - 1]; |
+ if (old_path.IsRect()) { |
+ CPDF_Rect old_rect(old_path.GetPointX(0), old_path.GetPointY(0), |
+ old_path.GetPointX(2), old_path.GetPointY(2)); |
+ CPDF_Rect new_rect = path.GetBoundingBox(); |
+ if (old_rect.Contains(new_rect)) { |
+ pData->m_PathCount--; |
+ pData->m_pPathList[pData->m_PathCount].SetNull(); |
+ } |
+ } |
+ } |
+ if (pData->m_PathCount % 8 == 0) { |
+ CPDF_Path* pNewPath = new CPDF_Path[pData->m_PathCount + 8]; |
+ for (int i = 0; i < pData->m_PathCount; i++) { |
+ pNewPath[i] = pData->m_pPathList[i]; |
+ } |
+ delete[] pData->m_pPathList; |
+ uint8_t* pNewType = FX_Alloc(uint8_t, pData->m_PathCount + 8); |
+ FXSYS_memcpy(pNewType, pData->m_pTypeList, pData->m_PathCount); |
+ if (pData->m_pTypeList) { |
+ FX_Free(pData->m_pTypeList); |
+ } |
+ pData->m_pPathList = pNewPath; |
+ pData->m_pTypeList = pNewType; |
+ } |
+ pData->m_pPathList[pData->m_PathCount] = path; |
+ pData->m_pTypeList[pData->m_PathCount] = (uint8_t)type; |
+ pData->m_PathCount++; |
+} |
+void CPDF_ClipPath::DeletePath(int index) { |
+ CPDF_ClipPathData* pData = GetModify(); |
+ if (index >= pData->m_PathCount) { |
+ return; |
+ } |
+ pData->m_pPathList[index].SetNull(); |
+ for (int i = index; i < pData->m_PathCount - 1; i++) { |
+ pData->m_pPathList[i] = pData->m_pPathList[i + 1]; |
+ } |
+ pData->m_pPathList[pData->m_PathCount - 1].SetNull(); |
+ FXSYS_memmove(pData->m_pTypeList + index, pData->m_pTypeList + index + 1, |
+ pData->m_PathCount - index - 1); |
+ pData->m_PathCount--; |
} |
#define FPDF_CLIPPATH_MAX_TEXTS 1024 |
-void CPDF_ClipPath::AppendTexts(CPDF_TextObject** pTexts, int count) |
-{ |
- CPDF_ClipPathData* pData = GetModify(); |
- if (pData->m_TextCount + count > FPDF_CLIPPATH_MAX_TEXTS) { |
- for (int i = 0; i < count; i ++) { |
- delete pTexts[i]; |
+void CPDF_ClipPath::AppendTexts(CPDF_TextObject** pTexts, int count) { |
+ CPDF_ClipPathData* pData = GetModify(); |
+ if (pData->m_TextCount + count > FPDF_CLIPPATH_MAX_TEXTS) { |
+ for (int i = 0; i < count; i++) { |
+ delete pTexts[i]; |
+ } |
+ return; |
+ } |
+ CPDF_TextObject** pNewList = |
+ FX_Alloc(CPDF_TextObject*, pData->m_TextCount + count + 1); |
+ if (pData->m_pTextList) { |
+ FXSYS_memcpy(pNewList, pData->m_pTextList, |
+ pData->m_TextCount * sizeof(CPDF_TextObject*)); |
+ FX_Free(pData->m_pTextList); |
+ } |
+ pData->m_pTextList = pNewList; |
+ for (int i = 0; i < count; i++) { |
+ pData->m_pTextList[pData->m_TextCount + i] = pTexts[i]; |
+ } |
+ pData->m_pTextList[pData->m_TextCount + count] = NULL; |
+ pData->m_TextCount += count + 1; |
+} |
+void CPDF_ClipPath::Transform(const CPDF_Matrix& matrix) { |
+ CPDF_ClipPathData* pData = GetModify(); |
+ int i; |
+ for (i = 0; i < pData->m_PathCount; i++) { |
+ pData->m_pPathList[i].Transform(&matrix); |
+ } |
+ for (i = 0; i < pData->m_TextCount; i++) |
+ if (pData->m_pTextList[i]) { |
+ pData->m_pTextList[i]->Transform(matrix); |
+ } |
+} |
+CPDF_ColorStateData::CPDF_ColorStateData(const CPDF_ColorStateData& src) { |
+ m_FillColor.Copy(&src.m_FillColor); |
+ m_FillRGB = src.m_FillRGB; |
+ m_StrokeColor.Copy(&src.m_StrokeColor); |
+ m_StrokeRGB = src.m_StrokeRGB; |
+} |
+void CPDF_ColorStateData::Default() { |
+ m_FillRGB = m_StrokeRGB = 0; |
+ m_FillColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY)); |
+ m_StrokeColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY)); |
+} |
+void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS, |
+ FX_FLOAT* pValue, |
+ int nValues) { |
+ CPDF_ColorStateData* pData = GetModify(); |
+ SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues); |
+} |
+void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS, |
+ FX_FLOAT* pValue, |
+ int nValues) { |
+ CPDF_ColorStateData* pData = GetModify(); |
+ SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues); |
+} |
+void CPDF_ColorState::SetColor(CPDF_Color& color, |
+ FX_DWORD& rgb, |
+ CPDF_ColorSpace* pCS, |
+ FX_FLOAT* pValue, |
+ int nValues) { |
+ if (pCS) { |
+ color.SetColorSpace(pCS); |
+ } else if (color.IsNull()) { |
+ color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY)); |
+ } |
+ if (color.m_pCS->CountComponents() > nValues) { |
+ return; |
+ } |
+ color.SetValue(pValue); |
+ int R, G, B; |
+ rgb = color.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD)-1; |
+} |
+void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern, |
+ FX_FLOAT* pValue, |
+ int nValues) { |
+ CPDF_ColorStateData* pData = GetModify(); |
+ pData->m_FillColor.SetValue(pPattern, pValue, nValues); |
+ int R, G, B; |
+ FX_BOOL ret = pData->m_FillColor.GetRGB(R, G, B); |
+ if (pPattern->m_PatternType == 1 && |
+ ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) { |
+ pData->m_FillRGB = 0x00BFBFBF; |
+ return; |
+ } |
+ pData->m_FillRGB = ret ? FXSYS_RGB(R, G, B) : (FX_DWORD)-1; |
+} |
+void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern, |
+ FX_FLOAT* pValue, |
+ int nValues) { |
+ CPDF_ColorStateData* pData = GetModify(); |
+ pData->m_StrokeColor.SetValue(pPattern, pValue, nValues); |
+ int R, G, B; |
+ FX_BOOL ret = pData->m_StrokeColor.GetRGB(R, G, B); |
+ if (pPattern->m_PatternType == 1 && |
+ ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) { |
+ pData->m_StrokeRGB = 0x00BFBFBF; |
+ return; |
+ } |
+ pData->m_StrokeRGB = |
+ pData->m_StrokeColor.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD)-1; |
+} |
+CPDF_TextStateData::CPDF_TextStateData() { |
+ m_pFont = NULL; |
+ m_pDocument = NULL; |
+ m_FontSize = 1.0f; |
+ m_WordSpace = 0; |
+ m_CharSpace = 0; |
+ m_TextMode = 0; |
+ m_Matrix[0] = m_Matrix[3] = 1.0f; |
+ m_Matrix[1] = m_Matrix[2] = 0; |
+ m_CTM[0] = m_CTM[3] = 1.0f; |
+ m_CTM[1] = m_CTM[2] = 0; |
+} |
+CPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src) { |
+ if (this == &src) { |
+ return; |
+ } |
+ FXSYS_memcpy(this, &src, sizeof(CPDF_TextStateData)); |
+ if (m_pDocument && m_pFont) { |
+ m_pFont = |
+ m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE); |
+ } |
+} |
+CPDF_TextStateData::~CPDF_TextStateData() { |
+ if (m_pDocument && m_pFont) { |
+ CPDF_DocPageData* pPageData = m_pDocument->GetPageData(); |
+ if (pPageData && !pPageData->IsForceClear()) { |
+ pPageData->ReleaseFont(m_pFont->GetFontDict()); |
+ } |
+ } |
+} |
+void CPDF_TextState::SetFont(CPDF_Font* pFont) { |
+ CPDF_TextStateData* pStateData = GetModify(); |
+ if (pStateData) { |
+ CPDF_Document* pDoc = pStateData->m_pDocument; |
+ CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : NULL; |
+ if (pPageData && pStateData->m_pFont && !pPageData->IsForceClear()) { |
+ pPageData->ReleaseFont(pStateData->m_pFont->GetFontDict()); |
+ } |
+ pStateData->m_pDocument = pFont ? pFont->m_pDocument : NULL; |
+ pStateData->m_pFont = pFont; |
+ } |
+} |
+FX_FLOAT CPDF_TextState::GetFontSizeV() const { |
+ FX_FLOAT* pMatrix = GetMatrix(); |
+ FX_FLOAT unit = FXSYS_sqrt2(pMatrix[1], pMatrix[3]); |
+ FX_FLOAT size = FXSYS_Mul(unit, GetFontSize()); |
+ return (FX_FLOAT)FXSYS_fabs(size); |
+} |
+FX_FLOAT CPDF_TextState::GetFontSizeH() const { |
+ FX_FLOAT* pMatrix = GetMatrix(); |
+ FX_FLOAT unit = FXSYS_sqrt2(pMatrix[0], pMatrix[2]); |
+ FX_FLOAT size = FXSYS_Mul(unit, GetFontSize()); |
+ return (FX_FLOAT)FXSYS_fabs(size); |
+} |
+FX_FLOAT CPDF_TextState::GetBaselineAngle() const { |
+ FX_FLOAT* m_Matrix = GetMatrix(); |
+ return FXSYS_atan2(m_Matrix[2], m_Matrix[0]); |
+} |
+FX_FLOAT CPDF_TextState::GetShearAngle() const { |
+ FX_FLOAT* m_Matrix = GetMatrix(); |
+ FX_FLOAT shear_angle = FXSYS_atan2(m_Matrix[1], m_Matrix[3]); |
+ return GetBaselineAngle() + shear_angle; |
+} |
+CPDF_GeneralStateData::CPDF_GeneralStateData() { |
+ FXSYS_memset(this, 0, sizeof(CPDF_GeneralStateData)); |
+ FXSYS_strcpy((FX_CHAR*)m_BlendMode, "Normal"); |
+ m_StrokeAlpha = 1.0f; |
+ m_FillAlpha = 1.0f; |
+ m_Flatness = 1.0f; |
+ m_Matrix.SetIdentity(); |
+} |
+CPDF_GeneralStateData::CPDF_GeneralStateData(const CPDF_GeneralStateData& src) { |
+ FXSYS_memcpy(this, &src, sizeof(CPDF_GeneralStateData)); |
+ if (src.m_pTransferFunc && src.m_pTransferFunc->m_pPDFDoc) { |
+ CPDF_DocRenderData* pDocCache = |
+ src.m_pTransferFunc->m_pPDFDoc->GetRenderData(); |
+ if (!pDocCache) { |
+ return; |
+ } |
+ m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR); |
+ } |
+} |
+CPDF_GeneralStateData::~CPDF_GeneralStateData() { |
+ if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) { |
+ CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData(); |
+ if (!pDocCache) { |
+ return; |
+ } |
+ pDocCache->ReleaseTransferFunc(m_pTR); |
+ } |
+} |
+static int GetBlendType(const CFX_ByteStringC& mode) { |
+ switch (mode.GetID()) { |
+ case FXBSTR_ID('N', 'o', 'r', 'm'): |
+ case FXBSTR_ID('C', 'o', 'm', 'p'): |
+ return FXDIB_BLEND_NORMAL; |
+ case FXBSTR_ID('M', 'u', 'l', 't'): |
+ return FXDIB_BLEND_MULTIPLY; |
+ case FXBSTR_ID('S', 'c', 'r', 'e'): |
+ return FXDIB_BLEND_SCREEN; |
+ case FXBSTR_ID('O', 'v', 'e', 'r'): |
+ return FXDIB_BLEND_OVERLAY; |
+ case FXBSTR_ID('D', 'a', 'r', 'k'): |
+ return FXDIB_BLEND_DARKEN; |
+ case FXBSTR_ID('L', 'i', 'g', 'h'): |
+ return FXDIB_BLEND_LIGHTEN; |
+ case FXBSTR_ID('C', 'o', 'l', 'o'): |
+ if (mode.GetLength() == 10) { |
+ return FXDIB_BLEND_COLORDODGE; |
+ } |
+ if (mode.GetLength() == 9) { |
+ return FXDIB_BLEND_COLORBURN; |
+ } |
+ return FXDIB_BLEND_COLOR; |
+ case FXBSTR_ID('H', 'a', 'r', 'd'): |
+ return FXDIB_BLEND_HARDLIGHT; |
+ case FXBSTR_ID('S', 'o', 'f', 't'): |
+ return FXDIB_BLEND_SOFTLIGHT; |
+ case FXBSTR_ID('D', 'i', 'f', 'f'): |
+ return FXDIB_BLEND_DIFFERENCE; |
+ case FXBSTR_ID('E', 'x', 'c', 'l'): |
+ return FXDIB_BLEND_EXCLUSION; |
+ case FXBSTR_ID('H', 'u', 'e', 0): |
+ return FXDIB_BLEND_HUE; |
+ case FXBSTR_ID('S', 'a', 't', 'u'): |
+ return FXDIB_BLEND_SATURATION; |
+ case FXBSTR_ID('L', 'u', 'm', 'i'): |
+ return FXDIB_BLEND_LUMINOSITY; |
+ } |
+ return FXDIB_BLEND_NORMAL; |
+} |
+void CPDF_GeneralStateData::SetBlendMode(const CFX_ByteStringC& blend_mode) { |
+ if (blend_mode.GetLength() > 15) { |
+ return; |
+ } |
+ FXSYS_memcpy(m_BlendMode, blend_mode.GetPtr(), blend_mode.GetLength()); |
+ m_BlendMode[blend_mode.GetLength()] = 0; |
+ m_BlendType = ::GetBlendType(blend_mode); |
+} |
+int RI_StringToId(const CFX_ByteString& ri) { |
+ FX_DWORD id = ri.GetID(); |
+ if (id == FXBSTR_ID('A', 'b', 's', 'o')) { |
+ return 1; |
+ } |
+ if (id == FXBSTR_ID('S', 'a', 't', 'u')) { |
+ return 2; |
+ } |
+ if (id == FXBSTR_ID('P', 'e', 'r', 'c')) { |
+ return 3; |
+ } |
+ return 0; |
+} |
+void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri) { |
+ GetModify()->m_RenderIntent = RI_StringToId(ri); |
+} |
+CPDF_AllStates::CPDF_AllStates() { |
+ m_TextX = m_TextY = m_TextLineX = m_TextLineY = 0; |
+ m_TextLeading = 0; |
+ m_TextRise = 0; |
+ m_TextHorzScale = 1.0f; |
+} |
+CPDF_AllStates::~CPDF_AllStates() {} |
+void CPDF_AllStates::Copy(const CPDF_AllStates& src) { |
+ CopyStates(src); |
+ m_TextMatrix.Copy(src.m_TextMatrix); |
+ m_ParentMatrix.Copy(src.m_ParentMatrix); |
+ m_CTM.Copy(src.m_CTM); |
+ m_TextX = src.m_TextX; |
+ m_TextY = src.m_TextY; |
+ m_TextLineX = src.m_TextLineX; |
+ m_TextLineY = src.m_TextLineY; |
+ m_TextLeading = src.m_TextLeading; |
+ m_TextRise = src.m_TextRise; |
+ m_TextHorzScale = src.m_TextHorzScale; |
+} |
+void CPDF_AllStates::SetLineDash(CPDF_Array* pArray, |
+ FX_FLOAT phase, |
+ FX_FLOAT scale) { |
+ CFX_GraphStateData* pData = m_GraphState.GetModify(); |
+ pData->m_DashPhase = FXSYS_Mul(phase, scale); |
+ pData->SetDashCount(pArray->GetCount()); |
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i++) { |
+ pData->m_DashArray[i] = FXSYS_Mul(pArray->GetNumber(i), scale); |
+ } |
+} |
+void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, |
+ CPDF_StreamContentParser* pParser) { |
+ CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetModify(); |
+ FX_POSITION pos = pGS->GetStartPos(); |
+ while (pos) { |
+ CFX_ByteString key_str; |
+ CPDF_Object* pElement = pGS->GetNextElement(pos, key_str); |
+ CPDF_Object* pObject = pElement ? pElement->GetDirect() : NULL; |
+ if (pObject == NULL) { |
+ continue; |
+ } |
+ FX_DWORD key = key_str.GetID(); |
+ switch (key) { |
+ case FXBSTR_ID('L', 'W', 0, 0): |
+ m_GraphState.GetModify()->m_LineWidth = pObject->GetNumber(); |
+ break; |
+ case FXBSTR_ID('L', 'C', 0, 0): |
+ m_GraphState.GetModify()->m_LineCap = |
+ (CFX_GraphStateData::LineCap)pObject->GetInteger(); |
+ break; |
+ case FXBSTR_ID('L', 'J', 0, 0): |
+ m_GraphState.GetModify()->m_LineJoin = |
+ (CFX_GraphStateData::LineJoin)pObject->GetInteger(); |
+ break; |
+ case FXBSTR_ID('M', 'L', 0, 0): |
+ m_GraphState.GetModify()->m_MiterLimit = pObject->GetNumber(); |
+ break; |
+ case FXBSTR_ID('D', 0, 0, 0): { |
+ if (pObject->GetType() != PDFOBJ_ARRAY) { |
+ break; |
} |
- return; |
- } |
- CPDF_TextObject** pNewList = FX_Alloc(CPDF_TextObject*, pData->m_TextCount + count + 1); |
- if (pData->m_pTextList) { |
- FXSYS_memcpy(pNewList, pData->m_pTextList, pData->m_TextCount * sizeof(CPDF_TextObject*)); |
- FX_Free(pData->m_pTextList); |
- } |
- pData->m_pTextList = pNewList; |
- for (int i = 0; i < count; i ++) { |
- pData->m_pTextList[pData->m_TextCount + i] = pTexts[i]; |
- } |
- pData->m_pTextList[pData->m_TextCount + count] = NULL; |
- pData->m_TextCount += count + 1; |
-} |
-void CPDF_ClipPath::Transform(const CPDF_Matrix& matrix) |
-{ |
- CPDF_ClipPathData* pData = GetModify(); |
- int i; |
- for (i = 0; i < pData->m_PathCount; i ++) { |
- pData->m_pPathList[i].Transform(&matrix); |
- } |
- for (i = 0; i < pData->m_TextCount; i ++) |
- if (pData->m_pTextList[i]) { |
- pData->m_pTextList[i]->Transform(matrix); |
+ CPDF_Array* pDash = (CPDF_Array*)pObject; |
+ CPDF_Array* pArray = pDash->GetArray(0); |
+ if (pArray == NULL) { |
+ break; |
} |
-} |
-CPDF_ColorStateData::CPDF_ColorStateData(const CPDF_ColorStateData& src) |
-{ |
- m_FillColor.Copy(&src.m_FillColor); |
- m_FillRGB = src.m_FillRGB; |
- m_StrokeColor.Copy(&src.m_StrokeColor); |
- m_StrokeRGB = src.m_StrokeRGB; |
-} |
-void CPDF_ColorStateData::Default() |
-{ |
- m_FillRGB = m_StrokeRGB = 0; |
- m_FillColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY)); |
- m_StrokeColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY)); |
-} |
-void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues) |
-{ |
- CPDF_ColorStateData* pData = GetModify(); |
- SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues); |
-} |
-void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues) |
-{ |
- CPDF_ColorStateData* pData = GetModify(); |
- SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues); |
-} |
-void CPDF_ColorState::SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues) |
-{ |
- if (pCS) { |
- color.SetColorSpace(pCS); |
- } else if (color.IsNull()) { |
- color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY)); |
- } |
- if (color.m_pCS->CountComponents() > nValues) { |
- return; |
- } |
- color.SetValue(pValue); |
- int R, G, B; |
- rgb = color.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1; |
-} |
-void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues) |
-{ |
- CPDF_ColorStateData* pData = GetModify(); |
- pData->m_FillColor.SetValue(pPattern, pValue, nValues); |
- int R, G, B; |
- FX_BOOL ret = pData->m_FillColor.GetRGB(R, G, B); |
- if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) { |
- pData->m_FillRGB = 0x00BFBFBF; |
- return; |
- } |
- pData->m_FillRGB = ret ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1; |
-} |
-void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues) |
-{ |
- CPDF_ColorStateData* pData = GetModify(); |
- pData->m_StrokeColor.SetValue(pPattern, pValue, nValues); |
- int R, G, B; |
- FX_BOOL ret = pData->m_StrokeColor.GetRGB(R, G, B); |
- if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) { |
- pData->m_StrokeRGB = 0x00BFBFBF; |
- return; |
- } |
- pData->m_StrokeRGB = pData->m_StrokeColor.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1; |
-} |
-CPDF_TextStateData::CPDF_TextStateData() |
-{ |
- m_pFont = NULL; |
- m_pDocument = NULL; |
- m_FontSize = 1.0f; |
- m_WordSpace = 0; |
- m_CharSpace = 0; |
- m_TextMode = 0; |
- m_Matrix[0] = m_Matrix[3] = 1.0f; |
- m_Matrix[1] = m_Matrix[2] = 0; |
- m_CTM[0] = m_CTM[3] = 1.0f; |
- m_CTM[1] = m_CTM[2] = 0; |
-} |
-CPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src) |
-{ |
- if (this == &src) { |
- return; |
- } |
- FXSYS_memcpy(this, &src, sizeof(CPDF_TextStateData)); |
- if (m_pDocument && m_pFont) { |
- m_pFont = m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE); |
- } |
-} |
-CPDF_TextStateData::~CPDF_TextStateData() |
-{ |
- if (m_pDocument && m_pFont) { |
- CPDF_DocPageData *pPageData = m_pDocument->GetPageData(); |
- if (pPageData && !pPageData->IsForceClear()) { |
- pPageData->ReleaseFont(m_pFont->GetFontDict()); |
+ SetLineDash(pArray, pDash->GetNumber(1), 1.0f); |
+ break; |
+ } |
+ case FXBSTR_ID('R', 'I', 0, 0): |
+ m_GeneralState.SetRenderIntent(pObject->GetString()); |
+ break; |
+ case FXBSTR_ID('F', 'o', 'n', 't'): { |
+ if (pObject->GetType() != PDFOBJ_ARRAY) { |
+ break; |
} |
- } |
-} |
-void CPDF_TextState::SetFont(CPDF_Font* pFont) |
-{ |
- CPDF_TextStateData* pStateData = GetModify(); |
- if (pStateData) { |
- CPDF_Document* pDoc = pStateData->m_pDocument; |
- CPDF_DocPageData *pPageData = pDoc ? pDoc->GetPageData() : NULL; |
- if (pPageData && pStateData->m_pFont && !pPageData->IsForceClear()) { |
- pPageData->ReleaseFont(pStateData->m_pFont->GetFontDict()); |
+ CPDF_Array* pFont = (CPDF_Array*)pObject; |
+ m_TextState.GetModify()->m_FontSize = pFont->GetNumber(1); |
+ m_TextState.SetFont(pParser->FindFont(pFont->GetString(0))); |
+ break; |
+ } |
+ case FXBSTR_ID('T', 'R', 0, 0): |
+ if (pGS->KeyExist(FX_BSTRC("TR2"))) { |
+ continue; |
} |
- pStateData->m_pDocument = pFont ? pFont->m_pDocument : NULL; |
- pStateData->m_pFont = pFont; |
- } |
-} |
-FX_FLOAT CPDF_TextState::GetFontSizeV() const |
-{ |
- FX_FLOAT* pMatrix = GetMatrix(); |
- FX_FLOAT unit = FXSYS_sqrt2(pMatrix[1], pMatrix[3]); |
- FX_FLOAT size = FXSYS_Mul(unit, GetFontSize()); |
- return (FX_FLOAT)FXSYS_fabs(size); |
-} |
-FX_FLOAT CPDF_TextState::GetFontSizeH() const |
-{ |
- FX_FLOAT* pMatrix = GetMatrix(); |
- FX_FLOAT unit = FXSYS_sqrt2(pMatrix[0], pMatrix[2]); |
- FX_FLOAT size = FXSYS_Mul(unit, GetFontSize()); |
- return (FX_FLOAT)FXSYS_fabs(size); |
-} |
-FX_FLOAT CPDF_TextState::GetBaselineAngle() const |
-{ |
- FX_FLOAT* m_Matrix = GetMatrix(); |
- return FXSYS_atan2(m_Matrix[2], m_Matrix[0]); |
-} |
-FX_FLOAT CPDF_TextState::GetShearAngle() const |
-{ |
- FX_FLOAT* m_Matrix = GetMatrix(); |
- FX_FLOAT shear_angle = FXSYS_atan2(m_Matrix[1], m_Matrix[3]); |
- return GetBaselineAngle() + shear_angle; |
-} |
-CPDF_GeneralStateData::CPDF_GeneralStateData() |
-{ |
- FXSYS_memset(this, 0, sizeof(CPDF_GeneralStateData)); |
- FXSYS_strcpy((FX_CHAR*)m_BlendMode, "Normal"); |
- m_StrokeAlpha = 1.0f; |
- m_FillAlpha = 1.0f; |
- m_Flatness = 1.0f; |
- m_Matrix.SetIdentity(); |
-} |
-CPDF_GeneralStateData::CPDF_GeneralStateData(const CPDF_GeneralStateData& src) |
-{ |
- FXSYS_memcpy(this, &src, sizeof(CPDF_GeneralStateData)); |
- if (src.m_pTransferFunc && src.m_pTransferFunc->m_pPDFDoc) { |
- CPDF_DocRenderData* pDocCache = src.m_pTransferFunc->m_pPDFDoc->GetRenderData(); |
- if (!pDocCache) { |
- return; |
+ case FXBSTR_ID('T', 'R', '2', 0): |
+ if (pObject && pObject->GetType() != PDFOBJ_NAME) { |
+ pGeneralState->m_pTR = pObject; |
+ } else { |
+ pGeneralState->m_pTR = NULL; |
} |
- m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR); |
- } |
-} |
-CPDF_GeneralStateData::~CPDF_GeneralStateData() |
-{ |
- if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) { |
- CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData(); |
- if (!pDocCache) { |
- return; |
+ break; |
+ case FXBSTR_ID('B', 'M', 0, 0): { |
+ CFX_ByteString mode; |
+ if (pObject->GetType() == PDFOBJ_ARRAY) { |
+ mode = ((CPDF_Array*)pObject)->GetString(0); |
+ } else { |
+ mode = pObject->GetString(); |
} |
- pDocCache->ReleaseTransferFunc(m_pTR); |
- } |
-} |
-static int GetBlendType(const CFX_ByteStringC& mode) |
-{ |
- switch (mode.GetID()) { |
- case FXBSTR_ID('N', 'o', 'r', 'm'): |
- case FXBSTR_ID('C', 'o', 'm', 'p'): |
- return FXDIB_BLEND_NORMAL; |
- case FXBSTR_ID('M', 'u', 'l', 't'): |
- return FXDIB_BLEND_MULTIPLY; |
- case FXBSTR_ID('S', 'c', 'r', 'e'): |
- return FXDIB_BLEND_SCREEN; |
- case FXBSTR_ID('O', 'v', 'e', 'r'): |
- return FXDIB_BLEND_OVERLAY; |
- case FXBSTR_ID('D', 'a', 'r', 'k'): |
- return FXDIB_BLEND_DARKEN; |
- case FXBSTR_ID('L', 'i', 'g', 'h'): |
- return FXDIB_BLEND_LIGHTEN; |
- case FXBSTR_ID('C', 'o', 'l', 'o'): |
- if (mode.GetLength() == 10) { |
- return FXDIB_BLEND_COLORDODGE; |
- } |
- if (mode.GetLength() == 9) { |
- return FXDIB_BLEND_COLORBURN; |
- } |
- return FXDIB_BLEND_COLOR; |
- case FXBSTR_ID('H', 'a', 'r', 'd'): |
- return FXDIB_BLEND_HARDLIGHT; |
- case FXBSTR_ID('S', 'o', 'f', 't'): |
- return FXDIB_BLEND_SOFTLIGHT; |
- case FXBSTR_ID('D', 'i', 'f', 'f'): |
- return FXDIB_BLEND_DIFFERENCE; |
- case FXBSTR_ID('E', 'x', 'c', 'l'): |
- return FXDIB_BLEND_EXCLUSION; |
- case FXBSTR_ID('H', 'u', 'e', 0): |
- return FXDIB_BLEND_HUE; |
- case FXBSTR_ID('S', 'a', 't', 'u'): |
- return FXDIB_BLEND_SATURATION; |
- case FXBSTR_ID('L', 'u', 'm', 'i'): |
- return FXDIB_BLEND_LUMINOSITY; |
- } |
- return FXDIB_BLEND_NORMAL; |
-} |
-void CPDF_GeneralStateData::SetBlendMode(const CFX_ByteStringC& blend_mode) |
-{ |
- if (blend_mode.GetLength() > 15) { |
- return; |
- } |
- FXSYS_memcpy(m_BlendMode, blend_mode.GetPtr(), blend_mode.GetLength()); |
- m_BlendMode[blend_mode.GetLength()] = 0; |
- m_BlendType = ::GetBlendType(blend_mode); |
-} |
-int RI_StringToId(const CFX_ByteString& ri) |
-{ |
- FX_DWORD id = ri.GetID(); |
- if (id == FXBSTR_ID('A', 'b', 's', 'o')) { |
- return 1; |
- } |
- if (id == FXBSTR_ID('S', 'a', 't', 'u')) { |
- return 2; |
- } |
- if (id == FXBSTR_ID('P', 'e', 'r', 'c')) { |
- return 3; |
- } |
- return 0; |
-} |
-void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri) |
-{ |
- GetModify()->m_RenderIntent = RI_StringToId(ri); |
-} |
-CPDF_AllStates::CPDF_AllStates() |
-{ |
- m_TextX = m_TextY = m_TextLineX = m_TextLineY = 0; |
- m_TextLeading = 0; |
- m_TextRise = 0; |
- m_TextHorzScale = 1.0f; |
-} |
-CPDF_AllStates::~CPDF_AllStates() |
-{ |
-} |
-void CPDF_AllStates::Copy(const CPDF_AllStates& src) |
-{ |
- CopyStates(src); |
- m_TextMatrix.Copy(src.m_TextMatrix); |
- m_ParentMatrix.Copy(src.m_ParentMatrix); |
- m_CTM.Copy(src.m_CTM); |
- m_TextX = src.m_TextX; |
- m_TextY = src.m_TextY; |
- m_TextLineX = src.m_TextLineX; |
- m_TextLineY = src.m_TextLineY; |
- m_TextLeading = src.m_TextLeading; |
- m_TextRise = src.m_TextRise; |
- m_TextHorzScale = src.m_TextHorzScale; |
-} |
-void CPDF_AllStates::SetLineDash(CPDF_Array* pArray, FX_FLOAT phase, FX_FLOAT scale) |
-{ |
- CFX_GraphStateData* pData = m_GraphState.GetModify(); |
- pData->m_DashPhase = FXSYS_Mul(phase, scale); |
- pData->SetDashCount(pArray->GetCount()); |
- for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) { |
- pData->m_DashArray[i] = FXSYS_Mul(pArray->GetNumber(i), scale); |
- } |
-} |
-void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser) |
-{ |
- CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetModify(); |
- FX_POSITION pos = pGS->GetStartPos(); |
- while (pos) { |
- CFX_ByteString key_str; |
- CPDF_Object* pElement = pGS->GetNextElement(pos, key_str); |
- CPDF_Object* pObject = pElement ? pElement->GetDirect() : NULL; |
- if (pObject == NULL) { |
- continue; |
+ pGeneralState->SetBlendMode(mode); |
+ if (pGeneralState->m_BlendType > FXDIB_BLEND_MULTIPLY) { |
+ pParser->GetObjectList()->m_bBackgroundAlphaNeeded = TRUE; |
} |
- FX_DWORD key = key_str.GetID(); |
- switch (key) { |
- case FXBSTR_ID('L', 'W', 0, 0): |
- m_GraphState.GetModify()->m_LineWidth = pObject->GetNumber(); |
- break; |
- case FXBSTR_ID('L', 'C', 0, 0): |
- m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)pObject->GetInteger(); |
- break; |
- case FXBSTR_ID('L', 'J', 0, 0): |
- m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)pObject->GetInteger(); |
- break; |
- case FXBSTR_ID('M', 'L', 0, 0): |
- m_GraphState.GetModify()->m_MiterLimit = pObject->GetNumber(); |
- break; |
- case FXBSTR_ID('D', 0, 0, 0): { |
- if (pObject->GetType() != PDFOBJ_ARRAY) { |
- break; |
- } |
- CPDF_Array* pDash = (CPDF_Array*)pObject; |
- CPDF_Array* pArray = pDash->GetArray(0); |
- if (pArray == NULL) { |
- break; |
- } |
- SetLineDash(pArray, pDash->GetNumber(1), 1.0f); |
- break; |
- } |
- case FXBSTR_ID('R', 'I', 0, 0): |
- m_GeneralState.SetRenderIntent(pObject->GetString()); |
- break; |
- case FXBSTR_ID('F', 'o', 'n', 't'): { |
- if (pObject->GetType() != PDFOBJ_ARRAY) { |
- break; |
- } |
- CPDF_Array* pFont = (CPDF_Array*)pObject; |
- m_TextState.GetModify()->m_FontSize = pFont->GetNumber(1); |
- m_TextState.SetFont(pParser->FindFont(pFont->GetString(0))); |
- break; |
- } |
- case FXBSTR_ID('T', 'R', 0, 0): |
- if (pGS->KeyExist(FX_BSTRC("TR2"))) { |
- continue; |
- } |
- case FXBSTR_ID('T', 'R', '2', 0): |
- if (pObject && pObject->GetType() != PDFOBJ_NAME) { |
- pGeneralState->m_pTR = pObject; |
- } else { |
- pGeneralState->m_pTR = NULL; |
- } |
- break; |
- case FXBSTR_ID('B', 'M', 0, 0): { |
- CFX_ByteString mode; |
- if (pObject->GetType() == PDFOBJ_ARRAY) { |
- mode = ((CPDF_Array*)pObject)->GetString(0); |
- } else { |
- mode = pObject->GetString(); |
- } |
- pGeneralState->SetBlendMode(mode); |
- if (pGeneralState->m_BlendType > FXDIB_BLEND_MULTIPLY) { |
- pParser->GetObjectList()->m_bBackgroundAlphaNeeded = TRUE; |
- } |
- break; |
- } |
- case FXBSTR_ID('S', 'M', 'a', 's'): |
- if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY) { |
- pGeneralState->m_pSoftMask = pObject; |
- FXSYS_memcpy(pGeneralState->m_SMaskMatrix, &pParser->GetCurStates()->m_CTM, sizeof(CPDF_Matrix)); |
- } else { |
- pGeneralState->m_pSoftMask = NULL; |
- } |
- break; |
- case FXBSTR_ID('C', 'A', 0, 0): |
- pGeneralState->m_StrokeAlpha = PDF_ClipFloat(pObject->GetNumber()); |
- break; |
- case FXBSTR_ID('c', 'a', 0, 0): |
- pGeneralState->m_FillAlpha = PDF_ClipFloat(pObject->GetNumber()); |
- break; |
- case FXBSTR_ID('O', 'P', 0, 0): |
- pGeneralState->m_StrokeOP = pObject->GetInteger(); |
- if (!pGS->KeyExist(FX_BSTRC("op"))) { |
- pGeneralState->m_FillOP = pObject->GetInteger(); |
- } |
- break; |
- case FXBSTR_ID('o', 'p', 0, 0): |
- pGeneralState->m_FillOP = pObject->GetInteger(); |
- break; |
- case FXBSTR_ID('O', 'P', 'M', 0): |
- pGeneralState->m_OPMode = pObject->GetInteger(); |
- break; |
- case FXBSTR_ID('B', 'G', 0, 0): |
- if (pGS->KeyExist(FX_BSTRC("BG2"))) { |
- continue; |
- } |
- case FXBSTR_ID('B', 'G', '2', 0): |
- pGeneralState->m_pBG = pObject; |
- break; |
- case FXBSTR_ID('U', 'C', 'R', 0): |
- if (pGS->KeyExist(FX_BSTRC("UCR2"))) { |
- continue; |
- } |
- case FXBSTR_ID('U', 'C', 'R', '2'): |
- pGeneralState->m_pUCR = pObject; |
- break; |
- case FXBSTR_ID('H', 'T', 0, 0): |
- pGeneralState->m_pHT = pObject; |
- break; |
- case FXBSTR_ID('F', 'L', 0, 0): |
- pGeneralState->m_Flatness = pObject->GetNumber(); |
- break; |
- case FXBSTR_ID('S', 'M', 0, 0): |
- pGeneralState->m_Smoothness = pObject->GetNumber(); |
- break; |
- case FXBSTR_ID('S', 'A', 0, 0): |
- pGeneralState->m_StrokeAdjust = pObject->GetInteger(); |
- break; |
- case FXBSTR_ID('A', 'I', 'S', 0): |
- pGeneralState->m_AlphaSource = pObject->GetInteger(); |
- break; |
- case FXBSTR_ID('T', 'K', 0, 0): |
- pGeneralState->m_TextKnockout = pObject->GetInteger(); |
- break; |
+ break; |
+ } |
+ case FXBSTR_ID('S', 'M', 'a', 's'): |
+ if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY) { |
+ pGeneralState->m_pSoftMask = pObject; |
+ FXSYS_memcpy(pGeneralState->m_SMaskMatrix, |
+ &pParser->GetCurStates()->m_CTM, sizeof(CPDF_Matrix)); |
+ } else { |
+ pGeneralState->m_pSoftMask = NULL; |
} |
- } |
- pGeneralState->m_Matrix = m_CTM; |
-} |
-CPDF_ContentMarkItem::CPDF_ContentMarkItem() |
-{ |
- m_ParamType = None; |
-} |
-CPDF_ContentMarkItem::CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src) |
-{ |
- m_MarkName = src.m_MarkName; |
- m_ParamType = src.m_ParamType; |
- if (m_ParamType == DirectDict) { |
- m_pParam = ((CPDF_Dictionary*)src.m_pParam)->Clone(); |
- } else { |
- m_pParam = src.m_pParam; |
- } |
-} |
-CPDF_ContentMarkItem::~CPDF_ContentMarkItem() |
-{ |
- if (m_ParamType == DirectDict && m_pParam) { |
- ((CPDF_Dictionary*)m_pParam)->Release(); |
- } |
-} |
-FX_BOOL CPDF_ContentMarkItem::HasMCID() const |
-{ |
- if (m_pParam && (m_ParamType == DirectDict || m_ParamType == PropertiesDict)) { |
- return ((CPDF_Dictionary *)m_pParam)->KeyExist(FX_BSTRC("MCID")); |
- } |
- return FALSE; |
-} |
-CPDF_ContentMarkData::CPDF_ContentMarkData(const CPDF_ContentMarkData& src) |
-{ |
- for (int i = 0; i < src.m_Marks.GetSize(); i ++) { |
- m_Marks.Add(src.m_Marks[i]); |
- } |
-} |
-int CPDF_ContentMarkData::GetMCID() const |
-{ |
- CPDF_ContentMarkItem::ParamType type = CPDF_ContentMarkItem::None; |
- for (int i = 0; i < m_Marks.GetSize(); i ++) { |
- type = m_Marks[i].GetParamType(); |
- if (type == CPDF_ContentMarkItem::PropertiesDict || type == CPDF_ContentMarkItem::DirectDict) { |
- CPDF_Dictionary *pDict = (CPDF_Dictionary *)m_Marks[i].GetParam(); |
- if (pDict->KeyExist(FX_BSTRC("MCID"))) { |
- return pDict->GetInteger(FX_BSTRC("MCID")); |
- } |
+ break; |
+ case FXBSTR_ID('C', 'A', 0, 0): |
+ pGeneralState->m_StrokeAlpha = PDF_ClipFloat(pObject->GetNumber()); |
+ break; |
+ case FXBSTR_ID('c', 'a', 0, 0): |
+ pGeneralState->m_FillAlpha = PDF_ClipFloat(pObject->GetNumber()); |
+ break; |
+ case FXBSTR_ID('O', 'P', 0, 0): |
+ pGeneralState->m_StrokeOP = pObject->GetInteger(); |
+ if (!pGS->KeyExist(FX_BSTRC("op"))) { |
+ pGeneralState->m_FillOP = pObject->GetInteger(); |
} |
- } |
- return -1; |
-} |
-void CPDF_ContentMarkData::AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDirect) |
-{ |
- CPDF_ContentMarkItem& item = m_Marks.Add(); |
- item.SetName(name); |
- if (pDict == NULL) { |
- return; |
- } |
- item.SetParam(bDirect ? CPDF_ContentMarkItem::DirectDict : CPDF_ContentMarkItem::PropertiesDict, |
- bDirect ? pDict->Clone() : pDict); |
-} |
-void CPDF_ContentMarkData::DeleteLastMark() |
-{ |
- int size = m_Marks.GetSize(); |
- if (size == 0) { |
- return; |
- } |
- m_Marks.RemoveAt(size - 1); |
-} |
-FX_BOOL CPDF_ContentMark::HasMark(const CFX_ByteStringC& mark) const |
-{ |
- if (m_pObject == NULL) { |
- return FALSE; |
- } |
- for (int i = 0; i < m_pObject->CountItems(); i ++) { |
- CPDF_ContentMarkItem& item = m_pObject->GetItem(i); |
- if (item.GetName() == mark) { |
- return TRUE; |
+ break; |
+ case FXBSTR_ID('o', 'p', 0, 0): |
+ pGeneralState->m_FillOP = pObject->GetInteger(); |
+ break; |
+ case FXBSTR_ID('O', 'P', 'M', 0): |
+ pGeneralState->m_OPMode = pObject->GetInteger(); |
+ break; |
+ case FXBSTR_ID('B', 'G', 0, 0): |
+ if (pGS->KeyExist(FX_BSTRC("BG2"))) { |
+ continue; |
} |
- } |
- return FALSE; |
-} |
-FX_BOOL CPDF_ContentMark::LookupMark(const CFX_ByteStringC& mark, CPDF_Dictionary*& pDict) const |
-{ |
- if (m_pObject == NULL) { |
- return FALSE; |
- } |
- for (int i = 0; i < m_pObject->CountItems(); i ++) { |
- CPDF_ContentMarkItem& item = m_pObject->GetItem(i); |
- if (item.GetName() == mark) { |
- pDict = NULL; |
- if (item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict || |
- item.GetParamType() == CPDF_ContentMarkItem::DirectDict) { |
- pDict = (CPDF_Dictionary*)item.GetParam(); |
- } |
- return TRUE; |
+ case FXBSTR_ID('B', 'G', '2', 0): |
+ pGeneralState->m_pBG = pObject; |
+ break; |
+ case FXBSTR_ID('U', 'C', 'R', 0): |
+ if (pGS->KeyExist(FX_BSTRC("UCR2"))) { |
+ continue; |
} |
- } |
+ case FXBSTR_ID('U', 'C', 'R', '2'): |
+ pGeneralState->m_pUCR = pObject; |
+ break; |
+ case FXBSTR_ID('H', 'T', 0, 0): |
+ pGeneralState->m_pHT = pObject; |
+ break; |
+ case FXBSTR_ID('F', 'L', 0, 0): |
+ pGeneralState->m_Flatness = pObject->GetNumber(); |
+ break; |
+ case FXBSTR_ID('S', 'M', 0, 0): |
+ pGeneralState->m_Smoothness = pObject->GetNumber(); |
+ break; |
+ case FXBSTR_ID('S', 'A', 0, 0): |
+ pGeneralState->m_StrokeAdjust = pObject->GetInteger(); |
+ break; |
+ case FXBSTR_ID('A', 'I', 'S', 0): |
+ pGeneralState->m_AlphaSource = pObject->GetInteger(); |
+ break; |
+ case FXBSTR_ID('T', 'K', 0, 0): |
+ pGeneralState->m_TextKnockout = pObject->GetInteger(); |
+ break; |
+ } |
+ } |
+ pGeneralState->m_Matrix = m_CTM; |
+} |
+CPDF_ContentMarkItem::CPDF_ContentMarkItem() { |
+ m_ParamType = None; |
+} |
+CPDF_ContentMarkItem::CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src) { |
+ m_MarkName = src.m_MarkName; |
+ m_ParamType = src.m_ParamType; |
+ if (m_ParamType == DirectDict) { |
+ m_pParam = ((CPDF_Dictionary*)src.m_pParam)->Clone(); |
+ } else { |
+ m_pParam = src.m_pParam; |
+ } |
+} |
+CPDF_ContentMarkItem::~CPDF_ContentMarkItem() { |
+ if (m_ParamType == DirectDict && m_pParam) { |
+ ((CPDF_Dictionary*)m_pParam)->Release(); |
+ } |
+} |
+FX_BOOL CPDF_ContentMarkItem::HasMCID() const { |
+ if (m_pParam && |
+ (m_ParamType == DirectDict || m_ParamType == PropertiesDict)) { |
+ return ((CPDF_Dictionary*)m_pParam)->KeyExist(FX_BSTRC("MCID")); |
+ } |
+ return FALSE; |
+} |
+CPDF_ContentMarkData::CPDF_ContentMarkData(const CPDF_ContentMarkData& src) { |
+ for (int i = 0; i < src.m_Marks.GetSize(); i++) { |
+ m_Marks.Add(src.m_Marks[i]); |
+ } |
+} |
+int CPDF_ContentMarkData::GetMCID() const { |
+ CPDF_ContentMarkItem::ParamType type = CPDF_ContentMarkItem::None; |
+ for (int i = 0; i < m_Marks.GetSize(); i++) { |
+ type = m_Marks[i].GetParamType(); |
+ if (type == CPDF_ContentMarkItem::PropertiesDict || |
+ type == CPDF_ContentMarkItem::DirectDict) { |
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_Marks[i].GetParam(); |
+ if (pDict->KeyExist(FX_BSTRC("MCID"))) { |
+ return pDict->GetInteger(FX_BSTRC("MCID")); |
+ } |
+ } |
+ } |
+ return -1; |
+} |
+void CPDF_ContentMarkData::AddMark(const CFX_ByteString& name, |
+ CPDF_Dictionary* pDict, |
+ FX_BOOL bDirect) { |
+ CPDF_ContentMarkItem& item = m_Marks.Add(); |
+ item.SetName(name); |
+ if (pDict == NULL) { |
+ return; |
+ } |
+ item.SetParam(bDirect ? CPDF_ContentMarkItem::DirectDict |
+ : CPDF_ContentMarkItem::PropertiesDict, |
+ bDirect ? pDict->Clone() : pDict); |
+} |
+void CPDF_ContentMarkData::DeleteLastMark() { |
+ int size = m_Marks.GetSize(); |
+ if (size == 0) { |
+ return; |
+ } |
+ m_Marks.RemoveAt(size - 1); |
+} |
+FX_BOOL CPDF_ContentMark::HasMark(const CFX_ByteStringC& mark) const { |
+ if (m_pObject == NULL) { |
+ return FALSE; |
+ } |
+ for (int i = 0; i < m_pObject->CountItems(); i++) { |
+ CPDF_ContentMarkItem& item = m_pObject->GetItem(i); |
+ if (item.GetName() == mark) { |
+ return TRUE; |
+ } |
+ } |
+ return FALSE; |
+} |
+FX_BOOL CPDF_ContentMark::LookupMark(const CFX_ByteStringC& mark, |
+ CPDF_Dictionary*& pDict) const { |
+ if (m_pObject == NULL) { |
return FALSE; |
+ } |
+ for (int i = 0; i < m_pObject->CountItems(); i++) { |
+ CPDF_ContentMarkItem& item = m_pObject->GetItem(i); |
+ if (item.GetName() == mark) { |
+ pDict = NULL; |
+ if (item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict || |
+ item.GetParamType() == CPDF_ContentMarkItem::DirectDict) { |
+ pDict = (CPDF_Dictionary*)item.GetParam(); |
+ } |
+ return TRUE; |
+ } |
+ } |
+ return FALSE; |
} |