OLD | NEW |
---|---|
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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/fpdfapi/render/cpdf_imagerenderer.h" | 7 #include "core/fpdfapi/render/cpdf_imagerenderer.h" |
8 | 8 |
9 #include <algorithm> | |
9 #include <memory> | 10 #include <memory> |
10 | 11 |
11 #include "core/fpdfapi/page/cpdf_docpagedata.h" | 12 #include "core/fpdfapi/page/cpdf_docpagedata.h" |
12 #include "core/fpdfapi/page/cpdf_image.h" | 13 #include "core/fpdfapi/page/cpdf_image.h" |
13 #include "core/fpdfapi/page/cpdf_imageobject.h" | 14 #include "core/fpdfapi/page/cpdf_imageobject.h" |
14 #include "core/fpdfapi/page/cpdf_page.h" | 15 #include "core/fpdfapi/page/cpdf_page.h" |
15 #include "core/fpdfapi/page/cpdf_pageobject.h" | 16 #include "core/fpdfapi/page/cpdf_pageobject.h" |
16 #include "core/fpdfapi/page/cpdf_shadingpattern.h" | 17 #include "core/fpdfapi/page/cpdf_shadingpattern.h" |
17 #include "core/fpdfapi/page/cpdf_tilingpattern.h" | 18 #include "core/fpdfapi/page/cpdf_tilingpattern.h" |
18 #include "core/fpdfapi/parser/cpdf_array.h" | 19 #include "core/fpdfapi/parser/cpdf_array.h" |
(...skipping 30 matching lines...) Expand all Loading... | |
49 if (m_DeviceHandle) | 50 if (m_DeviceHandle) |
50 m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle); | 51 m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle); |
51 } | 52 } |
52 | 53 |
53 bool CPDF_ImageRenderer::StartLoadDIBSource() { | 54 bool CPDF_ImageRenderer::StartLoadDIBSource() { |
54 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); | 55 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); |
55 FX_RECT image_rect = image_rect_f.GetOuterRect(); | 56 FX_RECT image_rect = image_rect_f.GetOuterRect(); |
56 if (!image_rect.Valid()) | 57 if (!image_rect.Valid()) |
57 return false; | 58 return false; |
58 | 59 |
59 int dest_width = image_rect.Width(); | 60 int dest_width = |
60 int dest_height = image_rect.Height(); | 61 m_ImageMatrix.a >= 0 ? image_rect.Width() : -image_rect.Width(); |
61 if (m_ImageMatrix.a < 0) | 62 int dest_height = |
62 dest_width = -dest_width; | 63 m_ImageMatrix.d <= 0 ? image_rect.Height() : -image_rect.Height(); |
63 if (m_ImageMatrix.d > 0) | |
64 dest_height = -dest_height; | |
65 if (m_Loader.Start( | 64 if (m_Loader.Start( |
66 m_pImageObject, m_pRenderStatus->m_pContext->GetPageCache(), m_bStdCS, | 65 m_pImageObject, m_pRenderStatus->m_pContext->GetPageCache(), m_bStdCS, |
67 m_pRenderStatus->m_GroupFamily, m_pRenderStatus->m_bLoadMask, | 66 m_pRenderStatus->m_GroupFamily, m_pRenderStatus->m_bLoadMask, |
68 m_pRenderStatus, dest_width, dest_height)) { | 67 m_pRenderStatus, dest_width, dest_height)) { |
69 m_Status = 4; | 68 m_Status = 4; |
70 return true; | 69 return true; |
71 } | 70 } |
72 return false; | 71 return false; |
73 } | 72 } |
74 | 73 |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
218 m_pDIBSource = pDIBSource; | 217 m_pDIBSource = pDIBSource; |
219 m_FillArgb = bitmap_argb; | 218 m_FillArgb = bitmap_argb; |
220 m_BitmapAlpha = bitmap_alpha; | 219 m_BitmapAlpha = bitmap_alpha; |
221 m_ImageMatrix = *pImage2Device; | 220 m_ImageMatrix = *pImage2Device; |
222 m_Flags = flags; | 221 m_Flags = flags; |
223 m_bStdCS = bStdCS; | 222 m_bStdCS = bStdCS; |
224 m_BlendType = blendType; | 223 m_BlendType = blendType; |
225 return StartDIBSource(); | 224 return StartDIBSource(); |
226 } | 225 } |
227 | 226 |
228 bool CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device) { | 227 bool CPDF_ImageRenderer::NotDrawing() { |
229 if (m_pRenderStatus->m_bPrint && | 228 bool bRet = m_pRenderStatus->m_bPrint && |
230 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { | 229 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE); |
230 if (bRet) | |
231 m_Result = false; | 231 m_Result = false; |
Tom Sepez
2016/11/28 18:42:53
I'd prefer to make this a const method, and make t
npm
2016/11/28 20:51:30
Done.
| |
232 return false; | 232 return bRet; |
233 } | 233 } |
234 | |
235 FX_RECT CPDF_ImageRenderer::GetDrawRect() { | |
234 FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOuterRect(); | 236 FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOuterRect(); |
235 rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); | 237 rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); |
238 return rect; | |
239 } | |
240 | |
241 CFX_Matrix CPDF_ImageRenderer::GetDrawMatrix(const FX_RECT& rect) { | |
242 CFX_Matrix new_matrix = m_ImageMatrix; | |
243 new_matrix.TranslateI(-rect.left, -rect.top); | |
244 return new_matrix; | |
245 } | |
246 | |
247 void CPDF_ImageRenderer::CalculateDrawImage(CFX_FxgeDevice* pBitmapDevice1, | |
248 CFX_FxgeDevice* pBitmapDevice2, | |
249 const CFX_DIBSource* pDIBSource, | |
250 CFX_Matrix* pNewMatrix, | |
251 const FX_RECT& rect) { | |
252 CPDF_RenderStatus bitmap_render; | |
253 bitmap_render.Initialize(m_pRenderStatus->m_pContext, pBitmapDevice2, nullptr, | |
254 nullptr, nullptr, nullptr, nullptr, 0, | |
255 m_pRenderStatus->m_bDropObjects, nullptr, true); | |
256 CPDF_ImageRenderer image_render; | |
257 if (image_render.Start(&bitmap_render, pDIBSource, 0xffffffff, 255, | |
258 pNewMatrix, m_Flags, true, FXDIB_BLEND_NORMAL)) { | |
259 image_render.Continue(nullptr); | |
260 } | |
261 if (m_Loader.m_MatteColor == 0xffffffff) | |
262 return; | |
263 int matte_r = FXARGB_R(m_Loader.m_MatteColor); | |
264 int matte_g = FXARGB_G(m_Loader.m_MatteColor); | |
265 int matte_b = FXARGB_B(m_Loader.m_MatteColor); | |
266 for (int row = 0; row < rect.Height(); row++) { | |
267 uint8_t* dest_scan = | |
268 (uint8_t*)pBitmapDevice1->GetBitmap()->GetScanline(row); | |
Tom Sepez
2016/11/28 18:42:53
nit: const_cast<uint8_t*>() so that we know that i
npm
2016/11/28 20:51:30
Done.
| |
269 const uint8_t* mask_scan = pBitmapDevice2->GetBitmap()->GetScanline(row); | |
270 for (int col = 0; col < rect.Width(); col++) { | |
271 int alpha = *mask_scan++; | |
272 if (!alpha) { | |
273 dest_scan += 4; | |
274 continue; | |
275 } | |
276 int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b; | |
277 *dest_scan++ = std::min(std::max(orig, 0), 255); | |
278 orig = (*dest_scan - matte_g) * 255 / alpha + matte_g; | |
279 *dest_scan++ = std::min(std::max(orig, 0), 255); | |
280 orig = (*dest_scan - matte_r) * 255 / alpha + matte_r; | |
281 *dest_scan++ = std::min(std::max(orig, 0), 255); | |
282 dest_scan++; | |
283 } | |
284 } | |
285 } | |
286 | |
287 bool CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device) { | |
288 if (NotDrawing()) | |
289 return false; | |
290 | |
291 FX_RECT rect = GetDrawRect(); | |
236 if (rect.IsEmpty()) | 292 if (rect.IsEmpty()) |
237 return false; | 293 return false; |
238 | 294 |
239 CFX_Matrix new_matrix = m_ImageMatrix; | 295 CFX_Matrix new_matrix = GetDrawMatrix(rect); |
240 new_matrix.TranslateI(-rect.left, -rect.top); | |
241 int width = rect.Width(); | |
242 int height = rect.Height(); | |
243 CFX_FxgeDevice bitmap_device1; | 296 CFX_FxgeDevice bitmap_device1; |
244 if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32, nullptr)) | 297 if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32, nullptr)) |
245 return true; | 298 return true; |
246 | 299 |
247 bitmap_device1.GetBitmap()->Clear(0xffffff); | 300 bitmap_device1.GetBitmap()->Clear(0xffffff); |
248 CPDF_RenderStatus bitmap_render; | 301 CPDF_RenderStatus bitmap_render; |
249 bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1, | 302 bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1, |
250 nullptr, nullptr, nullptr, nullptr, | 303 nullptr, nullptr, nullptr, nullptr, |
251 &m_pRenderStatus->m_Options, 0, | 304 &m_pRenderStatus->m_Options, 0, |
252 m_pRenderStatus->m_bDropObjects, nullptr, true); | 305 m_pRenderStatus->m_bDropObjects, nullptr, true); |
253 CFX_Matrix patternDevice = *pObj2Device; | 306 CFX_Matrix patternDevice = *pObj2Device; |
254 patternDevice.Translate((FX_FLOAT)-rect.left, (FX_FLOAT)-rect.top); | 307 patternDevice.Translate((FX_FLOAT)-rect.left, (FX_FLOAT)-rect.top); |
255 if (CPDF_TilingPattern* pTilingPattern = m_pPattern->AsTilingPattern()) { | 308 if (CPDF_TilingPattern* pTilingPattern = m_pPattern->AsTilingPattern()) { |
256 bitmap_render.DrawTilingPattern(pTilingPattern, m_pImageObject, | 309 bitmap_render.DrawTilingPattern(pTilingPattern, m_pImageObject, |
257 &patternDevice, false); | 310 &patternDevice, false); |
258 } else if (CPDF_ShadingPattern* pShadingPattern = | 311 } else if (CPDF_ShadingPattern* pShadingPattern = |
259 m_pPattern->AsShadingPattern()) { | 312 m_pPattern->AsShadingPattern()) { |
260 bitmap_render.DrawShadingPattern(pShadingPattern, m_pImageObject, | 313 bitmap_render.DrawShadingPattern(pShadingPattern, m_pImageObject, |
261 &patternDevice, false); | 314 &patternDevice, false); |
262 } | 315 } |
263 | 316 |
264 CFX_FxgeDevice bitmap_device2; | 317 CFX_FxgeDevice bitmap_device2; |
265 if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb, | 318 if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb, |
266 nullptr)) { | 319 nullptr)) { |
267 return true; | 320 return true; |
268 } | 321 } |
269 bitmap_device2.GetBitmap()->Clear(0); | 322 bitmap_device2.GetBitmap()->Clear(0); |
270 CPDF_RenderStatus bitmap_render2; | 323 CalculateDrawImage(&bitmap_device1, &bitmap_device2, m_pDIBSource, |
271 bitmap_render2.Initialize(m_pRenderStatus->m_pContext, &bitmap_device2, | 324 &new_matrix, rect); |
272 nullptr, nullptr, nullptr, nullptr, nullptr, 0, | |
273 m_pRenderStatus->m_bDropObjects, nullptr, true); | |
274 CPDF_ImageRenderer image_render; | |
275 if (image_render.Start(&bitmap_render2, m_pDIBSource, 0xffffffff, 255, | |
276 &new_matrix, m_Flags, true, FXDIB_BLEND_NORMAL)) { | |
277 image_render.Continue(nullptr); | |
278 } | |
279 if (m_Loader.m_MatteColor != 0xffffffff) { | |
280 int matte_r = FXARGB_R(m_Loader.m_MatteColor); | |
281 int matte_g = FXARGB_G(m_Loader.m_MatteColor); | |
282 int matte_b = FXARGB_B(m_Loader.m_MatteColor); | |
283 for (int row = 0; row < height; row++) { | |
284 uint8_t* dest_scan = | |
285 (uint8_t*)bitmap_device1.GetBitmap()->GetScanline(row); | |
286 const uint8_t* mask_scan = bitmap_device2.GetBitmap()->GetScanline(row); | |
287 for (int col = 0; col < width; col++) { | |
288 int alpha = *mask_scan++; | |
289 if (!alpha) { | |
290 dest_scan += 4; | |
291 continue; | |
292 } | |
293 int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b; | |
294 if (orig < 0) | |
295 orig = 0; | |
296 else if (orig > 255) | |
297 orig = 255; | |
298 *dest_scan++ = orig; | |
299 orig = (*dest_scan - matte_g) * 255 / alpha + matte_g; | |
300 if (orig < 0) | |
301 orig = 0; | |
302 else if (orig > 255) | |
303 orig = 255; | |
304 *dest_scan++ = orig; | |
305 orig = (*dest_scan - matte_r) * 255 / alpha + matte_r; | |
306 if (orig < 0) | |
307 orig = 0; | |
308 else if (orig > 255) | |
309 orig = 255; | |
310 *dest_scan++ = orig; | |
311 dest_scan++; | |
312 } | |
313 } | |
314 } | |
315 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); | 325 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); |
316 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); | 326 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); |
317 bitmap_device1.GetBitmap()->MultiplyAlpha(255); | 327 bitmap_device1.GetBitmap()->MultiplyAlpha(255); |
318 m_pRenderStatus->m_pDevice->SetDIBitsWithBlend( | 328 m_pRenderStatus->m_pDevice->SetDIBitsWithBlend( |
319 bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType); | 329 bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType); |
320 return false; | 330 return false; |
321 } | 331 } |
322 | 332 |
323 bool CPDF_ImageRenderer::DrawMaskedImage() { | 333 bool CPDF_ImageRenderer::DrawMaskedImage() { |
324 if (m_pRenderStatus->m_bPrint && | 334 if (NotDrawing()) |
325 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { | |
326 m_Result = false; | |
327 return false; | 335 return false; |
328 } | 336 |
329 FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOuterRect(); | 337 FX_RECT rect = GetDrawRect(); |
330 rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); | |
331 if (rect.IsEmpty()) | 338 if (rect.IsEmpty()) |
332 return false; | 339 return false; |
333 | 340 |
334 CFX_Matrix new_matrix = m_ImageMatrix; | 341 CFX_Matrix new_matrix = GetDrawMatrix(rect); |
335 new_matrix.TranslateI(-rect.left, -rect.top); | |
336 int width = rect.Width(); | |
337 int height = rect.Height(); | |
338 CFX_FxgeDevice bitmap_device1; | 342 CFX_FxgeDevice bitmap_device1; |
339 if (!bitmap_device1.Create(width, height, FXDIB_Rgb32, nullptr)) | 343 if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32, nullptr)) |
340 return true; | 344 return true; |
341 | 345 |
342 #if defined _SKIA_SUPPORT_ | 346 #if defined _SKIA_SUPPORT_ |
343 bitmap_device1.Clear(0xffffff); | 347 bitmap_device1.Clear(0xffffff); |
344 #else | 348 #else |
345 bitmap_device1.GetBitmap()->Clear(0xffffff); | 349 bitmap_device1.GetBitmap()->Clear(0xffffff); |
346 #endif | 350 #endif |
347 CPDF_RenderStatus bitmap_render; | 351 CPDF_RenderStatus bitmap_render; |
348 bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1, | 352 bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1, |
349 nullptr, nullptr, nullptr, nullptr, nullptr, 0, | 353 nullptr, nullptr, nullptr, nullptr, nullptr, 0, |
350 m_pRenderStatus->m_bDropObjects, nullptr, true); | 354 m_pRenderStatus->m_bDropObjects, nullptr, true); |
351 CPDF_ImageRenderer image_render; | 355 CPDF_ImageRenderer image_render; |
352 if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, | 356 if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, |
353 m_Flags, true, FXDIB_BLEND_NORMAL)) { | 357 m_Flags, true, FXDIB_BLEND_NORMAL)) { |
354 image_render.Continue(nullptr); | 358 image_render.Continue(nullptr); |
355 } | 359 } |
356 CFX_FxgeDevice bitmap_device2; | 360 CFX_FxgeDevice bitmap_device2; |
357 if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb, nullptr)) | 361 if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb, |
362 nullptr)) | |
358 return true; | 363 return true; |
359 | 364 |
360 #if defined _SKIA_SUPPORT_ | 365 #if defined _SKIA_SUPPORT_ |
361 bitmap_device2.Clear(0); | 366 bitmap_device2.Clear(0); |
362 #else | 367 #else |
363 bitmap_device2.GetBitmap()->Clear(0); | 368 bitmap_device2.GetBitmap()->Clear(0); |
364 #endif | 369 #endif |
365 CPDF_RenderStatus bitmap_render2; | 370 CalculateDrawImage(&bitmap_device1, &bitmap_device2, m_Loader.m_pMask, |
366 bitmap_render2.Initialize(m_pRenderStatus->m_pContext, &bitmap_device2, | 371 &new_matrix, rect); |
367 nullptr, nullptr, nullptr, nullptr, nullptr, 0, | |
368 m_pRenderStatus->m_bDropObjects, nullptr, true); | |
369 CPDF_ImageRenderer image_render2; | |
370 if (image_render2.Start(&bitmap_render2, m_Loader.m_pMask, 0xffffffff, 255, | |
371 &new_matrix, m_Flags, true, FXDIB_BLEND_NORMAL)) { | |
372 image_render2.Continue(nullptr); | |
373 } | |
374 if (m_Loader.m_MatteColor != 0xffffffff) { | |
375 int matte_r = FXARGB_R(m_Loader.m_MatteColor); | |
376 int matte_g = FXARGB_G(m_Loader.m_MatteColor); | |
377 int matte_b = FXARGB_B(m_Loader.m_MatteColor); | |
378 for (int row = 0; row < height; row++) { | |
379 uint8_t* dest_scan = | |
380 (uint8_t*)bitmap_device1.GetBitmap()->GetScanline(row); | |
381 const uint8_t* mask_scan = bitmap_device2.GetBitmap()->GetScanline(row); | |
382 for (int col = 0; col < width; col++) { | |
383 int alpha = *mask_scan++; | |
384 if (alpha) { | |
385 int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b; | |
386 if (orig < 0) { | |
387 orig = 0; | |
388 } else if (orig > 255) { | |
389 orig = 255; | |
390 } | |
391 *dest_scan++ = orig; | |
392 orig = (*dest_scan - matte_g) * 255 / alpha + matte_g; | |
393 if (orig < 0) { | |
394 orig = 0; | |
395 } else if (orig > 255) { | |
396 orig = 255; | |
397 } | |
398 *dest_scan++ = orig; | |
399 orig = (*dest_scan - matte_r) * 255 / alpha + matte_r; | |
400 if (orig < 0) { | |
401 orig = 0; | |
402 } else if (orig > 255) { | |
403 orig = 255; | |
404 } | |
405 *dest_scan++ = orig; | |
406 dest_scan++; | |
407 } else { | |
408 dest_scan += 4; | |
409 } | |
410 } | |
411 } | |
412 } | |
413 #ifdef _SKIA_SUPPORT_ | 372 #ifdef _SKIA_SUPPORT_ |
414 m_pRenderStatus->m_pDevice->SetBitsWithMask( | 373 m_pRenderStatus->m_pDevice->SetBitsWithMask( |
415 bitmap_device1.GetBitmap(), bitmap_device2.GetBitmap(), rect.left, | 374 bitmap_device1.GetBitmap(), bitmap_device2.GetBitmap(), rect.left, |
416 rect.top, m_BitmapAlpha, m_BlendType); | 375 rect.top, m_BitmapAlpha, m_BlendType); |
417 #else | 376 #else |
418 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); | 377 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); |
419 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); | 378 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); |
420 if (m_BitmapAlpha < 255) | 379 if (m_BitmapAlpha < 255) |
421 bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha); | 380 bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha); |
422 m_pRenderStatus->m_pDevice->SetDIBitsWithBlend( | 381 m_pRenderStatus->m_pDevice->SetDIBitsWithBlend( |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
462 } | 421 } |
463 return false; | 422 return false; |
464 } | 423 } |
465 #endif | 424 #endif |
466 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); | 425 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); |
467 FX_RECT image_rect = image_rect_f.GetOuterRect(); | 426 FX_RECT image_rect = image_rect_f.GetOuterRect(); |
468 int dest_width = image_rect.Width(); | 427 int dest_width = image_rect.Width(); |
469 int dest_height = image_rect.Height(); | 428 int dest_height = image_rect.Height(); |
470 if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || | 429 if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || |
471 (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) { | 430 (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) { |
472 if (m_pRenderStatus->m_bPrint && | 431 if (NotDrawing()) |
473 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { | |
474 m_Result = false; | |
475 return false; | 432 return false; |
476 } | 433 |
477 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); | 434 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); |
478 clip_box.Intersect(image_rect); | 435 clip_box.Intersect(image_rect); |
479 m_Status = 2; | 436 m_Status = 2; |
480 m_pTransformer.reset(new CFX_ImageTransformer(m_pDIBSource, &m_ImageMatrix, | 437 m_pTransformer.reset(new CFX_ImageTransformer(m_pDIBSource, &m_ImageMatrix, |
481 m_Flags, &clip_box)); | 438 m_Flags, &clip_box)); |
482 m_pTransformer->Start(); | 439 m_pTransformer->Start(); |
483 return true; | 440 return true; |
484 } | 441 } |
485 if (m_ImageMatrix.a < 0) | 442 if (m_ImageMatrix.a < 0) |
486 dest_width = -dest_width; | 443 dest_width = -dest_width; |
(...skipping 12 matching lines...) Expand all Loading... | |
499 } | 456 } |
500 if (m_pDIBSource->IsAlphaMask()) { | 457 if (m_pDIBSource->IsAlphaMask()) { |
501 if (m_BitmapAlpha != 255) | 458 if (m_BitmapAlpha != 255) |
502 m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); | 459 m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); |
503 if (m_pRenderStatus->m_pDevice->StretchBitMaskWithFlags( | 460 if (m_pRenderStatus->m_pDevice->StretchBitMaskWithFlags( |
504 m_pDIBSource, dest_left, dest_top, dest_width, dest_height, | 461 m_pDIBSource, dest_left, dest_top, dest_width, dest_height, |
505 m_FillArgb, m_Flags)) { | 462 m_FillArgb, m_Flags)) { |
506 return false; | 463 return false; |
507 } | 464 } |
508 } | 465 } |
509 if (m_pRenderStatus->m_bPrint && | 466 if (NotDrawing()) |
510 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { | |
511 m_Result = false; | |
512 return true; | 467 return true; |
513 } | |
514 | 468 |
515 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); | 469 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); |
516 FX_RECT dest_rect = clip_box; | 470 FX_RECT dest_rect = clip_box; |
517 dest_rect.Intersect(image_rect); | 471 dest_rect.Intersect(image_rect); |
518 FX_RECT dest_clip( | 472 FX_RECT dest_clip( |
519 dest_rect.left - image_rect.left, dest_rect.top - image_rect.top, | 473 dest_rect.left - image_rect.left, dest_rect.top - image_rect.top, |
520 dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top); | 474 dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top); |
521 std::unique_ptr<CFX_DIBitmap> pStretched( | 475 std::unique_ptr<CFX_DIBitmap> pStretched( |
522 m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip)); | 476 m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip)); |
523 if (pStretched) { | 477 if (pStretched) { |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
599 | 553 |
600 if (m_Status == 4) { | 554 if (m_Status == 4) { |
601 if (m_Loader.Continue(pPause)) | 555 if (m_Loader.Continue(pPause)) |
602 return true; | 556 return true; |
603 | 557 |
604 if (StartRenderDIBSource()) | 558 if (StartRenderDIBSource()) |
605 return Continue(pPause); | 559 return Continue(pPause); |
606 } | 560 } |
607 return false; | 561 return false; |
608 } | 562 } |
563 | |
564 bool CPDF_ImageRenderer::GetResult() { | |
Tom Sepez
2016/11/28 18:42:53
nit: a one-liner like this can go in the header.
npm
2016/11/28 20:51:30
Done.
| |
565 return m_Result; | |
566 } | |
OLD | NEW |