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/include/fx_ge.h" | 7 #include "core/fxge/include/fx_ge.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 m_Width = ::GetDeviceCaps(m_hDC, HORZRES); | 746 m_Width = ::GetDeviceCaps(m_hDC, HORZRES); |
747 m_Height = ::GetDeviceCaps(m_hDC, VERTRES); | 747 m_Height = ::GetDeviceCaps(m_hDC, VERTRES); |
748 } | 748 } |
749 if (m_DeviceClass != FXDC_DISPLAY) { | 749 if (m_DeviceClass != FXDC_DISPLAY) { |
750 m_RenderCaps = FXRC_BIT_MASK; | 750 m_RenderCaps = FXRC_BIT_MASK; |
751 } else { | 751 } else { |
752 m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK; | 752 m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK; |
753 } | 753 } |
754 } | 754 } |
755 | 755 |
| 756 CGdiDeviceDriver::~CGdiDeviceDriver() {} |
| 757 |
756 int CGdiDeviceDriver::GetDeviceCaps(int caps_id) { | 758 int CGdiDeviceDriver::GetDeviceCaps(int caps_id) { |
757 switch (caps_id) { | 759 switch (caps_id) { |
758 case FXDC_DEVICE_CLASS: | 760 case FXDC_DEVICE_CLASS: |
759 return m_DeviceClass; | 761 return m_DeviceClass; |
760 case FXDC_PIXEL_WIDTH: | 762 case FXDC_PIXEL_WIDTH: |
761 return m_Width; | 763 return m_Width; |
762 case FXDC_PIXEL_HEIGHT: | 764 case FXDC_PIXEL_HEIGHT: |
763 return m_Height; | 765 return m_Height; |
764 case FXDC_BITS_PIXEL: | 766 case FXDC_BITS_PIXEL: |
765 return m_nBitsPerPixel; | 767 return m_nBitsPerPixel; |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr); | 993 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr); |
992 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); | 994 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); |
993 } | 995 } |
994 | 996 |
995 FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData, | 997 FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData, |
996 const CFX_Matrix* pMatrix, | 998 const CFX_Matrix* pMatrix, |
997 const CFX_GraphStateData* pGraphState, | 999 const CFX_GraphStateData* pGraphState, |
998 uint32_t fill_color, | 1000 uint32_t fill_color, |
999 uint32_t stroke_color, | 1001 uint32_t stroke_color, |
1000 int fill_mode, | 1002 int fill_mode, |
1001 int alpha_flag, | |
1002 void* pIccTransform, | |
1003 int blend_type) { | 1003 int blend_type) { |
1004 if (blend_type != FXDIB_BLEND_NORMAL) { | 1004 if (blend_type != FXDIB_BLEND_NORMAL) |
1005 return FALSE; | 1005 return FALSE; |
1006 } | 1006 |
1007 Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); | 1007 Color2Argb(fill_color, fill_color, 1 << 24, nullptr); |
1008 Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform); | 1008 Color2Argb(stroke_color, stroke_color, 0, nullptr); |
1009 CWin32Platform* pPlatform = | 1009 CWin32Platform* pPlatform = |
1010 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); | 1010 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); |
1011 if (!(pGraphState || stroke_color == 0) && | 1011 if (!(pGraphState || stroke_color == 0) && |
1012 !pPlatform->m_GdiplusExt.IsAvailable()) { | 1012 !pPlatform->m_GdiplusExt.IsAvailable()) { |
1013 CFX_FloatRect bbox_f = pPathData->GetBoundingBox(); | 1013 CFX_FloatRect bbox_f = pPathData->GetBoundingBox(); |
1014 if (pMatrix) { | 1014 if (pMatrix) { |
1015 bbox_f.Transform(pMatrix); | 1015 bbox_f.Transform(pMatrix); |
1016 } | 1016 } |
1017 FX_RECT bbox = bbox_f.GetInnerRect(); | 1017 FX_RECT bbox = bbox_f.GetInnerRect(); |
1018 if (bbox.Width() <= 0) { | 1018 if (bbox.Width() <= 0) { |
1019 return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), | 1019 return DrawCosmeticLine( |
1020 (FX_FLOAT)(bbox.left), | 1020 (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left), |
1021 (FX_FLOAT)(bbox.bottom + 1), fill_color, | 1021 (FX_FLOAT)(bbox.bottom + 1), fill_color, FXDIB_BLEND_NORMAL); |
1022 alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL); | 1022 } |
1023 } else if (bbox.Height() <= 0) { | 1023 if (bbox.Height() <= 0) { |
1024 return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), | 1024 return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), |
1025 (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), | 1025 (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), |
1026 fill_color, alpha_flag, pIccTransform, | 1026 fill_color, FXDIB_BLEND_NORMAL); |
1027 FXDIB_BLEND_NORMAL); | |
1028 } | 1027 } |
1029 } | 1028 } |
1030 int fill_alpha = FXARGB_A(fill_color); | 1029 int fill_alpha = FXARGB_A(fill_color); |
1031 int stroke_alpha = FXARGB_A(stroke_color); | 1030 int stroke_alpha = FXARGB_A(stroke_color); |
1032 FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || | 1031 FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || |
1033 (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState); | 1032 (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState); |
1034 if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) { | 1033 if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) |
1035 return FALSE; | 1034 return FALSE; |
1036 } | 1035 |
1037 if (pPlatform->m_GdiplusExt.IsAvailable()) { | 1036 if (pPlatform->m_GdiplusExt.IsAvailable()) { |
1038 if (bDrawAlpha || | 1037 if (bDrawAlpha || |
1039 ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || | 1038 ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || |
1040 (pGraphState && pGraphState->m_DashCount))) { | 1039 (pGraphState && pGraphState->m_DashCount))) { |
1041 if (!((!pMatrix || MatrixNoScaled(pMatrix)) && pGraphState && | 1040 if (!((!pMatrix || MatrixNoScaled(pMatrix)) && pGraphState && |
1042 pGraphState->m_LineWidth == 1.f && | 1041 pGraphState->m_LineWidth == 1.f && |
1043 (pPathData->GetPointCount() == 5 || | 1042 (pPathData->GetPointCount() == 5 || |
1044 pPathData->GetPointCount() == 4) && | 1043 pPathData->GetPointCount() == 4) && |
1045 pPathData->IsRect())) { | 1044 pPathData->IsRect())) { |
1046 if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, | 1045 if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, |
(...skipping 13 matching lines...) Expand all Loading... |
1060 hPen = CreatePen(pGraphState, pMatrix, stroke_color); | 1059 hPen = CreatePen(pGraphState, pMatrix, stroke_color); |
1061 hPen = (HPEN)SelectObject(m_hDC, hPen); | 1060 hPen = (HPEN)SelectObject(m_hDC, hPen); |
1062 } | 1061 } |
1063 if (fill_mode && fill_alpha) { | 1062 if (fill_mode && fill_alpha) { |
1064 SetPolyFillMode(m_hDC, fill_mode); | 1063 SetPolyFillMode(m_hDC, fill_mode); |
1065 hBrush = CreateBrush(fill_color); | 1064 hBrush = CreateBrush(fill_color); |
1066 hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); | 1065 hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); |
1067 } | 1066 } |
1068 if (pPathData->GetPointCount() == 2 && pGraphState && | 1067 if (pPathData->GetPointCount() == 2 && pGraphState && |
1069 pGraphState->m_DashCount) { | 1068 pGraphState->m_DashCount) { |
1070 FX_FLOAT x1 = pPathData->GetPointX(0), y1 = pPathData->GetPointY(0); | 1069 FX_FLOAT x1 = pPathData->GetPointX(0); |
| 1070 FX_FLOAT y1 = pPathData->GetPointY(0); |
| 1071 FX_FLOAT x2 = pPathData->GetPointX(1); |
| 1072 FX_FLOAT y2 = pPathData->GetPointY(1); |
1071 if (pMatrix) { | 1073 if (pMatrix) { |
1072 pMatrix->Transform(x1, y1); | 1074 pMatrix->Transform(x1, y1); |
1073 } | |
1074 FX_FLOAT x2 = pPathData->GetPointX(1), y2 = pPathData->GetPointY(1); | |
1075 if (pMatrix) { | |
1076 pMatrix->Transform(x2, y2); | 1075 pMatrix->Transform(x2, y2); |
1077 } | 1076 } |
1078 DrawLine(x1, y1, x2, y2); | 1077 DrawLine(x1, y1, x2, y2); |
1079 } else { | 1078 } else { |
1080 SetPathToDC(m_hDC, pPathData, pMatrix); | 1079 SetPathToDC(m_hDC, pPathData, pMatrix); |
1081 if (pGraphState && stroke_alpha) { | 1080 if (pGraphState && stroke_alpha) { |
1082 if (fill_mode && fill_alpha) { | 1081 if (fill_mode && fill_alpha) { |
1083 if (old_fill_mode & FX_FILL_TEXT_MODE) { | 1082 if (old_fill_mode & FX_FILL_TEXT_MODE) { |
1084 StrokeAndFillPath(m_hDC); | 1083 StrokeAndFillPath(m_hDC); |
1085 } else { | 1084 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
1098 hPen = (HPEN)SelectObject(m_hDC, hPen); | 1097 hPen = (HPEN)SelectObject(m_hDC, hPen); |
1099 DeleteObject(hPen); | 1098 DeleteObject(hPen); |
1100 } | 1099 } |
1101 if (hBrush) { | 1100 if (hBrush) { |
1102 hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); | 1101 hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); |
1103 DeleteObject(hBrush); | 1102 DeleteObject(hBrush); |
1104 } | 1103 } |
1105 return TRUE; | 1104 return TRUE; |
1106 } | 1105 } |
1107 | 1106 |
1108 FX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, | 1107 FX_BOOL CGdiDeviceDriver::FillRectWithBlend(const FX_RECT* pRect, |
1109 uint32_t fill_color, | 1108 uint32_t fill_color, |
1110 int alpha_flag, | 1109 int blend_type) { |
1111 void* pIccTransform, | 1110 if (blend_type != FXDIB_BLEND_NORMAL) |
1112 int blend_type) { | |
1113 if (blend_type != FXDIB_BLEND_NORMAL) { | |
1114 return FALSE; | 1111 return FALSE; |
1115 } | 1112 |
1116 Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform); | 1113 Color2Argb(fill_color, fill_color, 1 << 24, nullptr); |
1117 int alpha; | 1114 int alpha; |
1118 FX_COLORREF rgb; | 1115 FX_COLORREF rgb; |
1119 ArgbDecode(fill_color, alpha, rgb); | 1116 ArgbDecode(fill_color, alpha, rgb); |
1120 if (alpha == 0) { | 1117 if (alpha == 0) |
1121 return TRUE; | 1118 return TRUE; |
1122 } | 1119 |
1123 if (alpha < 255) { | 1120 if (alpha < 255) |
1124 return FALSE; | 1121 return FALSE; |
1125 } | 1122 |
1126 HBRUSH hBrush = CreateSolidBrush(rgb); | 1123 HBRUSH hBrush = CreateSolidBrush(rgb); |
1127 ::FillRect(m_hDC, (RECT*)pRect, hBrush); | 1124 ::FillRect(m_hDC, (RECT*)pRect, hBrush); |
1128 DeleteObject(hBrush); | 1125 DeleteObject(hBrush); |
1129 return TRUE; | 1126 return TRUE; |
1130 } | 1127 } |
1131 | 1128 |
1132 FX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData, | 1129 FX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData, |
1133 const CFX_Matrix* pMatrix, | 1130 const CFX_Matrix* pMatrix, |
1134 int fill_mode) { | 1131 int fill_mode) { |
1135 if (pPathData->GetPointCount() == 5) { | 1132 if (pPathData->GetPointCount() == 5) { |
(...skipping 23 matching lines...) Expand all Loading... |
1159 hPen = (HPEN)SelectObject(m_hDC, hPen); | 1156 hPen = (HPEN)SelectObject(m_hDC, hPen); |
1160 DeleteObject(hPen); | 1157 DeleteObject(hPen); |
1161 return ret; | 1158 return ret; |
1162 } | 1159 } |
1163 | 1160 |
1164 FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, | 1161 FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, |
1165 FX_FLOAT y1, | 1162 FX_FLOAT y1, |
1166 FX_FLOAT x2, | 1163 FX_FLOAT x2, |
1167 FX_FLOAT y2, | 1164 FX_FLOAT y2, |
1168 uint32_t color, | 1165 uint32_t color, |
1169 int alpha_flag, | |
1170 void* pIccTransform, | |
1171 int blend_type) { | 1166 int blend_type) { |
1172 if (blend_type != FXDIB_BLEND_NORMAL) { | 1167 if (blend_type != FXDIB_BLEND_NORMAL) |
1173 return FALSE; | 1168 return FALSE; |
1174 } | 1169 |
1175 Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform); | 1170 Color2Argb(color, color, 1 << 24, nullptr); |
1176 int a; | 1171 int a; |
1177 FX_COLORREF rgb; | 1172 FX_COLORREF rgb; |
1178 ArgbDecode(color, a, rgb); | 1173 ArgbDecode(color, a, rgb); |
1179 if (a == 0) { | 1174 if (a == 0) |
1180 return TRUE; | 1175 return TRUE; |
1181 } | 1176 |
1182 HPEN hPen = CreatePen(PS_SOLID, 1, rgb); | 1177 HPEN hPen = CreatePen(PS_SOLID, 1, rgb); |
1183 hPen = (HPEN)SelectObject(m_hDC, hPen); | 1178 hPen = (HPEN)SelectObject(m_hDC, hPen); |
1184 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr); | 1179 MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr); |
1185 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); | 1180 LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); |
1186 hPen = (HPEN)SelectObject(m_hDC, hPen); | 1181 hPen = (HPEN)SelectObject(m_hDC, hPen); |
1187 DeleteObject(hPen); | 1182 DeleteObject(hPen); |
1188 return TRUE; | 1183 return TRUE; |
1189 } | 1184 } |
1190 | 1185 |
1191 FX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(void* pRgn) { | 1186 FX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(void* pRgn) { |
1192 DeleteObject((HGDIOBJ)pRgn); | 1187 DeleteObject((HGDIOBJ)pRgn); |
1193 return TRUE; | 1188 return TRUE; |
1194 } | 1189 } |
1195 | 1190 |
1196 CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) | 1191 CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) |
1197 : CGdiDeviceDriver(hDC, FXDC_DISPLAY) { | 1192 : CGdiDeviceDriver(hDC, FXDC_DISPLAY) { |
1198 CWin32Platform* pPlatform = | 1193 CWin32Platform* pPlatform = |
1199 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); | 1194 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); |
1200 if (pPlatform->m_GdiplusExt.IsAvailable()) { | 1195 if (pPlatform->m_GdiplusExt.IsAvailable()) { |
1201 m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE; | 1196 m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE; |
1202 } | 1197 } |
1203 } | 1198 } |
1204 | 1199 |
1205 FX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, | 1200 CGdiDisplayDriver::~CGdiDisplayDriver() {} |
1206 int left, | 1201 |
1207 int top, | 1202 FX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) { |
1208 void* pIccTransform, | |
1209 FX_BOOL bDEdge) { | |
1210 FX_BOOL ret = FALSE; | 1203 FX_BOOL ret = FALSE; |
1211 int width = pBitmap->GetWidth(); | 1204 int width = pBitmap->GetWidth(); |
1212 int height = pBitmap->GetHeight(); | 1205 int height = pBitmap->GetHeight(); |
1213 HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height); | 1206 HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height); |
1214 HDC hDCMemory = CreateCompatibleDC(m_hDC); | 1207 HDC hDCMemory = CreateCompatibleDC(m_hDC); |
1215 HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp); | 1208 HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp); |
1216 BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY); | 1209 BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY); |
1217 SelectObject(hDCMemory, holdbmp); | 1210 SelectObject(hDCMemory, holdbmp); |
1218 BITMAPINFO bmi; | 1211 BITMAPINFO bmi; |
1219 FXSYS_memset(&bmi, 0, sizeof bmi); | 1212 FXSYS_memset(&bmi, 0, sizeof bmi); |
1220 bmi.bmiHeader.biSize = sizeof bmi.bmiHeader; | 1213 bmi.bmiHeader.biSize = sizeof bmi.bmiHeader; |
1221 bmi.bmiHeader.biBitCount = pBitmap->GetBPP(); | 1214 bmi.bmiHeader.biBitCount = pBitmap->GetBPP(); |
1222 bmi.bmiHeader.biHeight = -height; | 1215 bmi.bmiHeader.biHeight = -height; |
1223 bmi.bmiHeader.biPlanes = 1; | 1216 bmi.bmiHeader.biPlanes = 1; |
1224 bmi.bmiHeader.biWidth = width; | 1217 bmi.bmiHeader.biWidth = width; |
1225 if (!CFX_GEModule::Get()->GetCodecModule() || | 1218 if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage()) { |
1226 !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { | |
1227 pIccTransform = nullptr; | |
1228 } | |
1229 if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage() && !pIccTransform) { | |
1230 ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, | 1219 ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, |
1231 DIB_RGB_COLORS) == height; | 1220 DIB_RGB_COLORS) == height; |
1232 } else { | 1221 } else { |
1233 CFX_DIBitmap bitmap; | 1222 CFX_DIBitmap bitmap; |
1234 if (bitmap.Create(width, height, FXDIB_Rgb)) { | 1223 if (bitmap.Create(width, height, FXDIB_Rgb)) { |
1235 bmi.bmiHeader.biBitCount = 24; | 1224 bmi.bmiHeader.biBitCount = 24; |
1236 ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, | 1225 ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, |
1237 DIB_RGB_COLORS); | 1226 DIB_RGB_COLORS); |
1238 ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, | 1227 ret = |
1239 pIccTransform); | 1228 pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, nullptr); |
1240 } else { | 1229 } else { |
1241 ret = FALSE; | 1230 ret = FALSE; |
1242 } | 1231 } |
1243 } | 1232 } |
1244 if (pBitmap->HasAlpha() && ret) { | 1233 if (pBitmap->HasAlpha() && ret) |
1245 pBitmap->LoadChannel(FXDIB_Alpha, 0xff); | 1234 pBitmap->LoadChannel(FXDIB_Alpha, 0xff); |
1246 } | 1235 |
1247 DeleteObject(hbmp); | 1236 DeleteObject(hbmp); |
1248 DeleteObject(hDCMemory); | 1237 DeleteObject(hDCMemory); |
1249 return ret; | 1238 return ret; |
1250 } | 1239 } |
1251 | 1240 |
1252 FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, | 1241 FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, |
1253 uint32_t color, | 1242 uint32_t color, |
1254 const FX_RECT* pSrcRect, | 1243 const FX_RECT* pSrcRect, |
1255 int left, | 1244 int left, |
1256 int top, | 1245 int top, |
1257 int blend_type, | 1246 int blend_type) { |
1258 int alpha_flag, | |
1259 void* pIccTransform) { | |
1260 ASSERT(blend_type == FXDIB_BLEND_NORMAL); | 1247 ASSERT(blend_type == FXDIB_BLEND_NORMAL); |
1261 if (pSource->IsAlphaMask()) { | 1248 if (pSource->IsAlphaMask()) { |
1262 int width = pSource->GetWidth(), height = pSource->GetHeight(); | 1249 int width = pSource->GetWidth(), height = pSource->GetHeight(); |
1263 int alpha = FXGETFLAG_COLORTYPE(alpha_flag) | 1250 int alpha = FXARGB_A(color); |
1264 ? FXGETFLAG_ALPHA_FILL(alpha_flag) | |
1265 : FXARGB_A(color); | |
1266 if (pSource->GetBPP() != 1 || alpha != 255) { | 1251 if (pSource->GetBPP() != 1 || alpha != 255) { |
1267 CFX_DIBitmap background; | 1252 CFX_DIBitmap background; |
1268 if (!background.Create(width, height, FXDIB_Rgb32) || | 1253 if (!background.Create(width, height, FXDIB_Rgb32) || |
1269 !GetDIBits(&background, left, top, nullptr) || | 1254 !GetDIBits(&background, left, top) || |
1270 !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, | 1255 !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, |
1271 FXDIB_BLEND_NORMAL, nullptr, FALSE, | 1256 FXDIB_BLEND_NORMAL, nullptr, FALSE, 0, |
1272 alpha_flag, pIccTransform)) { | 1257 nullptr)) { |
1273 return FALSE; | 1258 return FALSE; |
1274 } | 1259 } |
1275 FX_RECT src_rect(0, 0, width, height); | 1260 FX_RECT src_rect(0, 0, width, height); |
1276 return SetDIBits(&background, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, | 1261 return SetDIBits(&background, 0, &src_rect, left, top, |
1277 0, nullptr); | 1262 FXDIB_BLEND_NORMAL); |
1278 } | 1263 } |
1279 FX_RECT clip_rect(left, top, left + pSrcRect->Width(), | 1264 FX_RECT clip_rect(left, top, left + pSrcRect->Width(), |
1280 top + pSrcRect->Height()); | 1265 top + pSrcRect->Height()); |
1281 return StretchDIBits(pSource, color, left - pSrcRect->left, | 1266 return StretchDIBits(pSource, color, left - pSrcRect->left, |
1282 top - pSrcRect->top, width, height, &clip_rect, 0, | 1267 top - pSrcRect->top, width, height, &clip_rect, 0, |
1283 alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL); | 1268 FXDIB_BLEND_NORMAL); |
1284 } | 1269 } |
1285 int width = pSrcRect->Width(), height = pSrcRect->Height(); | 1270 int width = pSrcRect->Width(), height = pSrcRect->Height(); |
1286 if (pSource->HasAlpha()) { | 1271 if (pSource->HasAlpha()) { |
1287 CFX_DIBitmap bitmap; | 1272 CFX_DIBitmap bitmap; |
1288 if (!bitmap.Create(width, height, FXDIB_Rgb) || | 1273 if (!bitmap.Create(width, height, FXDIB_Rgb) || |
1289 !GetDIBits(&bitmap, left, top, nullptr) || | 1274 !GetDIBits(&bitmap, left, top) || |
1290 !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, | 1275 !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, |
1291 pSrcRect->top, FXDIB_BLEND_NORMAL, nullptr, | 1276 pSrcRect->top, FXDIB_BLEND_NORMAL, nullptr, |
1292 FALSE, pIccTransform)) { | 1277 FALSE, nullptr)) { |
1293 return FALSE; | 1278 return FALSE; |
1294 } | 1279 } |
1295 FX_RECT src_rect(0, 0, width, height); | 1280 FX_RECT src_rect(0, 0, width, height); |
1296 return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, | 1281 return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL); |
1297 nullptr); | |
1298 } | 1282 } |
1299 CFX_DIBExtractor temp(pSource); | 1283 CFX_DIBExtractor temp(pSource); |
1300 CFX_DIBitmap* pBitmap = temp; | 1284 CFX_DIBitmap* pBitmap = temp; |
1301 if (pBitmap) { | 1285 if (!pBitmap) |
1302 return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform); | 1286 return FALSE; |
1303 } | 1287 return GDI_SetDIBits(pBitmap, pSrcRect, left, top, nullptr); |
1304 return FALSE; | |
1305 } | 1288 } |
1306 | 1289 |
1307 FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, | 1290 FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, |
1308 uint32_t color, | 1291 uint32_t color, |
1309 int dest_left, | 1292 int dest_left, |
1310 int dest_top, | 1293 int dest_top, |
1311 int dest_width, | 1294 int dest_width, |
1312 int dest_height, | 1295 int dest_height, |
1313 const FX_RECT* pClipRect, | 1296 const FX_RECT* pClipRect, |
1314 int render_flags, | 1297 int render_flags) { |
1315 int alpha_flag, | |
1316 void* pIccTransform, | |
1317 int blend_type) { | |
1318 FX_RECT bitmap_clip = *pClipRect; | 1298 FX_RECT bitmap_clip = *pClipRect; |
1319 if (dest_width < 0) { | 1299 if (dest_width < 0) |
1320 dest_left += dest_width; | 1300 dest_left += dest_width; |
1321 } | 1301 |
1322 if (dest_height < 0) { | 1302 if (dest_height < 0) |
1323 dest_top += dest_height; | 1303 dest_top += dest_height; |
1324 } | 1304 |
1325 bitmap_clip.Offset(-dest_left, -dest_top); | 1305 bitmap_clip.Offset(-dest_left, -dest_top); |
1326 std::unique_ptr<CFX_DIBitmap> pStretched( | 1306 std::unique_ptr<CFX_DIBitmap> pStretched( |
1327 pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip)); | 1307 pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip)); |
1328 if (!pStretched) | 1308 if (!pStretched) |
1329 return TRUE; | 1309 return TRUE; |
1330 | 1310 |
1331 FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight()); | 1311 FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight()); |
1332 return SetDIBits(pStretched.get(), color, &src_rect, pClipRect->left, | 1312 return SetDIBits(pStretched.get(), color, &src_rect, pClipRect->left, |
1333 pClipRect->top, FXDIB_BLEND_NORMAL, alpha_flag, | 1313 pClipRect->top, FXDIB_BLEND_NORMAL); |
1334 pIccTransform); | |
1335 } | 1314 } |
1336 | 1315 |
1337 FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, | 1316 FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, |
1338 uint32_t color, | 1317 uint32_t color, |
1339 int dest_left, | 1318 int dest_left, |
1340 int dest_top, | 1319 int dest_top, |
1341 int dest_width, | 1320 int dest_width, |
1342 int dest_height, | 1321 int dest_height, |
1343 const FX_RECT* pClipRect, | 1322 const FX_RECT* pClipRect, |
1344 uint32_t flags, | 1323 uint32_t flags, |
1345 int alpha_flag, | |
1346 void* pIccTransform, | |
1347 int blend_type) { | 1324 int blend_type) { |
1348 ASSERT(pSource && pClipRect); | 1325 ASSERT(pSource && pClipRect); |
1349 if (flags || dest_width > 10000 || dest_width < -10000 || | 1326 if (flags || dest_width > 10000 || dest_width < -10000 || |
1350 dest_height > 10000 || dest_height < -10000) { | 1327 dest_height > 10000 || dest_height < -10000) { |
1351 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, | 1328 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, |
1352 dest_width, dest_height, pClipRect, flags, | 1329 dest_width, dest_height, pClipRect, flags); |
1353 alpha_flag, pIccTransform, blend_type); | |
1354 } | 1330 } |
1355 if (pSource->IsAlphaMask()) { | 1331 if (pSource->IsAlphaMask()) { |
1356 FX_RECT image_rect; | 1332 FX_RECT image_rect; |
1357 image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width; | 1333 image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width; |
1358 image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left; | 1334 image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left; |
1359 image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height; | 1335 image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height; |
1360 image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top; | 1336 image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top; |
1361 FX_RECT clip_rect = image_rect; | 1337 FX_RECT clip_rect = image_rect; |
1362 clip_rect.Intersect(*pClipRect); | 1338 clip_rect.Intersect(*pClipRect); |
1363 clip_rect.Offset(-image_rect.left, -image_rect.top); | 1339 clip_rect.Offset(-image_rect.left, -image_rect.top); |
1364 int clip_width = clip_rect.Width(), clip_height = clip_rect.Height(); | 1340 int clip_width = clip_rect.Width(), clip_height = clip_rect.Height(); |
1365 std::unique_ptr<CFX_DIBitmap> pStretched( | 1341 std::unique_ptr<CFX_DIBitmap> pStretched( |
1366 pSource->StretchTo(dest_width, dest_height, flags, &clip_rect)); | 1342 pSource->StretchTo(dest_width, dest_height, flags, &clip_rect)); |
1367 if (!pStretched) | 1343 if (!pStretched) |
1368 return TRUE; | 1344 return TRUE; |
1369 | 1345 |
1370 CFX_DIBitmap background; | 1346 CFX_DIBitmap background; |
1371 if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) || | 1347 if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) || |
1372 !GetDIBits(&background, image_rect.left + clip_rect.left, | 1348 !GetDIBits(&background, image_rect.left + clip_rect.left, |
1373 image_rect.top + clip_rect.top, nullptr) || | 1349 image_rect.top + clip_rect.top) || |
1374 !background.CompositeMask( | 1350 !background.CompositeMask( |
1375 0, 0, clip_width, clip_height, pStretched.get(), color, 0, 0, | 1351 0, 0, clip_width, clip_height, pStretched.get(), color, 0, 0, |
1376 FXDIB_BLEND_NORMAL, nullptr, FALSE, alpha_flag, pIccTransform)) { | 1352 FXDIB_BLEND_NORMAL, nullptr, FALSE, 0, nullptr)) { |
1377 return FALSE; | 1353 return FALSE; |
1378 } | 1354 } |
1379 | 1355 |
1380 FX_RECT src_rect(0, 0, clip_width, clip_height); | 1356 FX_RECT src_rect(0, 0, clip_width, clip_height); |
1381 return SetDIBits( | 1357 return SetDIBits(&background, 0, &src_rect, |
1382 &background, 0, &src_rect, image_rect.left + clip_rect.left, | 1358 image_rect.left + clip_rect.left, |
1383 image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL, 0, nullptr); | 1359 image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL); |
1384 } | 1360 } |
1385 if (pSource->HasAlpha()) { | 1361 if (pSource->HasAlpha()) { |
1386 CWin32Platform* pPlatform = | 1362 CWin32Platform* pPlatform = |
1387 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); | 1363 (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); |
1388 if (pPlatform->m_GdiplusExt.IsAvailable() && !pIccTransform && | 1364 if (pPlatform->m_GdiplusExt.IsAvailable() && !pSource->IsCmykImage()) { |
1389 !pSource->IsCmykImage()) { | |
1390 CFX_DIBExtractor temp(pSource); | 1365 CFX_DIBExtractor temp(pSource); |
1391 CFX_DIBitmap* pBitmap = temp; | 1366 CFX_DIBitmap* pBitmap = temp; |
1392 if (!pBitmap) | 1367 if (!pBitmap) |
1393 return FALSE; | 1368 return FALSE; |
1394 return pPlatform->m_GdiplusExt.StretchDIBits( | 1369 return pPlatform->m_GdiplusExt.StretchDIBits( |
1395 m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, | 1370 m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, |
1396 pClipRect, flags); | 1371 pClipRect, flags); |
1397 } | 1372 } |
1398 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, | 1373 return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, |
1399 dest_width, dest_height, pClipRect, flags, | 1374 dest_width, dest_height, pClipRect, flags); |
1400 alpha_flag, pIccTransform, blend_type); | |
1401 } | 1375 } |
1402 CFX_DIBExtractor temp(pSource); | 1376 CFX_DIBExtractor temp(pSource); |
1403 CFX_DIBitmap* pBitmap = temp; | 1377 CFX_DIBitmap* pBitmap = temp; |
1404 if (pBitmap) { | 1378 if (!pBitmap) |
1405 return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, | 1379 return FALSE; |
1406 dest_height, flags, pIccTransform); | 1380 return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, |
1407 } | 1381 dest_height, flags, nullptr); |
1408 return FALSE; | |
1409 } | 1382 } |
1410 | 1383 |
1411 CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC) { | 1384 CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC) { |
1412 SetDeviceDriver(CreateDriver(hDC)); | 1385 SetDeviceDriver(CreateDriver(hDC)); |
1413 } | 1386 } |
1414 | 1387 |
1415 CFX_WindowsDevice::~CFX_WindowsDevice() {} | 1388 CFX_WindowsDevice::~CFX_WindowsDevice() {} |
1416 | 1389 |
1417 HDC CFX_WindowsDevice::GetDC() const { | 1390 HDC CFX_WindowsDevice::GetDC() const { |
1418 IFX_RenderDeviceDriver* pRDD = GetDeviceDriver(); | 1391 IFX_RenderDeviceDriver* pRDD = GetDeviceDriver(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1460 if (m_hDC) { | 1433 if (m_hDC) { |
1461 SelectObject(m_hDC, m_hOldBitmap); | 1434 SelectObject(m_hDC, m_hOldBitmap); |
1462 DeleteDC(m_hDC); | 1435 DeleteDC(m_hDC); |
1463 } | 1436 } |
1464 if (m_hBitmap) | 1437 if (m_hBitmap) |
1465 DeleteObject(m_hBitmap); | 1438 DeleteObject(m_hBitmap); |
1466 delete GetBitmap(); | 1439 delete GetBitmap(); |
1467 } | 1440 } |
1468 | 1441 |
1469 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ | 1442 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ |
OLD | NEW |