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 <windows.h> | 7 #include <windows.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 uint32_t size, | 439 uint32_t size, |
440 void* pdv, | 440 void* pdv, |
441 uint32_t* num_face) { | 441 uint32_t* num_face) { |
442 if (!m_pGdiAddFontMemResourceEx) | 442 if (!m_pGdiAddFontMemResourceEx) |
443 return nullptr; | 443 return nullptr; |
444 | 444 |
445 return m_pGdiAddFontMemResourceEx((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, | 445 return m_pGdiAddFontMemResourceEx((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, |
446 (DWORD*)num_face); | 446 (DWORD*)num_face); |
447 } | 447 } |
448 | 448 |
449 FX_BOOL CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle) { | 449 bool CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle) { |
450 return m_pGdiRemoveFontMemResourseEx && | 450 return m_pGdiRemoveFontMemResourseEx && |
451 m_pGdiRemoveFontMemResourseEx((HANDLE)handle); | 451 m_pGdiRemoveFontMemResourseEx((HANDLE)handle); |
452 } | 452 } |
453 | 453 |
454 static GpBrush* _GdipCreateBrush(DWORD argb) { | 454 static GpBrush* _GdipCreateBrush(DWORD argb) { |
455 CGdiplusExt& GdiplusExt = | 455 CGdiplusExt& GdiplusExt = |
456 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 456 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
457 GpSolidFill* solidBrush = nullptr; | 457 GpSolidFill* solidBrush = nullptr; |
458 CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush); | 458 CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush); |
459 return solidBrush; | 459 return solidBrush; |
460 } | 460 } |
461 static CFX_DIBitmap* _StretchMonoToGray(int dest_width, | 461 static CFX_DIBitmap* _StretchMonoToGray(int dest_width, |
462 int dest_height, | 462 int dest_height, |
463 const CFX_DIBitmap* pSource, | 463 const CFX_DIBitmap* pSource, |
464 FX_RECT* pClipRect) { | 464 FX_RECT* pClipRect) { |
465 FX_BOOL bFlipX = dest_width < 0; | 465 bool bFlipX = dest_width < 0; |
466 if (bFlipX) { | 466 if (bFlipX) { |
467 dest_width = -dest_width; | 467 dest_width = -dest_width; |
468 } | 468 } |
469 FX_BOOL bFlipY = dest_height < 0; | 469 bool bFlipY = dest_height < 0; |
470 if (bFlipY) { | 470 if (bFlipY) { |
471 dest_height = -dest_height; | 471 dest_height = -dest_height; |
472 } | 472 } |
473 int result_width = pClipRect->Width(); | 473 int result_width = pClipRect->Width(); |
474 int result_height = pClipRect->Height(); | 474 int result_height = pClipRect->Height(); |
475 int result_pitch = (result_width + 3) / 4 * 4; | 475 int result_pitch = (result_width + 3) / 4 * 4; |
476 CFX_DIBitmap* pStretched = new CFX_DIBitmap; | 476 CFX_DIBitmap* pStretched = new CFX_DIBitmap; |
477 if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) { | 477 if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) { |
478 delete pStretched; | 478 delete pStretched; |
479 return nullptr; | 479 return nullptr; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 if (image_clip.IsEmpty()) { | 557 if (image_clip.IsEmpty()) { |
558 return; | 558 return; |
559 } | 559 } |
560 image_clip.Offset(-image_rect.left, -image_rect.top); | 560 image_clip.Offset(-image_rect.left, -image_rect.top); |
561 CFX_DIBitmap* pStretched = nullptr; | 561 CFX_DIBitmap* pStretched = nullptr; |
562 if (src_width * src_height > 10000) { | 562 if (src_width * src_height > 10000) { |
563 pStretched = | 563 pStretched = |
564 _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip); | 564 _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip); |
565 } else { | 565 } else { |
566 pStretched = | 566 pStretched = |
567 pBitmap->StretchTo(dest_width, dest_height, FALSE, &image_clip); | 567 pBitmap->StretchTo(dest_width, dest_height, false, &image_clip); |
568 } | 568 } |
569 GpBitmap* bitmap; | 569 GpBitmap* bitmap; |
570 CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(), | 570 CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(), |
571 (image_clip.Width() + 3) / 4 * 4, | 571 (image_clip.Width() + 3) / 4 * 4, |
572 PixelFormat8bppIndexed, | 572 PixelFormat8bppIndexed, |
573 pStretched->GetBuffer(), &bitmap); | 573 pStretched->GetBuffer(), &bitmap); |
574 int a, r, g, b; | 574 int a, r, g, b; |
575 ArgbDecode(argb, a, r, g, b); | 575 ArgbDecode(argb, a, r, g, b); |
576 UINT pal[258]; | 576 UINT pal[258]; |
577 pal[0] = 0; | 577 pal[0] = 0; |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 return pCollection; | 722 return pCollection; |
723 } | 723 } |
724 CallFunc(GdipDeletePrivateFontCollection)(&pCollection); | 724 CallFunc(GdipDeletePrivateFontCollection)(&pCollection); |
725 return nullptr; | 725 return nullptr; |
726 } | 726 } |
727 void CGdiplusExt::DeleteMemFont(LPVOID pCollection) { | 727 void CGdiplusExt::DeleteMemFont(LPVOID pCollection) { |
728 CGdiplusExt& GdiplusExt = | 728 CGdiplusExt& GdiplusExt = |
729 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 729 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
730 CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection); | 730 CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection); |
731 } | 731 } |
732 FX_BOOL CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void** bitmap) { | 732 bool CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void** bitmap) { |
733 CGdiplusExt& GdiplusExt = | 733 CGdiplusExt& GdiplusExt = |
734 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 734 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
735 PixelFormat format; | 735 PixelFormat format; |
736 switch (pBitmap->GetFormat()) { | 736 switch (pBitmap->GetFormat()) { |
737 case FXDIB_Rgb: | 737 case FXDIB_Rgb: |
738 format = PixelFormat24bppRGB; | 738 format = PixelFormat24bppRGB; |
739 break; | 739 break; |
740 case FXDIB_Rgb32: | 740 case FXDIB_Rgb32: |
741 format = PixelFormat32bppRGB; | 741 format = PixelFormat32bppRGB; |
742 break; | 742 break; |
743 case FXDIB_Argb: | 743 case FXDIB_Argb: |
744 format = PixelFormat32bppARGB; | 744 format = PixelFormat32bppARGB; |
745 break; | 745 break; |
746 default: | 746 default: |
747 return FALSE; | 747 return false; |
748 } | 748 } |
749 GpStatus status = CallFunc(GdipCreateBitmapFromScan0)( | 749 GpStatus status = CallFunc(GdipCreateBitmapFromScan0)( |
750 pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap->GetPitch(), format, | 750 pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap->GetPitch(), format, |
751 pBitmap->GetBuffer(), (GpBitmap**)bitmap); | 751 pBitmap->GetBuffer(), (GpBitmap**)bitmap); |
752 if (status == Ok) { | 752 if (status == Ok) { |
753 return TRUE; | 753 return true; |
754 } | 754 } |
755 return FALSE; | 755 return false; |
756 } | 756 } |
757 FX_BOOL CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics) { | 757 bool CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics) { |
758 CGdiplusExt& GdiplusExt = | 758 CGdiplusExt& GdiplusExt = |
759 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 759 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
760 GpStatus status = CallFunc(GdipGetImageGraphicsContext)( | 760 GpStatus status = CallFunc(GdipGetImageGraphicsContext)( |
761 (GpBitmap*)bitmap, (GpGraphics**)graphics); | 761 (GpBitmap*)bitmap, (GpGraphics**)graphics); |
762 if (status == Ok) { | 762 if (status == Ok) { |
763 return TRUE; | 763 return true; |
764 } | 764 } |
765 return FALSE; | 765 return false; |
766 } | 766 } |
767 FX_BOOL CGdiplusExt::GdipCreateFontFamilyFromName(const FX_WCHAR* name, | 767 bool CGdiplusExt::GdipCreateFontFamilyFromName(const FX_WCHAR* name, |
768 void* pFontCollection, | 768 void* pFontCollection, |
769 void** pFamily) { | 769 void** pFamily) { |
770 CGdiplusExt& GdiplusExt = | 770 CGdiplusExt& GdiplusExt = |
771 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 771 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
772 GpStatus status = CallFunc(GdipCreateFontFamilyFromName)( | 772 GpStatus status = CallFunc(GdipCreateFontFamilyFromName)( |
773 (GDIPCONST WCHAR*)name, (GpFontCollection*)pFontCollection, | 773 (GDIPCONST WCHAR*)name, (GpFontCollection*)pFontCollection, |
774 (GpFontFamily**)pFamily); | 774 (GpFontFamily**)pFamily); |
775 if (status == Ok) { | 775 if (status == Ok) { |
776 return TRUE; | 776 return true; |
777 } | 777 } |
778 return FALSE; | 778 return false; |
779 } | 779 } |
780 FX_BOOL CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, | 780 bool CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, |
781 FX_FLOAT font_size, | 781 FX_FLOAT font_size, |
782 int fontstyle, | 782 int fontstyle, |
783 int flag, | 783 int flag, |
784 void** pFont) { | 784 void** pFont) { |
785 CGdiplusExt& GdiplusExt = | 785 CGdiplusExt& GdiplusExt = |
786 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 786 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
787 GpStatus status = | 787 GpStatus status = |
788 CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, | 788 CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, |
789 Unit(flag), (GpFont**)pFont); | 789 Unit(flag), (GpFont**)pFont); |
790 if (status == Ok) { | 790 if (status == Ok) { |
791 return TRUE; | 791 return true; |
792 } | 792 } |
793 return FALSE; | 793 return false; |
794 } | 794 } |
795 void CGdiplusExt::GdipGetFontSize(void* pFont, FX_FLOAT* size) { | 795 void CGdiplusExt::GdipGetFontSize(void* pFont, FX_FLOAT* size) { |
796 REAL get_size; | 796 REAL get_size; |
797 CGdiplusExt& GdiplusExt = | 797 CGdiplusExt& GdiplusExt = |
798 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 798 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
799 GpStatus status = CallFunc(GdipGetFontSize)((GpFont*)pFont, (REAL*)&get_size); | 799 GpStatus status = CallFunc(GdipGetFontSize)((GpFont*)pFont, (REAL*)&get_size); |
800 if (status == Ok) { | 800 if (status == Ok) { |
801 *size = (FX_FLOAT)get_size; | 801 *size = (FX_FLOAT)get_size; |
802 } else { | 802 } else { |
803 *size = 0; | 803 *size = 0; |
804 } | 804 } |
805 } | 805 } |
806 void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode) { | 806 void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode) { |
807 CGdiplusExt& GdiplusExt = | 807 CGdiplusExt& GdiplusExt = |
808 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 808 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
809 CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, | 809 CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, |
810 (TextRenderingHint)mode); | 810 (TextRenderingHint)mode); |
811 } | 811 } |
812 void CGdiplusExt::GdipSetPageUnit(void* graphics, uint32_t unit) { | 812 void CGdiplusExt::GdipSetPageUnit(void* graphics, uint32_t unit) { |
813 CGdiplusExt& GdiplusExt = | 813 CGdiplusExt& GdiplusExt = |
814 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 814 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
815 CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit); | 815 CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit); |
816 } | 816 } |
817 FX_BOOL CGdiplusExt::GdipDrawDriverString(void* graphics, | 817 bool CGdiplusExt::GdipDrawDriverString(void* graphics, |
818 unsigned short* text, | 818 unsigned short* text, |
819 int length, | 819 int length, |
820 void* font, | 820 void* font, |
821 void* brush, | 821 void* brush, |
822 void* positions, | 822 void* positions, |
823 int flags, | 823 int flags, |
824 const void* matrix) { | 824 const void* matrix) { |
825 CGdiplusExt& GdiplusExt = | 825 CGdiplusExt& GdiplusExt = |
826 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 826 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
827 GpStatus status = CallFunc(GdipDrawDriverString)( | 827 GpStatus status = CallFunc(GdipDrawDriverString)( |
828 (GpGraphics*)graphics, (GDIPCONST UINT16*)text, (INT)length, | 828 (GpGraphics*)graphics, (GDIPCONST UINT16*)text, (INT)length, |
829 (GDIPCONST GpFont*)font, (GDIPCONST GpBrush*)brush, | 829 (GDIPCONST GpFont*)font, (GDIPCONST GpBrush*)brush, |
830 (GDIPCONST PointF*)positions, (INT)flags, (GDIPCONST GpMatrix*)matrix); | 830 (GDIPCONST PointF*)positions, (INT)flags, (GDIPCONST GpMatrix*)matrix); |
831 if (status == Ok) { | 831 if (status == Ok) { |
832 return TRUE; | 832 return true; |
833 } | 833 } |
834 return FALSE; | 834 return false; |
835 } | 835 } |
836 void CGdiplusExt::GdipCreateBrush(uint32_t fill_argb, void** pBrush) { | 836 void CGdiplusExt::GdipCreateBrush(uint32_t fill_argb, void** pBrush) { |
837 CGdiplusExt& GdiplusExt = | 837 CGdiplusExt& GdiplusExt = |
838 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 838 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
839 CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush); | 839 CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush); |
840 } | 840 } |
841 void CGdiplusExt::GdipDeleteBrush(void* pBrush) { | 841 void CGdiplusExt::GdipDeleteBrush(void* pBrush) { |
842 CGdiplusExt& GdiplusExt = | 842 CGdiplusExt& GdiplusExt = |
843 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 843 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
844 CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush); | 844 CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
902 void CGdiplusExt::GdipDisposeImage(void* bitmap) { | 902 void CGdiplusExt::GdipDisposeImage(void* bitmap) { |
903 CGdiplusExt& GdiplusExt = | 903 CGdiplusExt& GdiplusExt = |
904 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 904 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
905 CallFunc(GdipDisposeImage)((GpBitmap*)bitmap); | 905 CallFunc(GdipDisposeImage)((GpBitmap*)bitmap); |
906 } | 906 } |
907 void CGdiplusExt::GdipDeleteGraphics(void* graphics) { | 907 void CGdiplusExt::GdipDeleteGraphics(void* graphics) { |
908 CGdiplusExt& GdiplusExt = | 908 CGdiplusExt& GdiplusExt = |
909 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 909 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
910 CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics); | 910 CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics); |
911 } | 911 } |
912 FX_BOOL CGdiplusExt::StretchBitMask(HDC hDC, | 912 bool CGdiplusExt::StretchBitMask(HDC hDC, |
913 BOOL bMonoDevice, | 913 BOOL bMonoDevice, |
914 const CFX_DIBitmap* pBitmap, | 914 const CFX_DIBitmap* pBitmap, |
915 int dest_left, | 915 int dest_left, |
916 int dest_top, | 916 int dest_top, |
917 int dest_width, | 917 int dest_width, |
918 int dest_height, | 918 int dest_height, |
919 uint32_t argb, | 919 uint32_t argb, |
920 const FX_RECT* pClipRect, | 920 const FX_RECT* pClipRect, |
921 int flags) { | 921 int flags) { |
922 ASSERT(pBitmap->GetBPP() == 1); | 922 ASSERT(pBitmap->GetBPP() == 1); |
923 CGdiplusExt& GdiplusExt = | 923 CGdiplusExt& GdiplusExt = |
924 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 924 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
925 GpGraphics* pGraphics = nullptr; | 925 GpGraphics* pGraphics = nullptr; |
926 CallFunc(GdipCreateFromHDC)(hDC, &pGraphics); | 926 CallFunc(GdipCreateFromHDC)(hDC, &pGraphics); |
927 CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel); | 927 CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel); |
928 if (flags & FXDIB_NOSMOOTH) { | 928 if (flags & FXDIB_NOSMOOTH) { |
929 CallFunc(GdipSetInterpolationMode)(pGraphics, | 929 CallFunc(GdipSetInterpolationMode)(pGraphics, |
930 InterpolationModeNearestNeighbor); | 930 InterpolationModeNearestNeighbor); |
931 } else { | 931 } else { |
932 CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality); | 932 CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality); |
933 } | 933 } |
934 OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, | 934 OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, |
935 dest_width, dest_height, argb, pClipRect); | 935 dest_width, dest_height, argb, pClipRect); |
936 CallFunc(GdipDeleteGraphics)(pGraphics); | 936 CallFunc(GdipDeleteGraphics)(pGraphics); |
937 return TRUE; | 937 return true; |
938 } | 938 } |
939 FX_BOOL CGdiplusExt::StretchDIBits(HDC hDC, | 939 bool CGdiplusExt::StretchDIBits(HDC hDC, |
940 const CFX_DIBitmap* pBitmap, | 940 const CFX_DIBitmap* pBitmap, |
941 int dest_left, | 941 int dest_left, |
942 int dest_top, | 942 int dest_top, |
943 int dest_width, | 943 int dest_width, |
944 int dest_height, | 944 int dest_height, |
945 const FX_RECT* pClipRect, | 945 const FX_RECT* pClipRect, |
946 int flags) { | 946 int flags) { |
947 GpGraphics* pGraphics; | 947 GpGraphics* pGraphics; |
948 CGdiplusExt& GdiplusExt = | 948 CGdiplusExt& GdiplusExt = |
949 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 949 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
950 CallFunc(GdipCreateFromHDC)(hDC, &pGraphics); | 950 CallFunc(GdipCreateFromHDC)(hDC, &pGraphics); |
951 CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel); | 951 CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel); |
952 if (flags & FXDIB_NOSMOOTH) { | 952 if (flags & FXDIB_NOSMOOTH) { |
953 CallFunc(GdipSetInterpolationMode)(pGraphics, | 953 CallFunc(GdipSetInterpolationMode)(pGraphics, |
954 InterpolationModeNearestNeighbor); | 954 InterpolationModeNearestNeighbor); |
955 } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || | 955 } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || |
956 pBitmap->GetHeight() > abs(dest_height) / 2) { | 956 pBitmap->GetHeight() > abs(dest_height) / 2) { |
957 CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality); | 957 CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality); |
958 } else { | 958 } else { |
959 CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear); | 959 CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear); |
960 } | 960 } |
961 FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); | 961 FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); |
962 OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, | 962 OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, |
963 dest_height); | 963 dest_height); |
964 CallFunc(GdipDeleteGraphics)(pGraphics); | 964 CallFunc(GdipDeleteGraphics)(pGraphics); |
965 CallFunc(GdipDeleteGraphics)(pGraphics); | 965 CallFunc(GdipDeleteGraphics)(pGraphics); |
966 return TRUE; | 966 return true; |
967 } | 967 } |
968 static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, | 968 static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, |
969 const CFX_Matrix* pMatrix, | 969 const CFX_Matrix* pMatrix, |
970 DWORD argb, | 970 DWORD argb, |
971 FX_BOOL bTextMode = FALSE) { | 971 bool bTextMode = false) { |
972 CGdiplusExt& GdiplusExt = | 972 CGdiplusExt& GdiplusExt = |
973 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 973 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
974 FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f; | 974 FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f; |
975 if (!bTextMode) { | 975 if (!bTextMode) { |
976 FX_FLOAT unit = | 976 FX_FLOAT unit = |
977 pMatrix ? 1.0f / ((pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2) | 977 pMatrix ? 1.0f / ((pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2) |
978 : 1.0f; | 978 : 1.0f; |
979 if (width < unit) { | 979 if (width < unit) { |
980 width = unit; | 980 width = unit; |
981 } | 981 } |
982 } | 982 } |
983 GpPen* pPen = nullptr; | 983 GpPen* pPen = nullptr; |
984 CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen); | 984 CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen); |
985 LineCap lineCap = LineCapFlat; | 985 LineCap lineCap = LineCapFlat; |
986 DashCap dashCap = DashCapFlat; | 986 DashCap dashCap = DashCapFlat; |
987 FX_BOOL bDashExtend = FALSE; | 987 bool bDashExtend = false; |
988 switch (pGraphState->m_LineCap) { | 988 switch (pGraphState->m_LineCap) { |
989 case CFX_GraphStateData::LineCapButt: | 989 case CFX_GraphStateData::LineCapButt: |
990 lineCap = LineCapFlat; | 990 lineCap = LineCapFlat; |
991 break; | 991 break; |
992 case CFX_GraphStateData::LineCapRound: | 992 case CFX_GraphStateData::LineCapRound: |
993 lineCap = LineCapRound; | 993 lineCap = LineCapRound; |
994 dashCap = DashCapRound; | 994 dashCap = DashCapRound; |
995 bDashExtend = TRUE; | 995 bDashExtend = true; |
996 break; | 996 break; |
997 case CFX_GraphStateData::LineCapSquare: | 997 case CFX_GraphStateData::LineCapSquare: |
998 lineCap = LineCapSquare; | 998 lineCap = LineCapSquare; |
999 bDashExtend = TRUE; | 999 bDashExtend = true; |
1000 break; | 1000 break; |
1001 } | 1001 } |
1002 CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap); | 1002 CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap); |
1003 LineJoin lineJoin = LineJoinMiterClipped; | 1003 LineJoin lineJoin = LineJoinMiterClipped; |
1004 switch (pGraphState->m_LineJoin) { | 1004 switch (pGraphState->m_LineJoin) { |
1005 case CFX_GraphStateData::LineJoinMiter: | 1005 case CFX_GraphStateData::LineJoinMiter: |
1006 lineJoin = LineJoinMiterClipped; | 1006 lineJoin = LineJoinMiterClipped; |
1007 break; | 1007 break; |
1008 case CFX_GraphStateData::LineJoinRound: | 1008 case CFX_GraphStateData::LineJoinRound: |
1009 lineJoin = LineJoinRound; | 1009 lineJoin = LineJoinRound; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1064 phase -= 0.5f; | 1064 phase -= 0.5f; |
1065 } | 1065 } |
1066 } | 1066 } |
1067 CallFunc(GdipSetPenDashOffset)(pPen, phase); | 1067 CallFunc(GdipSetPenDashOffset)(pPen, phase); |
1068 FX_Free(pDashArray); | 1068 FX_Free(pDashArray); |
1069 pDashArray = nullptr; | 1069 pDashArray = nullptr; |
1070 } | 1070 } |
1071 CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit); | 1071 CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit); |
1072 return pPen; | 1072 return pPen; |
1073 } | 1073 } |
1074 static FX_BOOL IsSmallTriangle(PointF* points, | 1074 static bool IsSmallTriangle(PointF* points, |
1075 const CFX_Matrix* pMatrix, | 1075 const CFX_Matrix* pMatrix, |
1076 int& v1, | 1076 int& v1, |
1077 int& v2) { | 1077 int& v2) { |
1078 int pairs[] = {1, 2, 0, 2, 0, 1}; | 1078 int pairs[] = {1, 2, 0, 2, 0, 1}; |
1079 for (int i = 0; i < 3; i++) { | 1079 for (int i = 0; i < 3; i++) { |
1080 int pair1 = pairs[i * 2]; | 1080 int pair1 = pairs[i * 2]; |
1081 int pair2 = pairs[i * 2 + 1]; | 1081 int pair2 = pairs[i * 2 + 1]; |
1082 FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X; | 1082 FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X; |
1083 FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y; | 1083 FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y; |
1084 if (pMatrix) { | 1084 if (pMatrix) { |
1085 pMatrix->Transform(x1, y1); | 1085 pMatrix->Transform(x1, y1); |
1086 pMatrix->Transform(x2, y2); | 1086 pMatrix->Transform(x2, y2); |
1087 } | 1087 } |
1088 FX_FLOAT dx = x1 - x2; | 1088 FX_FLOAT dx = x1 - x2; |
1089 FX_FLOAT dy = y1 - y2; | 1089 FX_FLOAT dy = y1 - y2; |
1090 FX_FLOAT distance_square = (dx * dx) + (dy * dy); | 1090 FX_FLOAT distance_square = (dx * dx) + (dy * dy); |
1091 if (distance_square < (1.0f * 2 + 1.0f / 4)) { | 1091 if (distance_square < (1.0f * 2 + 1.0f / 4)) { |
1092 v1 = i; | 1092 v1 = i; |
1093 v2 = pair1; | 1093 v2 = pair1; |
1094 return TRUE; | 1094 return true; |
1095 } | 1095 } |
1096 } | 1096 } |
1097 return FALSE; | 1097 return false; |
1098 } | 1098 } |
1099 FX_BOOL CGdiplusExt::DrawPath(HDC hDC, | 1099 bool CGdiplusExt::DrawPath(HDC hDC, |
1100 const CFX_PathData* pPathData, | 1100 const CFX_PathData* pPathData, |
1101 const CFX_Matrix* pObject2Device, | 1101 const CFX_Matrix* pObject2Device, |
1102 const CFX_GraphStateData* pGraphState, | 1102 const CFX_GraphStateData* pGraphState, |
1103 uint32_t fill_argb, | 1103 uint32_t fill_argb, |
1104 uint32_t stroke_argb, | 1104 uint32_t stroke_argb, |
1105 int fill_mode) { | 1105 int fill_mode) { |
1106 int nPoints = pPathData->GetPointCount(); | 1106 int nPoints = pPathData->GetPointCount(); |
1107 if (nPoints == 0) { | 1107 if (nPoints == 0) { |
1108 return TRUE; | 1108 return true; |
1109 } | 1109 } |
1110 FX_PATHPOINT* pPoints = pPathData->GetPoints(); | 1110 FX_PATHPOINT* pPoints = pPathData->GetPoints(); |
1111 GpGraphics* pGraphics = nullptr; | 1111 GpGraphics* pGraphics = nullptr; |
1112 CGdiplusExt& GdiplusExt = | 1112 CGdiplusExt& GdiplusExt = |
1113 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; | 1113 ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; |
1114 CallFunc(GdipCreateFromHDC)(hDC, &pGraphics); | 1114 CallFunc(GdipCreateFromHDC)(hDC, &pGraphics); |
1115 CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel); | 1115 CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel); |
1116 CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf); | 1116 CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf); |
1117 GpMatrix* pMatrix = nullptr; | 1117 GpMatrix* pMatrix = nullptr; |
1118 if (pObject2Device) { | 1118 if (pObject2Device) { |
1119 CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, | 1119 CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, |
1120 pObject2Device->c, pObject2Device->d, | 1120 pObject2Device->c, pObject2Device->d, |
1121 pObject2Device->e, pObject2Device->f, &pMatrix); | 1121 pObject2Device->e, pObject2Device->f, &pMatrix); |
1122 CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix); | 1122 CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix); |
1123 } | 1123 } |
1124 PointF* points = FX_Alloc(PointF, nPoints); | 1124 PointF* points = FX_Alloc(PointF, nPoints); |
1125 BYTE* types = FX_Alloc(BYTE, nPoints); | 1125 BYTE* types = FX_Alloc(BYTE, nPoints); |
1126 int nSubPathes = 0; | 1126 int nSubPathes = 0; |
1127 FX_BOOL bSubClose = FALSE; | 1127 bool bSubClose = false; |
1128 int pos_subclose = 0; | 1128 int pos_subclose = 0; |
1129 FX_BOOL bSmooth = FALSE; | 1129 bool bSmooth = false; |
1130 int startpoint = 0; | 1130 int startpoint = 0; |
1131 for (int i = 0; i < nPoints; i++) { | 1131 for (int i = 0; i < nPoints; i++) { |
1132 points[i].X = pPoints[i].m_PointX; | 1132 points[i].X = pPoints[i].m_PointX; |
1133 points[i].Y = pPoints[i].m_PointY; | 1133 points[i].Y = pPoints[i].m_PointY; |
1134 FX_FLOAT x, y; | 1134 FX_FLOAT x, y; |
1135 if (pObject2Device) { | 1135 if (pObject2Device) { |
1136 pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y); | 1136 pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y); |
1137 } else { | 1137 } else { |
1138 x = pPoints[i].m_PointX; | 1138 x = pPoints[i].m_PointX; |
1139 y = pPoints[i].m_PointY; | 1139 y = pPoints[i].m_PointY; |
1140 } | 1140 } |
1141 if (x > 50000 * 1.0f) { | 1141 if (x > 50000 * 1.0f) { |
1142 points[i].X = 50000 * 1.0f; | 1142 points[i].X = 50000 * 1.0f; |
1143 } | 1143 } |
1144 if (x < -50000 * 1.0f) { | 1144 if (x < -50000 * 1.0f) { |
1145 points[i].X = -50000 * 1.0f; | 1145 points[i].X = -50000 * 1.0f; |
1146 } | 1146 } |
1147 if (y > 50000 * 1.0f) { | 1147 if (y > 50000 * 1.0f) { |
1148 points[i].Y = 50000 * 1.0f; | 1148 points[i].Y = 50000 * 1.0f; |
1149 } | 1149 } |
1150 if (y < -50000 * 1.0f) { | 1150 if (y < -50000 * 1.0f) { |
1151 points[i].Y = -50000 * 1.0f; | 1151 points[i].Y = -50000 * 1.0f; |
1152 } | 1152 } |
1153 int point_type = pPoints[i].m_Flag & FXPT_TYPE; | 1153 int point_type = pPoints[i].m_Flag & FXPT_TYPE; |
1154 if (point_type == FXPT_MOVETO) { | 1154 if (point_type == FXPT_MOVETO) { |
1155 types[i] = PathPointTypeStart; | 1155 types[i] = PathPointTypeStart; |
1156 nSubPathes++; | 1156 nSubPathes++; |
1157 bSubClose = FALSE; | 1157 bSubClose = false; |
1158 startpoint = i; | 1158 startpoint = i; |
1159 } else if (point_type == FXPT_LINETO) { | 1159 } else if (point_type == FXPT_LINETO) { |
1160 types[i] = PathPointTypeLine; | 1160 types[i] = PathPointTypeLine; |
1161 if (pPoints[i - 1].m_Flag == FXPT_MOVETO && | 1161 if (pPoints[i - 1].m_Flag == FXPT_MOVETO && |
1162 (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) && | 1162 (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) && |
1163 points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) { | 1163 points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) { |
1164 points[i].X += 0.01f; | 1164 points[i].X += 0.01f; |
1165 continue; | 1165 continue; |
1166 } | 1166 } |
1167 if (!bSmooth && points[i].X != points[i - 1].X && | 1167 if (!bSmooth && points[i].X != points[i - 1].X && |
1168 points[i].Y != points[i - 1].Y) { | 1168 points[i].Y != points[i - 1].Y) { |
1169 bSmooth = TRUE; | 1169 bSmooth = true; |
1170 } | 1170 } |
1171 } else if (point_type == FXPT_BEZIERTO) { | 1171 } else if (point_type == FXPT_BEZIERTO) { |
1172 types[i] = PathPointTypeBezier; | 1172 types[i] = PathPointTypeBezier; |
1173 bSmooth = TRUE; | 1173 bSmooth = true; |
1174 } | 1174 } |
1175 if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) { | 1175 if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) { |
1176 if (bSubClose) { | 1176 if (bSubClose) { |
1177 types[pos_subclose] &= ~PathPointTypeCloseSubpath; | 1177 types[pos_subclose] &= ~PathPointTypeCloseSubpath; |
1178 } else { | 1178 } else { |
1179 bSubClose = TRUE; | 1179 bSubClose = true; |
1180 } | 1180 } |
1181 pos_subclose = i; | 1181 pos_subclose = i; |
1182 types[i] |= PathPointTypeCloseSubpath; | 1182 types[i] |= PathPointTypeCloseSubpath; |
1183 if (!bSmooth && points[i].X != points[startpoint].X && | 1183 if (!bSmooth && points[i].X != points[startpoint].X && |
1184 points[i].Y != points[startpoint].Y) { | 1184 points[i].Y != points[startpoint].Y) { |
1185 bSmooth = TRUE; | 1185 bSmooth = true; |
1186 } | 1186 } |
1187 } | 1187 } |
1188 } | 1188 } |
1189 if (fill_mode & FXFILL_NOPATHSMOOTH) { | 1189 if (fill_mode & FXFILL_NOPATHSMOOTH) { |
1190 bSmooth = FALSE; | 1190 bSmooth = false; |
1191 CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone); | 1191 CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone); |
1192 } else if (!(fill_mode & FXFILL_FULLCOVER)) { | 1192 } else if (!(fill_mode & FXFILL_FULLCOVER)) { |
1193 if (!bSmooth && (fill_mode & 3)) { | 1193 if (!bSmooth && (fill_mode & 3)) { |
1194 bSmooth = TRUE; | 1194 bSmooth = true; |
1195 } | 1195 } |
1196 if (bSmooth || (pGraphState && pGraphState->m_LineWidth > 2)) { | 1196 if (bSmooth || (pGraphState && pGraphState->m_LineWidth > 2)) { |
1197 CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias); | 1197 CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias); |
1198 } | 1198 } |
1199 } | 1199 } |
1200 int new_fill_mode = fill_mode & 3; | 1200 int new_fill_mode = fill_mode & 3; |
1201 if (nPoints == 4 && !pGraphState) { | 1201 if (nPoints == 4 && !pGraphState) { |
1202 int v1, v2; | 1202 int v1, v2; |
1203 if (IsSmallTriangle(points, pObject2Device, v1, v2)) { | 1203 if (IsSmallTriangle(points, pObject2Device, v1, v2)) { |
1204 GpPen* pPen = nullptr; | 1204 GpPen* pPen = nullptr; |
1205 CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen); | 1205 CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen); |
1206 CallFunc(GdipDrawLineI)( | 1206 CallFunc(GdipDrawLineI)( |
1207 pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y), | 1207 pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y), |
1208 FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y)); | 1208 FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y)); |
1209 CallFunc(GdipDeletePen)(pPen); | 1209 CallFunc(GdipDeletePen)(pPen); |
1210 return TRUE; | 1210 return true; |
1211 } | 1211 } |
1212 } | 1212 } |
1213 GpPath* pGpPath = nullptr; | 1213 GpPath* pGpPath = nullptr; |
1214 CallFunc(GdipCreatePath2)(points, types, nPoints, | 1214 CallFunc(GdipCreatePath2)(points, types, nPoints, |
1215 GdiFillType2Gdip(new_fill_mode), &pGpPath); | 1215 GdiFillType2Gdip(new_fill_mode), &pGpPath); |
1216 if (!pGpPath) { | 1216 if (!pGpPath) { |
1217 if (pMatrix) { | 1217 if (pMatrix) { |
1218 CallFunc(GdipDeleteMatrix)(pMatrix); | 1218 CallFunc(GdipDeleteMatrix)(pMatrix); |
1219 } | 1219 } |
1220 FX_Free(points); | 1220 FX_Free(points); |
1221 FX_Free(types); | 1221 FX_Free(types); |
1222 CallFunc(GdipDeleteGraphics)(pGraphics); | 1222 CallFunc(GdipDeleteGraphics)(pGraphics); |
1223 return FALSE; | 1223 return false; |
1224 } | 1224 } |
1225 if (new_fill_mode) { | 1225 if (new_fill_mode) { |
1226 GpBrush* pBrush = _GdipCreateBrush(fill_argb); | 1226 GpBrush* pBrush = _GdipCreateBrush(fill_argb); |
1227 CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode)); | 1227 CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode)); |
1228 CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath); | 1228 CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath); |
1229 CallFunc(GdipDeleteBrush)(pBrush); | 1229 CallFunc(GdipDeleteBrush)(pBrush); |
1230 } | 1230 } |
1231 if (pGraphState && stroke_argb) { | 1231 if (pGraphState && stroke_argb) { |
1232 GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, | 1232 GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, |
1233 !!(fill_mode & FX_STROKE_TEXT_MODE)); | 1233 !!(fill_mode & FX_STROKE_TEXT_MODE)); |
(...skipping 15 matching lines...) Expand all Loading... |
1249 } | 1249 } |
1250 CallFunc(GdipDeletePen)(pPen); | 1250 CallFunc(GdipDeletePen)(pPen); |
1251 } | 1251 } |
1252 if (pMatrix) { | 1252 if (pMatrix) { |
1253 CallFunc(GdipDeleteMatrix)(pMatrix); | 1253 CallFunc(GdipDeleteMatrix)(pMatrix); |
1254 } | 1254 } |
1255 FX_Free(points); | 1255 FX_Free(points); |
1256 FX_Free(types); | 1256 FX_Free(types); |
1257 CallFunc(GdipDeletePath)(pGpPath); | 1257 CallFunc(GdipDeletePath)(pGpPath); |
1258 CallFunc(GdipDeleteGraphics)(pGraphics); | 1258 CallFunc(GdipDeleteGraphics)(pGraphics); |
1259 return TRUE; | 1259 return true; |
1260 } | 1260 } |
1261 | 1261 |
1262 class GpStream final : public IStream { | 1262 class GpStream final : public IStream { |
1263 public: | 1263 public: |
1264 GpStream() : m_RefCount(1), m_ReadPos(0) {} | 1264 GpStream() : m_RefCount(1), m_ReadPos(0) {} |
1265 | 1265 |
1266 // IUnknown | 1266 // IUnknown |
1267 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, | 1267 HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, |
1268 void** ppvObject) override { | 1268 void** ppvObject) override { |
1269 if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) || | 1269 if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) || |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1490 FX_Free(pInfo->pBitmapData); | 1490 FX_Free(pInfo->pBitmapData); |
1491 FX_Free((LPBYTE)pInfo->pbmi); | 1491 FX_Free((LPBYTE)pInfo->pbmi); |
1492 if (pInfo->pStream) { | 1492 if (pInfo->pStream) { |
1493 pInfo->pStream->Release(); | 1493 pInfo->pStream->Release(); |
1494 } | 1494 } |
1495 FX_Free(pInfo); | 1495 FX_Free(pInfo); |
1496 } | 1496 } |
1497 | 1497 |
1498 CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, | 1498 CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, |
1499 LPVOID pData, | 1499 LPVOID pData, |
1500 FX_BOOL bAlpha); | 1500 bool bAlpha); |
1501 CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args) { | 1501 CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args) { |
1502 PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args); | 1502 PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args); |
1503 if (!pInfo) { | 1503 if (!pInfo) { |
1504 return nullptr; | 1504 return nullptr; |
1505 } | 1505 } |
1506 int height = abs(pInfo->pbmi->bmiHeader.biHeight); | 1506 int height = abs(pInfo->pbmi->bmiHeader.biHeight); |
1507 int width = pInfo->pbmi->bmiHeader.biWidth; | 1507 int width = pInfo->pbmi->bmiHeader.biWidth; |
1508 int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4; | 1508 int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4; |
1509 LPBYTE pData = FX_Alloc2D(BYTE, dest_pitch, height); | 1509 LPBYTE pData = FX_Alloc2D(BYTE, dest_pitch, height); |
1510 if (dest_pitch == pInfo->Stride) { | 1510 if (dest_pitch == pInfo->Stride) { |
1511 FXSYS_memcpy(pData, pInfo->pScan0, dest_pitch * height); | 1511 FXSYS_memcpy(pData, pInfo->pScan0, dest_pitch * height); |
1512 } else { | 1512 } else { |
1513 for (int i = 0; i < height; i++) { | 1513 for (int i = 0; i < height; i++) { |
1514 FXSYS_memcpy(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, | 1514 FXSYS_memcpy(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, |
1515 dest_pitch); | 1515 dest_pitch); |
1516 } | 1516 } |
1517 } | 1517 } |
1518 CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf( | 1518 CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf( |
1519 pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32); | 1519 pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32); |
1520 FX_Free(pData); | 1520 FX_Free(pData); |
1521 FreeDIBitmap(pInfo); | 1521 FreeDIBitmap(pInfo); |
1522 return pDIBitmap; | 1522 return pDIBitmap; |
1523 } | 1523 } |
OLD | NEW |