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

Side by Side Diff: core/fpdfapi/render/cpdf_imagerenderer.cpp

Issue 2531643002: Add some methods in CPDF_ImageRenderer (Closed)
Patch Set: Created 4 years 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
OLDNEW
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698