Index: base/gfx/platform_device_mac.cc |
=================================================================== |
--- base/gfx/platform_device_mac.cc (revision 2768) |
+++ base/gfx/platform_device_mac.cc (working copy) |
@@ -97,37 +97,32 @@ |
// static |
void PlatformDeviceMac::LoadTransformToCGContext(CGContextRef context, |
const SkMatrix& matrix) { |
- // TODO: CoreGraphics can concatenate transforms, but not reset the current |
- // one. Either find a workaround or remove this function if it turns out |
- // to be unneeded on the Mac. |
- // For now, just load the translation. |
+ // CoreGraphics can concatenate transforms, but not reset the current one. |
+ // So in order to get the required behavior here, we need to first make |
+ // the current transformation matrix identity and only then load the new one. |
- // First reset the Transforms. |
- // TODO(playmobil): no need to call CGContextTranslateCTM() twice |
- // just add up the numbers and call through. |
- CGAffineTransform orig_transform = CGContextGetCTM(context); |
- CGContextTranslateCTM(context, |
- -orig_transform.tx, |
- orig_transform.ty); // y axis is flipped. |
- |
- // TODO(playmobil): remove debug code. |
- // CGAffineTransform temp_transform = CGContextGetCTM(context); |
+ // Reset matrix to identity. |
+ CGAffineTransform orig_cg_matrix = CGContextGetCTM(context); |
+ CGAffineTransform orig_cg_matrix_inv = CGAffineTransformInvert(orig_cg_matrix); |
+ CGContextConcatCTM(context, orig_cg_matrix_inv); |
- // Now set the new transform. |
- int tx = matrix.getTranslateX(); |
- int ty = -matrix.getTranslateY(); |
- int height = CGBitmapContextGetHeight(context); |
- CGContextTranslateCTM(context, |
- tx, |
- -(ty+height)); |
- CGAffineTransform new_transform = CGContextGetCTM(context); |
-// TODO(playmobil): remove debug code. |
-// printf("tx_matrix (%lf,%lf)->(%lf,%lf)->(%lf,%lf) (%d, %d) height=%d\n", orig_transform.tx, |
-// orig_transform.ty, |
-// foo_transform.tx, |
-// foo_transform.ty, |
-// new_transform.tx, |
-// new_transform.ty, tx, ty, height); |
+ // assert that we have indeed returned to the identity Matrix. |
+ DCHECK(CGAffineTransformIsIdentity(CGContextGetCTM(context))); |
+ |
+ // Convert xform to CG-land. |
+ // Our coordinate system is flipped to match WebKit's so we need to modify |
+ // the xform to match that. |
+ SkMatrix transformed_matrix = matrix; |
+ SkScalar sy = matrix.getScaleY() * (SkScalar)-1; |
+ transformed_matrix.setScaleY(sy); |
+ size_t height = CGBitmapContextGetHeight(context); |
+ SkScalar ty = -matrix.getTranslateY(); // y axis is flipped. |
+ transformed_matrix.setTranslateY(ty + (SkScalar)height); |
+ |
+ CGAffineTransform cg_matrix = SkMatrixToCGAffineTransform(transformed_matrix); |
+ |
+ // Load final transform into context. |
+ CGContextConcatCTM(context, cg_matrix); |
} |
// static |
@@ -147,9 +142,6 @@ |
transformation.mapRect(&rect); |
SkIRect irect; |
rect.round(&irect); |
-// TODO(playmobil): remove debug code. |
-// printf("Clipping to (%d,%d) (%d,%d)\n", irect.fLeft, irect.fTop, |
-// irect.fRight, irect.fBottom); |
CGContextClipToRect(context, SkIRectToCGRect(irect)); |
} else { |
// It is complex. |