| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/include/fpdfapi/fpdf_pageobj.h" | 7 #include "core/include/fpdfapi/fpdf_pageobj.h" |
| 8 #include "core/include/fpdfdoc/fpdf_doc.h" | 8 #include "core/include/fpdfdoc/fpdf_doc.h" |
| 9 | 9 |
| 10 CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) | 10 CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) |
| 11 : m_pDocument(pPage->m_pDocument) { | 11 : m_pDocument(pPage->m_pDocument) { |
| 12 if (!pPage->m_pFormDict) | 12 if (!pPage->m_pFormDict) |
| 13 return; | 13 return; |
| 14 | 14 |
| 15 CPDF_Array* pAnnots = pPage->m_pFormDict->GetArray("Annots"); | 15 CPDF_Array* pAnnots = pPage->m_pFormDict->GetArrayBy("Annots"); |
| 16 if (!pAnnots) | 16 if (!pAnnots) |
| 17 return; | 17 return; |
| 18 | 18 |
| 19 CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); | 19 CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); |
| 20 CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm"); | 20 CPDF_Dictionary* pAcroForm = pRoot->GetDictBy("AcroForm"); |
| 21 FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean("NeedAppearances"); | 21 FX_BOOL bRegenerateAP = |
| 22 pAcroForm && pAcroForm->GetBooleanBy("NeedAppearances"); |
| 22 for (FX_DWORD i = 0; i < pAnnots->GetCount(); ++i) { | 23 for (FX_DWORD i = 0; i < pAnnots->GetCount(); ++i) { |
| 23 CPDF_Dictionary* pDict = ToDictionary(pAnnots->GetElementValue(i)); | 24 CPDF_Dictionary* pDict = ToDictionary(pAnnots->GetElementValue(i)); |
| 24 if (!pDict) | 25 if (!pDict) |
| 25 continue; | 26 continue; |
| 26 | 27 |
| 27 FX_DWORD dwObjNum = pDict->GetObjNum(); | 28 FX_DWORD dwObjNum = pDict->GetObjNum(); |
| 28 if (dwObjNum == 0) { | 29 if (dwObjNum == 0) { |
| 29 dwObjNum = m_pDocument->AddIndirectObject(pDict); | 30 dwObjNum = m_pDocument->AddIndirectObject(pDict); |
| 30 CPDF_Reference* pAction = new CPDF_Reference(m_pDocument, dwObjNum); | 31 CPDF_Reference* pAction = new CPDF_Reference(m_pDocument, dwObjNum); |
| 31 pAnnots->InsertAt(i, pAction); | 32 pAnnots->InsertAt(i, pAction); |
| 32 pAnnots->RemoveAt(i + 1); | 33 pAnnots->RemoveAt(i + 1); |
| 33 pDict = pAnnots->GetDict(i); | 34 pDict = pAnnots->GetDictAt(i); |
| 34 } | 35 } |
| 35 m_AnnotList.push_back(new CPDF_Annot(pDict, this)); | 36 m_AnnotList.push_back(new CPDF_Annot(pDict, this)); |
| 36 if (bRegenerateAP && pDict->GetConstString("Subtype") == "Widget" && | 37 if (bRegenerateAP && pDict->GetConstStringBy("Subtype") == "Widget" && |
| 37 CPDF_InterForm::UpdatingAPEnabled()) { | 38 CPDF_InterForm::UpdatingAPEnabled()) { |
| 38 FPDF_GenerateAP(m_pDocument, pDict); | 39 FPDF_GenerateAP(m_pDocument, pDict); |
| 39 } | 40 } |
| 40 } | 41 } |
| 41 } | 42 } |
| 42 | 43 |
| 43 CPDF_AnnotList::~CPDF_AnnotList() { | 44 CPDF_AnnotList::~CPDF_AnnotList() { |
| 44 for (CPDF_Annot* annot : m_AnnotList) | 45 for (CPDF_Annot* annot : m_AnnotList) |
| 45 delete annot; | 46 delete annot; |
| 46 } | 47 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 65 if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) | 66 if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) |
| 66 continue; | 67 continue; |
| 67 | 68 |
| 68 if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) | 69 if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) |
| 69 continue; | 70 continue; |
| 70 | 71 |
| 71 if (pOptions) { | 72 if (pOptions) { |
| 72 IPDF_OCContext* pOCContext = pOptions->m_pOCContext; | 73 IPDF_OCContext* pOCContext = pOptions->m_pOCContext; |
| 73 CPDF_Dictionary* pAnnotDict = pAnnot->GetAnnotDict(); | 74 CPDF_Dictionary* pAnnotDict = pAnnot->GetAnnotDict(); |
| 74 if (pOCContext && pAnnotDict && | 75 if (pOCContext && pAnnotDict && |
| 75 !pOCContext->CheckOCGVisible(pAnnotDict->GetDict("OC"))) { | 76 !pOCContext->CheckOCGVisible(pAnnotDict->GetDictBy("OC"))) { |
| 76 continue; | 77 continue; |
| 77 } | 78 } |
| 78 } | 79 } |
| 79 CPDF_Rect annot_rect_f; | 80 CPDF_Rect annot_rect_f; |
| 80 pAnnot->GetRect(annot_rect_f); | 81 pAnnot->GetRect(annot_rect_f); |
| 81 CFX_Matrix matrix = *pMatrix; | 82 CFX_Matrix matrix = *pMatrix; |
| 82 if (clip_rect) { | 83 if (clip_rect) { |
| 83 annot_rect_f.Transform(&matrix); | 84 annot_rect_f.Transform(&matrix); |
| 84 FX_RECT annot_rect = annot_rect_f.GetOutterRect(); | 85 FX_RECT annot_rect = annot_rect_f.GetOutterRect(); |
| 85 annot_rect.Intersect(*clip_rect); | 86 annot_rect.Intersect(*clip_rect); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 110 } | 111 } |
| 111 if (dwAnnotFlags & 0x02) { | 112 if (dwAnnotFlags & 0x02) { |
| 112 DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE, | 113 DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE, |
| 113 pOptions, pClipRect); | 114 pOptions, pClipRect); |
| 114 } | 115 } |
| 115 } | 116 } |
| 116 | 117 |
| 117 CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList) | 118 CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList) |
| 118 : m_pAnnotDict(pDict), | 119 : m_pAnnotDict(pDict), |
| 119 m_pList(pList), | 120 m_pList(pList), |
| 120 m_sSubtype(m_pAnnotDict->GetConstString("Subtype")) {} | 121 m_sSubtype(m_pAnnotDict->GetConstStringBy("Subtype")) {} |
| 121 CPDF_Annot::~CPDF_Annot() { | 122 CPDF_Annot::~CPDF_Annot() { |
| 122 ClearCachedAP(); | 123 ClearCachedAP(); |
| 123 } | 124 } |
| 124 void CPDF_Annot::ClearCachedAP() { | 125 void CPDF_Annot::ClearCachedAP() { |
| 125 for (const auto& pair : m_APMap) { | 126 for (const auto& pair : m_APMap) { |
| 126 delete pair.second; | 127 delete pair.second; |
| 127 } | 128 } |
| 128 m_APMap.clear(); | 129 m_APMap.clear(); |
| 129 } | 130 } |
| 130 CFX_ByteString CPDF_Annot::GetSubType() const { | 131 CFX_ByteString CPDF_Annot::GetSubType() const { |
| 131 return m_sSubtype; | 132 return m_sSubtype; |
| 132 } | 133 } |
| 133 | 134 |
| 134 void CPDF_Annot::GetRect(CPDF_Rect& rect) const { | 135 void CPDF_Annot::GetRect(CPDF_Rect& rect) const { |
| 135 if (!m_pAnnotDict) { | 136 if (!m_pAnnotDict) { |
| 136 return; | 137 return; |
| 137 } | 138 } |
| 138 rect = m_pAnnotDict->GetRect("Rect"); | 139 rect = m_pAnnotDict->GetRectBy("Rect"); |
| 139 rect.Normalize(); | 140 rect.Normalize(); |
| 140 } | 141 } |
| 141 | 142 |
| 142 FX_DWORD CPDF_Annot::GetFlags() const { | 143 FX_DWORD CPDF_Annot::GetFlags() const { |
| 143 return m_pAnnotDict->GetInteger("F"); | 144 return m_pAnnotDict->GetIntegerBy("F"); |
| 144 } | 145 } |
| 145 | 146 |
| 146 CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, | 147 CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, |
| 147 CPDF_Annot::AppearanceMode mode) { | 148 CPDF_Annot::AppearanceMode mode) { |
| 148 CPDF_Dictionary* pAP = pAnnotDict->GetDict("AP"); | 149 CPDF_Dictionary* pAP = pAnnotDict->GetDictBy("AP"); |
| 149 if (!pAP) { | 150 if (!pAP) { |
| 150 return NULL; | 151 return NULL; |
| 151 } | 152 } |
| 152 const FX_CHAR* ap_entry = "N"; | 153 const FX_CHAR* ap_entry = "N"; |
| 153 if (mode == CPDF_Annot::Down) | 154 if (mode == CPDF_Annot::Down) |
| 154 ap_entry = "D"; | 155 ap_entry = "D"; |
| 155 else if (mode == CPDF_Annot::Rollover) | 156 else if (mode == CPDF_Annot::Rollover) |
| 156 ap_entry = "R"; | 157 ap_entry = "R"; |
| 157 if (!pAP->KeyExist(ap_entry)) | 158 if (!pAP->KeyExist(ap_entry)) |
| 158 ap_entry = "N"; | 159 ap_entry = "N"; |
| 159 | 160 |
| 160 CPDF_Object* psub = pAP->GetElementValue(ap_entry); | 161 CPDF_Object* psub = pAP->GetElementValue(ap_entry); |
| 161 if (!psub) | 162 if (!psub) |
| 162 return nullptr; | 163 return nullptr; |
| 163 if (CPDF_Stream* pStream = psub->AsStream()) | 164 if (CPDF_Stream* pStream = psub->AsStream()) |
| 164 return pStream; | 165 return pStream; |
| 165 | 166 |
| 166 if (CPDF_Dictionary* pDict = psub->AsDictionary()) { | 167 if (CPDF_Dictionary* pDict = psub->AsDictionary()) { |
| 167 CFX_ByteString as = pAnnotDict->GetString("AS"); | 168 CFX_ByteString as = pAnnotDict->GetStringBy("AS"); |
| 168 if (as.IsEmpty()) { | 169 if (as.IsEmpty()) { |
| 169 CFX_ByteString value = pAnnotDict->GetString("V"); | 170 CFX_ByteString value = pAnnotDict->GetStringBy("V"); |
| 170 if (value.IsEmpty()) { | 171 if (value.IsEmpty()) { |
| 171 CPDF_Dictionary* pDict = pAnnotDict->GetDict("Parent"); | 172 CPDF_Dictionary* pDict = pAnnotDict->GetDictBy("Parent"); |
| 172 value = pDict ? pDict->GetString("V") : CFX_ByteString(); | 173 value = pDict ? pDict->GetStringBy("V") : CFX_ByteString(); |
| 173 } | 174 } |
| 174 if (value.IsEmpty() || !pDict->KeyExist(value)) | 175 if (value.IsEmpty() || !pDict->KeyExist(value)) |
| 175 as = "Off"; | 176 as = "Off"; |
| 176 else | 177 else |
| 177 as = value; | 178 as = value; |
| 178 } | 179 } |
| 179 return pDict->GetStream(as); | 180 return pDict->GetStreamBy(as); |
| 180 } | 181 } |
| 181 return nullptr; | 182 return nullptr; |
| 182 } | 183 } |
| 183 | 184 |
| 184 CPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode) { | 185 CPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode) { |
| 185 CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode); | 186 CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode); |
| 186 if (!pStream) | 187 if (!pStream) |
| 187 return nullptr; | 188 return nullptr; |
| 188 | 189 |
| 189 auto it = m_APMap.find(pStream); | 190 auto it = m_APMap.find(pStream); |
| 190 if (it != m_APMap.end()) | 191 if (it != m_APMap.end()) |
| 191 return it->second; | 192 return it->second; |
| 192 | 193 |
| 193 CPDF_Form* pNewForm = | 194 CPDF_Form* pNewForm = |
| 194 new CPDF_Form(m_pList->GetDocument(), pPage->m_pResources, pStream); | 195 new CPDF_Form(m_pList->GetDocument(), pPage->m_pResources, pStream); |
| 195 pNewForm->ParseContent(nullptr, nullptr, nullptr, nullptr); | 196 pNewForm->ParseContent(nullptr, nullptr, nullptr, nullptr); |
| 196 m_APMap[pStream] = pNewForm; | 197 m_APMap[pStream] = pNewForm; |
| 197 return pNewForm; | 198 return pNewForm; |
| 198 } | 199 } |
| 199 | 200 |
| 200 static CPDF_Form* FPDFDOC_Annot_GetMatrix(const CPDF_Page* pPage, | 201 static CPDF_Form* FPDFDOC_Annot_GetMatrix(const CPDF_Page* pPage, |
| 201 CPDF_Annot* pAnnot, | 202 CPDF_Annot* pAnnot, |
| 202 CPDF_Annot::AppearanceMode mode, | 203 CPDF_Annot::AppearanceMode mode, |
| 203 const CFX_Matrix* pUser2Device, | 204 const CFX_Matrix* pUser2Device, |
| 204 CFX_Matrix& matrix) { | 205 CFX_Matrix& matrix) { |
| 205 CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode); | 206 CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode); |
| 206 if (!pForm) { | 207 if (!pForm) { |
| 207 return NULL; | 208 return NULL; |
| 208 } | 209 } |
| 209 CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRect("BBox"); | 210 CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRectBy("BBox"); |
| 210 CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrix("Matrix"); | 211 CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrixBy("Matrix"); |
| 211 form_matrix.TransformRect(form_bbox); | 212 form_matrix.TransformRect(form_bbox); |
| 212 CPDF_Rect arect; | 213 CPDF_Rect arect; |
| 213 pAnnot->GetRect(arect); | 214 pAnnot->GetRect(arect); |
| 214 matrix.MatchRect(arect, form_bbox); | 215 matrix.MatchRect(arect, form_bbox); |
| 215 matrix.Concat(*pUser2Device); | 216 matrix.Concat(*pUser2Device); |
| 216 return pForm; | 217 return pForm; |
| 217 } | 218 } |
| 218 FX_BOOL CPDF_Annot::DrawAppearance(CPDF_Page* pPage, | 219 FX_BOOL CPDF_Annot::DrawAppearance(CPDF_Page* pPage, |
| 219 CFX_RenderDevice* pDevice, | 220 CFX_RenderDevice* pDevice, |
| 220 const CFX_Matrix* pUser2Device, | 221 const CFX_Matrix* pUser2Device, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 return; | 256 return; |
| 256 } | 257 } |
| 257 FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || | 258 FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || |
| 258 (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); | 259 (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); |
| 259 if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { | 260 if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { |
| 260 return; | 261 return; |
| 261 } | 262 } |
| 262 if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { | 263 if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { |
| 263 return; | 264 return; |
| 264 } | 265 } |
| 265 CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS"); | 266 CPDF_Dictionary* pBS = m_pAnnotDict->GetDictBy("BS"); |
| 266 char style_char; | 267 char style_char; |
| 267 FX_FLOAT width; | 268 FX_FLOAT width; |
| 268 CPDF_Array* pDashArray = NULL; | 269 CPDF_Array* pDashArray = NULL; |
| 269 if (!pBS) { | 270 if (!pBS) { |
| 270 CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border"); | 271 CPDF_Array* pBorderArray = m_pAnnotDict->GetArrayBy("Border"); |
| 271 style_char = 'S'; | 272 style_char = 'S'; |
| 272 if (pBorderArray) { | 273 if (pBorderArray) { |
| 273 width = pBorderArray->GetNumber(2); | 274 width = pBorderArray->GetNumberAt(2); |
| 274 if (pBorderArray->GetCount() == 4) { | 275 if (pBorderArray->GetCount() == 4) { |
| 275 pDashArray = pBorderArray->GetArray(3); | 276 pDashArray = pBorderArray->GetArrayAt(3); |
| 276 if (!pDashArray) { | 277 if (!pDashArray) { |
| 277 return; | 278 return; |
| 278 } | 279 } |
| 279 int nLen = pDashArray->GetCount(); | 280 int nLen = pDashArray->GetCount(); |
| 280 int i = 0; | 281 int i = 0; |
| 281 for (; i < nLen; ++i) { | 282 for (; i < nLen; ++i) { |
| 282 CPDF_Object* pObj = pDashArray->GetElementValue(i); | 283 CPDF_Object* pObj = pDashArray->GetElementValue(i); |
| 283 if (pObj && pObj->GetInteger()) { | 284 if (pObj && pObj->GetInteger()) { |
| 284 break; | 285 break; |
| 285 } | 286 } |
| 286 } | 287 } |
| 287 if (i == nLen) { | 288 if (i == nLen) { |
| 288 return; | 289 return; |
| 289 } | 290 } |
| 290 style_char = 'D'; | 291 style_char = 'D'; |
| 291 } | 292 } |
| 292 } else { | 293 } else { |
| 293 width = 1; | 294 width = 1; |
| 294 } | 295 } |
| 295 } else { | 296 } else { |
| 296 CFX_ByteString style = pBS->GetString("S"); | 297 CFX_ByteString style = pBS->GetStringBy("S"); |
| 297 pDashArray = pBS->GetArray("D"); | 298 pDashArray = pBS->GetArrayBy("D"); |
| 298 style_char = style[1]; | 299 style_char = style[1]; |
| 299 width = pBS->GetNumber("W"); | 300 width = pBS->GetNumberBy("W"); |
| 300 } | 301 } |
| 301 if (width <= 0) { | 302 if (width <= 0) { |
| 302 return; | 303 return; |
| 303 } | 304 } |
| 304 CPDF_Array* pColor = m_pAnnotDict->GetArray("C"); | 305 CPDF_Array* pColor = m_pAnnotDict->GetArrayBy("C"); |
| 305 FX_DWORD argb = 0xff000000; | 306 FX_DWORD argb = 0xff000000; |
| 306 if (pColor) { | 307 if (pColor) { |
| 307 int R = (int32_t)(pColor->GetNumber(0) * 255); | 308 int R = (int32_t)(pColor->GetNumberAt(0) * 255); |
| 308 int G = (int32_t)(pColor->GetNumber(1) * 255); | 309 int G = (int32_t)(pColor->GetNumberAt(1) * 255); |
| 309 int B = (int32_t)(pColor->GetNumber(2) * 255); | 310 int B = (int32_t)(pColor->GetNumberAt(2) * 255); |
| 310 argb = ArgbEncode(0xff, R, G, B); | 311 argb = ArgbEncode(0xff, R, G, B); |
| 311 } | 312 } |
| 312 CPDF_GraphStateData graph_state; | 313 CPDF_GraphStateData graph_state; |
| 313 graph_state.m_LineWidth = width; | 314 graph_state.m_LineWidth = width; |
| 314 if (style_char == 'D') { | 315 if (style_char == 'D') { |
| 315 if (pDashArray) { | 316 if (pDashArray) { |
| 316 FX_DWORD dash_count = pDashArray->GetCount(); | 317 FX_DWORD dash_count = pDashArray->GetCount(); |
| 317 if (dash_count % 2) { | 318 if (dash_count % 2) { |
| 318 dash_count++; | 319 dash_count++; |
| 319 } | 320 } |
| 320 graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count); | 321 graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count); |
| 321 graph_state.m_DashCount = dash_count; | 322 graph_state.m_DashCount = dash_count; |
| 322 FX_DWORD i; | 323 FX_DWORD i; |
| 323 for (i = 0; i < pDashArray->GetCount(); ++i) { | 324 for (i = 0; i < pDashArray->GetCount(); ++i) { |
| 324 graph_state.m_DashArray[i] = pDashArray->GetNumber(i); | 325 graph_state.m_DashArray[i] = pDashArray->GetNumberAt(i); |
| 325 } | 326 } |
| 326 if (i < dash_count) { | 327 if (i < dash_count) { |
| 327 graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1]; | 328 graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1]; |
| 328 } | 329 } |
| 329 } else { | 330 } else { |
| 330 graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2); | 331 graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2); |
| 331 graph_state.m_DashCount = 2; | 332 graph_state.m_DashCount = 2; |
| 332 graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f; | 333 graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f; |
| 333 } | 334 } |
| 334 } | 335 } |
| 335 CFX_FloatRect rect; | 336 CFX_FloatRect rect; |
| 336 GetRect(rect); | 337 GetRect(rect); |
| 337 CPDF_PathData path; | 338 CPDF_PathData path; |
| 338 width /= 2; | 339 width /= 2; |
| 339 path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, | 340 path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, |
| 340 rect.top - width); | 341 rect.top - width); |
| 341 int fill_type = 0; | 342 int fill_type = 0; |
| 342 if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) { | 343 if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) { |
| 343 fill_type |= FXFILL_NOPATHSMOOTH; | 344 fill_type |= FXFILL_NOPATHSMOOTH; |
| 344 } | 345 } |
| 345 pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type); | 346 pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type); |
| 346 } | 347 } |
| OLD | NEW |