OvalTestView() { fSize.set(SK_Scalar1, SK_Scalar1); fBitmap.setConfig(SkBitmap::kARGB_8888_Config, kILimit, kILimit); fBitmap.allocPixels(); fInsideColor = SkPreMultiplyColor(SK_ColorRED); fOutsideColor = SkPreMultiplyColor(SK_ColorGREEN); }
FilterQualityView() : fImage(make_image()), fTrans(2, 2), fShowFatBits(true) { fCell.set(256, 256); fScale.set(1, SK_Scalar1 / 8, 1); fAngle.setMod(0, 360); SkScalar values[2]; fTrans.setMirror(true); fTrans.setReset(true); fCurrTime = 0; fTrans.setRepeatCount(999); values[0] = values[1] = 0; fTrans.setKeyFrame(0, fCurrTime, values); values[0] = values[1] = 1; fTrans.setKeyFrame(1, fCurrTime + 2000, values); }
void onDrawContent(SkCanvas* canvas) override { fCell.set(this->height() / 2, this->height() / 2); SkScalar trans[2]; fTrans.timeToValues(fCurrTime, trans); for (int y = 0; y < 2; ++y) { for (int x = 0; x < 2; ++x) { int index = y * 2 + x; SkAutoCanvasRestore acr(canvas, true); canvas->translate(fCell.width() * x, fCell.height() * y); SkRect r = SkRect::MakeWH(fCell.width(), fCell.height()); r.inset(4, 4); canvas->clipRect(r); this->drawHere(canvas, SkFilterQuality(index), trans[0], trans[1]); } } this->drawBorders(canvas); const SkScalar textX = fCell.width() * 2 + 30; SkPaint paint; paint.setAntiAlias(true); paint.setTextSize(36); SkString str; str.appendScalar(fScale); canvas->drawText(str.c_str(), str.size(), textX, 100, paint); str.reset(); str.appendScalar(fAngle); canvas->drawText(str.c_str(), str.size(), textX, 150, paint); str.reset(); str.appendScalar(trans[0]); canvas->drawText(str.c_str(), str.size(), textX, 200, paint); str.reset(); str.appendScalar(trans[1]); canvas->drawText(str.c_str(), str.size(), textX, 250, paint); }
SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatrix* localM) const { SkASSERT(fPicture && !fPicture->cullRect().isEmpty()); SkMatrix m; m.setConcat(matrix, this->getLocalMatrix()); if (localM) { m.preConcat(*localM); } // Use a rotation-invariant scale SkPoint scale; if (!SkDecomposeUpper2x2(m, NULL, &scale, NULL)) { // Decomposition failed, use an approximation. scale.set(SkScalarSqrt(m.getScaleX() * m.getScaleX() + m.getSkewX() * m.getSkewX()), SkScalarSqrt(m.getScaleY() * m.getScaleY() + m.getSkewY() * m.getSkewY())); } SkSize scaledSize = SkSize::Make(scale.x() * fTile.width(), scale.y() * fTile.height()); // Clamp the tile size to about 16M pixels static const SkScalar kMaxTileArea = 4096 * 4096; SkScalar tileArea = SkScalarMul(scaledSize.width(), scaledSize.height()); if (tileArea > kMaxTileArea) { SkScalar clampScale = SkScalarSqrt(SkScalarDiv(kMaxTileArea, tileArea)); scaledSize.set(SkScalarMul(scaledSize.width(), clampScale), SkScalarMul(scaledSize.height(), clampScale)); } SkISize tileSize = scaledSize.toRound(); if (tileSize.isEmpty()) { return NULL; } // The actual scale, compensating for rounding & clamping. SkSize tileScale = SkSize::Make(SkIntToScalar(tileSize.width()) / fTile.width(), SkIntToScalar(tileSize.height()) / fTile.height()); SkAutoMutexAcquire ama(fCachedBitmapShaderMutex); if (!fCachedBitmapShader || tileScale != fCachedTileScale) { SkBitmap bm; if (!bm.tryAllocN32Pixels(tileSize.width(), tileSize.height())) { return NULL; } bm.eraseColor(SK_ColorTRANSPARENT); SkCanvas canvas(bm); canvas.scale(tileScale.width(), tileScale.height()); canvas.translate(fTile.x(), fTile.y()); canvas.drawPicture(fPicture); fCachedTileScale = tileScale; SkMatrix shaderMatrix = this->getLocalMatrix(); shaderMatrix.preScale(1 / tileScale.width(), 1 / tileScale.height()); fCachedBitmapShader.reset(CreateBitmapShader(bm, fTmx, fTmy, &shaderMatrix)); } // Increment the ref counter inside the mutex to ensure the returned pointer is still valid. // Otherwise, the pointer may have been overwritten on a different thread before the object's // ref count was incremented. fCachedBitmapShader.get()->ref(); return fCachedBitmapShader; }
ImageGM() { fBufferSize = RB * H; fBuffer = sk_malloc_throw(fBufferSize); fSize.set(SkIntToScalar(W), SkIntToScalar(H)); }