SkUnitScalar SkPoint3D::normalize(SkUnit3D* unit) const { #ifdef SK_SCALAR_IS_FLOAT float mag = sk_float_sqrt(fX*fX + fY*fY + fZ*fZ); if (mag) { float scale = 1.0f / mag; unit->fX = fX * scale; unit->fY = fY * scale; unit->fZ = fZ * scale; } #else Sk64 tmp1, tmp2; tmp1.setMul(fX, fX); tmp2.setMul(fY, fY); tmp1.add(tmp2); tmp2.setMul(fZ, fZ); tmp1.add(tmp2); SkFixed mag = tmp1.getSqrt(); if (mag) { // what if mag < SK_Fixed1 ??? we will underflow the fixdiv SkFixed scale = SkFixedDiv(SK_Fract1, mag); unit->fX = SkFixedMul(fX, scale); unit->fY = SkFixedMul(fY, scale); unit->fZ = SkFixedMul(fZ, scale); } #endif return mag; }
void SkProgressView::onDraw(SkCanvas* canvas) { if (fMax == 0) return; SkFixed percent; if (fInterp) { SkScalar x; if (fInterp->timeToValues(SkTime::GetMSecs(), &x) == SkInterpolator::kFreezeEnd_Result) { delete fInterp; fInterp = NULL; } percent = (SkFixed)x; // now its 16.8 percent = SkMax32(0, SkMin32(percent, fMax << 8)); // now its pinned percent = SkFixedDiv(percent, fMax << 8); // now its 0.16 this->inval(NULL); } else { U16CPU value = SkMax32(0, SkMin32(fValue, fMax)); percent = SkFixedDiv(value, fMax); } SkRect r; SkPaint p; r.set(0, 0, this->width(), this->height()); p.setAntiAlias(true); r.fRight = r.fLeft + SkScalarMul(r.width(), SkFixedToScalar(percent)); p.setStyle(SkPaint::kFill_Style); p.setColor(SK_ColorDKGRAY); p.setShader(fOnShader); canvas->drawRect(r, p); p.setColor(SK_ColorWHITE); p.setShader(fOffShader); r.fLeft = r.fRight; r.fRight = this->width() - SK_Scalar1; if (r.width() > 0) canvas->drawRect(r, p); }
static inline SkFixed quickSkFDot6Div(SkFDot6 a, SkFDot6 b) { if (SkAbs32(b) < kInverseTableSize) { SkASSERT((int64_t)a * QuickFDot6Inverse::Lookup(b) <= SK_MaxS32); SkFixed ourAnswer = (a * QuickFDot6Inverse::Lookup(b)) >> 6; #ifdef SK_DEBUG SkFixed directAnswer = SkFDot6Div(a, b); SkASSERT( (directAnswer == 0 && ourAnswer == 0) || SkFixedDiv(SkAbs32(directAnswer - ourAnswer), SkAbs32(directAnswer)) <= 1 << 10 ); #endif return ourAnswer; } else {
void SkSliderView::onDraw(SkCanvas* canvas) { this->INHERITED::onDraw(canvas); U16CPU value = SkMax32(0, SkMin32(fValue, fMax)); SkRect r; SkPaint p; r.set(0, 0, this->width(), this->height()); p.setAntiAliasOn(true); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1); r.inset(SK_Scalar1/2, SK_Scalar1/2); canvas->drawRect(r, p); if (fMax) { SkFixed percent = SkFixedDiv(value, fMax); r.inset(SK_Scalar1/2, SK_Scalar1/2); r.fRight = r.fLeft + SkScalarMul(r.width(), SkFixedToScalar(percent)); p.setStyle(SkPaint::kFill_Style); setgrad(&p, r); canvas->drawRect(r, p); } #if 0 r.set(0, 0, this->width(), this->height()); r.inset(SK_Scalar1, SK_Scalar1); r.inset(r.width()/2, 0); p.setColor(SK_ColorBLACK); canvas->drawLine(*(SkPoint*)&r.fLeft, *(SkPoint*)&r.fRight, p); #endif }