|
47 | 47 | #ifndef COMPILING_FOR_10_5 |
48 | 48 | static int ngc = 0; /* The number of graphics contexts in use */ |
49 | 49 |
|
| 50 | +#include <Carbon/Carbon.h> |
50 | 51 |
|
51 | 52 | /* For drawing Unicode strings with ATSUI */ |
52 | 53 | static ATSUStyle style = NULL; |
@@ -2620,7 +2621,7 @@ static CGFloat _get_device_scale(CGContextRef cr) |
2620 | 2621 | #endif |
2621 | 2622 | CFRelease(string); |
2622 | 2623 | } |
2623 | | - if (font == NULL) |
| 2624 | + if (!font) |
2624 | 2625 | { |
2625 | 2626 | PyErr_SetString(PyExc_ValueError, "Could not load font"); |
2626 | 2627 | } |
@@ -2761,11 +2762,13 @@ static CGFloat _get_device_scale(CGContextRef cr) |
2761 | 2762 | const UniChar* text; |
2762 | 2763 | #endif |
2763 | 2764 |
|
2764 | | - CGFloat ascent; |
2765 | | - CGFloat descent; |
2766 | | - double width; |
| 2765 | + float descent; |
| 2766 | + float width; |
| 2767 | + float height; |
| 2768 | + |
2767 | 2769 | CGRect rect; |
2768 | 2770 |
|
| 2771 | + CGPoint point; |
2769 | 2772 | CTFontRef font; |
2770 | 2773 |
|
2771 | 2774 | CGContextRef cr = self->cr; |
@@ -2830,12 +2833,15 @@ static CGFloat _get_device_scale(CGContextRef cr) |
2830 | 2833 | return NULL; |
2831 | 2834 | } |
2832 | 2835 |
|
2833 | | - width = CTLineGetTypographicBounds(line, &ascent, &descent, NULL); |
| 2836 | + point = CGContextGetTextPosition(cr); |
2834 | 2837 | rect = CTLineGetImageBounds(line, cr); |
2835 | | - |
2836 | 2838 | CFRelease(line); |
2837 | 2839 |
|
2838 | | - return Py_BuildValue("fff", width, rect.size.height, descent); |
| 2840 | + width = rect.size.width; |
| 2841 | + height = rect.size.height; |
| 2842 | + descent = point.y - rect.origin.y; |
| 2843 | + |
| 2844 | + return Py_BuildValue("fff", width, height, descent); |
2839 | 2845 | } |
2840 | 2846 |
|
2841 | 2847 | #else // Text drawing for OSX versions <10.5 |
@@ -2948,6 +2954,7 @@ static CGFloat _get_device_scale(CGContextRef cr) |
2948 | 2954 | const char* italic; |
2949 | 2955 |
|
2950 | 2956 | ATSFontRef atsfont; |
| 2957 | + Rect rect; |
2951 | 2958 |
|
2952 | 2959 | CGContextRef cr = self->cr; |
2953 | 2960 | if (!cr) |
@@ -3016,23 +3023,20 @@ static CGFloat _get_device_scale(CGContextRef cr) |
3016 | 3023 | return NULL; |
3017 | 3024 | } |
3018 | 3025 |
|
3019 | | - ATSUTextMeasurement before; |
3020 | | - ATSUTextMeasurement after; |
3021 | | - ATSUTextMeasurement ascent; |
3022 | | - ATSUTextMeasurement descent; |
3023 | | - status = ATSUGetUnjustifiedBounds(layout, |
3024 | | - kATSUFromTextBeginning, kATSUToTextEnd, |
3025 | | - &before, &after, &ascent, &descent); |
| 3026 | + status = ATSUMeasureTextImage(layout, |
| 3027 | + kATSUFromTextBeginning, kATSUToTextEnd, |
| 3028 | + 0, 0, &rect); |
3026 | 3029 | if (status!=noErr) |
3027 | 3030 | { |
3028 | | - PyErr_SetString(PyExc_RuntimeError, "ATSUGetUnjustifiedBounds failed"); |
| 3031 | + PyErr_SetString(PyExc_RuntimeError, "ATSUMeasureTextImage failed"); |
3029 | 3032 | return NULL; |
3030 | 3033 | } |
3031 | 3034 |
|
3032 | | - const float width = FixedToFloat(after-before); |
3033 | | - const float height = FixedToFloat(ascent-descent); |
| 3035 | + const float width = rect.right-rect.left; |
| 3036 | + const float height = rect.bottom-rect.top; |
| 3037 | + const float descent = rect.bottom; |
3034 | 3038 |
|
3035 | | - return Py_BuildValue("fff", width, height, FixedToFloat(descent)); |
| 3039 | + return Py_BuildValue("fff", width, height, descent); |
3036 | 3040 | } |
3037 | 3041 | #endif |
3038 | 3042 |
|
|
0 commit comments