📄 platformcontextskia.cpp
字号:
void PlatformContextSkia::drawRect(SkRect rect){ SkPaint paint; int fillcolorNotTransparent = m_state->m_fillColor & 0xFF000000; if (fillcolorNotTransparent) { setupPaintForFilling(&paint); canvas()->drawRect(rect, paint); } if (m_state->m_strokeStyle != WebCore::NoStroke && (m_state->m_strokeColor & 0xFF000000)) { if (fillcolorNotTransparent) { // This call is expensive so don't call it unnecessarily. paint.reset(); } setupPaintForStroking(&paint, &rect, 0); canvas()->drawRect(rect, paint); }}void PlatformContextSkia::setupPaintCommon(SkPaint* paint) const{#ifdef SK_DEBUGx { SkPaint defaultPaint; SkASSERT(*paint == defaultPaint); }#endif paint->setAntiAlias(m_state->m_useAntialiasing); paint->setPorterDuffXfermode(m_state->m_porterDuffMode); paint->setLooper(m_state->m_looper); if (m_state->m_gradient) paint->setShader(m_state->m_gradient); else if (m_state->m_pattern) paint->setShader(m_state->m_pattern);}void PlatformContextSkia::setupPaintForFilling(SkPaint* paint) const{ setupPaintCommon(paint); paint->setColor(m_state->applyAlpha(m_state->m_fillColor));}float PlatformContextSkia::setupPaintForStroking(SkPaint* paint, SkRect* rect, int length) const{ setupPaintCommon(paint); float width = m_state->m_strokeThickness; // This allows dashing and dotting to work properly for hairline strokes. if (width == 0) width = 1; paint->setColor(m_state->applyAlpha(m_state->m_strokeColor)); paint->setStyle(SkPaint::kStroke_Style); paint->setStrokeWidth(SkFloatToScalar(width)); paint->setStrokeCap(m_state->m_lineCap); paint->setStrokeJoin(m_state->m_lineJoin); paint->setStrokeMiter(SkFloatToScalar(m_state->m_miterLimit)); if (rect != 0 && (static_cast<int>(roundf(width)) & 1)) rect->inset(-SK_ScalarHalf, -SK_ScalarHalf); if (m_state->m_dash) paint->setPathEffect(m_state->m_dash); else { switch (m_state->m_strokeStyle) { case WebCore::NoStroke: case WebCore::SolidStroke: break; case WebCore::DashedStroke: width = m_state->m_dashRatio * width; // Fall through. case WebCore::DottedStroke: SkScalar dashLength; if (length) { // Determine about how many dashes or dots we should have. int numDashes = length / roundf(width); if (!(numDashes & 1)) numDashes++; // Make it odd so we end on a dash/dot. // Use the number of dashes to determine the length of a // dash/dot, which will be approximately width dashLength = SkScalarDiv(SkIntToScalar(length), SkIntToScalar(numDashes)); } else dashLength = SkFloatToScalar(width); SkScalar intervals[2] = { dashLength, dashLength }; paint->setPathEffect(new SkDashPathEffect(intervals, 2, 0))->unref(); } } return width;}void PlatformContextSkia::setDrawLooper(SkDrawLooper* dl){ SkRefCnt_SafeAssign(m_state->m_looper, dl);}void PlatformContextSkia::setMiterLimit(float ml){ m_state->m_miterLimit = ml;}void PlatformContextSkia::setAlpha(float alpha){ m_state->m_alpha = alpha;}void PlatformContextSkia::setLineCap(SkPaint::Cap lc){ m_state->m_lineCap = lc;}void PlatformContextSkia::setLineJoin(SkPaint::Join lj){ m_state->m_lineJoin = lj;}void PlatformContextSkia::setPorterDuffMode(SkPorterDuff::Mode pdm){ m_state->m_porterDuffMode = pdm;}void PlatformContextSkia::setFillColor(SkColor color){ m_state->m_fillColor = color;}SkDrawLooper* PlatformContextSkia::getDrawLooper() const{ return m_state->m_looper;}WebCore::StrokeStyle PlatformContextSkia::getStrokeStyle() const{ return m_state->m_strokeStyle;}void PlatformContextSkia::setStrokeStyle(WebCore::StrokeStyle strokeStyle){ m_state->m_strokeStyle = strokeStyle;}void PlatformContextSkia::setStrokeColor(SkColor strokeColor){ m_state->m_strokeColor = strokeColor;}float PlatformContextSkia::getStrokeThickness() const{ return m_state->m_strokeThickness;}void PlatformContextSkia::setStrokeThickness(float thickness){ m_state->m_strokeThickness = thickness;}int PlatformContextSkia::getTextDrawingMode() const{ return m_state->m_textDrawingMode;}void PlatformContextSkia::setTextDrawingMode(int mode){ // cTextClip is never used, so we assert that it isn't set: // https://bugs.webkit.org/show_bug.cgi?id=21898 ASSERT((mode & WebCore::cTextClip) == 0); m_state->m_textDrawingMode = mode;}void PlatformContextSkia::setUseAntialiasing(bool enable){ m_state->m_useAntialiasing = enable;}SkColor PlatformContextSkia::effectiveFillColor() const{ return m_state->applyAlpha(m_state->m_fillColor);}SkColor PlatformContextSkia::effectiveStrokeColor() const{ return m_state->applyAlpha(m_state->m_strokeColor);}void PlatformContextSkia::beginPath(){ m_path.reset();}void PlatformContextSkia::addPath(const SkPath& path){ m_path.addPath(path, m_canvas->getTotalMatrix());}SkPath PlatformContextSkia::currentPathInLocalCoordinates() const{ SkPath localPath = m_path; const SkMatrix& matrix = m_canvas->getTotalMatrix(); SkMatrix inverseMatrix; matrix.invert(&inverseMatrix); localPath.transform(inverseMatrix); return localPath;}void PlatformContextSkia::setFillRule(SkPath::FillType fr){ m_path.setFillType(fr);}void PlatformContextSkia::setGradient(SkShader* gradient){ if (gradient != m_state->m_gradient) { m_state->m_gradient->safeUnref(); m_state->m_gradient = gradient; }}void PlatformContextSkia::setPattern(SkShader* pattern){ if (pattern != m_state->m_pattern) { m_state->m_pattern->safeUnref(); m_state->m_pattern = pattern; }}void PlatformContextSkia::setDashPathEffect(SkDashPathEffect* dash){ if (dash != m_state->m_dash) { m_state->m_dash->safeUnref(); m_state->m_dash = dash; }}void PlatformContextSkia::paintSkPaint(const SkRect& rect, const SkPaint& paint){ m_canvas->drawRect(rect, paint);}const SkBitmap* PlatformContextSkia::bitmap() const{ return &m_canvas->getDevice()->accessBitmap(false);}bool PlatformContextSkia::isPrinting(){ return m_canvas->getTopPlatformDevice().IsVectorial();}#if defined(__linux__) || PLATFORM(WIN_OS)void PlatformContextSkia::applyClipFromImage(const WebCore::FloatRect& rect, const SkBitmap& imageBuffer){ // NOTE: this assumes the image mask contains opaque black for the portions that are to be shown, as such we // only look at the alpha when compositing. I'm not 100% sure this is what WebKit expects for image clipping. SkPaint paint; paint.setPorterDuffXfermode(SkPorterDuff::kDstIn_Mode); m_canvas->drawBitmap(imageBuffer, SkFloatToScalar(rect.x()), SkFloatToScalar(rect.y()), &paint);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -