| 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 "../../include/fxcrt/fx_basic.h" | 7 #include "../../include/fxcrt/fx_basic.h" |
| 8 #include "../../../third_party/base/numerics/safe_math.h" | 8 #include "../../../third_party/base/numerics/safe_math.h" |
| 9 | 9 |
| 10 CFX_BasicArray::CFX_BasicArray(int unit_size) | 10 CFX_BasicArray::CFX_BasicArray(int unit_size) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 return 0 == nNewSize; | 31 return 0 == nNewSize; |
| 32 } | 32 } |
| 33 | 33 |
| 34 if (m_pData == NULL) { | 34 if (m_pData == NULL) { |
| 35 pdfium::base::CheckedNumeric<int> totalSize = nNewSize; | 35 pdfium::base::CheckedNumeric<int> totalSize = nNewSize; |
| 36 totalSize *= m_nUnitSize; | 36 totalSize *= m_nUnitSize; |
| 37 if (!totalSize.IsValid()) { | 37 if (!totalSize.IsValid()) { |
| 38 m_nSize = m_nMaxSize = 0; | 38 m_nSize = m_nMaxSize = 0; |
| 39 return FALSE; | 39 return FALSE; |
| 40 } | 40 } |
| 41 m_pData = FX_Alloc(FX_BYTE, totalSize.ValueOrDie()); | 41 m_pData = FX_Alloc(uint8_t, totalSize.ValueOrDie()); |
| 42 m_nSize = m_nMaxSize = nNewSize; | 42 m_nSize = m_nMaxSize = nNewSize; |
| 43 } else if (nNewSize <= m_nMaxSize) { | 43 } else if (nNewSize <= m_nMaxSize) { |
| 44 if (nNewSize > m_nSize) { | 44 if (nNewSize > m_nSize) { |
| 45 FXSYS_memset32(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSi
ze) * m_nUnitSize); | 45 FXSYS_memset32(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSi
ze) * m_nUnitSize); |
| 46 } | 46 } |
| 47 m_nSize = nNewSize; | 47 m_nSize = nNewSize; |
| 48 } else { | 48 } else { |
| 49 int nNewMax = nNewSize < m_nMaxSize ? m_nMaxSize : nNewSize; | 49 int nNewMax = nNewSize < m_nMaxSize ? m_nMaxSize : nNewSize; |
| 50 pdfium::base::CheckedNumeric<int> totalSize = nNewMax; | 50 pdfium::base::CheckedNumeric<int> totalSize = nNewMax; |
| 51 totalSize *= m_nUnitSize; | 51 totalSize *= m_nUnitSize; |
| 52 if (!totalSize.IsValid() || nNewMax < m_nSize) { | 52 if (!totalSize.IsValid() || nNewMax < m_nSize) { |
| 53 return FALSE; | 53 return FALSE; |
| 54 } | 54 } |
| 55 FX_LPBYTE pNewData = FX_Realloc(FX_BYTE, m_pData, totalSize.ValueOrDie()
); | 55 FX_LPBYTE pNewData = FX_Realloc(uint8_t, m_pData, totalSize.ValueOrDie()
); |
| 56 if (pNewData == NULL) { | 56 if (pNewData == NULL) { |
| 57 return FALSE; | 57 return FALSE; |
| 58 } | 58 } |
| 59 FXSYS_memset32(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize)
* m_nUnitSize); | 59 FXSYS_memset32(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize)
* m_nUnitSize); |
| 60 m_pData = pNewData; | 60 m_pData = pNewData; |
| 61 m_nSize = nNewSize; | 61 m_nSize = nNewSize; |
| 62 m_nMaxSize = nNewMax; | 62 m_nMaxSize = nNewMax; |
| 63 } | 63 } |
| 64 return TRUE; | 64 return TRUE; |
| 65 } | 65 } |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 _ClearIndex(m_IndexDepth, m_IndexSize, (void**)m_pIndex); | 178 _ClearIndex(m_IndexDepth, m_IndexSize, (void**)m_pIndex); |
| 179 m_pIndex = NULL; | 179 m_pIndex = NULL; |
| 180 m_IndexDepth = 0; | 180 m_IndexDepth = 0; |
| 181 m_DataSize = 0; | 181 m_DataSize = 0; |
| 182 } | 182 } |
| 183 void* CFX_BaseSegmentedArray::Add() | 183 void* CFX_BaseSegmentedArray::Add() |
| 184 { | 184 { |
| 185 if (m_DataSize % m_SegmentSize) { | 185 if (m_DataSize % m_SegmentSize) { |
| 186 return GetAt(m_DataSize ++); | 186 return GetAt(m_DataSize ++); |
| 187 } | 187 } |
| 188 void* pSegment = FX_Alloc2D(FX_BYTE, m_UnitSize, m_SegmentSize); | 188 void* pSegment = FX_Alloc2D(uint8_t, m_UnitSize, m_SegmentSize); |
| 189 if (m_pIndex == NULL) { | 189 if (m_pIndex == NULL) { |
| 190 m_pIndex = pSegment; | 190 m_pIndex = pSegment; |
| 191 m_DataSize ++; | 191 m_DataSize ++; |
| 192 return pSegment; | 192 return pSegment; |
| 193 } | 193 } |
| 194 if (m_IndexDepth == 0) { | 194 if (m_IndexDepth == 0) { |
| 195 void** pIndex = (void**)FX_Alloc(void*, m_IndexSize); | 195 void** pIndex = (void**)FX_Alloc(void*, m_IndexSize); |
| 196 pIndex[0] = m_pIndex; | 196 pIndex[0] = m_pIndex; |
| 197 pIndex[1] = pSegment; | 197 pIndex[1] = pSegment; |
| 198 m_pIndex = pIndex; | 198 m_pIndex = pIndex; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 int seg_index = index / m_SegmentSize; | 308 int seg_index = index / m_SegmentSize; |
| 309 return (FX_LPBYTE)GetIndex(seg_index)[seg_index % m_IndexSize] + (index % m_
SegmentSize) * m_UnitSize; | 309 return (FX_LPBYTE)GetIndex(seg_index)[seg_index % m_IndexSize] + (index % m_
SegmentSize) * m_UnitSize; |
| 310 } | 310 } |
| 311 void CFX_BaseSegmentedArray::Delete(int index, int count) | 311 void CFX_BaseSegmentedArray::Delete(int index, int count) |
| 312 { | 312 { |
| 313 if(index < 0 || count < 1 || index + count > m_DataSize) { | 313 if(index < 0 || count < 1 || index + count > m_DataSize) { |
| 314 return; | 314 return; |
| 315 } | 315 } |
| 316 int i; | 316 int i; |
| 317 for (i = index; i < m_DataSize - count; i ++) { | 317 for (i = index; i < m_DataSize - count; i ++) { |
| 318 FX_BYTE* pSrc = (FX_BYTE*)GetAt(i + count); | 318 uint8_t* pSrc = (uint8_t*)GetAt(i + count); |
| 319 FX_BYTE* pDest = (FX_BYTE*)GetAt(i); | 319 uint8_t* pDest = (uint8_t*)GetAt(i); |
| 320 for (int j = 0; j < m_UnitSize; j ++) { | 320 for (int j = 0; j < m_UnitSize; j ++) { |
| 321 pDest[j] = pSrc[j]; | 321 pDest[j] = pSrc[j]; |
| 322 } | 322 } |
| 323 } | 323 } |
| 324 int new_segs = (m_DataSize - count + m_SegmentSize - 1) / m_SegmentSize; | 324 int new_segs = (m_DataSize - count + m_SegmentSize - 1) / m_SegmentSize; |
| 325 int old_segs = (m_DataSize + m_SegmentSize - 1) / m_SegmentSize; | 325 int old_segs = (m_DataSize + m_SegmentSize - 1) / m_SegmentSize; |
| 326 if (new_segs < old_segs) { | 326 if (new_segs < old_segs) { |
| 327 if(m_IndexDepth) { | 327 if(m_IndexDepth) { |
| 328 for (i = new_segs; i < old_segs; i ++) { | 328 for (i = new_segs; i < old_segs; i ++) { |
| 329 void** pIndex = GetIndex(i); | 329 void** pIndex = GetIndex(i); |
| 330 FX_Free(pIndex[i % m_IndexSize]); | 330 FX_Free(pIndex[i % m_IndexSize]); |
| 331 pIndex[i % m_IndexSize] = NULL; | 331 pIndex[i % m_IndexSize] = NULL; |
| 332 } | 332 } |
| 333 } else { | 333 } else { |
| 334 FX_Free(m_pIndex); | 334 FX_Free(m_pIndex); |
| 335 m_pIndex = NULL; | 335 m_pIndex = NULL; |
| 336 } | 336 } |
| 337 } | 337 } |
| 338 m_DataSize -= count; | 338 m_DataSize -= count; |
| 339 } | 339 } |
| OLD | NEW |