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 #include "core/include/fxge/fx_ge.h" | 5 #include "core/include/fxge/fx_ge.h" |
6 | 6 |
7 //#define _SKIA_SUPPORT_ | |
8 #if defined(_SKIA_SUPPORT_) | 7 #if defined(_SKIA_SUPPORT_) |
9 #include "SkBlitter.h" | 8 #include "SkBlitter.h" |
10 #include "core/include/fxcodec/fx_codec.h" | 9 #include "core/include/fxcodec/fx_codec.h" |
11 #include "core/src/fxge/skia/fx_skia_blitter_new.h" | 10 #include "core/src/fxge/skia/fx_skia_blitter_new.h" |
12 | 11 |
13 // We use our own renderer here to make it simple | 12 // We use our own renderer here to make it simple |
14 void CFX_SkiaRenderer::blitAntiH(int x, | 13 void CFX_SkiaRenderer::blitAntiH(int x, |
15 int y, | 14 int y, |
16 const SkAlpha antialias[], | 15 const SkAlpha antialias[], |
17 const int16_t runs[]) { | 16 const int16_t runs[]) { |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 int col_start = span_left < clip_left ? clip_left - span_left : 0; | 382 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
384 int col_end = | 383 int col_end = |
385 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); | 384 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
386 if (col_end < col_start) | 385 if (col_end < col_start) |
387 return; // do nothing. | 386 return; // do nothing. |
388 dest_scan += col_start << 2; | 387 dest_scan += col_start << 2; |
389 if (m_Alpha == 255 && cover_scan == 255) { | 388 if (m_Alpha == 255 && cover_scan == 255) { |
390 FXSYS_memset(dest_scan, m_Color, (col_end - col_start) << 2); | 389 FXSYS_memset(dest_scan, m_Color, (col_end - col_start) << 2); |
391 return; | 390 return; |
392 } | 391 } |
393 int src_alpha; | 392 int src_alpha = m_Alpha * cover_scan / 255; |
394 #if 0 | |
395 if (m_bFullCover) { | |
396 if (m_Alpha == 255) { | |
397 FXSYS_memset(dest_scan, m_Color, (col_end - col_start)<<2); | |
398 return; | |
399 } | |
400 } | |
401 else | |
402 #endif | |
403 src_alpha = m_Alpha * cover_scan / 255; | |
404 for (int col = col_start; col < col_end; col++) { | 393 for (int col = col_start; col < col_end; col++) { |
405 // Dest format: Argb | 394 // Dest format: Argb |
406 // calculate destination alpha (it's union of source and dest alpha) | 395 // calculate destination alpha (it's union of source and dest alpha) |
407 if (dest_scan[3] == 0) { | 396 if (dest_scan[3] == 0) { |
408 dest_scan[3] = src_alpha; | 397 dest_scan[3] = src_alpha; |
409 *dest_scan++ = m_Blue; | 398 *dest_scan++ = m_Blue; |
410 *dest_scan++ = m_Green; | 399 *dest_scan++ = m_Green; |
411 *dest_scan = m_Red; | 400 *dest_scan = m_Red; |
412 dest_scan += 2; | 401 dest_scan += 2; |
413 continue; | 402 continue; |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 int col_start = span_left < clip_left ? clip_left - span_left : 0; | 673 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
685 int col_end = | 674 int col_end = |
686 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); | 675 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
687 if (col_end < col_start) | 676 if (col_end < col_start) |
688 return; // do nothing. | 677 return; // do nothing. |
689 dest_scan += (col_start << 2); | 678 dest_scan += (col_start << 2); |
690 if (m_Alpha == 255 && cover_scan == 255) { | 679 if (m_Alpha == 255 && cover_scan == 255) { |
691 FXSYS_memset(dest_scan, m_Color, (col_end - col_start) << 2); | 680 FXSYS_memset(dest_scan, m_Color, (col_end - col_start) << 2); |
692 return; | 681 return; |
693 } | 682 } |
694 int src_alpha; | 683 int src_alpha = m_Alpha * cover_scan / 255; |
695 #if 0 | |
696 if (m_bFullCover) | |
697 src_alpha = m_Alpha; | |
698 else | |
699 #endif | |
700 src_alpha = m_Alpha * cover_scan / 255; | |
701 for (int col = col_start; col < col_end; col++) { | 684 for (int col = col_start; col < col_end; col++) { |
702 // Dest format: Rgb32 | 685 // Dest format: Rgb32 |
703 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); | 686 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); |
704 dest_scan++; | 687 dest_scan++; |
705 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); | 688 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); |
706 dest_scan++; | 689 dest_scan++; |
707 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); | 690 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); |
708 dest_scan += 2; | 691 dest_scan += 2; |
709 } | 692 } |
710 } | 693 } |
(...skipping 17 matching lines...) Expand all Loading... |
728 if (col_end < col_start) | 711 if (col_end < col_start) |
729 return; // do nothing. | 712 return; // do nothing. |
730 dest_scan += col_start << 2; | 713 dest_scan += col_start << 2; |
731 ori_scan += col_start << 2; | 714 ori_scan += col_start << 2; |
732 if (m_Alpha == 255 && cover_scan == 255) { | 715 if (m_Alpha == 255 && cover_scan == 255) { |
733 FXSYS_memset(dest_scan, m_Color, (col_end - col_start) << 2); | 716 FXSYS_memset(dest_scan, m_Color, (col_end - col_start) << 2); |
734 return; | 717 return; |
735 } | 718 } |
736 int src_alpha = m_Alpha; | 719 int src_alpha = m_Alpha; |
737 for (int col = col_start; col < col_end; col++) { | 720 for (int col = col_start; col < col_end; col++) { |
738 #if 0 | |
739 if (m_bFullCover) { | |
740 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha)
; | |
741 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha
); | |
742 *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); | |
743 dest_scan += 2; ori_scan += 2; | |
744 continue; | |
745 } | |
746 #endif | |
747 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); | 721 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); |
748 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); | 722 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); |
749 int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); | 723 int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); |
750 ori_scan += 2; | 724 ori_scan += 2; |
751 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); | 725 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); |
752 dest_scan++; | 726 dest_scan++; |
753 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); | 727 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); |
754 dest_scan++; | 728 dest_scan++; |
755 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); | 729 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); |
756 dest_scan += 2; | 730 dest_scan += 2; |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 uint8_t* clip_scan, | 921 uint8_t* clip_scan, |
948 uint8_t* dest_extra_alpha_scan) { | 922 uint8_t* dest_extra_alpha_scan) { |
949 dest_scan = | 923 dest_scan = |
950 (uint8_t*)m_pDevice->GetScanline(span_top) + span_left + (span_left << 1); | 924 (uint8_t*)m_pDevice->GetScanline(span_top) + span_left + (span_left << 1); |
951 int col_start = span_left < clip_left ? clip_left - span_left : 0; | 925 int col_start = span_left < clip_left ? clip_left - span_left : 0; |
952 int col_end = | 926 int col_end = |
953 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); | 927 (span_left + span_len) < clip_right ? span_len : (clip_right - span_left); |
954 if (col_end < col_start) | 928 if (col_end < col_start) |
955 return; // do nothing. | 929 return; // do nothing. |
956 dest_scan += (col_start << 1) + col_start; | 930 dest_scan += (col_start << 1) + col_start; |
957 int src_alpha; | 931 int src_alpha = m_Alpha * cover_scan / 255; |
958 #if 0 | |
959 if (m_bFullCover) | |
960 src_alpha = m_Alpha; | |
961 else | |
962 #endif | |
963 src_alpha = m_Alpha * cover_scan / 255; | |
964 if (src_alpha == 255) { | 932 if (src_alpha == 255) { |
965 for (int col = col_start; col < col_end; col++) { | 933 for (int col = col_start; col < col_end; col++) { |
966 *dest_scan++ = m_Blue; | 934 *dest_scan++ = m_Blue; |
967 *dest_scan++ = m_Green; | 935 *dest_scan++ = m_Green; |
968 *dest_scan++ = m_Red; | 936 *dest_scan++ = m_Red; |
969 } | 937 } |
970 return; | 938 return; |
971 } | 939 } |
972 for (int col = col_start; col < col_end; col++) { | 940 for (int col = col_start; col < col_end; col++) { |
973 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); | 941 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); |
(...skipping 30 matching lines...) Expand all Loading... |
1004 ori_scan += (col_start << 1) + col_start; | 972 ori_scan += (col_start << 1) + col_start; |
1005 if (m_Alpha == 255 && cover_scan == 255) { | 973 if (m_Alpha == 255 && cover_scan == 255) { |
1006 for (int col = col_start; col < col_end; col++) { | 974 for (int col = col_start; col < col_end; col++) { |
1007 *dest_scan++ = m_Blue; | 975 *dest_scan++ = m_Blue; |
1008 *dest_scan++ = m_Green; | 976 *dest_scan++ = m_Green; |
1009 *dest_scan++ = m_Red; | 977 *dest_scan++ = m_Red; |
1010 } | 978 } |
1011 return; | 979 return; |
1012 } | 980 } |
1013 for (int col = col_start; col < col_end; col++) { | 981 for (int col = col_start; col < col_end; col++) { |
1014 #if 0 | |
1015 if (m_bFullCover) { | |
1016 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, m_Alpha); | |
1017 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, m_Alpha); | |
1018 *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, m_Alpha); | |
1019 continue; | |
1020 } | |
1021 #endif | |
1022 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, m_Alpha); | 982 int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, m_Alpha); |
1023 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, m_Alpha); | 983 int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, m_Alpha); |
1024 int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, m_Alpha); | 984 int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, m_Alpha); |
1025 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); | 985 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan); |
1026 dest_scan++; | 986 dest_scan++; |
1027 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); | 987 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan); |
1028 dest_scan++; | 988 dest_scan++; |
1029 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); | 989 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan); |
1030 dest_scan++; | 990 dest_scan++; |
1031 } | 991 } |
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1523 | 1483 |
1524 //-------------------------------------------------------------------- | 1484 //-------------------------------------------------------------------- |
1525 FX_BOOL CFX_SkiaRenderer::Init( | 1485 FX_BOOL CFX_SkiaRenderer::Init( |
1526 CFX_DIBitmap* pDevice, | 1486 CFX_DIBitmap* pDevice, |
1527 CFX_DIBitmap* pOriDevice, | 1487 CFX_DIBitmap* pOriDevice, |
1528 const CFX_ClipRgn* pClipRgn, | 1488 const CFX_ClipRgn* pClipRgn, |
1529 FX_DWORD color, | 1489 FX_DWORD color, |
1530 FX_BOOL bFullCover, | 1490 FX_BOOL bFullCover, |
1531 FX_BOOL bRgbByteOrder, | 1491 FX_BOOL bRgbByteOrder, |
1532 int alpha_flag, | 1492 int alpha_flag, |
1533 void* pIccTransform) // The alpha flag must be fill_flag if exist. | 1493 void* pIccTransform) { // The alpha flag must be fill_flag if exist. |
1534 { | |
1535 m_pDevice = pDevice; | 1494 m_pDevice = pDevice; |
1536 m_pClipRgn = pClipRgn; | 1495 m_pClipRgn = pClipRgn; |
1537 m_bRgbByteOrder = bRgbByteOrder; | 1496 m_bRgbByteOrder = bRgbByteOrder; |
1538 m_pOriDevice = pOriDevice; | 1497 m_pOriDevice = pOriDevice; |
1539 m_pDestScan = NULL; | 1498 m_pDestScan = NULL; |
1540 m_pDestExtraAlphaScan = NULL; | 1499 m_pDestExtraAlphaScan = NULL; |
1541 m_pOriScan = NULL; | 1500 m_pOriScan = NULL; |
1542 m_pClipScan = NULL; | 1501 m_pClipScan = NULL; |
1543 composite_span = NULL; | 1502 composite_span = NULL; |
1544 if (m_pClipRgn) | 1503 if (m_pClipRgn) |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1596 m_Gray = FXRGB2GRAY(r, g, b); | 1555 m_Gray = FXRGB2GRAY(r, g, b); |
1597 } else { | 1556 } else { |
1598 m_Gray = | 1557 m_Gray = |
1599 FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color)); | 1558 FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color)); |
1600 } | 1559 } |
1601 } | 1560 } |
1602 } | 1561 } |
1603 } else { | 1562 } else { |
1604 if (bDeviceCMYK) { // Cmyk(a) Device | 1563 if (bDeviceCMYK) { // Cmyk(a) Device |
1605 ASSERT(!m_bRgbByteOrder); | 1564 ASSERT(!m_bRgbByteOrder); |
1606 // TODO... opt for cmyk | 1565 // TODO ... opt for cmyk |
1607 composite_span = &CFX_SkiaRenderer::CompositeSpanCMYK; | 1566 composite_span = &CFX_SkiaRenderer::CompositeSpanCMYK; |
1608 if (bObjectCMYK) { | 1567 if (bObjectCMYK) { |
1609 m_Color = FXCMYK_TODIB(color); | 1568 m_Color = FXCMYK_TODIB(color); |
1610 if (pIccTransform) | 1569 if (pIccTransform) |
1611 pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&m_Color, | 1570 pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&m_Color, |
1612 (const uint8_t*)&m_Color, 1); | 1571 (const uint8_t*)&m_Color, 1); |
1613 } else { // Object RGB | 1572 } else { // Object RGB |
1614 if (!pIccTransform) | 1573 if (!pIccTransform) |
1615 return FALSE; | 1574 return FALSE; |
1616 color = FXARGB_TODIB(color); | 1575 color = FXARGB_TODIB(color); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1722 : &CFX_SkiaRenderer::CompositeSpanRGB32_7; | 1681 : &CFX_SkiaRenderer::CompositeSpanRGB32_7; |
1723 } break; | 1682 } break; |
1724 case 1: | 1683 case 1: |
1725 case 5: | 1684 case 5: |
1726 case 8: | 1685 case 8: |
1727 case 9: | 1686 case 9: |
1728 case 11: | 1687 case 11: |
1729 case 12: | 1688 case 12: |
1730 case 13: | 1689 case 13: |
1731 case 15: | 1690 case 15: |
1732 // TODO... | 1691 // TODO ... |
1733 break; | 1692 break; |
1734 case 10: | 1693 case 10: |
1735 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_10; | 1694 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_10; |
1736 break; | 1695 break; |
1737 case 14: | 1696 case 14: |
1738 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_14; | 1697 composite_span = &CFX_SkiaRenderer::CompositeSpanRGB24_14; |
1739 break; | 1698 break; |
1740 } | 1699 } |
1741 return !!composite_span; | 1700 return !!composite_span; |
1742 } | 1701 } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1841 m_pDevice = pDevice; | 1800 m_pDevice = pDevice; |
1842 m_Left = Left; | 1801 m_Left = Left; |
1843 m_Top = Top; | 1802 m_Top = Top; |
1844 if (pDevice) { | 1803 if (pDevice) { |
1845 m_dstWidth = m_Left + pDevice->GetWidth(); | 1804 m_dstWidth = m_Left + pDevice->GetWidth(); |
1846 m_dstHeight = m_Top + pDevice->GetHeight(); | 1805 m_dstHeight = m_Top + pDevice->GetHeight(); |
1847 } | 1806 } |
1848 return TRUE; | 1807 return TRUE; |
1849 } | 1808 } |
1850 #endif | 1809 #endif |
OLD | NEW |