| 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/agg/fx_agg_driver.h" | 7 #include "core/fxge/agg/fx_agg_driver.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 bGroupKnockout); | 193 bGroupKnockout); |
| 194 } | 194 } |
| 195 | 195 |
| 196 CFX_AggDeviceDriver::CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, | 196 CFX_AggDeviceDriver::CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, |
| 197 int dither_bits, | 197 int dither_bits, |
| 198 FX_BOOL bRgbByteOrder, | 198 FX_BOOL bRgbByteOrder, |
| 199 CFX_DIBitmap* pOriDevice, | 199 CFX_DIBitmap* pOriDevice, |
| 200 FX_BOOL bGroupKnockout) { | 200 FX_BOOL bGroupKnockout) { |
| 201 m_pBitmap = pBitmap; | 201 m_pBitmap = pBitmap; |
| 202 m_DitherBits = dither_bits; | 202 m_DitherBits = dither_bits; |
| 203 m_pClipRgn = NULL; | 203 m_pClipRgn = nullptr; |
| 204 m_pPlatformBitmap = NULL; | 204 m_pPlatformBitmap = nullptr; |
| 205 m_pPlatformGraphics = NULL; | 205 m_pPlatformGraphics = nullptr; |
| 206 m_pDwRenderTartget = NULL; | 206 m_pDwRenderTartget = nullptr; |
| 207 m_bRgbByteOrder = bRgbByteOrder; | 207 m_bRgbByteOrder = bRgbByteOrder; |
| 208 m_pOriDevice = pOriDevice; | 208 m_pOriDevice = pOriDevice; |
| 209 m_bGroupKnockout = bGroupKnockout; | 209 m_bGroupKnockout = bGroupKnockout; |
| 210 m_FillFlags = 0; | 210 m_FillFlags = 0; |
| 211 InitPlatform(); | 211 InitPlatform(); |
| 212 } | 212 } |
| 213 | 213 |
| 214 CFX_AggDeviceDriver::~CFX_AggDeviceDriver() { | 214 CFX_AggDeviceDriver::~CFX_AggDeviceDriver() { |
| 215 delete m_pClipRgn; | 215 delete m_pClipRgn; |
| 216 for (int i = 0; i < m_StateStack.GetSize(); i++) | 216 for (int i = 0; i < m_StateStack.GetSize(); i++) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 } | 270 } |
| 271 return flags; | 271 return flags; |
| 272 } | 272 } |
| 273 case FXDC_DITHER_BITS: | 273 case FXDC_DITHER_BITS: |
| 274 return m_DitherBits; | 274 return m_DitherBits; |
| 275 } | 275 } |
| 276 return 0; | 276 return 0; |
| 277 } | 277 } |
| 278 | 278 |
| 279 void CFX_AggDeviceDriver::SaveState() { | 279 void CFX_AggDeviceDriver::SaveState() { |
| 280 CFX_ClipRgn* pClip = NULL; | 280 CFX_ClipRgn* pClip = nullptr; |
| 281 if (m_pClipRgn) { | 281 if (m_pClipRgn) { |
| 282 pClip = new CFX_ClipRgn(*m_pClipRgn); | 282 pClip = new CFX_ClipRgn(*m_pClipRgn); |
| 283 } | 283 } |
| 284 m_StateStack.Add(pClip); | 284 m_StateStack.Add(pClip); |
| 285 } | 285 } |
| 286 | 286 |
| 287 void CFX_AggDeviceDriver::RestoreState(FX_BOOL bKeepSaved) { | 287 void CFX_AggDeviceDriver::RestoreState(FX_BOOL bKeepSaved) { |
| 288 if (m_StateStack.GetSize() == 0) { | 288 if (m_StateStack.GetSize() == 0) { |
| 289 delete m_pClipRgn; | 289 delete m_pClipRgn; |
| 290 m_pClipRgn = NULL; | 290 m_pClipRgn = nullptr; |
| 291 return; | 291 return; |
| 292 } | 292 } |
| 293 CFX_ClipRgn* pSavedClip = m_StateStack[m_StateStack.GetSize() - 1]; | 293 CFX_ClipRgn* pSavedClip = m_StateStack[m_StateStack.GetSize() - 1]; |
| 294 delete m_pClipRgn; | 294 delete m_pClipRgn; |
| 295 m_pClipRgn = NULL; | 295 m_pClipRgn = nullptr; |
| 296 if (bKeepSaved) { | 296 if (bKeepSaved) { |
| 297 if (pSavedClip) { | 297 if (pSavedClip) { |
| 298 m_pClipRgn = new CFX_ClipRgn(*pSavedClip); | 298 m_pClipRgn = new CFX_ClipRgn(*pSavedClip); |
| 299 } | 299 } |
| 300 } else { | 300 } else { |
| 301 m_StateStack.RemoveAt(m_StateStack.GetSize() - 1); | 301 m_StateStack.RemoveAt(m_StateStack.GetSize() - 1); |
| 302 m_pClipRgn = pSavedClip; | 302 m_pClipRgn = pSavedClip; |
| 303 } | 303 } |
| 304 } | 304 } |
| 305 | 305 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 | 363 |
| 364 FX_BOOL CFX_AggDeviceDriver::SetClip_PathStroke( | 364 FX_BOOL CFX_AggDeviceDriver::SetClip_PathStroke( |
| 365 const CFX_PathData* pPathData, | 365 const CFX_PathData* pPathData, |
| 366 const CFX_Matrix* pObject2Device, | 366 const CFX_Matrix* pObject2Device, |
| 367 const CFX_GraphStateData* pGraphState) { | 367 const CFX_GraphStateData* pGraphState) { |
| 368 if (!m_pClipRgn) { | 368 if (!m_pClipRgn) { |
| 369 m_pClipRgn = new CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), | 369 m_pClipRgn = new CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), |
| 370 GetDeviceCaps(FXDC_PIXEL_HEIGHT)); | 370 GetDeviceCaps(FXDC_PIXEL_HEIGHT)); |
| 371 } | 371 } |
| 372 CAgg_PathData path_data; | 372 CAgg_PathData path_data; |
| 373 path_data.BuildPath(pPathData, NULL); | 373 path_data.BuildPath(pPathData, nullptr); |
| 374 agg::rasterizer_scanline_aa rasterizer; | 374 agg::rasterizer_scanline_aa rasterizer; |
| 375 rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), | 375 rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), |
| 376 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); | 376 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); |
| 377 RasterizeStroke(rasterizer, path_data.m_PathData, pObject2Device, | 377 RasterizeStroke(rasterizer, path_data.m_PathData, pObject2Device, |
| 378 pGraphState); | 378 pGraphState); |
| 379 rasterizer.filling_rule(agg::fill_non_zero); | 379 rasterizer.filling_rule(agg::fill_non_zero); |
| 380 SetClipMask(rasterizer); | 380 SetClipMask(rasterizer); |
| 381 return TRUE; | 381 return TRUE; |
| 382 } | 382 } |
| 383 | 383 |
| (...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1021 template <class Scanline> | 1021 template <class Scanline> |
| 1022 void render(const Scanline& sl) { | 1022 void render(const Scanline& sl) { |
| 1023 if (!m_pOriDevice && !composite_span) { | 1023 if (!m_pOriDevice && !composite_span) { |
| 1024 return; | 1024 return; |
| 1025 } | 1025 } |
| 1026 int y = sl.y(); | 1026 int y = sl.y(); |
| 1027 if (y < m_ClipBox.top || y >= m_ClipBox.bottom) { | 1027 if (y < m_ClipBox.top || y >= m_ClipBox.bottom) { |
| 1028 return; | 1028 return; |
| 1029 } | 1029 } |
| 1030 uint8_t* dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * y; | 1030 uint8_t* dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * y; |
| 1031 uint8_t* dest_scan_extra_alpha = NULL; | 1031 uint8_t* dest_scan_extra_alpha = nullptr; |
| 1032 CFX_DIBitmap* pAlphaMask = m_pDevice->m_pAlphaMask; | 1032 CFX_DIBitmap* pAlphaMask = m_pDevice->m_pAlphaMask; |
| 1033 if (pAlphaMask) { | 1033 if (pAlphaMask) { |
| 1034 dest_scan_extra_alpha = | 1034 dest_scan_extra_alpha = |
| 1035 pAlphaMask->GetBuffer() + pAlphaMask->GetPitch() * y; | 1035 pAlphaMask->GetBuffer() + pAlphaMask->GetPitch() * y; |
| 1036 } | 1036 } |
| 1037 uint8_t* ori_scan = NULL; | 1037 uint8_t* ori_scan = nullptr; |
| 1038 if (m_pOriDevice) { | 1038 if (m_pOriDevice) { |
| 1039 ori_scan = m_pOriDevice->GetBuffer() + m_pOriDevice->GetPitch() * y; | 1039 ori_scan = m_pOriDevice->GetBuffer() + m_pOriDevice->GetPitch() * y; |
| 1040 } | 1040 } |
| 1041 int Bpp = m_pDevice->GetBPP() / 8; | 1041 int Bpp = m_pDevice->GetBPP() / 8; |
| 1042 FX_BOOL bDestAlpha = m_pDevice->HasAlpha() || m_pDevice->IsAlphaMask(); | 1042 FX_BOOL bDestAlpha = m_pDevice->HasAlpha() || m_pDevice->IsAlphaMask(); |
| 1043 unsigned num_spans = sl.num_spans(); | 1043 unsigned num_spans = sl.num_spans(); |
| 1044 typename Scanline::const_iterator span = sl.begin(); | 1044 typename Scanline::const_iterator span = sl.begin(); |
| 1045 while (1) { | 1045 while (1) { |
| 1046 int x = span->x; | 1046 int x = span->x; |
| 1047 ASSERT(span->len > 0); | 1047 ASSERT(span->len > 0); |
| 1048 uint8_t* dest_pos = NULL; | 1048 uint8_t* dest_pos = nullptr; |
| 1049 uint8_t* dest_extra_alpha_pos = NULL; | 1049 uint8_t* dest_extra_alpha_pos = nullptr; |
| 1050 uint8_t* ori_pos = NULL; | 1050 uint8_t* ori_pos = nullptr; |
| 1051 if (Bpp) { | 1051 if (Bpp) { |
| 1052 ori_pos = ori_scan ? ori_scan + x * Bpp : NULL; | 1052 ori_pos = ori_scan ? ori_scan + x * Bpp : nullptr; |
| 1053 dest_pos = dest_scan + x * Bpp; | 1053 dest_pos = dest_scan + x * Bpp; |
| 1054 dest_extra_alpha_pos = | 1054 dest_extra_alpha_pos = |
| 1055 dest_scan_extra_alpha ? dest_scan_extra_alpha + x : NULL; | 1055 dest_scan_extra_alpha ? dest_scan_extra_alpha + x : nullptr; |
| 1056 } else { | 1056 } else { |
| 1057 dest_pos = dest_scan + x / 8; | 1057 dest_pos = dest_scan + x / 8; |
| 1058 ori_pos = ori_scan ? ori_scan + x / 8 : NULL; | 1058 ori_pos = ori_scan ? ori_scan + x / 8 : nullptr; |
| 1059 } | 1059 } |
| 1060 uint8_t* clip_pos = NULL; | 1060 uint8_t* clip_pos = nullptr; |
| 1061 if (m_pClipMask) { | 1061 if (m_pClipMask) { |
| 1062 clip_pos = m_pClipMask->GetBuffer() + | 1062 clip_pos = m_pClipMask->GetBuffer() + |
| 1063 (y - m_ClipBox.top) * m_pClipMask->GetPitch() + x - | 1063 (y - m_ClipBox.top) * m_pClipMask->GetPitch() + x - |
| 1064 m_ClipBox.left; | 1064 m_ClipBox.left; |
| 1065 } | 1065 } |
| 1066 if (ori_pos) { | 1066 if (ori_pos) { |
| 1067 CompositeSpan(dest_pos, ori_pos, Bpp, bDestAlpha, x, span->len, | 1067 CompositeSpan(dest_pos, ori_pos, Bpp, bDestAlpha, x, span->len, |
| 1068 span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos); | 1068 span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos); |
| 1069 } else { | 1069 } else { |
| 1070 (this->*composite_span)(dest_pos, Bpp, x, span->len, span->covers, | 1070 (this->*composite_span)(dest_pos, Bpp, x, span->len, span->covers, |
| 1071 m_ClipBox.left, m_ClipBox.right, clip_pos, | 1071 m_ClipBox.left, m_ClipBox.right, clip_pos, |
| 1072 dest_extra_alpha_pos); | 1072 dest_extra_alpha_pos); |
| 1073 } | 1073 } |
| 1074 if (--num_spans == 0) { | 1074 if (--num_spans == 0) { |
| 1075 break; | 1075 break; |
| 1076 } | 1076 } |
| 1077 ++span; | 1077 ++span; |
| 1078 } | 1078 } |
| 1079 } | 1079 } |
| 1080 | 1080 |
| 1081 FX_BOOL Init(CFX_DIBitmap* pDevice, | 1081 FX_BOOL Init(CFX_DIBitmap* pDevice, |
| 1082 CFX_DIBitmap* pOriDevice, | 1082 CFX_DIBitmap* pOriDevice, |
| 1083 const CFX_ClipRgn* pClipRgn, | 1083 const CFX_ClipRgn* pClipRgn, |
| 1084 uint32_t color, | 1084 uint32_t color, |
| 1085 FX_BOOL bFullCover, | 1085 FX_BOOL bFullCover, |
| 1086 FX_BOOL bRgbByteOrder, | 1086 FX_BOOL bRgbByteOrder, |
| 1087 int alpha_flag = 0, | 1087 int alpha_flag = 0, |
| 1088 void* pIccTransform = NULL) { | 1088 void* pIccTransform = nullptr) { |
| 1089 m_pDevice = pDevice; | 1089 m_pDevice = pDevice; |
| 1090 m_pClipRgn = pClipRgn; | 1090 m_pClipRgn = pClipRgn; |
| 1091 composite_span = NULL; | 1091 composite_span = nullptr; |
| 1092 m_bRgbByteOrder = bRgbByteOrder; | 1092 m_bRgbByteOrder = bRgbByteOrder; |
| 1093 m_pOriDevice = pOriDevice; | 1093 m_pOriDevice = pOriDevice; |
| 1094 if (m_pClipRgn) { | 1094 if (m_pClipRgn) { |
| 1095 m_ClipBox = m_pClipRgn->GetBox(); | 1095 m_ClipBox = m_pClipRgn->GetBox(); |
| 1096 } else { | 1096 } else { |
| 1097 m_ClipBox.left = m_ClipBox.top = 0; | 1097 m_ClipBox.left = m_ClipBox.top = 0; |
| 1098 m_ClipBox.right = m_pDevice->GetWidth(); | 1098 m_ClipBox.right = m_pDevice->GetWidth(); |
| 1099 m_ClipBox.bottom = m_pDevice->GetHeight(); | 1099 m_ClipBox.bottom = m_pDevice->GetHeight(); |
| 1100 } | 1100 } |
| 1101 m_pClipMask = NULL; | 1101 m_pClipMask = nullptr; |
| 1102 if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) { | 1102 if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) { |
| 1103 m_pClipMask = m_pClipRgn->GetMask(); | 1103 m_pClipMask = m_pClipRgn->GetMask(); |
| 1104 } | 1104 } |
| 1105 m_bFullCover = bFullCover; | 1105 m_bFullCover = bFullCover; |
| 1106 FX_BOOL bObjectCMYK = FXGETFLAG_COLORTYPE(alpha_flag); | 1106 FX_BOOL bObjectCMYK = FXGETFLAG_COLORTYPE(alpha_flag); |
| 1107 FX_BOOL bDeviceCMYK = pDevice->IsCmykImage(); | 1107 FX_BOOL bDeviceCMYK = pDevice->IsCmykImage(); |
| 1108 m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); | 1108 m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); |
| 1109 CCodec_IccModule* pIccModule = NULL; | 1109 CCodec_IccModule* pIccModule = nullptr; |
| 1110 if (!CFX_GEModule::Get()->GetCodecModule() || | 1110 if (!CFX_GEModule::Get()->GetCodecModule() || |
| 1111 !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { | 1111 !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { |
| 1112 pIccTransform = NULL; | 1112 pIccTransform = nullptr; |
| 1113 } else { | 1113 } else { |
| 1114 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); | 1114 pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); |
| 1115 } | 1115 } |
| 1116 if (m_pDevice->GetBPP() == 8) { | 1116 if (m_pDevice->GetBPP() == 8) { |
| 1117 ASSERT(!m_bRgbByteOrder); | 1117 ASSERT(!m_bRgbByteOrder); |
| 1118 composite_span = &CFX_Renderer::CompositeSpanGray; | 1118 composite_span = &CFX_Renderer::CompositeSpanGray; |
| 1119 if (m_pDevice->IsAlphaMask()) { | 1119 if (m_pDevice->IsAlphaMask()) { |
| 1120 m_Gray = 255; | 1120 m_Gray = 255; |
| 1121 } else { | 1121 } else { |
| 1122 if (pIccTransform) { | 1122 if (pIccTransform) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1209 } | 1209 } |
| 1210 }; | 1210 }; |
| 1211 | 1211 |
| 1212 FX_BOOL CFX_AggDeviceDriver::RenderRasterizer( | 1212 FX_BOOL CFX_AggDeviceDriver::RenderRasterizer( |
| 1213 agg::rasterizer_scanline_aa& rasterizer, | 1213 agg::rasterizer_scanline_aa& rasterizer, |
| 1214 uint32_t color, | 1214 uint32_t color, |
| 1215 FX_BOOL bFullCover, | 1215 FX_BOOL bFullCover, |
| 1216 FX_BOOL bGroupKnockout, | 1216 FX_BOOL bGroupKnockout, |
| 1217 int alpha_flag, | 1217 int alpha_flag, |
| 1218 void* pIccTransform) { | 1218 void* pIccTransform) { |
| 1219 CFX_DIBitmap* pt = bGroupKnockout ? m_pOriDevice : NULL; | 1219 CFX_DIBitmap* pt = bGroupKnockout ? m_pOriDevice : nullptr; |
| 1220 CFX_Renderer render; | 1220 CFX_Renderer render; |
| 1221 if (!render.Init(m_pBitmap, pt, m_pClipRgn, color, bFullCover, | 1221 if (!render.Init(m_pBitmap, pt, m_pClipRgn, color, bFullCover, |
| 1222 m_bRgbByteOrder, alpha_flag, pIccTransform)) { | 1222 m_bRgbByteOrder, alpha_flag, pIccTransform)) { |
| 1223 return FALSE; | 1223 return FALSE; |
| 1224 } | 1224 } |
| 1225 agg::scanline_u8 scanline; | 1225 agg::scanline_u8 scanline; |
| 1226 agg::render_scanlines(rasterizer, scanline, render, | 1226 agg::render_scanlines(rasterizer, scanline, render, |
| 1227 (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0); | 1227 (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0); |
| 1228 return TRUE; | 1228 return TRUE; |
| 1229 } | 1229 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1263 ? FXGETFLAG_ALPHA_STROKE(alpha_flag) | 1263 ? FXGETFLAG_ALPHA_STROKE(alpha_flag) |
| 1264 : FXARGB_A(stroke_color); | 1264 : FXARGB_A(stroke_color); |
| 1265 if (pGraphState && stroke_alpha) { | 1265 if (pGraphState && stroke_alpha) { |
| 1266 if (fill_mode & FX_ZEROAREA_FILL) { | 1266 if (fill_mode & FX_ZEROAREA_FILL) { |
| 1267 CAgg_PathData path_data; | 1267 CAgg_PathData path_data; |
| 1268 path_data.BuildPath(pPathData, pObject2Device); | 1268 path_data.BuildPath(pPathData, pObject2Device); |
| 1269 agg::rasterizer_scanline_aa rasterizer; | 1269 agg::rasterizer_scanline_aa rasterizer; |
| 1270 rasterizer.clip_box(0.0f, 0.0f, | 1270 rasterizer.clip_box(0.0f, 0.0f, |
| 1271 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), | 1271 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), |
| 1272 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); | 1272 (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); |
| 1273 RasterizeStroke(rasterizer, path_data.m_PathData, NULL, pGraphState, 1, | 1273 RasterizeStroke(rasterizer, path_data.m_PathData, nullptr, pGraphState, 1, |
| 1274 FALSE, fill_mode & FX_STROKE_TEXT_MODE); | 1274 FALSE, fill_mode & FX_STROKE_TEXT_MODE); |
| 1275 int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | | 1275 int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | |
| 1276 FXGETFLAG_ALPHA_STROKE(alpha_flag); | 1276 FXGETFLAG_ALPHA_STROKE(alpha_flag); |
| 1277 if (!RenderRasterizer(rasterizer, stroke_color, | 1277 if (!RenderRasterizer(rasterizer, stroke_color, |
| 1278 fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, | 1278 fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, |
| 1279 fill_flag, pIccTransform)) { | 1279 fill_flag, pIccTransform)) { |
| 1280 return FALSE; | 1280 return FALSE; |
| 1281 } | 1281 } |
| 1282 return TRUE; | 1282 return TRUE; |
| 1283 } | 1283 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1312 return TRUE; | 1312 return TRUE; |
| 1313 } | 1313 } |
| 1314 | 1314 |
| 1315 void RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, uint32_t argb) { | 1315 void RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, uint32_t argb) { |
| 1316 if (x < 0 || x >= pBitmap->GetWidth() || y < 0 || y >= pBitmap->GetHeight()) { | 1316 if (x < 0 || x >= pBitmap->GetWidth() || y < 0 || y >= pBitmap->GetHeight()) { |
| 1317 return; | 1317 return; |
| 1318 } | 1318 } |
| 1319 uint8_t* pos = (uint8_t*)pBitmap->GetBuffer() + y * pBitmap->GetPitch() + | 1319 uint8_t* pos = (uint8_t*)pBitmap->GetBuffer() + y * pBitmap->GetPitch() + |
| 1320 x * pBitmap->GetBPP() / 8; | 1320 x * pBitmap->GetBPP() / 8; |
| 1321 if (pBitmap->GetFormat() == FXDIB_Argb) { | 1321 if (pBitmap->GetFormat() == FXDIB_Argb) { |
| 1322 FXARGB_SETRGBORDERDIB(pos, ArgbGamma(argb)); | 1322 FXARGB_SETRGBORDERDIB(pos, argb); |
| 1323 } else { | 1323 } else { |
| 1324 int alpha = FXARGB_A(argb); | 1324 int alpha = FXARGB_A(argb); |
| 1325 pos[0] = (FXARGB_R(argb) * alpha + pos[0] * (255 - alpha)) / 255; | 1325 pos[0] = (FXARGB_R(argb) * alpha + pos[0] * (255 - alpha)) / 255; |
| 1326 pos[1] = (FXARGB_G(argb) * alpha + pos[1] * (255 - alpha)) / 255; | 1326 pos[1] = (FXARGB_G(argb) * alpha + pos[1] * (255 - alpha)) / 255; |
| 1327 pos[2] = (FXARGB_B(argb) * alpha + pos[2] * (255 - alpha)) / 255; | 1327 pos[2] = (FXARGB_B(argb) * alpha + pos[2] * (255 - alpha)) / 255; |
| 1328 } | 1328 } |
| 1329 } | 1329 } |
| 1330 | 1330 |
| 1331 void RgbByteOrderCompositeRect(CFX_DIBitmap* pBitmap, | 1331 void RgbByteOrderCompositeRect(CFX_DIBitmap* pBitmap, |
| 1332 int left, | 1332 int left, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1358 } else { | 1358 } else { |
| 1359 for (int col = 0; col < width; col++) { | 1359 for (int col = 0; col < width; col++) { |
| 1360 *dest_scan++ = src_r; | 1360 *dest_scan++ = src_r; |
| 1361 *dest_scan++ = src_g; | 1361 *dest_scan++ = src_g; |
| 1362 *dest_scan++ = src_b; | 1362 *dest_scan++ = src_b; |
| 1363 } | 1363 } |
| 1364 } | 1364 } |
| 1365 } | 1365 } |
| 1366 return; | 1366 return; |
| 1367 } | 1367 } |
| 1368 src_r = FX_GAMMA(src_r); | |
| 1369 src_g = FX_GAMMA(src_g); | |
| 1370 src_b = FX_GAMMA(src_b); | |
| 1371 for (int row = rect.top; row < rect.bottom; row++) { | 1368 for (int row = rect.top; row < rect.bottom; row++) { |
| 1372 uint8_t* dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp; | 1369 uint8_t* dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp; |
| 1373 if (bAlpha) { | 1370 if (bAlpha) { |
| 1374 for (int col = 0; col < width; col++) { | 1371 for (int col = 0; col < width; col++) { |
| 1375 uint8_t back_alpha = dest_scan[3]; | 1372 uint8_t back_alpha = dest_scan[3]; |
| 1376 if (back_alpha == 0) { | 1373 if (back_alpha == 0) { |
| 1377 FXARGB_SETRGBORDERDIB(dest_scan, | 1374 FXARGB_SETRGBORDERDIB(dest_scan, |
| 1378 FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); | 1375 FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); |
| 1379 dest_scan += 4; | 1376 dest_scan += 4; |
| 1380 continue; | 1377 continue; |
| 1381 } | 1378 } |
| 1382 uint8_t dest_alpha = | 1379 uint8_t dest_alpha = |
| 1383 back_alpha + src_alpha - back_alpha * src_alpha / 255; | 1380 back_alpha + src_alpha - back_alpha * src_alpha / 255; |
| 1384 dest_scan[3] = dest_alpha; | 1381 dest_scan[3] = dest_alpha; |
| 1385 int alpha_ratio = src_alpha * 255 / dest_alpha; | 1382 int alpha_ratio = src_alpha * 255 / dest_alpha; |
| 1386 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); | 1383 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); |
| 1387 dest_scan++; | 1384 dest_scan++; |
| 1388 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); | 1385 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); |
| 1389 dest_scan++; | 1386 dest_scan++; |
| 1390 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); | 1387 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); |
| 1391 dest_scan += 2; | 1388 dest_scan += 2; |
| 1392 } | 1389 } |
| 1393 } else { | 1390 } else { |
| 1394 for (int col = 0; col < width; col++) { | 1391 for (int col = 0; col < width; col++) { |
| 1395 *dest_scan = FX_GAMMA_INVERSE( | 1392 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha); |
| 1396 FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_r, src_alpha)); | |
| 1397 dest_scan++; | 1393 dest_scan++; |
| 1398 *dest_scan = FX_GAMMA_INVERSE( | 1394 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha); |
| 1399 FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_g, src_alpha)); | |
| 1400 dest_scan++; | 1395 dest_scan++; |
| 1401 *dest_scan = FX_GAMMA_INVERSE( | 1396 *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha); |
| 1402 FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_b, src_alpha)); | |
| 1403 dest_scan++; | 1397 dest_scan++; |
| 1404 if (Bpp == 4) { | 1398 if (Bpp == 4) { |
| 1405 dest_scan++; | 1399 dest_scan++; |
| 1406 } | 1400 } |
| 1407 } | 1401 } |
| 1408 } | 1402 } |
| 1409 } | 1403 } |
| 1410 } | 1404 } |
| 1411 | 1405 |
| 1412 void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, | 1406 void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, |
| 1413 int dest_left, | 1407 int dest_left, |
| 1414 int dest_top, | 1408 int dest_top, |
| 1415 int width, | 1409 int width, |
| 1416 int height, | 1410 int height, |
| 1417 const CFX_DIBSource* pSrcBitmap, | 1411 const CFX_DIBSource* pSrcBitmap, |
| 1418 int src_left, | 1412 int src_left, |
| 1419 int src_top) { | 1413 int src_top) { |
| 1420 if (!pBitmap) { | 1414 if (!pBitmap) { |
| 1421 return; | 1415 return; |
| 1422 } | 1416 } |
| 1423 pBitmap->GetOverlapRect(dest_left, dest_top, width, height, | 1417 pBitmap->GetOverlapRect(dest_left, dest_top, width, height, |
| 1424 pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), | 1418 pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), |
| 1425 src_left, src_top, NULL); | 1419 src_left, src_top, nullptr); |
| 1426 if (width == 0 || height == 0) { | 1420 if (width == 0 || height == 0) { |
| 1427 return; | 1421 return; |
| 1428 } | 1422 } |
| 1429 int Bpp = pBitmap->GetBPP() / 8; | 1423 int Bpp = pBitmap->GetBPP() / 8; |
| 1430 FXDIB_Format dest_format = pBitmap->GetFormat(); | 1424 FXDIB_Format dest_format = pBitmap->GetFormat(); |
| 1431 FXDIB_Format src_format = pSrcBitmap->GetFormat(); | 1425 FXDIB_Format src_format = pSrcBitmap->GetFormat(); |
| 1432 int pitch = pBitmap->GetPitch(); | 1426 int pitch = pBitmap->GetPitch(); |
| 1433 uint8_t* buffer = pBitmap->GetBuffer(); | 1427 uint8_t* buffer = pBitmap->GetBuffer(); |
| 1434 if (dest_format == src_format) { | 1428 if (dest_format == src_format) { |
| 1435 for (int row = 0; row < height; row++) { | 1429 for (int row = 0; row < height; row++) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1470 } | 1464 } |
| 1471 } else { | 1465 } else { |
| 1472 ASSERT(FALSE); | 1466 ASSERT(FALSE); |
| 1473 } | 1467 } |
| 1474 } else if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) { | 1468 } else if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) { |
| 1475 if (src_format == FXDIB_Rgb) { | 1469 if (src_format == FXDIB_Rgb) { |
| 1476 for (int row = 0; row < height; row++) { | 1470 for (int row = 0; row < height; row++) { |
| 1477 uint8_t* dest_scan = (uint8_t*)(dest_buf + row * pitch); | 1471 uint8_t* dest_scan = (uint8_t*)(dest_buf + row * pitch); |
| 1478 uint8_t* src_scan = | 1472 uint8_t* src_scan = |
| 1479 (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3; | 1473 (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3; |
| 1480 if (src_format == FXDIB_Argb) { | 1474 for (int col = 0; col < width; col++) { |
| 1481 for (int col = 0; col < width; col++) { | 1475 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], |
| 1482 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, FX_GAMMA(src_scan[0]), | 1476 src_scan[2])); |
| 1483 FX_GAMMA(src_scan[1]), | 1477 dest_scan += 4; |
| 1484 FX_GAMMA(src_scan[2]))); | 1478 src_scan += 3; |
| 1485 dest_scan += 4; | |
| 1486 src_scan += 3; | |
| 1487 } | |
| 1488 } else { | |
| 1489 for (int col = 0; col < width; col++) { | |
| 1490 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], | |
| 1491 src_scan[2])); | |
| 1492 dest_scan += 4; | |
| 1493 src_scan += 3; | |
| 1494 } | |
| 1495 } | 1479 } |
| 1496 } | 1480 } |
| 1497 } else if (src_format == FXDIB_Rgb32) { | 1481 } else if (src_format == FXDIB_Rgb32) { |
| 1498 ASSERT(dest_format == FXDIB_Argb); | 1482 ASSERT(dest_format == FXDIB_Argb); |
| 1499 for (int row = 0; row < height; row++) { | 1483 for (int row = 0; row < height; row++) { |
| 1500 uint8_t* dest_scan = dest_buf + row * pitch; | 1484 uint8_t* dest_scan = dest_buf + row * pitch; |
| 1501 uint8_t* src_scan = | 1485 uint8_t* src_scan = |
| 1502 (uint8_t*)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4); | 1486 (uint8_t*)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4); |
| 1503 for (int col = 0; col < width; col++) { | 1487 for (int col = 0; col < width; col++) { |
| 1504 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], | 1488 FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1559 FX_BOOL CFX_AggDeviceDriver::SetPixel(int x, | 1543 FX_BOOL CFX_AggDeviceDriver::SetPixel(int x, |
| 1560 int y, | 1544 int y, |
| 1561 uint32_t color, | 1545 uint32_t color, |
| 1562 int alpha_flag, | 1546 int alpha_flag, |
| 1563 void* pIccTransform) { | 1547 void* pIccTransform) { |
| 1564 if (!m_pBitmap->GetBuffer()) { | 1548 if (!m_pBitmap->GetBuffer()) { |
| 1565 return TRUE; | 1549 return TRUE; |
| 1566 } | 1550 } |
| 1567 if (!CFX_GEModule::Get()->GetCodecModule() || | 1551 if (!CFX_GEModule::Get()->GetCodecModule() || |
| 1568 !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { | 1552 !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { |
| 1569 pIccTransform = NULL; | 1553 pIccTransform = nullptr; |
| 1570 } | 1554 } |
| 1571 if (!m_pClipRgn) { | 1555 if (!m_pClipRgn) { |
| 1572 if (m_bRgbByteOrder) { | 1556 if (m_bRgbByteOrder) { |
| 1573 RgbByteOrderSetPixel(m_pBitmap, x, y, color); | 1557 RgbByteOrderSetPixel(m_pBitmap, x, y, color); |
| 1574 } else { | 1558 } else { |
| 1575 return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform); | 1559 return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform); |
| 1576 } | 1560 } |
| 1577 } else if (m_pClipRgn->GetBox().Contains(x, y)) { | 1561 } else if (m_pClipRgn->GetBox().Contains(x, y)) { |
| 1578 if (m_pClipRgn->GetType() == CFX_ClipRgn::RectI) { | 1562 if (m_pClipRgn->GetType() == CFX_ClipRgn::RectI) { |
| 1579 if (m_bRgbByteOrder) { | 1563 if (m_bRgbByteOrder) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1632 m_pBitmap->CompositeRect(draw_rect.left, draw_rect.top, draw_rect.Width(), | 1616 m_pBitmap->CompositeRect(draw_rect.left, draw_rect.top, draw_rect.Width(), |
| 1633 draw_rect.Height(), fill_color, alpha_flag, | 1617 draw_rect.Height(), fill_color, alpha_flag, |
| 1634 pIccTransform); | 1618 pIccTransform); |
| 1635 } | 1619 } |
| 1636 return TRUE; | 1620 return TRUE; |
| 1637 } | 1621 } |
| 1638 m_pBitmap->CompositeMask( | 1622 m_pBitmap->CompositeMask( |
| 1639 draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), | 1623 draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), |
| 1640 (const CFX_DIBitmap*)m_pClipRgn->GetMask(), fill_color, | 1624 (const CFX_DIBitmap*)m_pClipRgn->GetMask(), fill_color, |
| 1641 draw_rect.left - clip_rect.left, draw_rect.top - clip_rect.top, | 1625 draw_rect.left - clip_rect.left, draw_rect.top - clip_rect.top, |
| 1642 FXDIB_BLEND_NORMAL, NULL, m_bRgbByteOrder, alpha_flag, pIccTransform); | 1626 FXDIB_BLEND_NORMAL, nullptr, m_bRgbByteOrder, alpha_flag, pIccTransform); |
| 1643 return TRUE; | 1627 return TRUE; |
| 1644 } | 1628 } |
| 1645 | 1629 |
| 1646 FX_BOOL CFX_AggDeviceDriver::GetClipBox(FX_RECT* pRect) { | 1630 FX_BOOL CFX_AggDeviceDriver::GetClipBox(FX_RECT* pRect) { |
| 1647 if (!m_pClipRgn) { | 1631 if (!m_pClipRgn) { |
| 1648 pRect->left = pRect->top = 0; | 1632 pRect->left = pRect->top = 0; |
| 1649 pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH); | 1633 pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH); |
| 1650 pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT); | 1634 pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT); |
| 1651 return TRUE; | 1635 return TRUE; |
| 1652 } | 1636 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1668 pBitmap->GetHeight(), m_pBitmap, left, top); | 1652 pBitmap->GetHeight(), m_pBitmap, left, top); |
| 1669 } else { | 1653 } else { |
| 1670 return pBitmap->TransferBitmap(0, 0, pBitmap->GetWidth(), | 1654 return pBitmap->TransferBitmap(0, 0, pBitmap->GetWidth(), |
| 1671 pBitmap->GetHeight(), m_pBitmap, left, top, | 1655 pBitmap->GetHeight(), m_pBitmap, left, top, |
| 1672 pIccTransform); | 1656 pIccTransform); |
| 1673 } | 1657 } |
| 1674 return TRUE; | 1658 return TRUE; |
| 1675 } | 1659 } |
| 1676 FX_RECT rect(left, top, left + pBitmap->GetWidth(), | 1660 FX_RECT rect(left, top, left + pBitmap->GetWidth(), |
| 1677 top + pBitmap->GetHeight()); | 1661 top + pBitmap->GetHeight()); |
| 1678 CFX_DIBitmap* pBack = NULL; | 1662 CFX_DIBitmap* pBack = nullptr; |
| 1679 if (m_pOriDevice) { | 1663 if (m_pOriDevice) { |
| 1680 pBack = m_pOriDevice->Clone(&rect); | 1664 pBack = m_pOriDevice->Clone(&rect); |
| 1681 if (!pBack) { | 1665 if (!pBack) { |
| 1682 return TRUE; | 1666 return TRUE; |
| 1683 } | 1667 } |
| 1684 pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), | 1668 pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), |
| 1685 m_pBitmap, 0, 0); | 1669 m_pBitmap, 0, 0); |
| 1686 } else { | 1670 } else { |
| 1687 pBack = m_pBitmap->Clone(&rect); | 1671 pBack = m_pBitmap->Clone(&rect); |
| 1688 } | 1672 } |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1831 SetDeviceDriver(pDriver); | 1815 SetDeviceDriver(pDriver); |
| 1832 return true; | 1816 return true; |
| 1833 } | 1817 } |
| 1834 | 1818 |
| 1835 CFX_FxgeDevice::~CFX_FxgeDevice() { | 1819 CFX_FxgeDevice::~CFX_FxgeDevice() { |
| 1836 if (m_bOwnedBitmap) { | 1820 if (m_bOwnedBitmap) { |
| 1837 delete GetBitmap(); | 1821 delete GetBitmap(); |
| 1838 } | 1822 } |
| 1839 } | 1823 } |
| 1840 #endif | 1824 #endif |
| OLD | NEW |