String SVGPreserveAspectRatio::valueAsString() const { String result; switch ((SVGPreserveAspectRatioType) align()) { default: case SVG_PRESERVEASPECTRATIO_NONE: result = "none"; break; case SVG_PRESERVEASPECTRATIO_XMINYMIN: result = "xMinYMin"; break; case SVG_PRESERVEASPECTRATIO_XMIDYMIN: result = "xMidYMin"; break; case SVG_PRESERVEASPECTRATIO_XMAXYMIN: result = "xMaxYMin"; break; case SVG_PRESERVEASPECTRATIO_XMINYMID: result = "xMinYMid"; break; case SVG_PRESERVEASPECTRATIO_XMIDYMID: result = "xMidYMid"; break; case SVG_PRESERVEASPECTRATIO_XMAXYMID: result = "xMaxYMid"; break; case SVG_PRESERVEASPECTRATIO_XMINYMAX: result = "xMinYMax"; break; case SVG_PRESERVEASPECTRATIO_XMIDYMAX: result = "xMidYMax"; break; case SVG_PRESERVEASPECTRATIO_XMAXYMAX: result = "xMaxYMax"; break; }; switch ((SVGMeetOrSliceType) meetOrSlice()) { default: case SVG_MEETORSLICE_UNKNOWN: break; case SVG_MEETORSLICE_MEET: result += " meet"; break; case SVG_MEETORSLICE_SLICE: result += " slice"; break; }; return result; }
AffineTransform SVGPreserveAspectRatio::getCTM(double logicX, double logicY, double logicWidth, double logicHeight, double /*physX*/, double /*physY*/, double physWidth, double physHeight) { AffineTransform temp; if (align() == SVG_PRESERVEASPECTRATIO_UNKNOWN) return temp; double vpar = logicWidth / logicHeight; double svgar = physWidth / physHeight; if (align() == SVG_PRESERVEASPECTRATIO_NONE) { temp.scale(physWidth / logicWidth, physHeight / logicHeight); temp.translate(-logicX, -logicY); } else if (vpar < svgar && (meetOrSlice() == SVG_MEETORSLICE_MEET) || vpar >= svgar && (meetOrSlice() == SVG_MEETORSLICE_SLICE)) { temp.scale(physHeight / logicHeight, physHeight / logicHeight); if (align() == SVG_PRESERVEASPECTRATIO_XMINYMIN || align() == SVG_PRESERVEASPECTRATIO_XMINYMID || align() == SVG_PRESERVEASPECTRATIO_XMINYMAX) temp.translate(-logicX, -logicY); else if (align() == SVG_PRESERVEASPECTRATIO_XMIDYMIN || align() == SVG_PRESERVEASPECTRATIO_XMIDYMID || align() == SVG_PRESERVEASPECTRATIO_XMIDYMAX) temp.translate(-logicX - (logicWidth - physWidth * logicHeight / physHeight) / 2, -logicY); else temp.translate(-logicX - (logicWidth - physWidth * logicHeight / physHeight), -logicY); } else { temp.scale(physWidth / logicWidth, physWidth / logicWidth); if (align() == SVG_PRESERVEASPECTRATIO_XMINYMIN || align() == SVG_PRESERVEASPECTRATIO_XMIDYMIN || align() == SVG_PRESERVEASPECTRATIO_XMAXYMIN) temp.translate(-logicX, -logicY); else if (align() == SVG_PRESERVEASPECTRATIO_XMINYMID || align() == SVG_PRESERVEASPECTRATIO_XMIDYMID || align() == SVG_PRESERVEASPECTRATIO_XMAXYMID) temp.translate(-logicX, -logicY - (logicHeight - physHeight * logicWidth / physWidth) / 2); else temp.translate(-logicX, -logicY - (logicHeight - physHeight * logicWidth / physWidth)); } return temp; }
void SVGPreserveAspectRatio::transformRect(FloatRect& destRect, FloatRect& srcRect) { FloatSize imageSize = srcRect.size(); float origDestWidth = destRect.width(); float origDestHeight = destRect.height(); if (meetOrSlice() == SVGPreserveAspectRatio::SVG_MEETORSLICE_MEET) { float widthToHeightMultiplier = srcRect.height() / srcRect.width(); if (origDestHeight > (origDestWidth * widthToHeightMultiplier)) { destRect.setHeight(origDestWidth * widthToHeightMultiplier); switch (align()) { case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMINYMID: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMID: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMID: destRect.setY(destRect.y() + origDestHeight / 2.0f - destRect.height() / 2.0f); break; case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMINYMAX: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMAX: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMAX: destRect.setY(destRect.y() + origDestHeight - destRect.height()); break; } } if (origDestWidth > (origDestHeight / widthToHeightMultiplier)) { destRect.setWidth(origDestHeight / widthToHeightMultiplier); switch (align()) { case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMIN: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMID: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMAX: destRect.setX(destRect.x() + origDestWidth / 2.0f - destRect.width() / 2.0f); break; case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMIN: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMID: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMAX: destRect.setX(destRect.x() + origDestWidth - destRect.width()); break; } } } else if (meetOrSlice() == SVGPreserveAspectRatio::SVG_MEETORSLICE_SLICE) { float widthToHeightMultiplier = srcRect.height() / srcRect.width(); // if the destination height is less than the height of the image we'll be drawing if (origDestHeight < (origDestWidth * widthToHeightMultiplier)) { float destToSrcMultiplier = srcRect.width() / destRect.width(); srcRect.setHeight(destRect.height() * destToSrcMultiplier); switch (align()) { case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMINYMID: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMID: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMID: srcRect.setY(destRect.y() + imageSize.height() / 2.0f - srcRect.height() / 2.0f); break; case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMINYMAX: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMAX: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMAX: srcRect.setY(destRect.y() + imageSize.height() - srcRect.height()); break; } } // if the destination width is less than the width of the image we'll be drawing if (origDestWidth < (origDestHeight / widthToHeightMultiplier)) { float destToSrcMultiplier = srcRect.height() / destRect.height(); srcRect.setWidth(destRect.width() * destToSrcMultiplier); switch (align()) { case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMIN: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMID: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMIDYMAX: srcRect.setX(destRect.x() + imageSize.width() / 2.0f - srcRect.width() / 2.0f); break; case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMIN: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMID: case SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_XMAXYMAX: srcRect.setX(destRect.x() + imageSize.width() - srcRect.width()); break; } } } }