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 "core/fxge/dib/dib_int.h" | 7 #include "core/fxge/dib/dib_int.h" |
8 | 8 |
9 #include "core/fxge/include/fx_dib.h" | 9 #include "core/fxge/include/fx_dib.h" |
10 | 10 |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 if (bFlipX) { | 289 if (bFlipX) { |
290 rect.top = width - clip.left; | 290 rect.top = width - clip.left; |
291 rect.bottom = width - clip.right; | 291 rect.bottom = width - clip.right; |
292 } else { | 292 } else { |
293 rect.top = clip.left; | 293 rect.top = clip.left; |
294 rect.bottom = clip.right; | 294 rect.bottom = clip.right; |
295 } | 295 } |
296 rect.Normalize(); | 296 rect.Normalize(); |
297 return rect; | 297 return rect; |
298 } | 298 } |
| 299 |
299 CFX_DIBitmap* CFX_DIBSource::TransformTo(const CFX_Matrix* pDestMatrix, | 300 CFX_DIBitmap* CFX_DIBSource::TransformTo(const CFX_Matrix* pDestMatrix, |
300 int& result_left, | 301 int& result_left, |
301 int& result_top, | 302 int& result_top, |
302 uint32_t flags, | 303 uint32_t flags, |
303 const FX_RECT* pDestClip) const { | 304 const FX_RECT* pDestClip) const { |
304 CFX_ImageTransformer transformer; | 305 CFX_ImageTransformer transformer(this, pDestMatrix, flags, pDestClip); |
305 transformer.Start(this, pDestMatrix, flags, pDestClip); | 306 transformer.Start(); |
306 transformer.Continue(NULL); | 307 transformer.Continue(nullptr); |
307 result_left = transformer.m_ResultLeft; | 308 result_left = transformer.result().left; |
308 result_top = transformer.m_ResultTop; | 309 result_top = transformer.result().top; |
309 CFX_DIBitmap* pTransformed = transformer.m_Storer.Detach(); | 310 return transformer.DetachBitmap().release(); |
310 return pTransformed; | |
311 } | 311 } |
312 | 312 |
313 CFX_DIBitmap* CFX_DIBSource::StretchTo(int dest_width, | 313 CFX_DIBitmap* CFX_DIBSource::StretchTo(int dest_width, |
314 int dest_height, | 314 int dest_height, |
315 uint32_t flags, | 315 uint32_t flags, |
316 const FX_RECT* pClip) const { | 316 const FX_RECT* pClip) const { |
317 FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height)); | 317 FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height)); |
318 if (pClip) | 318 if (pClip) |
319 clip_rect.Intersect(*pClip); | 319 clip_rect.Intersect(*pClip); |
320 | 320 |
321 if (clip_rect.IsEmpty()) | 321 if (clip_rect.IsEmpty()) |
322 return nullptr; | 322 return nullptr; |
323 | 323 |
324 if (dest_width == m_Width && dest_height == m_Height) | 324 if (dest_width == m_Width && dest_height == m_Height) |
325 return Clone(&clip_rect); | 325 return Clone(&clip_rect); |
326 | 326 |
327 CFX_BitmapStorer storer; | 327 CFX_BitmapStorer storer; |
328 CFX_ImageStretcher stretcher(&storer, this, dest_width, dest_height, | 328 CFX_ImageStretcher stretcher(&storer, this, dest_width, dest_height, |
329 clip_rect, flags); | 329 clip_rect, flags); |
330 if (stretcher.Start()) | 330 if (stretcher.Start()) |
331 stretcher.Continue(nullptr); | 331 stretcher.Continue(nullptr); |
332 return storer.Detach(); | 332 return storer.Detach().release(); |
333 } | 333 } |
334 | 334 |
335 CFX_ImageTransformer::CFX_ImageTransformer() { | 335 CFX_ImageTransformer::CFX_ImageTransformer(const CFX_DIBSource* pSrc, |
336 m_Status = 0; | 336 const CFX_Matrix* pMatrix, |
337 m_pMatrix = NULL; | 337 int flags, |
338 } | 338 const FX_RECT* pClip) |
| 339 : m_pSrc(pSrc), |
| 340 m_pMatrix(pMatrix), |
| 341 m_pClip(pClip), |
| 342 m_Flags(flags), |
| 343 m_Status(0) {} |
339 | 344 |
340 CFX_ImageTransformer::~CFX_ImageTransformer() {} | 345 CFX_ImageTransformer::~CFX_ImageTransformer() {} |
341 | 346 |
342 FX_BOOL CFX_ImageTransformer::Start(const CFX_DIBSource* pSrc, | 347 FX_BOOL CFX_ImageTransformer::Start() { |
343 const CFX_Matrix* pDestMatrix, | 348 CFX_FloatRect unit_rect = m_pMatrix->GetUnitRect(); |
344 int flags, | |
345 const FX_RECT* pDestClip) { | |
346 m_pMatrix = (CFX_Matrix*)pDestMatrix; | |
347 CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect(); | |
348 FX_RECT result_rect = unit_rect.GetClosestRect(); | 349 FX_RECT result_rect = unit_rect.GetClosestRect(); |
349 FX_RECT result_clip = result_rect; | 350 FX_RECT result_clip = result_rect; |
350 if (pDestClip) | 351 if (m_pClip) |
351 result_clip.Intersect(*pDestClip); | 352 result_clip.Intersect(*m_pClip); |
352 | 353 |
353 if (result_clip.IsEmpty()) | 354 if (result_clip.IsEmpty()) |
354 return FALSE; | 355 return FALSE; |
355 | 356 |
356 m_ResultLeft = result_clip.left; | 357 m_result = result_clip; |
357 m_ResultTop = result_clip.top; | 358 if (FXSYS_fabs(m_pMatrix->a) < FXSYS_fabs(m_pMatrix->b) / 20 && |
358 m_ResultWidth = result_clip.Width(); | 359 FXSYS_fabs(m_pMatrix->d) < FXSYS_fabs(m_pMatrix->c) / 20 && |
359 m_ResultHeight = result_clip.Height(); | 360 FXSYS_fabs(m_pMatrix->a) < 0.5f && FXSYS_fabs(m_pMatrix->d) < 0.5f) { |
360 m_Flags = flags; | |
361 if (FXSYS_fabs(pDestMatrix->a) < FXSYS_fabs(pDestMatrix->b) / 20 && | |
362 FXSYS_fabs(pDestMatrix->d) < FXSYS_fabs(pDestMatrix->c) / 20 && | |
363 FXSYS_fabs(pDestMatrix->a) < 0.5f && FXSYS_fabs(pDestMatrix->d) < 0.5f) { | |
364 int dest_width = result_rect.Width(); | 361 int dest_width = result_rect.Width(); |
365 int dest_height = result_rect.Height(); | 362 int dest_height = result_rect.Height(); |
366 result_clip.Offset(-result_rect.left, -result_rect.top); | 363 result_clip.Offset(-result_rect.left, -result_rect.top); |
367 result_clip = FXDIB_SwapClipBox(result_clip, dest_width, dest_height, | 364 result_clip = FXDIB_SwapClipBox(result_clip, dest_width, dest_height, |
368 pDestMatrix->c > 0, pDestMatrix->b < 0); | 365 m_pMatrix->c > 0, m_pMatrix->b < 0); |
369 m_Stretcher.reset(new CFX_ImageStretcher(&m_Storer, pSrc, dest_height, | 366 m_Stretcher.reset(new CFX_ImageStretcher(&m_Storer, m_pSrc, dest_height, |
370 dest_width, result_clip, flags)); | 367 dest_width, result_clip, m_Flags)); |
371 m_Stretcher->Start(); | 368 m_Stretcher->Start(); |
372 m_Status = 1; | 369 m_Status = 1; |
373 return TRUE; | 370 return TRUE; |
374 } | 371 } |
375 if (FXSYS_fabs(pDestMatrix->b) < FIX16_005 && | 372 if (FXSYS_fabs(m_pMatrix->b) < FIX16_005 && |
376 FXSYS_fabs(pDestMatrix->c) < FIX16_005) { | 373 FXSYS_fabs(m_pMatrix->c) < FIX16_005) { |
377 int dest_width = pDestMatrix->a > 0 ? (int)FXSYS_ceil(pDestMatrix->a) | 374 int dest_width = m_pMatrix->a > 0 ? (int)FXSYS_ceil(m_pMatrix->a) |
378 : (int)FXSYS_floor(pDestMatrix->a); | 375 : (int)FXSYS_floor(m_pMatrix->a); |
379 int dest_height = pDestMatrix->d > 0 ? (int)-FXSYS_ceil(pDestMatrix->d) | 376 int dest_height = m_pMatrix->d > 0 ? (int)-FXSYS_ceil(m_pMatrix->d) |
380 : (int)-FXSYS_floor(pDestMatrix->d); | 377 : (int)-FXSYS_floor(m_pMatrix->d); |
381 result_clip.Offset(-result_rect.left, -result_rect.top); | 378 result_clip.Offset(-result_rect.left, -result_rect.top); |
382 m_Stretcher.reset(new CFX_ImageStretcher(&m_Storer, pSrc, dest_width, | 379 m_Stretcher.reset(new CFX_ImageStretcher( |
383 dest_height, result_clip, flags)); | 380 &m_Storer, m_pSrc, dest_width, dest_height, result_clip, m_Flags)); |
384 m_Stretcher->Start(); | 381 m_Stretcher->Start(); |
385 m_Status = 2; | 382 m_Status = 2; |
386 return TRUE; | 383 return TRUE; |
387 } | 384 } |
388 int stretch_width = | 385 int stretch_width = (int)FXSYS_ceil(FXSYS_sqrt2(m_pMatrix->a, m_pMatrix->b)); |
389 (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->a, pDestMatrix->b)); | 386 int stretch_height = (int)FXSYS_ceil(FXSYS_sqrt2(m_pMatrix->c, m_pMatrix->d)); |
390 int stretch_height = | |
391 (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->c, pDestMatrix->d)); | |
392 CFX_Matrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, | 387 CFX_Matrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, |
393 (FX_FLOAT)(stretch_height)); | 388 (FX_FLOAT)(stretch_height)); |
394 stretch2dest.Concat( | 389 stretch2dest.Concat( |
395 pDestMatrix->a / stretch_width, pDestMatrix->b / stretch_width, | 390 m_pMatrix->a / stretch_width, m_pMatrix->b / stretch_width, |
396 pDestMatrix->c / stretch_height, pDestMatrix->d / stretch_height, | 391 m_pMatrix->c / stretch_height, m_pMatrix->d / stretch_height, |
397 pDestMatrix->e, pDestMatrix->f); | 392 m_pMatrix->e, m_pMatrix->f); |
398 m_dest2stretch.SetReverse(stretch2dest); | 393 m_dest2stretch.SetReverse(stretch2dest); |
399 CFX_FloatRect clip_rect_f(result_clip); | 394 CFX_FloatRect clip_rect_f(result_clip); |
400 clip_rect_f.Transform(&m_dest2stretch); | 395 clip_rect_f.Transform(&m_dest2stretch); |
401 m_StretchClip = clip_rect_f.GetOutterRect(); | 396 m_StretchClip = clip_rect_f.GetOutterRect(); |
402 m_StretchClip.Intersect(0, 0, stretch_width, stretch_height); | 397 m_StretchClip.Intersect(0, 0, stretch_width, stretch_height); |
403 m_Stretcher.reset(new CFX_ImageStretcher( | 398 m_Stretcher.reset(new CFX_ImageStretcher(&m_Storer, m_pSrc, stretch_width, |
404 &m_Storer, pSrc, stretch_width, stretch_height, m_StretchClip, flags)); | 399 stretch_height, m_StretchClip, |
| 400 m_Flags)); |
405 m_Stretcher->Start(); | 401 m_Stretcher->Start(); |
406 m_Status = 3; | 402 m_Status = 3; |
407 return TRUE; | 403 return TRUE; |
408 } | 404 } |
409 | 405 |
410 FX_BOOL CFX_ImageTransformer::Continue(IFX_Pause* pPause) { | 406 FX_BOOL CFX_ImageTransformer::Continue(IFX_Pause* pPause) { |
411 if (m_Status == 1) { | 407 if (m_Status == 1) { |
412 if (m_Stretcher->Continue(pPause)) | 408 if (m_Stretcher->Continue(pPause)) |
413 return TRUE; | 409 return TRUE; |
414 | 410 |
415 if (m_Storer.GetBitmap()) { | 411 if (m_Storer.GetBitmap()) { |
416 m_Storer.Replace( | 412 std::unique_ptr<CFX_DIBitmap> swapped( |
417 m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0)); | 413 m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0)); |
| 414 m_Storer.Replace(std::move(swapped)); |
418 } | 415 } |
419 return FALSE; | 416 return FALSE; |
420 } | 417 } |
421 | 418 |
422 if (m_Status == 2) | 419 if (m_Status == 2) |
423 return m_Stretcher->Continue(pPause); | 420 return m_Stretcher->Continue(pPause); |
424 | 421 |
425 if (m_Status != 3) | 422 if (m_Status != 3) |
426 return FALSE; | 423 return FALSE; |
427 | 424 |
428 if (m_Stretcher->Continue(pPause)) | 425 if (m_Stretcher->Continue(pPause)) |
429 return TRUE; | 426 return TRUE; |
430 | 427 |
431 int stretch_width = m_StretchClip.Width(); | 428 int stretch_width = m_StretchClip.Width(); |
432 int stretch_height = m_StretchClip.Height(); | 429 int stretch_height = m_StretchClip.Height(); |
433 if (!m_Storer.GetBitmap()) | 430 if (!m_Storer.GetBitmap()) |
434 return FALSE; | 431 return FALSE; |
435 | 432 |
436 const uint8_t* stretch_buf = m_Storer.GetBitmap()->GetBuffer(); | 433 const uint8_t* stretch_buf = m_Storer.GetBitmap()->GetBuffer(); |
437 const uint8_t* stretch_buf_mask = nullptr; | 434 const uint8_t* stretch_buf_mask = nullptr; |
438 if (m_Storer.GetBitmap()->m_pAlphaMask) | 435 if (m_Storer.GetBitmap()->m_pAlphaMask) |
439 stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer(); | 436 stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer(); |
440 | 437 |
441 int stretch_pitch = m_Storer.GetBitmap()->GetPitch(); | 438 int stretch_pitch = m_Storer.GetBitmap()->GetPitch(); |
442 std::unique_ptr<CFX_DIBitmap> pTransformed(new CFX_DIBitmap); | 439 std::unique_ptr<CFX_DIBitmap> pTransformed(new CFX_DIBitmap); |
443 FXDIB_Format transformF = GetTransformedFormat(m_Stretcher->source()); | 440 FXDIB_Format transformF = GetTransformedFormat(m_Stretcher->source()); |
444 if (!pTransformed->Create(m_ResultWidth, m_ResultHeight, transformF)) | 441 if (!pTransformed->Create(m_result.Width(), m_result.Height(), transformF)) |
445 return FALSE; | 442 return FALSE; |
446 | 443 |
447 pTransformed->Clear(0); | 444 pTransformed->Clear(0); |
448 if (pTransformed->m_pAlphaMask) | 445 if (pTransformed->m_pAlphaMask) |
449 pTransformed->m_pAlphaMask->Clear(0); | 446 pTransformed->m_pAlphaMask->Clear(0); |
450 | 447 |
451 CFX_Matrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_ResultLeft), | 448 CFX_Matrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_result.left), |
452 (FX_FLOAT)(m_ResultTop)); | 449 (FX_FLOAT)(m_result.top)); |
453 result2stretch.Concat(m_dest2stretch); | 450 result2stretch.Concat(m_dest2stretch); |
454 result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top); | 451 result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top); |
455 if (!stretch_buf_mask && pTransformed->m_pAlphaMask) { | 452 if (!stretch_buf_mask && pTransformed->m_pAlphaMask) { |
456 pTransformed->m_pAlphaMask->Clear(0xff000000); | 453 pTransformed->m_pAlphaMask->Clear(0xff000000); |
457 } else if (pTransformed->m_pAlphaMask) { | 454 } else if (pTransformed->m_pAlphaMask) { |
458 int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch(); | 455 int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch(); |
459 if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { | 456 if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { |
460 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | 457 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); |
461 for (int row = 0; row < m_ResultHeight; row++) { | 458 for (int row = 0; row < m_result.Height(); row++) { |
462 uint8_t* dest_pos_mask = | 459 uint8_t* dest_pos_mask = |
463 (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); | 460 (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); |
464 for (int col = 0; col < m_ResultWidth; col++) { | 461 for (int col = 0; col < m_result.Width(); col++) { |
465 int src_col_l, src_row_l, res_x, res_y; | 462 int src_col_l, src_row_l, res_x, res_y; |
466 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | 463 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, |
467 res_y); | 464 res_y); |
468 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && | 465 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && |
469 src_row_l <= stretch_height) { | 466 src_row_l <= stretch_height) { |
470 if (src_col_l == stretch_width) { | 467 if (src_col_l == stretch_width) { |
471 src_col_l--; | 468 src_col_l--; |
472 } | 469 } |
473 if (src_row_l == stretch_height) { | 470 if (src_row_l == stretch_height) { |
474 src_row_l--; | 471 src_row_l--; |
(...skipping 10 matching lines...) Expand all Loading... |
485 int row_offset_r = src_row_r * stretch_pitch_mask; | 482 int row_offset_r = src_row_r * stretch_pitch_mask; |
486 *dest_pos_mask = | 483 *dest_pos_mask = |
487 bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, | 484 bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, |
488 src_col_l, src_col_r, res_x, res_y, 1, 0); | 485 src_col_l, src_col_r, res_x, res_y, 1, 0); |
489 } | 486 } |
490 dest_pos_mask++; | 487 dest_pos_mask++; |
491 } | 488 } |
492 } | 489 } |
493 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { | 490 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { |
494 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | 491 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); |
495 for (int row = 0; row < m_ResultHeight; row++) { | 492 for (int row = 0; row < m_result.Height(); row++) { |
496 uint8_t* dest_pos_mask = | 493 uint8_t* dest_pos_mask = |
497 (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); | 494 (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); |
498 for (int col = 0; col < m_ResultWidth; col++) { | 495 for (int col = 0; col < m_result.Width(); col++) { |
499 int src_col_l, src_row_l, res_x, res_y; | 496 int src_col_l, src_row_l, res_x, res_y; |
500 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | 497 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, |
501 res_y); | 498 res_y); |
502 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && | 499 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && |
503 src_row_l <= stretch_height) { | 500 src_row_l <= stretch_height) { |
504 int pos_pixel[8]; | 501 int pos_pixel[8]; |
505 int u_w[4], v_w[4]; | 502 int u_w[4], v_w[4]; |
506 if (src_col_l == stretch_width) { | 503 if (src_col_l == stretch_width) { |
507 src_col_l--; | 504 src_col_l--; |
508 } | 505 } |
509 if (src_row_l == stretch_height) { | 506 if (src_row_l == stretch_height) { |
510 src_row_l--; | 507 src_row_l--; |
511 } | 508 } |
512 bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, | 509 bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, |
513 res_x, res_y, stretch_width, stretch_height); | 510 res_x, res_y, stretch_width, stretch_height); |
514 *dest_pos_mask = | 511 *dest_pos_mask = |
515 bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, | 512 bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, |
516 pos_pixel, u_w, v_w, res_x, res_y, 1, 0); | 513 pos_pixel, u_w, v_w, res_x, res_y, 1, 0); |
517 } | 514 } |
518 dest_pos_mask++; | 515 dest_pos_mask++; |
519 } | 516 } |
520 } | 517 } |
521 } else { | 518 } else { |
522 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); | 519 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); |
523 for (int row = 0; row < m_ResultHeight; row++) { | 520 for (int row = 0; row < m_result.Height(); row++) { |
524 uint8_t* dest_pos_mask = | 521 uint8_t* dest_pos_mask = |
525 (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); | 522 (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); |
526 for (int col = 0; col < m_ResultWidth; col++) { | 523 for (int col = 0; col < m_result.Width(); col++) { |
527 int src_col, src_row; | 524 int src_col, src_row; |
528 result2stretch_fix.Transform(col, row, src_col, src_row); | 525 result2stretch_fix.Transform(col, row, src_col, src_row); |
529 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && | 526 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && |
530 src_row <= stretch_height) { | 527 src_row <= stretch_height) { |
531 if (src_col == stretch_width) { | 528 if (src_col == stretch_width) { |
532 src_col--; | 529 src_col--; |
533 } | 530 } |
534 if (src_row == stretch_height) { | 531 if (src_row == stretch_height) { |
535 src_row--; | 532 src_row--; |
536 } | 533 } |
537 *dest_pos_mask = | 534 *dest_pos_mask = |
538 stretch_buf_mask[src_row * stretch_pitch_mask + src_col]; | 535 stretch_buf_mask[src_row * stretch_pitch_mask + src_col]; |
539 } | 536 } |
540 dest_pos_mask++; | 537 dest_pos_mask++; |
541 } | 538 } |
542 } | 539 } |
543 } | 540 } |
544 } | 541 } |
545 if (m_Storer.GetBitmap()->IsAlphaMask()) { | 542 if (m_Storer.GetBitmap()->IsAlphaMask()) { |
546 if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { | 543 if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { |
547 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | 544 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); |
548 for (int row = 0; row < m_ResultHeight; row++) { | 545 for (int row = 0; row < m_result.Height(); row++) { |
549 uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); | 546 uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); |
550 for (int col = 0; col < m_ResultWidth; col++) { | 547 for (int col = 0; col < m_result.Width(); col++) { |
551 int src_col_l, src_row_l, res_x, res_y; | 548 int src_col_l, src_row_l, res_x, res_y; |
552 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | 549 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, |
553 res_y); | 550 res_y); |
554 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && | 551 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && |
555 src_row_l <= stretch_height) { | 552 src_row_l <= stretch_height) { |
556 if (src_col_l == stretch_width) { | 553 if (src_col_l == stretch_width) { |
557 src_col_l--; | 554 src_col_l--; |
558 } | 555 } |
559 if (src_row_l == stretch_height) { | 556 if (src_row_l == stretch_height) { |
560 src_row_l--; | 557 src_row_l--; |
(...skipping 10 matching lines...) Expand all Loading... |
571 int row_offset_r = src_row_r * stretch_pitch; | 568 int row_offset_r = src_row_r * stretch_pitch; |
572 *dest_scan = | 569 *dest_scan = |
573 bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, | 570 bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, |
574 src_col_l, src_col_r, res_x, res_y, 1, 0); | 571 src_col_l, src_col_r, res_x, res_y, 1, 0); |
575 } | 572 } |
576 dest_scan++; | 573 dest_scan++; |
577 } | 574 } |
578 } | 575 } |
579 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { | 576 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { |
580 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | 577 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); |
581 for (int row = 0; row < m_ResultHeight; row++) { | 578 for (int row = 0; row < m_result.Height(); row++) { |
582 uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); | 579 uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); |
583 for (int col = 0; col < m_ResultWidth; col++) { | 580 for (int col = 0; col < m_result.Width(); col++) { |
584 int src_col_l, src_row_l, res_x, res_y; | 581 int src_col_l, src_row_l, res_x, res_y; |
585 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | 582 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, |
586 res_y); | 583 res_y); |
587 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && | 584 if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && |
588 src_row_l <= stretch_height) { | 585 src_row_l <= stretch_height) { |
589 int pos_pixel[8]; | 586 int pos_pixel[8]; |
590 int u_w[4], v_w[4]; | 587 int u_w[4], v_w[4]; |
591 if (src_col_l == stretch_width) { | 588 if (src_col_l == stretch_width) { |
592 src_col_l--; | 589 src_col_l--; |
593 } | 590 } |
594 if (src_row_l == stretch_height) { | 591 if (src_row_l == stretch_height) { |
595 src_row_l--; | 592 src_row_l--; |
596 } | 593 } |
597 bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, | 594 bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, |
598 res_x, res_y, stretch_width, stretch_height); | 595 res_x, res_y, stretch_width, stretch_height); |
599 *dest_scan = bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, | 596 *dest_scan = bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, |
600 u_w, v_w, res_x, res_y, 1, 0); | 597 u_w, v_w, res_x, res_y, 1, 0); |
601 } | 598 } |
602 dest_scan++; | 599 dest_scan++; |
603 } | 600 } |
604 } | 601 } |
605 } else { | 602 } else { |
606 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); | 603 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); |
607 for (int row = 0; row < m_ResultHeight; row++) { | 604 for (int row = 0; row < m_result.Height(); row++) { |
608 uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); | 605 uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); |
609 for (int col = 0; col < m_ResultWidth; col++) { | 606 for (int col = 0; col < m_result.Width(); col++) { |
610 int src_col, src_row; | 607 int src_col, src_row; |
611 result2stretch_fix.Transform(col, row, src_col, src_row); | 608 result2stretch_fix.Transform(col, row, src_col, src_row); |
612 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && | 609 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && |
613 src_row <= stretch_height) { | 610 src_row <= stretch_height) { |
614 if (src_col == stretch_width) { | 611 if (src_col == stretch_width) { |
615 src_col--; | 612 src_col--; |
616 } | 613 } |
617 if (src_row == stretch_height) { | 614 if (src_row == stretch_height) { |
618 src_row--; | 615 src_row--; |
619 } | 616 } |
(...skipping 22 matching lines...) Expand all Loading... |
642 } | 639 } |
643 } else { | 640 } else { |
644 for (int i = 0; i < 256; i++) { | 641 for (int i = 0; i < 256; i++) { |
645 argb[i] = 0xff000000 | (i * 0x010101); | 642 argb[i] = 0xff000000 | (i * 0x010101); |
646 } | 643 } |
647 } | 644 } |
648 } | 645 } |
649 if (!(m_Flags & FXDIB_DOWNSAMPLE) && | 646 if (!(m_Flags & FXDIB_DOWNSAMPLE) && |
650 !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { | 647 !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { |
651 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | 648 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); |
652 for (int row = 0; row < m_ResultHeight; row++) { | 649 for (int row = 0; row < m_result.Height(); row++) { |
653 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | 650 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); |
654 for (int col = 0; col < m_ResultWidth; col++) { | 651 for (int col = 0; col < m_result.Width(); col++) { |
655 int src_col_l, src_row_l, res_x, res_y; | 652 int src_col_l, src_row_l, res_x, res_y; |
656 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | 653 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, |
657 res_y); | 654 res_y); |
658 if (src_col_l >= 0 && src_col_l <= stretch_width && | 655 if (src_col_l >= 0 && src_col_l <= stretch_width && |
659 src_row_l >= 0 && src_row_l <= stretch_height) { | 656 src_row_l >= 0 && src_row_l <= stretch_height) { |
660 if (src_col_l == stretch_width) { | 657 if (src_col_l == stretch_width) { |
661 src_col_l--; | 658 src_col_l--; |
662 } | 659 } |
663 if (src_row_l == stretch_height) { | 660 if (src_row_l == stretch_height) { |
664 src_row_l--; | 661 src_row_l--; |
(...skipping 17 matching lines...) Expand all Loading... |
682 dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); | 679 dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); |
683 } else { | 680 } else { |
684 *(uint32_t*)dest_pos = r_bgra_cmyk; | 681 *(uint32_t*)dest_pos = r_bgra_cmyk; |
685 } | 682 } |
686 } | 683 } |
687 dest_pos += destBpp; | 684 dest_pos += destBpp; |
688 } | 685 } |
689 } | 686 } |
690 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { | 687 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { |
691 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | 688 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); |
692 for (int row = 0; row < m_ResultHeight; row++) { | 689 for (int row = 0; row < m_result.Height(); row++) { |
693 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | 690 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); |
694 for (int col = 0; col < m_ResultWidth; col++) { | 691 for (int col = 0; col < m_result.Width(); col++) { |
695 int src_col_l, src_row_l, res_x, res_y; | 692 int src_col_l, src_row_l, res_x, res_y; |
696 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | 693 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, |
697 res_y); | 694 res_y); |
698 if (src_col_l >= 0 && src_col_l <= stretch_width && | 695 if (src_col_l >= 0 && src_col_l <= stretch_width && |
699 src_row_l >= 0 && src_row_l <= stretch_height) { | 696 src_row_l >= 0 && src_row_l <= stretch_height) { |
700 int pos_pixel[8]; | 697 int pos_pixel[8]; |
701 int u_w[4], v_w[4]; | 698 int u_w[4], v_w[4]; |
702 if (src_col_l == stretch_width) { | 699 if (src_col_l == stretch_width) { |
703 src_col_l--; | 700 src_col_l--; |
704 } | 701 } |
(...skipping 12 matching lines...) Expand all Loading... |
717 dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); | 714 dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); |
718 } else { | 715 } else { |
719 *(uint32_t*)dest_pos = r_bgra_cmyk; | 716 *(uint32_t*)dest_pos = r_bgra_cmyk; |
720 } | 717 } |
721 } | 718 } |
722 dest_pos += destBpp; | 719 dest_pos += destBpp; |
723 } | 720 } |
724 } | 721 } |
725 } else { | 722 } else { |
726 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); | 723 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); |
727 for (int row = 0; row < m_ResultHeight; row++) { | 724 for (int row = 0; row < m_result.Height(); row++) { |
728 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | 725 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); |
729 for (int col = 0; col < m_ResultWidth; col++) { | 726 for (int col = 0; col < m_result.Width(); col++) { |
730 int src_col, src_row; | 727 int src_col, src_row; |
731 result2stretch_fix.Transform(col, row, src_col, src_row); | 728 result2stretch_fix.Transform(col, row, src_col, src_row); |
732 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && | 729 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && |
733 src_row <= stretch_height) { | 730 src_row <= stretch_height) { |
734 if (src_col == stretch_width) { | 731 if (src_col == stretch_width) { |
735 src_col--; | 732 src_col--; |
736 } | 733 } |
737 if (src_row == stretch_height) { | 734 if (src_row == stretch_height) { |
738 src_row--; | 735 src_row--; |
739 } | 736 } |
(...skipping 10 matching lines...) Expand all Loading... |
750 dest_pos += destBpp; | 747 dest_pos += destBpp; |
751 } | 748 } |
752 } | 749 } |
753 } | 750 } |
754 } else { | 751 } else { |
755 FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha(); | 752 FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha(); |
756 int destBpp = pTransformed->GetBPP() / 8; | 753 int destBpp = pTransformed->GetBPP() / 8; |
757 if (!(m_Flags & FXDIB_DOWNSAMPLE) && | 754 if (!(m_Flags & FXDIB_DOWNSAMPLE) && |
758 !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { | 755 !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { |
759 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | 756 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); |
760 for (int row = 0; row < m_ResultHeight; row++) { | 757 for (int row = 0; row < m_result.Height(); row++) { |
761 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | 758 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); |
762 for (int col = 0; col < m_ResultWidth; col++) { | 759 for (int col = 0; col < m_result.Width(); col++) { |
763 int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0; | 760 int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0; |
764 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | 761 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, |
765 res_y); | 762 res_y); |
766 if (src_col_l >= 0 && src_col_l <= stretch_width && | 763 if (src_col_l >= 0 && src_col_l <= stretch_width && |
767 src_row_l >= 0 && src_row_l <= stretch_height) { | 764 src_row_l >= 0 && src_row_l <= stretch_height) { |
768 if (src_col_l == stretch_width) { | 765 if (src_col_l == stretch_width) { |
769 src_col_l--; | 766 src_col_l--; |
770 } | 767 } |
771 if (src_row_l == stretch_height) { | 768 if (src_row_l == stretch_height) { |
772 src_row_l--; | 769 src_row_l--; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, | 823 FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, |
827 r_pos_blue_c_r)); | 824 r_pos_blue_c_r)); |
828 } | 825 } |
829 } | 826 } |
830 } | 827 } |
831 dest_pos += destBpp; | 828 dest_pos += destBpp; |
832 } | 829 } |
833 } | 830 } |
834 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { | 831 } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { |
835 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); | 832 CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); |
836 for (int row = 0; row < m_ResultHeight; row++) { | 833 for (int row = 0; row < m_result.Height(); row++) { |
837 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | 834 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); |
838 for (int col = 0; col < m_ResultWidth; col++) { | 835 for (int col = 0; col < m_result.Width(); col++) { |
839 int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0; | 836 int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0; |
840 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, | 837 result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, |
841 res_y); | 838 res_y); |
842 if (src_col_l >= 0 && src_col_l <= stretch_width && | 839 if (src_col_l >= 0 && src_col_l <= stretch_width && |
843 src_row_l >= 0 && src_row_l <= stretch_height) { | 840 src_row_l >= 0 && src_row_l <= stretch_height) { |
844 int pos_pixel[8]; | 841 int pos_pixel[8]; |
845 int u_w[4], v_w[4]; | 842 int u_w[4], v_w[4]; |
846 if (src_col_l == stretch_width) { | 843 if (src_col_l == stretch_width) { |
847 src_col_l--; | 844 src_col_l--; |
848 } | 845 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, | 894 FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, |
898 r_pos_blue_c_r)); | 895 r_pos_blue_c_r)); |
899 } | 896 } |
900 } | 897 } |
901 } | 898 } |
902 dest_pos += destBpp; | 899 dest_pos += destBpp; |
903 } | 900 } |
904 } | 901 } |
905 } else { | 902 } else { |
906 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); | 903 CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); |
907 for (int row = 0; row < m_ResultHeight; row++) { | 904 for (int row = 0; row < m_result.Height(); row++) { |
908 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); | 905 uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); |
909 for (int col = 0; col < m_ResultWidth; col++) { | 906 for (int col = 0; col < m_result.Width(); col++) { |
910 int src_col, src_row; | 907 int src_col, src_row; |
911 result2stretch_fix.Transform(col, row, src_col, src_row); | 908 result2stretch_fix.Transform(col, row, src_col, src_row); |
912 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && | 909 if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && |
913 src_row <= stretch_height) { | 910 src_row <= stretch_height) { |
914 if (src_col == stretch_width) { | 911 if (src_col == stretch_width) { |
915 src_col--; | 912 src_col--; |
916 } | 913 } |
917 if (src_row == stretch_height) { | 914 if (src_row == stretch_height) { |
918 src_row--; | 915 src_row--; |
919 } | 916 } |
(...skipping 22 matching lines...) Expand all Loading... |
942 FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0])); | 939 FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0])); |
943 } | 940 } |
944 } | 941 } |
945 } | 942 } |
946 dest_pos += destBpp; | 943 dest_pos += destBpp; |
947 } | 944 } |
948 } | 945 } |
949 } | 946 } |
950 } | 947 } |
951 } | 948 } |
952 m_Storer.Replace(pTransformed.release()); | 949 m_Storer.Replace(std::move(pTransformed)); |
953 return FALSE; | 950 return FALSE; |
954 } | 951 } |
| 952 |
| 953 std::unique_ptr<CFX_DIBitmap> CFX_ImageTransformer::DetachBitmap() { |
| 954 return m_Storer.Detach(); |
| 955 } |
OLD | NEW |