| 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 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 default: | 205 default: |
| 206 join = SkPaint::kMiter_Join; | 206 join = SkPaint::kMiter_Join; |
| 207 break; | 207 break; |
| 208 } | 208 } |
| 209 FX_FIXFLOAT width = pGraphState->m_LineWidth * scale; | 209 FX_FIXFLOAT width = pGraphState->m_LineWidth * scale; |
| 210 FX_FIXFLOAT unit = fix32_to_8(fixdiv_8_8_to_32( | 210 FX_FIXFLOAT unit = fix32_to_8(fixdiv_8_8_to_32( |
| 211 FIX8_ONE, (pObject2Device->GetXUnit() + pObject2Device->GetYUnit()) / 2)); | 211 FIX8_ONE, (pObject2Device->GetXUnit() + pObject2Device->GetYUnit()) / 2)); |
| 212 if (width <= unit) | 212 if (width <= unit) |
| 213 width = unit; | 213 width = unit; |
| 214 | 214 |
| 215 if (pGraphState->m_DashArray == NULL) { | 215 if (pGraphState->m_DashArray) { |
| 216 SkStroke stroker; | |
| 217 stroker.setCap(cap); | |
| 218 stroker.setJoin(join); | |
| 219 stroker.setMiterLimit(pGraphState->m_MiterLimit); | |
| 220 stroker.setWidth(width); | |
| 221 stroker.setDoFill(FALSE); | |
| 222 stroker.strokePath(path_data, dstPathData); | |
| 223 SkMatrix smatrix; | |
| 224 smatrix.setAll(pObject2Device->a, pObject2Device->c, pObject2Device->e, | |
| 225 pObject2Device->b, pObject2Device->d, pObject2Device->f, 0, | |
| 226 0, 1); | |
| 227 dstPathData->transform(smatrix); | |
| 228 } else { | |
| 229 int count = (pGraphState->m_DashCount + 1) / 2; | 216 int count = (pGraphState->m_DashCount + 1) / 2; |
| 230 SkScalar* intervals = FX_Alloc2D(SkScalar, count, sizeof(SkScalar)); | 217 SkScalar* intervals = FX_Alloc2D(SkScalar, count, sizeof(SkScalar)); |
| 231 // Set dash pattern | 218 // Set dash pattern |
| 232 for (int i = 0; i < count; i++) { | 219 for (int i = 0; i < count; i++) { |
| 233 FX_FIXFLOAT on = pGraphState->m_DashArray[i * 2]; | 220 FX_FIXFLOAT on = pGraphState->m_DashArray[i * 2]; |
| 234 if (on <= 0.000001f) | 221 if (on <= 0.000001f) |
| 235 on = FIX8_ONE / 10; | 222 on = FIX8_ONE / 10; |
| 236 FX_FIXFLOAT off = i * 2 + 1 == pGraphState->m_DashCount | 223 FX_FIXFLOAT off = i * 2 + 1 == pGraphState->m_DashCount |
| 237 ? on | 224 ? on |
| 238 : pGraphState->m_DashArray[i * 2 + 1]; | 225 : pGraphState->m_DashArray[i * 2 + 1]; |
| 239 if (off < 0) | 226 if (off < 0) |
| 240 off = 0; | 227 off = 0; |
| 241 intervals[i * 2] = on * scale; | 228 intervals[i * 2] = on * scale; |
| 242 intervals[i * 2 + 1] = off * scale; | 229 intervals[i * 2 + 1] = off * scale; |
| 243 } | 230 } |
| 244 SkDashPathEffect* pEffect = new SkDashPathEffect( | 231 SkDashPathEffect* pEffect = new SkDashPathEffect( |
| 245 intervals, count * 2, pGraphState->m_DashPhase * scale); | 232 intervals, count * 2, pGraphState->m_DashPhase * scale); |
| 246 spaint.setPathEffect(pEffect)->unref(); | 233 spaint.setPathEffect(pEffect)->unref(); |
| 247 spaint.setStrokeWidth(width); | 234 spaint.setStrokeWidth(width); |
| 248 spaint.setStrokeMiter(pGraphState->m_MiterLimit); | 235 spaint.setStrokeMiter(pGraphState->m_MiterLimit); |
| 249 spaint.setStrokeCap(cap); | 236 spaint.setStrokeCap(cap); |
| 250 spaint.setStrokeJoin(join); | 237 spaint.setStrokeJoin(join); |
| 251 spaint.getFillPath(path_data, dstPathData); | 238 spaint.getFillPath(path_data, dstPathData); |
| 252 SkMatrix smatrix; | 239 SkMatrix smatrix; |
| 253 smatrix.setAll(pObject2Device->a, pObject2Device->c, pObject2Device->e, | 240 smatrix.setAll(pObject2Device->a, pObject2Device->c, pObject2Device->e, |
| 254 pObject2Device->b, pObject2Device->d, pObject2Device->f, 0, | 241 pObject2Device->b, pObject2Device->d, pObject2Device->f, 0, |
| 255 0, 1); | 242 0, 1); |
| 256 dstPathData->transform(smatrix); | 243 dstPathData->transform(smatrix); |
| 257 FX_Free(intervals); | 244 FX_Free(intervals); |
| 245 } else { |
| 246 SkStroke stroker; |
| 247 stroker.setCap(cap); |
| 248 stroker.setJoin(join); |
| 249 stroker.setMiterLimit(pGraphState->m_MiterLimit); |
| 250 stroker.setWidth(width); |
| 251 stroker.setDoFill(FALSE); |
| 252 stroker.strokePath(path_data, dstPathData); |
| 253 SkMatrix smatrix; |
| 254 smatrix.setAll(pObject2Device->a, pObject2Device->c, pObject2Device->e, |
| 255 pObject2Device->b, pObject2Device->d, pObject2Device->f, 0, |
| 256 0, 1); |
| 257 dstPathData->transform(smatrix); |
| 258 } | 258 } |
| 259 } | 259 } |
| 260 | 260 |
| 261 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap, | 261 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap, |
| 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); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 | 324 |
| 325 // 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 |
| 326 // region | 326 // region |
| 327 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); |
| 328 } | 328 } |
| 329 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathFill( | 329 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathFill( |
| 330 const CFX_PathData* pPathData, // path info | 330 const CFX_PathData* pPathData, // path info |
| 331 const CFX_Matrix* pObject2Device, // optional transformation | 331 const CFX_Matrix* pObject2Device, // optional transformation |
| 332 int fill_mode // fill mode, WINDING or ALTERNATE | 332 int fill_mode // fill mode, WINDING or ALTERNATE |
| 333 ) { | 333 ) { |
| 334 if (m_pAggDriver->m_pClipRgn == NULL) | 334 if (!m_pAggDriver->m_pClipRgn) { |
| 335 m_pAggDriver->m_pClipRgn = new CFX_ClipRgn( | 335 m_pAggDriver->m_pClipRgn = new CFX_ClipRgn( |
| 336 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); | 336 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); |
| 337 } |
| 337 | 338 |
| 338 if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) { | 339 if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) { |
| 339 CFX_FloatRect rectf; | 340 CFX_FloatRect rectf; |
| 340 if (pPathData->IsRect(pObject2Device, &rectf)) { | 341 if (pPathData->IsRect(pObject2Device, &rectf)) { |
| 341 rectf.Intersect( | 342 rectf.Intersect( |
| 342 CFX_FloatRect(0, 0, (FX_FIXFLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), | 343 CFX_FloatRect(0, 0, (FX_FIXFLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), |
| 343 (FX_FIXFLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT))); | 344 (FX_FIXFLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT))); |
| 344 FX_RECT rect = rectf.GetOutterRect(); | 345 FX_RECT rect = rectf.GetOutterRect(); |
| 345 m_pAggDriver->m_pClipRgn->IntersectRect(rect); | 346 m_pAggDriver->m_pClipRgn->IntersectRect(rect); |
| 346 return TRUE; | 347 return TRUE; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 361 SetClipMask(path_data.m_PathData, &spaint); | 362 SetClipMask(path_data.m_PathData, &spaint); |
| 362 | 363 |
| 363 return TRUE; | 364 return TRUE; |
| 364 } | 365 } |
| 365 | 366 |
| 366 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathStroke( | 367 FX_BOOL CFX_SkiaDeviceDriver::SetClip_PathStroke( |
| 367 const CFX_PathData* pPathData, // path info | 368 const CFX_PathData* pPathData, // path info |
| 368 const CFX_Matrix* pObject2Device, // optional transformation | 369 const CFX_Matrix* pObject2Device, // optional transformation |
| 369 const CFX_GraphStateData* pGraphState // graphic state, for pen attributes | 370 const CFX_GraphStateData* pGraphState // graphic state, for pen attributes |
| 370 ) { | 371 ) { |
| 371 if (m_pAggDriver->m_pClipRgn == NULL) | 372 if (!m_pAggDriver->m_pClipRgn) { |
| 372 m_pAggDriver->m_pClipRgn = new CFX_ClipRgn( | 373 m_pAggDriver->m_pClipRgn = new CFX_ClipRgn( |
| 373 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); | 374 GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); |
| 375 } |
| 374 | 376 |
| 375 // build path data | 377 // build path data |
| 376 CSkia_PathData path_data; | 378 CSkia_PathData path_data; |
| 377 path_data.BuildPath(pPathData, NULL); | 379 path_data.BuildPath(pPathData, NULL); |
| 378 path_data.m_PathData.setFillType(SkPath::kWinding_FillType); | 380 path_data.m_PathData.setFillType(SkPath::kWinding_FillType); |
| 379 | 381 |
| 380 SkPaint spaint; | 382 SkPaint spaint; |
| 381 spaint.setColor(0xffffffff); | 383 spaint.setColor(0xffffffff); |
| 382 spaint.setStyle(SkPaint::kStroke_Style); | 384 spaint.setStyle(SkPaint::kStroke_Style); |
| 383 spaint.setAntiAlias(TRUE); | 385 spaint.setAntiAlias(TRUE); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 | 427 |
| 426 FX_BOOL CFX_SkiaDeviceDriver::DrawPath( | 428 FX_BOOL CFX_SkiaDeviceDriver::DrawPath( |
| 427 const CFX_PathData* pPathData, // path info | 429 const CFX_PathData* pPathData, // path info |
| 428 const CFX_Matrix* pObject2Device, // optional transformation | 430 const CFX_Matrix* pObject2Device, // optional transformation |
| 429 const CFX_GraphStateData* pGraphState, // graphic state, for pen attributes | 431 const CFX_GraphStateData* pGraphState, // graphic state, for pen attributes |
| 430 FX_DWORD fill_color, // fill color | 432 FX_DWORD fill_color, // fill color |
| 431 FX_DWORD stroke_color, // stroke color | 433 FX_DWORD stroke_color, // stroke color |
| 432 int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled | 434 int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled |
| 433 int alpha_flag, | 435 int alpha_flag, |
| 434 void* pIccTransform) { | 436 void* pIccTransform) { |
| 435 if (GetBuffer() == NULL) | 437 if (!GetBuffer()) |
| 436 return TRUE; | 438 return TRUE; |
| 437 FOXIT_DEBUG1("CFX_SkiaDeviceDriver::DrawPath: entering"); | 439 FOXIT_DEBUG1("CFX_SkiaDeviceDriver::DrawPath: entering"); |
| 438 SkIRect rect; | 440 SkIRect rect; |
| 439 rect.set(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH), | 441 rect.set(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH), |
| 440 GetDeviceCaps(FXDC_PIXEL_HEIGHT)); | 442 GetDeviceCaps(FXDC_PIXEL_HEIGHT)); |
| 441 if ((fill_mode & 3) && fill_color) { | 443 if ((fill_mode & 3) && fill_color) { |
| 442 // We have to transform before building path data, otherwise we'll have | 444 // We have to transform before building path data, otherwise we'll have |
| 443 // flatting problem | 445 // flatting problem |
| 444 // when we enlarge a small path (flatten before transformed) | 446 // when we enlarge a small path (flatten before transformed) |
| 445 // TESTDOC: Bug #5115 - DS_S1Dimpact_lr.pdf | 447 // TESTDOC: Bug #5115 - DS_S1Dimpact_lr.pdf |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 | 587 |
| 586 CFX_SkiaDevice::CFX_SkiaDevice() { | 588 CFX_SkiaDevice::CFX_SkiaDevice() { |
| 587 m_bOwnedBitmap = FALSE; | 589 m_bOwnedBitmap = FALSE; |
| 588 } | 590 } |
| 589 | 591 |
| 590 FX_BOOL CFX_SkiaDevice::Attach(CFX_DIBitmap* pBitmap, | 592 FX_BOOL CFX_SkiaDevice::Attach(CFX_DIBitmap* pBitmap, |
| 591 int dither_bits, | 593 int dither_bits, |
| 592 FX_BOOL bRgbByteOrder, | 594 FX_BOOL bRgbByteOrder, |
| 593 CFX_DIBitmap* pOriDevice, | 595 CFX_DIBitmap* pOriDevice, |
| 594 FX_BOOL bGroupKnockout) { | 596 FX_BOOL bGroupKnockout) { |
| 595 if (pBitmap == NULL) | 597 if (!pBitmap) |
| 596 return FALSE; | 598 return FALSE; |
| 597 SetBitmap(pBitmap); | 599 SetBitmap(pBitmap); |
| 598 CFX_SkiaDeviceDriver* pDriver = new CFX_SkiaDeviceDriver( | 600 CFX_SkiaDeviceDriver* pDriver = new CFX_SkiaDeviceDriver( |
| 599 pBitmap, dither_bits, bRgbByteOrder, pOriDevice, bGroupKnockout); | 601 pBitmap, dither_bits, bRgbByteOrder, pOriDevice, bGroupKnockout); |
| 600 SetDeviceDriver(pDriver); | 602 SetDeviceDriver(pDriver); |
| 601 return TRUE; | 603 return TRUE; |
| 602 } | 604 } |
| 603 | 605 |
| 604 FX_BOOL CFX_SkiaDevice::Create(int width, | 606 FX_BOOL CFX_SkiaDevice::Create(int width, |
| 605 int height, | 607 int height, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 617 new CFX_SkiaDeviceDriver(pBitmap, dither_bits, FALSE, pOriDevice, FALSE); | 619 new CFX_SkiaDeviceDriver(pBitmap, dither_bits, FALSE, pOriDevice, FALSE); |
| 618 SetDeviceDriver(pDriver); | 620 SetDeviceDriver(pDriver); |
| 619 return TRUE; | 621 return TRUE; |
| 620 } | 622 } |
| 621 CFX_SkiaDevice::~CFX_SkiaDevice() { | 623 CFX_SkiaDevice::~CFX_SkiaDevice() { |
| 622 if (m_bOwnedBitmap && GetBitmap()) | 624 if (m_bOwnedBitmap && GetBitmap()) |
| 623 delete GetBitmap(); | 625 delete GetBitmap(); |
| 624 } | 626 } |
| 625 | 627 |
| 626 #endif | 628 #endif |
| OLD | NEW |