Chromium Code Reviews| 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 |