void CanvasRenderingContext2D::putImageData(ImageData* data, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight, ExceptionCode& ec) { if (!data) { ec = TYPE_MISMATCH_ERR; return; } if (!isfinite(dx) || !isfinite(dy) || !isfinite(dirtyX) || !isfinite(dirtyY) || !isfinite(dirtyWidth) || !isfinite(dirtyHeight)) { ec = INDEX_SIZE_ERR; return; } ImageBuffer* buffer = m_canvas ? m_canvas->buffer() : 0; if (!buffer) return; if (dirtyWidth < 0) { dirtyX += dirtyWidth; dirtyWidth = -dirtyWidth; } if (dirtyHeight < 0) { dirtyY += dirtyHeight; dirtyHeight = -dirtyHeight; } FloatRect clipRect(dirtyX, dirtyY, dirtyWidth, dirtyHeight); clipRect.intersect(IntRect(0, 0, data->width(), data->height())); IntSize destOffset(static_cast<int>(dx), static_cast<int>(dy)); IntRect sourceRect = enclosingIntRect(clipRect); sourceRect.move(destOffset); sourceRect.intersect(IntRect(IntPoint(), buffer->size())); if (sourceRect.isEmpty()) return; willDraw(sourceRect); sourceRect.move(-destOffset); IntPoint destPoint(destOffset.width(), destOffset.height()); buffer->putImageData(data, sourceRect, destPoint); }
float distance() const { if (!valid()) return 0.0; return (destPoint() - sourcePoint()).norm(); }
gex::Point2 dir() const { if (!valid()) gex::Point2(0.0,0.0); return (destPoint() - sourcePoint()).normalized(); }