OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "skia/ext/bitmap_platform_device_mac.h" | 5 #include "skia/ext/bitmap_platform_device_mac.h" |
6 | 6 |
7 #include "skia/ext/skia_utils_mac.h" | 7 #include "skia/ext/skia_utils_mac.h" |
8 #include "third_party/skia/include/core/SkMatrix.h" | 8 #include "third_party/skia/include/core/SkMatrix.h" |
9 #include "third_party/skia/include/core/SkPath.h" | 9 #include "third_party/skia/include/core/SkPath.h" |
10 #include "third_party/skia/include/core/SkTypes.h" | 10 #include "third_party/skia/include/core/SkTypes.h" |
11 #include "third_party/skia/include/core/SkUtils.h" | 11 #include "third_party/skia/include/core/SkUtils.h" |
12 | 12 |
13 namespace skia { | 13 namespace skia { |
14 | 14 |
15 // TODO(brettw) remove this when the gfx namespaces are all removed. | |
16 using namespace gfx; | |
17 | |
18 namespace { | 15 namespace { |
19 | 16 |
20 // Constrains position and size to fit within available_size. | 17 // Constrains position and size to fit within available_size. |
21 bool constrain(int available_size, int* position, int *size) { | 18 bool constrain(int available_size, int* position, int *size) { |
22 if (*position < 0) { | 19 if (*position < 0) { |
23 *size += *position; | 20 *size += *position; |
24 *position = 0; | 21 *position = 0; |
25 } | 22 } |
26 if (*size > 0 && *position < available_size) { | 23 if (*size > 0 && *position < available_size) { |
27 int overflow = (*position + *size) - available_size; | 24 int overflow = (*position + *size) - available_size; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 | 86 |
90 // static | 87 // static |
91 void PlatformDevice::LoadTransformToCGContext(CGContextRef context, | 88 void PlatformDevice::LoadTransformToCGContext(CGContextRef context, |
92 const SkMatrix& matrix) { | 89 const SkMatrix& matrix) { |
93 // CoreGraphics can concatenate transforms, but not reset the current one. | 90 // CoreGraphics can concatenate transforms, but not reset the current one. |
94 // So in order to get the required behavior here, we need to first make | 91 // So in order to get the required behavior here, we need to first make |
95 // the current transformation matrix identity and only then load the new one. | 92 // the current transformation matrix identity and only then load the new one. |
96 | 93 |
97 // Reset matrix to identity. | 94 // Reset matrix to identity. |
98 CGAffineTransform orig_cg_matrix = CGContextGetCTM(context); | 95 CGAffineTransform orig_cg_matrix = CGContextGetCTM(context); |
99 CGAffineTransform orig_cg_matrix_inv = CGAffineTransformInvert(orig_cg_matrix)
; | 96 CGAffineTransform orig_cg_matrix_inv = CGAffineTransformInvert( |
| 97 orig_cg_matrix); |
100 CGContextConcatCTM(context, orig_cg_matrix_inv); | 98 CGContextConcatCTM(context, orig_cg_matrix_inv); |
101 | 99 |
102 // assert that we have indeed returned to the identity Matrix. | 100 // assert that we have indeed returned to the identity Matrix. |
103 SkASSERT(CGAffineTransformIsIdentity(CGContextGetCTM(context))); | 101 SkASSERT(CGAffineTransformIsIdentity(CGContextGetCTM(context))); |
104 | 102 |
105 // Convert xform to CG-land. | 103 // Convert xform to CG-land. |
106 // Our coordinate system is flipped to match WebKit's so we need to modify | 104 // Our coordinate system is flipped to match WebKit's so we need to modify |
107 // the xform to match that. | 105 // the xform to match that. |
108 SkMatrix transformed_matrix = matrix; | 106 SkMatrix transformed_matrix = matrix; |
109 SkScalar sy = matrix.getScaleY() * (SkScalar)-1; | 107 SkScalar sy = matrix.getScaleY() * (SkScalar)-1; |
110 transformed_matrix.setScaleY(sy); | 108 transformed_matrix.setScaleY(sy); |
111 size_t height = CGBitmapContextGetHeight(context); | 109 size_t height = CGBitmapContextGetHeight(context); |
112 SkScalar ty = -matrix.getTranslateY(); // y axis is flipped. | 110 SkScalar ty = -matrix.getTranslateY(); // y axis is flipped. |
113 transformed_matrix.setTranslateY(ty + (SkScalar)height); | 111 transformed_matrix.setTranslateY(ty + (SkScalar)height); |
114 | 112 |
115 CGAffineTransform cg_matrix = SkMatrixToCGAffineTransform(transformed_matrix); | 113 CGAffineTransform cg_matrix = gfx::SkMatrixToCGAffineTransform( |
| 114 transformed_matrix); |
116 | 115 |
117 // Load final transform into context. | 116 // Load final transform into context. |
118 CGContextConcatCTM(context, cg_matrix); | 117 CGContextConcatCTM(context, cg_matrix); |
119 } | 118 } |
120 | 119 |
121 // static | 120 // static |
122 void PlatformDevice::LoadClippingRegionToCGContext( | 121 void PlatformDevice::LoadClippingRegionToCGContext( |
123 CGContextRef context, | 122 CGContextRef context, |
124 const SkRegion& region, | 123 const SkRegion& region, |
125 const SkMatrix& transformation) { | 124 const SkMatrix& transformation) { |
126 if (region.isEmpty()) { | 125 if (region.isEmpty()) { |
127 // region can be empty, in which case everything will be clipped. | 126 // region can be empty, in which case everything will be clipped. |
128 SkRect rect; | 127 SkRect rect; |
129 rect.setEmpty(); | 128 rect.setEmpty(); |
130 CGContextClipToRect(context, SkRectToCGRect(rect)); | 129 CGContextClipToRect(context, gfx::SkRectToCGRect(rect)); |
131 } else if (region.isRect()) { | 130 } else if (region.isRect()) { |
132 // Do the transformation. | 131 // Do the transformation. |
133 SkRect rect; | 132 SkRect rect; |
134 rect.set(region.getBounds()); | 133 rect.set(region.getBounds()); |
135 transformation.mapRect(&rect); | 134 transformation.mapRect(&rect); |
136 SkIRect irect; | 135 SkIRect irect; |
137 rect.round(&irect); | 136 rect.round(&irect); |
138 CGContextClipToRect(context, SkIRectToCGRect(irect)); | 137 CGContextClipToRect(context, gfx::SkIRectToCGRect(irect)); |
139 } else { | 138 } else { |
140 // It is complex. | 139 // It is complex. |
141 SkPath path; | 140 SkPath path; |
142 region.getBoundaryPath(&path); | 141 region.getBoundaryPath(&path); |
143 // Clip. Note that windows clipping regions are not affected by the | 142 // Clip. Note that windows clipping regions are not affected by the |
144 // transform so apply it manually. | 143 // transform so apply it manually. |
145 path.transform(transformation); | 144 path.transform(transformation); |
146 // TODO(playmobil): Implement. | 145 // TODO(playmobil): Implement. |
147 SkASSERT(false); | 146 SkASSERT(false); |
148 // LoadPathToDC(context, path); | 147 // LoadPathToDC(context, path); |
149 // hrgn = PathToRegion(context); | 148 // hrgn = PathToRegion(context); |
150 } | 149 } |
151 } | 150 } |
152 | 151 |
153 } // namespace skia | 152 } // namespace skia |
154 | 153 |
OLD | NEW |