Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(242)

Side by Side Diff: core/fxge/dib/fx_dib_engine.cpp

Issue 2322903002: Strengthen bounds check in CWeightTable::Calc. (Closed)
Patch Set: Add helper method Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fxge/dib/dib_int.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <limits.h> 7 #include <limits.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 23 matching lines...) Expand all
34 CWeightTable::CWeightTable() 34 CWeightTable::CWeightTable()
35 : m_DestMin(0), 35 : m_DestMin(0),
36 m_ItemSize(0), 36 m_ItemSize(0),
37 m_pWeightTables(nullptr), 37 m_pWeightTables(nullptr),
38 m_dwWeightTablesSize(0) {} 38 m_dwWeightTablesSize(0) {}
39 39
40 CWeightTable::~CWeightTable() { 40 CWeightTable::~CWeightTable() {
41 FX_Free(m_pWeightTables); 41 FX_Free(m_pWeightTables);
42 } 42 }
43 43
44 size_t CWeightTable::GetPixelWeightSize() const {
45 return m_dwWeightTablesSize / sizeof(int);
46 }
47
44 bool CWeightTable::Calc(int dest_len, 48 bool CWeightTable::Calc(int dest_len,
45 int dest_min, 49 int dest_min,
46 int dest_max, 50 int dest_max,
47 int src_len, 51 int src_len,
48 int src_min, 52 int src_min,
49 int src_max, 53 int src_max,
50 int flags) { 54 int flags) {
51 FX_Free(m_pWeightTables); 55 FX_Free(m_pWeightTables);
52 m_pWeightTables = nullptr; 56 m_pWeightTables = nullptr;
53 m_dwWeightTablesSize = 0; 57 m_dwWeightTablesSize = 0;
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 : (FX_FLOAT)(dest_pixel); 232 : (FX_FLOAT)(dest_pixel);
229 double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) 233 double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1)
230 ? (FX_FLOAT)(dest_pixel + 1) 234 ? (FX_FLOAT)(dest_pixel + 1)
231 : dest_end; 235 : dest_end;
232 double weight = area_start >= area_end ? 0.0f : area_end - area_start; 236 double weight = area_start >= area_end ? 0.0f : area_end - area_start;
233 if (weight == 0 && j == end_i) { 237 if (weight == 0 && j == end_i) {
234 pixel_weights.m_SrcEnd--; 238 pixel_weights.m_SrcEnd--;
235 break; 239 break;
236 } 240 }
237 size_t idx = j - start_i; 241 size_t idx = j - start_i;
238 if (idx >= m_dwWeightTablesSize) 242 if (idx >= GetPixelWeightSize())
239 return false; 243 return false;
240 pixel_weights.m_Weights[idx] = FXSYS_round((FX_FLOAT)(weight * 65536)); 244 pixel_weights.m_Weights[idx] = FXSYS_round((FX_FLOAT)(weight * 65536));
241 } 245 }
242 } 246 }
243 return true; 247 return true;
244 } 248 }
245 249
246 PixelWeight* CWeightTable::GetPixelWeight(int pixel) const { 250 PixelWeight* CWeightTable::GetPixelWeight(int pixel) const {
247 ASSERT(pixel >= m_DestMin); 251 ASSERT(pixel >= m_DestMin);
248 return reinterpret_cast<PixelWeight*>(m_pWeightTables + 252 return reinterpret_cast<PixelWeight*>(m_pWeightTables +
249 (pixel - m_DestMin) * m_ItemSize); 253 (pixel - m_DestMin) * m_ItemSize);
250 } 254 }
251 255
252 int* CWeightTable::GetValueFromPixelWeight(PixelWeight* pWeight, 256 int* CWeightTable::GetValueFromPixelWeight(PixelWeight* pWeight,
253 int index) const { 257 int index) const {
254 if (index < pWeight->m_SrcStart) 258 if (index < pWeight->m_SrcStart)
255 return nullptr; 259 return nullptr;
256 260
257 size_t idx = index - pWeight->m_SrcStart; 261 size_t idx = index - pWeight->m_SrcStart;
258 return idx < m_dwWeightTablesSize ? &pWeight->m_Weights[idx] : nullptr; 262 return idx < GetPixelWeightSize() ? &pWeight->m_Weights[idx] : nullptr;
259 } 263 }
260 264
261 CStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap, 265 CStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap,
262 FXDIB_Format dest_format, 266 FXDIB_Format dest_format,
263 int dest_width, 267 int dest_width,
264 int dest_height, 268 int dest_height,
265 const FX_RECT& clip_rect, 269 const FX_RECT& clip_rect,
266 const CFX_DIBSource* pSrcBitmap, 270 const CFX_DIBSource* pSrcBitmap,
267 int flags) { 271 int flags) {
268 m_State = 0; 272 m_State = 0;
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
994 result_width); 998 result_width);
995 if (m_pMaskScanline) { 999 if (m_pMaskScanline) {
996 m_pSource->m_pAlphaMask->DownSampleScanline( 1000 m_pSource->m_pAlphaMask->DownSampleScanline(
997 src_y, m_pMaskScanline.get(), 1, m_DestWidth, m_bFlipX, 1001 src_y, m_pMaskScanline.get(), 1, m_DestWidth, m_bFlipX,
998 m_ClipRect.left, result_width); 1002 m_ClipRect.left, result_width);
999 } 1003 }
1000 m_pDest->ComposeScanline(dest_y, m_pScanline.get(), m_pMaskScanline.get()); 1004 m_pDest->ComposeScanline(dest_y, m_pScanline.get(), m_pMaskScanline.get());
1001 } 1005 }
1002 return FALSE; 1006 return FALSE;
1003 } 1007 }
OLDNEW
« no previous file with comments | « core/fxge/dib/dib_int.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698