static void show_fill(SkCanvas* canvas, bool doAA) { SkRandom rand; SkPaint paint; paint.setAntiAlias(doAA); for (int i = 0; i < 50; ++i) { SkRect r; SkPath p; r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H, rand.nextUScalar1() * W, rand.nextUScalar1() * H); paint.setColor(rand.nextU()); canvas->drawRect(r, paint); r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H, rand.nextUScalar1() * W, rand.nextUScalar1() * H); paint.setColor(rand.nextU()); p.addOval(r); canvas->drawPath(p, paint); } }
static SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm) { SkAutoCanvasRestore acr(canvas, true); SkPaint paint; SkScalar x = 0; const int scale = 32; paint.setAntiAlias(true); const char* name = sk_tool_utils::colortype_name(bm.colorType()); canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8, paint); canvas->translate(SkIntToScalar(48), 0); canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale)); x += draw_set(canvas, bm, 0, &paint); paint.reset(); paint.setAlpha(0x80); draw_set(canvas, bm, x, &paint); return x * scale / 3; }
static void texteffect_slide(SkCanvas* canvas) { const char* str = "Google"; size_t len = strlen(str); SkScalar x = 20; SkScalar y = 80; SkPaint paint; paint.setTypeface(SkTypeface::MakeFromName("Georgia", SkFontStyle::FromOldStyle(SkTypeface::kItalic))); paint.setTextSize(75); paint.setAntiAlias(true); paint.setColor(SK_ColorBLUE); for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) { apply_shader(&paint, (int)i); canvas->drawText(str, len, x, y, paint); y += 80; if (i == 4) { x += 320; y = 80; } } }
void onDraw(SkCanvas* canvas) override { SkPoint pts[2] = { { 0, 0 }, { SkIntToScalar(100), SkIntToScalar(100) } }; SkShader::TileMode tm = SkShader::kClamp_TileMode; SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) }; SkPaint paint; paint.setAntiAlias(true); canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { canvas->save(); for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { paint.setShader(gGradMakers[j](pts, gGradData[i], tm)); canvas->drawRect(r, paint); canvas->translate(0, SkIntToScalar(120)); } canvas->restore(); canvas->translate(SkIntToScalar(120), 0); } }
SkBitmap createRandomCharIcon() { int size = cardHeight - (dp(10) * 2); SkBitmap bitmap = TestUtils::createSkBitmap(size, size); SkCanvas canvas(bitmap); canvas.clear(0); SkPaint paint; paint.setAntiAlias(true); SkColor randomColor = BrightColors[rand() % BrightColorsCount]; paint.setColor(randomColor); canvas.drawCircle(size / 2, size / 2, size / 2, paint); bool bgDark = SkColorGetR(randomColor) + SkColorGetG(randomColor) + SkColorGetB(randomColor) < 128 * 3; paint.setColor(bgDark ? Color::White : Color::Grey_700); paint.setTextAlign(SkPaint::kCenter_Align); paint.setTextSize(size / 2); char charToShow = 'A' + (rand() % 26); canvas.drawText(&charToShow, 1, size / 2, /*approximate centering*/ size * 0.7, paint); return bitmap; }
static SkBitmap createBitmap(int n) { SkBitmap bitmap; bitmap.allocN32Pixels(n, n); bitmap.eraseColor(SK_ColorGREEN); SkCanvas canvas(bitmap); SkRect r; r.set(0, 0, SkIntToScalar(n), SkIntToScalar(n)); SkPaint paint; paint.setAntiAlias(true); paint.setColor(SK_ColorRED); canvas.drawOval(r, paint); paint.setColor(SK_ColorBLUE); paint.setStrokeWidth(SkIntToScalar(n)/15); paint.setStyle(SkPaint::kStroke_Style); canvas.drawLine(0, 0, r.fRight, r.fBottom, paint); canvas.drawLine(0, r.fBottom, r.fRight, 0, paint); return bitmap; }
static void test_drawPathEmpty(skiatest::Reporter*, SkCanvas* canvas) { // Filling an empty path should not crash. SkPaint paint; canvas->drawRect(SkRect(), paint); canvas->drawPath(SkPath(), paint); canvas->drawOval(SkRect(), paint); canvas->drawRect(SkRect(), paint); canvas->drawRRect(SkRRect(), paint); // Stroking an empty path should not crash. paint.setAntiAlias(true); paint.setStyle(SkPaint::kStroke_Style); paint.setColor(SK_ColorGRAY); paint.setStrokeWidth(SkIntToScalar(20)); paint.setStrokeJoin(SkPaint::kRound_Join); canvas->drawRect(SkRect(), paint); canvas->drawPath(SkPath(), paint); canvas->drawOval(SkRect(), paint); canvas->drawRect(SkRect(), paint); canvas->drawRRect(SkRRect(), paint); }
/* * Inspired by http://code.google.com/p/chromium/issues/detail?id=112145 */ static void flower(SkCanvas* canvas, const SkPath& path, SkScalar intervals[2], SkPaint::Join join) { SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 0); SkPaint paint; paint.setAntiAlias(true); paint.setStyle(SkPaint::kStroke_Style); paint.setStrokeJoin(join); paint.setStrokeWidth(42); canvas->drawPath(path, paint); paint.setColor(SK_ColorRED); paint.setStrokeWidth(21); paint.setPathEffect(pe)->unref(); canvas->drawPath(path, paint); paint.setColor(SK_ColorGREEN); paint.setPathEffect(nullptr); paint.setStrokeWidth(0); canvas->drawPath(path, paint); }
virtual void onDraw(const int loops, SkCanvas* canvas) { SkPaint paint; this->setupPaint(&paint); paint.setAntiAlias(true); SkRandom rand; for (int i = 0; i < loops; i++) { SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400, rand.nextUScalar1() * 400); r.offset(fRadius, fRadius); if (fRadius > 0) { SkMaskFilter* mf = SkBlurMaskFilter::Create(fStyle, SkBlurMask::ConvertRadiusToSigma(fRadius), fFlags); paint.setMaskFilter(mf)->unref(); } canvas->drawOval(r, paint); } }
static void drawSomething(SkCanvas* canvas) { SkPaint paint; canvas->save(); canvas->scale(0.5f, 0.5f); canvas->drawBitmap(make_bitmap(), 0, 0, NULL); canvas->restore(); const char beforeStr[] = "before circle"; const char afterStr[] = "after circle"; paint.setAntiAlias(true); paint.setColor(SK_ColorRED); canvas->drawData(beforeStr, sizeof(beforeStr)); canvas->drawCircle(SkIntToScalar(kBitmapSize/2), SkIntToScalar(kBitmapSize/2), SkIntToScalar(kBitmapSize/3), paint); canvas->drawData(afterStr, sizeof(afterStr)); paint.setColor(SK_ColorBLACK); paint.setTextSize(SkIntToScalar(kBitmapSize/3)); canvas->drawText("Picture", 7, SkIntToScalar(kBitmapSize/2), SkIntToScalar(kBitmapSize/4), paint); }
static void Transform(DataSourceSurface* aDest, DataSourceSurface* aSource, const gfx3DMatrix& aTransform, const Point& aDestOffset) { if (aTransform.IsSingular()) { return; } IntSize destSize = aDest->GetSize(); SkImageInfo destInfo = SkImageInfo::Make(destSize.width, destSize.height, kBGRA_8888_SkColorType, kPremul_SkAlphaType); SkBitmap destBitmap; destBitmap.setInfo(destInfo, aDest->Stride()); destBitmap.setPixels((uint32_t*)aDest->GetData()); SkCanvas destCanvas(destBitmap); IntSize srcSize = aSource->GetSize(); SkImageInfo srcInfo = SkImageInfo::Make(srcSize.width, srcSize.height, kBGRA_8888_SkColorType, kPremul_SkAlphaType); SkBitmap src; src.setInfo(srcInfo, aSource->Stride()); src.setPixels((uint32_t*)aSource->GetData()); gfx3DMatrix transform = aTransform; transform.TranslatePost(Point3D(-aDestOffset.x, -aDestOffset.y, 0)); destCanvas.setMatrix(Matrix3DToSkia(transform)); SkPaint paint; paint.setXfermodeMode(SkXfermode::kSrc_Mode); paint.setAntiAlias(true); paint.setFilterLevel(SkPaint::kLow_FilterLevel); SkRect destRect = SkRect::MakeXYWH(0, 0, srcSize.width, srcSize.height); destCanvas.drawBitmapRectToRect(src, nullptr, destRect, &paint); }
static void paintSkBitmap(PlatformContextSkia* platformContext, const NativeImageSkia& bitmap, const SkIRect& srcRect, const SkRect& destRect, const SkXfermode::Mode& compOp) { #if PLATFORM(CHROMIUM) TRACE_EVENT("paintSkBitmap", platformContext, 0); #endif SkPaint paint; paint.setXfermodeMode(compOp); paint.setAlpha(platformContext->getNormalizedAlpha()); paint.setLooper(platformContext->getDrawLooper()); // only antialias if we're rotated or skewed paint.setAntiAlias(hasNon90rotation(platformContext)); SkCanvas* canvas = platformContext->canvas(); ResamplingMode resampling; if (platformContext->isAccelerated()) resampling = RESAMPLE_LINEAR; else resampling = platformContext->printing() ? RESAMPLE_NONE : computeResamplingMode(platformContext, bitmap, srcRect.width(), srcRect.height(), SkScalarToFloat(destRect.width()), SkScalarToFloat(destRect.height())); if (resampling == RESAMPLE_NONE) { // FIXME: This is to not break tests (it results in the filter bitmap flag // being set to true). We need to decide if we respect RESAMPLE_NONE // being returned from computeResamplingMode. resampling = RESAMPLE_LINEAR; } resampling = limitResamplingMode(platformContext, resampling); paint.setFilterBitmap(resampling == RESAMPLE_LINEAR); if (resampling == RESAMPLE_AWESOME) drawResampledBitmap(*canvas, paint, bitmap, srcRect, destRect); else { // No resampling necessary, we can just draw the bitmap. We want to // filter it if we decided to do linear interpolation above, or if there // is something interesting going on with the matrix (like a rotation). // Note: for serialization, we will want to subset the bitmap first so // we don't send extra pixels. canvas->drawBitmapRect(bitmap.bitmap(), &srcRect, destRect, &paint); } platformContext->didDrawRect(destRect, paint, &bitmap.bitmap()); }
void onDraw(SkCanvas* canvas) override { SkPaint paint; SkPath path; paint.setStyle(SkPaint::Style::kStroke_Style); canvas->translate(5.0f, 5.0f); const SkScalar size = 60.0f; for (int i = 0; i < 2; i++) { paint.setAntiAlias(i == 1); for (int j = 0; j < 4; j++) { SkScalar scale = 4.0f - j; paint.setStrokeWidth(4.0f / scale); canvas->save(); canvas->translate(size / 2.0f, size / 2.0f); canvas->scale(scale, scale); draw_path(size / 2.0f / scale, canvas, paint); canvas->restore(); canvas->save(); canvas->translate(size / 2.0f, 80.0f + size / 2.0f); canvas->scale(scale, scale); canvas->drawCircle(0.0f, 0.0f, size / 2.0f / scale, paint); canvas->restore(); canvas->save(); canvas->translate(0.0f, 160.0f); canvas->scale(scale, scale); canvas->drawRect(SkRect::MakeXYWH(0.0f, 0.0f, size / scale, size / scale), paint); canvas->restore(); canvas->save(); canvas->translate(0.0f, 240.0f); canvas->scale(scale, scale); canvas->drawLine(0.0f, 0.0f, size / scale, size / scale, paint); canvas->restore(); canvas->translate(80.0f, 0.0f); } } }
static SkPaint make_paint() { SkPaint paint; paint.setHinting(make_paint_hinting()); paint.setAntiAlias(make_bool()); paint.setDither(make_bool()); paint.setLinearText(make_bool()); paint.setSubpixelText(make_bool()); paint.setLCDRenderText(make_bool()); paint.setEmbeddedBitmapText(make_bool()); paint.setAutohinted(make_bool()); paint.setVerticalText(make_bool()); paint.setFakeBoldText(make_bool()); paint.setDevKernText(make_bool()); paint.setFilterQuality(make_filter_quality()); paint.setStyle(make_paint_style()); paint.setColor(make_color()); paint.setStrokeWidth(make_scalar()); paint.setStrokeMiter(make_scalar()); paint.setStrokeCap(make_paint_cap()); paint.setStrokeJoin(make_paint_join()); paint.setColorFilter(make_color_filter()); paint.setBlendMode(make_xfermode()); paint.setPathEffect(make_path_effect()); paint.setMaskFilter(make_mask_filter()); if (false) { // our validating buffer does not support typefaces yet, so skip this for now paint.setTypeface(SkTypeface::MakeFromName(make_font_name().c_str(), make_typeface_style())); } paint.setImageFilter(make_image_filter()); sk_sp<SkData> data(make_3Dlut(nullptr, make_bool(), make_bool(), make_bool())); paint.setTextAlign(make_paint_align()); paint.setTextSize(make_scalar()); paint.setTextScaleX(make_scalar()); paint.setTextSkewX(make_scalar()); paint.setTextEncoding(make_paint_text_encoding()); return paint; }
virtual void onDraw(SkCanvas* canvas) { this->drawBG(canvas); canvas->translate(this->width()/2, this->height()/2); Sk3DView view; view.rotateX(fRX); view.rotateY(fRY); view.applyToCanvas(canvas); SkPaint paint; SkScalar rad = SkIntToScalar(50); SkScalar dim = rad*2; if (fShaders.count() > 0) { bool frontFace = view.dotWithNormal(0, 0, SK_Scalar1) < 0; if (frontFace != fFrontFace) { fFrontFace = frontFace; fShaderIndex = (fShaderIndex + 1) % fShaders.count(); } paint.setAntiAlias(true); paint.setShader(fShaders[fShaderIndex]); #if 0 canvas->drawCircle(0, 0, rad, paint); canvas->drawCircle(-dim, -dim, rad, paint); canvas->drawCircle(-dim, dim, rad, paint); canvas->drawCircle( dim, -dim, rad, paint); canvas->drawCircle( dim, dim, rad, paint); #else SkRect r = { -150, -150, 150, 150 }; canvas->drawRoundRect(r, 30, 30, paint); #endif } fRY += SampleCode::GetAnimSecondsDelta() * 90; if (fRY >= SkIntToScalar(360)) { fRY = 0; } this->inval(NULL); }
virtual void onDraw(SkCanvas* canvas) { static const struct { SkColor fColor; const char* fName; SkRegion::Op fOp; } gOps[] = { { SK_ColorBLACK, "Difference", SkRegion::kDifference_Op }, { SK_ColorRED, "Intersect", SkRegion::kIntersect_Op }, { 0xFF008800, "Union", SkRegion::kUnion_Op }, { SK_ColorGREEN, "Rev Diff", SkRegion::kReverseDifference_Op }, { SK_ColorYELLOW, "Replace", SkRegion::kReplace_Op }, { SK_ColorBLUE, "XOR", SkRegion::kXOR_Op }, }; SkPaint textPaint; textPaint.setAntiAlias(true); textPaint.setTextSize(SK_Scalar1*24); int xOff = 0; for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) { canvas->drawText(gOps[op].fName, strlen(gOps[op].fName), SkIntToScalar(75), SkIntToScalar(50), textPaint); if (kAAClip_GeomType == fGeomType) { this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor); } else { this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor); } if (xOff >= 400) { canvas->translate(SkIntToScalar(-400), SkIntToScalar(250)); xOff = 0; } else { canvas->translate(SkIntToScalar(200), 0); xOff += 200; } } }
bool RenderThemeChromiumSkia::paintMenuList(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& rect) { SkCanvas* const canvas = i.context->platformContext()->canvas(); const int right = rect.x() + rect.width(); const int middle = rect.y() + rect.height() / 2; paintButtonLike(this, o, i, rect); SkPaint paint; paint.setARGB(0xff, 0, 0, 0); paint.setAntiAlias(true); paint.setStyle(SkPaint::kFill_Style); SkPath path; path.moveTo(right - 13, middle - 3); path.rLineTo(6, 0); path.rLineTo(-3, 6); path.close(); canvas->drawPath(path, paint); return false; }
static void draw_scene(SkCanvas* canvas, SkScalar pictureSize) { canvas->clear(SK_ColorWHITE); SkPaint paint; paint.setColor(SK_ColorGREEN); paint.setStyle(SkPaint::kFill_Style); paint.setAntiAlias(true); canvas->drawCircle(pictureSize / 4, pictureSize / 4, pictureSize / 4, paint); canvas->drawRect(SkRect::MakeXYWH(pictureSize / 2, pictureSize / 2, pictureSize / 2, pictureSize / 2), paint); paint.setColor(SK_ColorRED); canvas->drawLine(pictureSize / 2, pictureSize * 1 / 3, pictureSize / 2, pictureSize * 2 / 3, paint); canvas->drawLine(pictureSize * 1 / 3, pictureSize / 2, pictureSize * 2 / 3, pictureSize / 2, paint); paint.setColor(SK_ColorBLACK); paint.setStyle(SkPaint::kStroke_Style); canvas->drawRect(SkRect::MakeWH(pictureSize, pictureSize), paint); }
void onDraw(int loops, SkCanvas* canvas) override { SkRandom Random; for (int i = 0; i < loops; i++) { SkScalar blurSigma = Random.nextRangeScalar(1.5f, 25.0f); SkScalar size = Random.nextRangeScalar(20*blurSigma, 50*blurSigma); SkScalar x = Random.nextRangeScalar(0.0f, W - size); SkScalar y = Random.nextRangeScalar(0.0f, H - size); SkRect inner = { x, y, x + size, y + size }; SkRect outer(inner); // outer is always outset either 2x or 4x the blur radius (we go with 2x) outer.outset(2*blurSigma, 2*blurSigma); SkPath p; p.addRect(outer); p.addRect(inner); p.setFillType(SkPath::kEvenOdd_FillType); // This will be used to translate the normal draw outside the // clip rect and translate the blurred version back inside SkScalar translate = 2.0f * size; SkPaint paint; paint.setLooper(this->createLooper(-translate, blurSigma)); paint.setColor(0xff000000 | Random.nextU()); paint.setAntiAlias(true); canvas->save(); // clip always equals inner rect so we get the inside blur canvas->clipRect(inner); canvas->translate(translate, 0); canvas->drawPath(p, paint); canvas->restore(); } }
virtual void onDrawContent(SkCanvas* canvas) { SkPaint paint; paint.setAntiAlias(true); paint.setStrokeWidth(SkIntToScalar(4)); paint.setTextSize(SkIntToScalar(40)); paint.setTextAlign(SkPaint::kCenter_Align); canvas->save(); canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); // translate (1 point) const int src1[] = { 0, 0 }; const int dst1[] = { 5, 5 }; doDraw(canvas, &paint, src1, dst1, 1); canvas->restore(); canvas->save(); canvas->translate(SkIntToScalar(160), SkIntToScalar(10)); // rotate/uniform-scale (2 points) const int src2[] = { 32, 32, 64, 32 }; const int dst2[] = { 32, 32, 64, 48 }; doDraw(canvas, &paint, src2, dst2, 2); canvas->restore(); canvas->save(); canvas->translate(SkIntToScalar(10), SkIntToScalar(110)); // rotate/skew (3 points) const int src3[] = { 0, 0, 64, 0, 0, 64 }; const int dst3[] = { 0, 0, 96, 0, 24, 64 }; doDraw(canvas, &paint, src3, dst3, 3); canvas->restore(); canvas->save(); canvas->translate(SkIntToScalar(160), SkIntToScalar(110)); // perspective (4 points) const int src4[] = { 0, 0, 64, 0, 64, 64, 0, 64 }; const int dst4[] = { 0, 0, 96, 0, 64, 96, 0, 64 }; doDraw(canvas, &paint, src4, dst4, 4); canvas->restore(); }
void drawPath(SkCanvas* canvas, const SkPath& path, SkPaint::Join j) { SkPaint paint; paint.setAntiAlias(true); paint.setStyle(SkPaint::kStroke_Style); paint.setStrokeJoin(j); paint.setStrokeWidth(SkIntToScalar(fStroke)); if (fShowHairline) { SkPath fill; paint.getFillPath(path, &fill); paint.setStrokeWidth(0); canvas->drawPath(fill, paint); } else { canvas->drawPath(path, paint); } paint.setColor(SK_ColorRED); paint.setStrokeWidth(0); canvas->drawPath(path, paint); }
UnitMapperView() { fPts[0].set(0, 0); fPts[1].set(SK_Scalar1 / 3, SK_Scalar1 / 3); fPts[2].set(SK_Scalar1 * 2 / 3, SK_Scalar1 * 2 / 3); fPts[3].set(SK_Scalar1, SK_Scalar1); fMatrix.setScale(SK_Scalar1 * 200, -SK_Scalar1 * 200); fMatrix.postTranslate(SkIntToScalar(100), SkIntToScalar(300)); SkRect r = { SkIntToScalar(350), SkIntToScalar(100), SkIntToScalar(500), SkIntToScalar(130) }; SkPaint paint; paint.setAntiAlias(true); paint.setTextSize(SkIntToScalar(25)); for (int i = 0; i < 4; i++) { fViews[i] = make_textview(this, r, paint); r.offset(0, r.height()); } this->setViews(); }
SkBitmap create_string_bitmap(int w, int h, SkColor c, int x, int y, int textSize, const char* str) { SkBitmap bitmap; bitmap.allocN32Pixels(w, h); SkCanvas canvas(bitmap); SkPaint paint; paint.setAntiAlias(true); sk_tool_utils::set_portable_typeface(&paint); paint.setColor(c); paint.setTextSize(SkIntToScalar(textSize)); canvas.clear(0x00000000); canvas.drawString(str, SkIntToScalar(x), SkIntToScalar(y), paint); // Tag data as sRGB (without doing any color space conversion). Color-space aware configs // will process this correctly but legacy configs will render as if this returned N32. SkBitmap result; result.setInfo(SkImageInfo::MakeS32(w, h, kPremul_SkAlphaType)); result.setPixelRef(sk_ref_sp(bitmap.pixelRef()), 0, 0); return result; }
void drawContent(SkCanvas* canvas) { canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); SkPaint paint; sk_tool_utils::set_portable_typeface(&paint); paint.setColor(0x80F60000); const Proc procs[] = { draw_hair, draw_thick, draw_rect, draw_oval, draw_text }; const SkXfermode::Mode modes[] = { SkXfermode::kSrcOver_Mode, SkXfermode::kSrc_Mode, SkXfermode::kClear_Mode }; const PaintProc paintProcs[] = { identity_paintproc, gradient_paintproc }; for (int aa = 0; aa <= 1; ++aa) { paint.setAntiAlias(SkToBool(aa)); canvas->save(); for (size_t i = 0; i < SK_ARRAY_COUNT(paintProcs); ++i) { paintProcs[i](&paint); for (size_t x = 0; x < SK_ARRAY_COUNT(modes); ++x) { paint.setXfermodeMode(modes[x]); canvas->save(); for (size_t y = 0; y < SK_ARRAY_COUNT(procs); ++y) { procs[y](canvas, paint); canvas->translate(0, H * 5 / 4); } canvas->restore(); canvas->translate(W * 5 / 4, 0); } } canvas->restore(); canvas->translate(0, (H * 5 / 4) * SK_ARRAY_COUNT(procs)); } }
void GM::DrawGpuOnlyMessage(SkCanvas* canvas) { SkBitmap bmp; bmp.allocN32Pixels(128, 64); SkCanvas bmpCanvas(bmp); bmpCanvas.drawColor(SK_ColorWHITE); SkPaint paint; paint.setAntiAlias(true); paint.setTextSize(20); paint.setColor(SK_ColorRED); sk_tool_utils::set_portable_typeface(&paint); static const char kTxt[] = "GPU Only"; bmpCanvas.drawText(kTxt, strlen(kTxt), 20, 40, paint); SkMatrix localM; localM.setRotate(35.f); localM.postTranslate(10.f, 0.f); paint.setShader(SkShader::MakeBitmapShader(bmp, SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, &localM)); paint.setFilterQuality(kMedium_SkFilterQuality); canvas->drawPaint(paint); return; }
/** * Draw a single path element of the clip stack into the accumulation bitmap */ void GrSWMaskHelper::drawShape(const GrShape& shape, const SkMatrix& matrix, SkRegion::Op op, GrAA aa, uint8_t alpha) { SkPaint paint; paint.setPathEffect(shape.style().refPathEffect()); shape.style().strokeRec().applyToPaint(&paint); paint.setAntiAlias(GrAA::kYes == aa); SkMatrix translatedMatrix = matrix; translatedMatrix.postTranslate(fTranslate.fX, fTranslate.fY); fDraw.fMatrix = &translatedMatrix; SkPath path; shape.asPath(&path); if (SkRegion::kReplace_Op == op && 0xFF == alpha) { SkASSERT(0xFF == paint.getAlpha()); fDraw.drawPathCoverage(path, paint); } else { paint.setBlendMode(op_to_mode(op)); paint.setColor(SkColorSetARGB(alpha, alpha, alpha, alpha)); fDraw.drawPath(path, paint); } };
void draw(SkCanvas* canvas) { auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void { if (nullptr == image) { return; } SkPaint paint; paint.setAntiAlias(true); canvas->drawImage(image, 0, 0); canvas->drawString(label, 30, image->height() / 4, paint); canvas->drawString(image->isTextureBacked() ? "is GPU texture" : "not GPU texture", 20, image->height() * 3 / 4, paint); }; sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source)); sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture, kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr)); drawImage(image, "image"); canvas->translate(image->width(), 0); drawImage(bitmapImage, "source"); canvas->translate(-image->width(), image->height()); drawImage(textureImage, "backEndTexture"); }
void draw1x4(SkCanvas* canvas, SkScalar x, SkScalar y) { SkRect rect = { -kHalfSquareSize, -kHalfSquareSize, kHalfSquareSize, kHalfSquareSize }; rect.offset(x, y); SkRect outerClip = { -kHalfOuterClipSize-kHalfSquareSize, -kHalfOuterClipSize-kHalfSquareSize, kHalfOuterClipSize+kHalfSquareSize, kHalfOuterClipSize+kHalfSquareSize }; outerClip.offset(x, y); SkPaint paint; paint.setAntiAlias(true); paint.setLooper(create4Looper(-kOffsetToOutsideClip-kHalfSquareSize, 0)); canvas->save(); canvas->clipRect(outerClip, SkCanvas::kIntersect_Op); canvas->clipRect(rect, SkCanvas::kDifference_Op); rect.offset(SkIntToScalar(kOffsetToOutsideClip+kHalfSquareSize), 0); canvas->drawRect(rect, paint); canvas->restore(); }
static sk_sp<SkImage> MakeImage(const SkVector& vec, SkColor color) { const SkPoint start = SkPoint::Make(vec.y() * kSegLen / 2, vec.x() * kSegLen / 2); const SkPoint end = SkPoint::Make(start.x() + vec.x() * (kSegLen - 1), start.y() + vec.y() * (kSegLen - 1)); SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(kSegLen, kSegLen)); surface->getCanvas()->clear(SK_ColorTRANSPARENT); SkPaint paint; paint.setAntiAlias(true); const SkRect border = SkRect::MakeIWH(kSegLen, kSegLen).makeInset(.5f, .5f); paint.setColor(SK_ColorBLUE); paint.setStyle(SkPaint::kStroke_Style); surface->getCanvas()->drawRect(border, paint); paint.setColor(SK_ColorBLACK); surface->getCanvas()->drawLine(start.x(), start.y(), end.x(), end.y(), paint); surface->getCanvas()->drawPoint(start.x(), start.y(), color); surface->getCanvas()->drawPoint(end.x(), end.y(), color); return surface->makeImageSnapshot(); }
virtual void onDrawContent(SkCanvas* canvas) { SkPaint paint; paint.setAntiAlias(true); paint.setStyle(SkPaint::kStroke_Style); paint.setStrokeWidth(SkIntToScalar(20)); SkPaint hair; hair.setStyle(SkPaint::kStroke_Style); hair.setColor(SK_ColorRED); static const SkISize gSize[] = { { 100, 50 }, { 100, 0 }, { 0, 50 }, { 0, 0 } }; static const SkPaint::Join gJoin[] = { SkPaint::kMiter_Join, SkPaint::kRound_Join, SkPaint::kBevel_Join }; canvas->translate(paint.getStrokeWidth(), paint.getStrokeWidth()); for (size_t i = 0; i < SK_ARRAY_COUNT(gJoin); ++i) { paint.setStrokeJoin(gJoin[i]); canvas->save(); for (size_t j = 0; j < SK_ARRAY_COUNT(gSize); ++j) { SkRect r = SkRect::MakeWH(SkIntToScalar(gSize[j].fWidth), SkIntToScalar(gSize[j].fHeight)); canvas->drawRect(r, paint); canvas->drawRect(r, hair); canvas->translate(0, SkIntToScalar(100)); } canvas->restore(); canvas->translate(SkIntToScalar(150), 0); } }