static void center_of_mass(const SegmentArray& segments, SkPoint* c) { SkScalar area = 0; SkPoint center = {0, 0}; int count = segments.count(); SkPoint p0 = {0, 0}; if (count > 2) { // We translate the polygon so that the first point is at the origin. // This avoids some precision issues with small area polygons far away // from the origin. p0 = segments[0].endPt(); SkPoint pi; SkPoint pj; // the first and last iteration of the below loop would compute // zeros since the starting / ending point is (0,0). So instead we start // at i=1 and make the last iteration i=count-2. pj = segments[1].endPt() - p0; for (int i = 1; i < count - 1; ++i) { pi = pj; pj = segments[i + 1].endPt() - p0; SkScalar t = SkPoint::CrossProduct(pi, pj); area += t; center.fX += (pi.fX + pj.fX) * t; center.fY += (pi.fY + pj.fY) * t; } } // If the poly has no area then we instead return the average of // its points. if (SkScalarNearlyZero(area)) { SkPoint avg; avg.set(0, 0); for (int i = 0; i < count; ++i) { const SkPoint& pt = segments[i].endPt(); avg.fX += pt.fX; avg.fY += pt.fY; } SkScalar denom = SK_Scalar1 / count; avg.scale(denom); *c = avg; } else { area *= 3; area = SkScalarInvert(area); center.scale(area); // undo the translate of p0 to the origin. *c = center + p0; } SkASSERT(!SkScalarIsNaN(c->fX) && !SkScalarIsNaN(c->fY)); }
void updateDom() { const SkPoint corner = pos - SkPoint::Make(size.width() / 2, size.height() / 2); update_pos(objectNode, corner); // Simulate parallax shadow for a centered light source. SkPoint shadowOffset = pos - SkPoint::Make(kBounds.centerX(), kBounds.centerY()); shadowOffset.scale(kShadowParallax); const SkPoint shadowCorner = corner + shadowOffset; update_pos(shadowNode, shadowCorner); }
void updateDom() { const SkPoint corner = pos - SkPoint::Make(size.width() / 2, size.height() / 2); objectNode->setX(SkSVGLength(corner.x())); objectNode->setY(SkSVGLength(corner.y())); // Simulate parallax shadow for a centered light source. SkPoint shadowOffset = pos - SkPoint::Make(kBounds.centerX(), kBounds.centerY()); shadowOffset.scale(kShadowParallax); const SkPoint shadowCorner = corner + shadowOffset; shadowNode->setX(SkSVGLength(shadowCorner.x())); shadowNode->setY(SkSVGLength(shadowCorner.y())); }