augmenting fix in 8700 and 8701, be careful NOT to "sort" the result of mapRect

when we only want to proceed if the matrix is nearly identity. Hence we manually
apply the matrix to the two "points" of the rect.



git-svn-id: http://skia.googlecode.com/svn/trunk@8743 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2013-04-18 15:37:14 +00:00
parent ee056a82ae
commit f707adc4f8
2 changed files with 19 additions and 1 deletions

View File

@ -15,6 +15,13 @@ static void make_bm(SkBitmap* bm) {
SkCanvas canvas(*bm);
SkPaint paint;
SkPath path;
path.moveTo(6, 6);
path.lineTo(6, 54);
path.lineTo(30, 54);
canvas.drawPath(path, paint);
paint.setStyle(SkPaint::kStroke_Style);
canvas.drawRect(SkRect::MakeLTRB(0.5f, 0.5f, 59.5f, 59.5f), paint);
}
@ -34,8 +41,13 @@ static void test_bitmaprect(SkCanvas* canvas) {
canvas->drawBitmap(bm, 150, 45, NULL);
SkScalar scale = 0.472560018f;
canvas->save();
canvas->scale(scale, scale);
canvas->drawBitmapRectToRect(bm, NULL, SkRect::MakeXYWH(100, 100, 128, 128), NULL);
canvas->restore();
canvas->scale(-1, 1);
canvas->drawBitmap(bm, -310, 45, NULL);
}
class BitmapRectTestGM : public skiagm::GM {

View File

@ -45,7 +45,13 @@ static bool just_trans_clamp(const SkMatrix& matrix, const SkBitmap& bitmap) {
if (matrix.getType() & SkMatrix::kScale_Mask) {
SkRect src, dst;
bitmap.getBounds(&src);
matrix.mapRect(&dst, src);
// Can't call mapRect(), since that will fix up inverted rectangles,
// e.g. when scale is negative, and we don't want to return true for
// those.
matrix.mapPoints(SkTCast<SkPoint*>(&dst),
SkTCast<const SkPoint*>(&src),
2);
// Now round all 4 edges to device space, and then compare the device
// width/height to the original. Note: we must map all 4 and subtract