| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/include/fxge/fx_ge.h" | 5 #include "core/include/fxge/fx_ge.h" |
| 6 | 6 |
| 7 #if defined(_SKIA_SUPPORT_) | 7 #if defined(_SKIA_SUPPORT_) |
| 8 #include "core/include/fxcodec/fx_codec.h" | 8 #include "core/include/fxcodec/fx_codec.h" |
| 9 | 9 |
| 10 #include "SkDashPathEffect.h" | 10 #include "SkDashPathEffect.h" |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 proc(*devPathPtr, rect, blitter); | 120 proc(*devPathPtr, rect, blitter); |
| 121 } | 121 } |
| 122 | 122 |
| 123 class CSkia_PathData { | 123 class CSkia_PathData { |
| 124 public: | 124 public: |
| 125 CSkia_PathData() {} | 125 CSkia_PathData() {} |
| 126 ~CSkia_PathData() {} | 126 ~CSkia_PathData() {} |
| 127 SkPath m_PathData; | 127 SkPath m_PathData; |
| 128 | 128 |
| 129 void BuildPath(const CFX_PathData* pPathData, | 129 void BuildPath(const CFX_PathData* pPathData, |
| 130 const CFX_AffineMatrix* pObject2Device); | 130 const CFX_Matrix* pObject2Device); |
| 131 }; | 131 }; |
| 132 | 132 |
| 133 void CSkia_PathData::BuildPath(const CFX_PathData* pPathData, | 133 void CSkia_PathData::BuildPath(const CFX_PathData* pPathData, |
| 134 const CFX_AffineMatrix* pObject2Device) { | 134 const CFX_Matrix* pObject2Device) { |
| 135 const CFX_PathData* pFPath = pPathData; | 135 const CFX_PathData* pFPath = pPathData; |
| 136 int nPoints = pFPath->GetPointCount(); | 136 int nPoints = pFPath->GetPointCount(); |
| 137 FX_PATHPOINT* pPoints = pFPath->GetPoints(); | 137 FX_PATHPOINT* pPoints = pFPath->GetPoints(); |
| 138 for (int i = 0; i < nPoints; i++) { | 138 for (int i = 0; i < nPoints; i++) { |
| 139 FX_FIXFLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY; | 139 FX_FIXFLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY; |
| 140 if (pObject2Device) | 140 if (pObject2Device) |
| 141 pObject2Device->Transform(x, y); | 141 pObject2Device->Transform(x, y); |
| 142 int point_type = pPoints[i].m_Flag & FXPT_TYPE; | 142 int point_type = pPoints[i].m_Flag & FXPT_TYPE; |
| 143 if (point_type == FXPT_MOVETO) { | 143 if (point_type == FXPT_MOVETO) { |
| 144 m_PathData.moveTo(x, y); | 144 m_PathData.moveTo(x, y); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 170 } | 170 } |
| 171 if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) | 171 if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) |
| 172 m_PathData.close(); | 172 m_PathData.close(); |
| 173 } | 173 } |
| 174 } | 174 } |
| 175 | 175 |
| 176 // convert a stroking path to scanlines | 176 // convert a stroking path to scanlines |
| 177 static void SkRasterizeStroke(SkPaint& spaint, | 177 static void SkRasterizeStroke(SkPaint& spaint, |
| 178 SkPath* dstPathData, | 178 SkPath* dstPathData, |
| 179 SkPath& path_data, | 179 SkPath& path_data, |
| 180 const CFX_AffineMatrix* pObject2Device, | 180 const CFX_Matrix* pObject2Device, |
| 181 const CFX_GraphStateData* pGraphState, | 181 const CFX_GraphStateData* pGraphState, |
| 182 FX_FIXFLOAT scale = FIX8_ONE, | 182 FX_FIXFLOAT scale = FIX8_ONE, |
| 183 FX_BOOL bStrokeAdjust = FALSE, | 183 FX_BOOL bStrokeAdjust = FALSE, |
| 184 FX_BOOL bTextMode = FALSE) { | 184 FX_BOOL bTextMode = FALSE) { |
| 185 SkPaint::Cap cap; | 185 SkPaint::Cap cap; |
| 186 switch (pGraphState->m_LineCap) { | 186 switch (pGraphState->m_LineCap) { |
| 187 case CFX_GraphStateData::LineCapRound: | 187 case CFX_GraphStateData::LineCapRound: |
| 188 cap = SkPaint::kRound_Cap; | 188 cap = SkPaint::kRound_Cap; |
| 189 break; | 189 break; |
| 190 case CFX_GraphStateData::LineCapSquare: | 190 case CFX_GraphStateData::LineCapSquare: |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 int dither_bits, | 262 int dither_bits, |
| 263 FX_BOOL bRgbByteOrder, | 263 FX_BOOL bRgbByteOrder, |
| 264 CFX_DIBitmap* pOriDevice, | 264 CFX_DIBitmap* pOriDevice, |
| 265 FX_BOOL bGroupKnockout) { | 265 FX_BOOL bGroupKnockout) { |
| 266 m_pAggDriver = new CFX_AggDeviceDriver(pBitmap, dither_bits, bRgbByteOrder, | 266 m_pAggDriver = new CFX_AggDeviceDriver(pBitmap, dither_bits, bRgbByteOrder, |
| 267 pOriDevice, bGroupKnockout); | 267 pOriDevice, bGroupKnockout); |
| 268 } | 268 } |
| 269 CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() { | 269 CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() { |
| 270 delete m_pAggDriver; | 270 delete m_pAggDriver; |
| 271 } | 271 } |
| 272 FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText( | 272 FX_BOOL CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, |
| 273 int nChars, | 273 const FXTEXT_CHARPOS* pCharPos, |
| 274 const FXTEXT_CHARPOS* pCharPos, | 274 CFX_Font* pFont, |
| 275 CFX_Font* pFont, | 275 CFX_FontCache* pCache, |
| 276 CFX_FontCache* pCache, | 276 const CFX_Matrix* pObject2Device, |
| 277 const CFX_AffineMatrix* pObject2Device, | 277 FX_FIXFLOAT font_size, |
| 278 FX_FIXFLOAT font_size, | 278 FX_DWORD color, |
| 279 FX_DWORD color, | 279 int alpha_flag, |
| 280 int alpha_flag, | 280 void* pIccTransform) { |
| 281 void* pIccTransform) { | |
| 282 return m_pAggDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, | 281 return m_pAggDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, |
| 283 pObject2Device, font_size, color, | 282 pObject2Device, font_size, color, |
| 284 alpha_flag, pIccTransform); | 283 alpha_flag, pIccTransform); |
| 285 } | 284 } |
| 286 int CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id) { | 285 int CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id) { |
| 287 return m_pAggDriver->GetDeviceCaps(caps_id); | 286 return m_pAggDriver->GetDeviceCaps(caps_id); |
| 288 } | 287 } |
| 289 void CFX_SkiaDeviceDriver::SaveState() { | 288 void CFX_SkiaDeviceDriver::SaveState() { |
| 290 m_pAggDriver->SaveState(); | 289 m_pAggDriver->SaveState(); |
| 291 } | 290 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 321 render.Init(pThisLayer, clip_box.fLeft, clip_box.fTop); | 320 render.Init(pThisLayer, clip_box.fLeft, clip_box.fTop); |
| 322 | 321 |
| 323 SkRasterClip rasterClip(clip_box); | 322 SkRasterClip rasterClip(clip_box); |
| 324 SuperBlitter_skia::DrawPath(skPath, (SkBlitter*)&render, rasterClip, *spaint); | 323 SuperBlitter_skia::DrawPath(skPath, (SkBlitter*)&render, rasterClip, *spaint); |
| 325 | 324 |
| 326 // Finally, we have got the mask that we need, intersect with current clip | 325 // Finally, we have got the mask that we need, intersect with current clip |
| 327 // region | 326 // region |
| 328 m_pAggDriver->m_pClipRgn->IntersectMaskF(clip_box.fLeft, clip_box.fTop, mask); | 327 m_pAggDriver->m_pClipRgn->IntersectMaskF(clip_box.fLeft, clip_box.fTop, mask); |
| 329 } | 328 } |
| 330 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathFill( | 329 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathFill( |
| 331 const CFX_PathData* pPathData, // path info | 330 const CFX_PathData* pPathData, // path info |
| 332 const CFX_AffineMatrix* pObject2Device, // optional transformation | 331 const CFX_Matrix* pObject2Device, // optional transformation |
| 333 int fill_mode // fill mode, WINDING or ALTERNATE | 332 int fill_mode // fill mode, WINDING or ALTERNATE |
| 334 ) { | 333 ) { |
| 335 if (m_pAggDriver->m_pClipRgn == NULL) | 334 if (m_pAggDriver->m_pClipRgn == NULL) |
| 336 m_pAggDriver->m_pClipRgn = new CFX_ClipRgn( | 335 m_pAggDriver->m_pClipRgn = new CFX_ClipRgn( |
| 337 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); | 336 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); |
| 338 | 337 |
| 339 if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) { | 338 if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) { |
| 340 CFX_FloatRect rectf; | 339 CFX_FloatRect rectf; |
| 341 if (pPathData->IsRect(pObject2Device, &rectf)) { | 340 if (pPathData->IsRect(pObject2Device, &rectf)) { |
| 342 rectf.Intersect( | 341 rectf.Intersect( |
| 343 CFX_FloatRect(0, 0, (FX_FIXFLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), | 342 CFX_FloatRect(0, 0, (FX_FIXFLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 358 spaint.setColor(0xffffffff); | 357 spaint.setColor(0xffffffff); |
| 359 spaint.setAntiAlias(TRUE); | 358 spaint.setAntiAlias(TRUE); |
| 360 spaint.setStyle(SkPaint::kFill_Style); | 359 spaint.setStyle(SkPaint::kFill_Style); |
| 361 | 360 |
| 362 SetClipMask(path_data.m_PathData, &spaint); | 361 SetClipMask(path_data.m_PathData, &spaint); |
| 363 | 362 |
| 364 return TRUE; | 363 return TRUE; |
| 365 } | 364 } |
| 366 | 365 |
| 367 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathStroke( | 366 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathStroke( |
| 368 const CFX_PathData* pPathData, // path info | 367 const CFX_PathData* pPathData, // path info |
| 369 const CFX_AffineMatrix* pObject2Device, // optional transformation | 368 const CFX_Matrix* pObject2Device, // optional transformation |
| 370 const CFX_GraphStateData* pGraphState // graphic state, for pen attributes | 369 const CFX_GraphStateData* pGraphState // graphic state, for pen attributes |
| 371 ) { | 370 ) { |
| 372 if (m_pAggDriver->m_pClipRgn == NULL) | 371 if (m_pAggDriver->m_pClipRgn == NULL) |
| 373 m_pAggDriver->m_pClipRgn = new CFX_ClipRgn( | 372 m_pAggDriver->m_pClipRgn = new CFX_ClipRgn( |
| 374 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); | 373 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); |
| 375 | 374 |
| 376 // build path data | 375 // build path data |
| 377 CSkia_PathData path_data; | 376 CSkia_PathData path_data; |
| 378 path_data.BuildPath(pPathData, NULL); | 377 path_data.BuildPath(pPathData, NULL); |
| 379 path_data.m_PathData.setFillType(SkPath::kWinding_FillType); | 378 path_data.m_PathData.setFillType(SkPath::kWinding_FillType); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 return FALSE; | 417 return FALSE; |
| 419 | 418 |
| 420 SkRasterClip rasterClip(rect); | 419 SkRasterClip rasterClip(rect); |
| 421 SuperBlitter_skia::DrawPath(skPath, (SkBlitter*)&render, rasterClip, | 420 SuperBlitter_skia::DrawPath(skPath, (SkBlitter*)&render, rasterClip, |
| 422 origPaint); | 421 origPaint); |
| 423 | 422 |
| 424 return TRUE; | 423 return TRUE; |
| 425 } | 424 } |
| 426 | 425 |
| 427 FX_BOOL CFX_SkiaDeviceDriver::DrawPath( | 426 FX_BOOL CFX_SkiaDeviceDriver::DrawPath( |
| 428 const CFX_PathData* pPathData, // path info | 427 const CFX_PathData* pPathData, // path info |
| 429 const CFX_AffineMatrix* pObject2Device, // optional transformation | 428 const CFX_Matrix* pObject2Device, // optional transformation |
| 430 const CFX_GraphStateData* pGraphState, // graphic state, for pen attributes | 429 const CFX_GraphStateData* pGraphState, // graphic state, for pen attributes |
| 431 FX_DWORD fill_color, // fill color | 430 FX_DWORD fill_color, // fill color |
| 432 FX_DWORD stroke_color, // stroke color | 431 FX_DWORD stroke_color, // stroke color |
| 433 int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled | 432 int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled |
| 434 int alpha_flag, | 433 int alpha_flag, |
| 435 void* pIccTransform) { | 434 void* pIccTransform) { |
| 436 if (GetBuffer() == NULL) | 435 if (GetBuffer() == NULL) |
| 437 return TRUE; | 436 return TRUE; |
| 438 FOXIT_DEBUG1("CFX_SkiaDeviceDriver::DrawPath: entering"); | 437 FOXIT_DEBUG1("CFX_SkiaDeviceDriver::DrawPath: entering"); |
| 439 SkIRect rect; | 438 SkIRect rect; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 465 int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) | 464 int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) |
| 466 ? FXGETFLAG_ALPHA_STROKE(alpha_flag) | 465 ? FXGETFLAG_ALPHA_STROKE(alpha_flag) |
| 467 : FXARGB_A(stroke_color); | 466 : FXARGB_A(stroke_color); |
| 468 | 467 |
| 469 if (pGraphState && stroke_alpha) { | 468 if (pGraphState && stroke_alpha) { |
| 470 // We split the matrix into two parts: first part doing the scaling, so we | 469 // We split the matrix into two parts: first part doing the scaling, so we |
| 471 // won't have the | 470 // won't have the |
| 472 // flatness problem, second part doing the transformation, so we don't have | 471 // flatness problem, second part doing the transformation, so we don't have |
| 473 // stroking geo problem. | 472 // stroking geo problem. |
| 474 // TESTDOC: Bug #5253 - test[1].pdf | 473 // TESTDOC: Bug #5253 - test[1].pdf |
| 475 CFX_AffineMatrix matrix1, matrix2; | 474 CFX_Matrix matrix1, matrix2; |
| 476 if (pObject2Device) { | 475 if (pObject2Device) { |
| 477 matrix1.a = FXSYS_fabs(pObject2Device->a) > FXSYS_fabs(pObject2Device->b) | 476 matrix1.a = FXSYS_fabs(pObject2Device->a) > FXSYS_fabs(pObject2Device->b) |
| 478 ? FXSYS_fabs(pObject2Device->a) | 477 ? FXSYS_fabs(pObject2Device->a) |
| 479 : FXSYS_fabs(pObject2Device->b); | 478 : FXSYS_fabs(pObject2Device->b); |
| 480 matrix1.d = matrix1.a; // FXSYS_fabs(pObject2Device->c) > | 479 matrix1.d = matrix1.a; // FXSYS_fabs(pObject2Device->c) > |
| 481 // FXSYS_fabs(pObject2Device->d) ? | 480 // FXSYS_fabs(pObject2Device->d) ? |
| 482 // pObject2Device->c : pObject2Device->d; | 481 // pObject2Device->c : pObject2Device->d; |
| 483 matrix2.Set(pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a, | 482 matrix2.Set(pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a, |
| 484 pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d, | 483 pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d, |
| 485 pObject2Device->e, pObject2Device->f); | 484 pObject2Device->e, pObject2Device->f); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 int alpha_flag, | 558 int alpha_flag, |
| 560 void* pIccTransform) { | 559 void* pIccTransform) { |
| 561 return m_pAggDriver->StretchDIBits(pSource, argb, dest_left, dest_top, | 560 return m_pAggDriver->StretchDIBits(pSource, argb, dest_left, dest_top, |
| 562 dest_width, dest_height, pClipRect, flags, | 561 dest_width, dest_height, pClipRect, flags, |
| 563 alpha_flag, pIccTransform); | 562 alpha_flag, pIccTransform); |
| 564 } | 563 } |
| 565 | 564 |
| 566 FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, | 565 FX_BOOL CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, |
| 567 int bitmap_alpha, | 566 int bitmap_alpha, |
| 568 FX_DWORD argb, | 567 FX_DWORD argb, |
| 569 const CFX_AffineMatrix* pMatrix, | 568 const CFX_Matrix* pMatrix, |
| 570 FX_DWORD render_flags, | 569 FX_DWORD render_flags, |
| 571 void*& handle, | 570 void*& handle, |
| 572 int alpha_flag, | 571 int alpha_flag, |
| 573 void* pIccTransform) { | 572 void* pIccTransform) { |
| 574 return m_pAggDriver->StartDIBits(pSource, bitmap_alpha, argb, pMatrix, | 573 return m_pAggDriver->StartDIBits(pSource, bitmap_alpha, argb, pMatrix, |
| 575 render_flags, handle, alpha_flag, | 574 render_flags, handle, alpha_flag, |
| 576 pIccTransform); | 575 pIccTransform); |
| 577 } | 576 } |
| 578 | 577 |
| 579 FX_BOOL CFX_SkiaDeviceDriver::ContinueDIBits(void* pHandle, IFX_Pause* pPause) { | 578 FX_BOOL CFX_SkiaDeviceDriver::ContinueDIBits(void* pHandle, IFX_Pause* pPause) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 new CFX_SkiaDeviceDriver(pBitmap, dither_bits, FALSE, pOriDevice, FALSE); | 617 new CFX_SkiaDeviceDriver(pBitmap, dither_bits, FALSE, pOriDevice, FALSE); |
| 619 SetDeviceDriver(pDriver); | 618 SetDeviceDriver(pDriver); |
| 620 return TRUE; | 619 return TRUE; |
| 621 } | 620 } |
| 622 CFX_SkiaDevice::~CFX_SkiaDevice() { | 621 CFX_SkiaDevice::~CFX_SkiaDevice() { |
| 623 if (m_bOwnedBitmap && GetBitmap()) | 622 if (m_bOwnedBitmap && GetBitmap()) |
| 624 delete GetBitmap(); | 623 delete GetBitmap(); |
| 625 } | 624 } |
| 626 | 625 |
| 627 #endif | 626 #endif |
| OLD | NEW |