| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/gfx/render_text_mac.h" | 5 #include "ui/gfx/render_text_mac.h" |
| 6 | 6 |
| 7 #include <ApplicationServices/ApplicationServices.h> | 7 #include <ApplicationServices/ApplicationServices.h> |
| 8 | 8 |
| 9 #include <cmath> | 9 #include <cmath> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 runs_valid_ = false; | 100 runs_valid_ = false; |
| 101 } | 101 } |
| 102 | 102 |
| 103 void RenderTextMac::EnsureLayout() { | 103 void RenderTextMac::EnsureLayout() { |
| 104 if (line_.get()) | 104 if (line_.get()) |
| 105 return; | 105 return; |
| 106 runs_.clear(); | 106 runs_.clear(); |
| 107 runs_valid_ = false; | 107 runs_valid_ = false; |
| 108 | 108 |
| 109 const Font& font = GetFont(); | 109 const Font& font = GetFont(); |
| 110 base::mac::ScopedCFTypeRef<CFStringRef> font_name_cf_string( | 110 base::ScopedCFTypeRef<CFStringRef> font_name_cf_string( |
| 111 base::SysUTF8ToCFStringRef(font.GetFontName())); | 111 base::SysUTF8ToCFStringRef(font.GetFontName())); |
| 112 base::mac::ScopedCFTypeRef<CTFontRef> ct_font( | 112 base::ScopedCFTypeRef<CTFontRef> ct_font( |
| 113 CTFontCreateWithName(font_name_cf_string, font.GetFontSize(), NULL)); | 113 CTFontCreateWithName(font_name_cf_string, font.GetFontSize(), NULL)); |
| 114 | 114 |
| 115 const void* keys[] = { kCTFontAttributeName }; | 115 const void* keys[] = { kCTFontAttributeName }; |
| 116 const void* values[] = { ct_font }; | 116 const void* values[] = { ct_font }; |
| 117 base::mac::ScopedCFTypeRef<CFDictionaryRef> attributes( | 117 base::ScopedCFTypeRef<CFDictionaryRef> attributes( |
| 118 CFDictionaryCreate(NULL, keys, values, arraysize(keys), NULL, | 118 CFDictionaryCreate(NULL, |
| 119 keys, |
| 120 values, |
| 121 arraysize(keys), |
| 122 NULL, |
| 119 &kCFTypeDictionaryValueCallBacks)); | 123 &kCFTypeDictionaryValueCallBacks)); |
| 120 | 124 |
| 121 base::mac::ScopedCFTypeRef<CFStringRef> cf_text( | 125 base::ScopedCFTypeRef<CFStringRef> cf_text( |
| 122 base::SysUTF16ToCFStringRef(text())); | 126 base::SysUTF16ToCFStringRef(text())); |
| 123 base::mac::ScopedCFTypeRef<CFAttributedStringRef> attr_text( | 127 base::ScopedCFTypeRef<CFAttributedStringRef> attr_text( |
| 124 CFAttributedStringCreate(NULL, cf_text, attributes)); | 128 CFAttributedStringCreate(NULL, cf_text, attributes)); |
| 125 base::mac::ScopedCFTypeRef<CFMutableAttributedStringRef> attr_text_mutable( | 129 base::ScopedCFTypeRef<CFMutableAttributedStringRef> attr_text_mutable( |
| 126 CFAttributedStringCreateMutableCopy(NULL, 0, attr_text)); | 130 CFAttributedStringCreateMutableCopy(NULL, 0, attr_text)); |
| 127 | 131 |
| 128 // TODO(asvitkine|msw): Respect GetTextDirection(), which may not match the | 132 // TODO(asvitkine|msw): Respect GetTextDirection(), which may not match the |
| 129 // natural text direction. See kCTTypesetterOptionForcedEmbeddingLevel, etc. | 133 // natural text direction. See kCTTypesetterOptionForcedEmbeddingLevel, etc. |
| 130 | 134 |
| 131 ApplyStyles(attr_text_mutable, ct_font); | 135 ApplyStyles(attr_text_mutable, ct_font); |
| 132 line_.reset(CTLineCreateWithAttributedString(attr_text_mutable)); | 136 line_.reset(CTLineCreateWithAttributedString(attr_text_mutable)); |
| 133 | 137 |
| 134 CGFloat ascent = 0; | 138 CGFloat ascent = 0; |
| 135 CGFloat descent = 0; | 139 CGFloat descent = 0; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 // attribute objects do not leak, they are saved to |attributes_|. | 190 // attribute objects do not leak, they are saved to |attributes_|. |
| 187 // Clear the attributes storage. | 191 // Clear the attributes storage. |
| 188 attributes_.reset(CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks)); | 192 attributes_.reset(CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks)); |
| 189 | 193 |
| 190 // https://developer.apple.com/library/mac/#documentation/Carbon/Reference/Cor
eText_StringAttributes_Ref/Reference/reference.html | 194 // https://developer.apple.com/library/mac/#documentation/Carbon/Reference/Cor
eText_StringAttributes_Ref/Reference/reference.html |
| 191 internal::StyleIterator style(colors(), styles()); | 195 internal::StyleIterator style(colors(), styles()); |
| 192 const size_t layout_text_length = GetLayoutText().length(); | 196 const size_t layout_text_length = GetLayoutText().length(); |
| 193 for (size_t i = 0, end = 0; i < layout_text_length; i = end) { | 197 for (size_t i = 0, end = 0; i < layout_text_length; i = end) { |
| 194 end = TextIndexToLayoutIndex(style.GetRange().end()); | 198 end = TextIndexToLayoutIndex(style.GetRange().end()); |
| 195 const CFRange range = CFRangeMake(i, end - i); | 199 const CFRange range = CFRangeMake(i, end - i); |
| 196 base::mac::ScopedCFTypeRef<CGColorRef> foreground( | 200 base::ScopedCFTypeRef<CGColorRef> foreground( |
| 197 gfx::CGColorCreateFromSkColor(style.color())); | 201 gfx::CGColorCreateFromSkColor(style.color())); |
| 198 CFAttributedStringSetAttribute(attr_string, range, | 202 CFAttributedStringSetAttribute(attr_string, range, |
| 199 kCTForegroundColorAttributeName, foreground); | 203 kCTForegroundColorAttributeName, foreground); |
| 200 CFArrayAppendValue(attributes_, foreground); | 204 CFArrayAppendValue(attributes_, foreground); |
| 201 | 205 |
| 202 if (style.style(UNDERLINE)) { | 206 if (style.style(UNDERLINE)) { |
| 203 CTUnderlineStyle value = kCTUnderlineStyleSingle; | 207 CTUnderlineStyle value = kCTUnderlineStyleSingle; |
| 204 base::mac::ScopedCFTypeRef<CFNumberRef> underline_value( | 208 base::ScopedCFTypeRef<CFNumberRef> underline_value( |
| 205 CFNumberCreate(NULL, kCFNumberSInt32Type, &value)); | 209 CFNumberCreate(NULL, kCFNumberSInt32Type, &value)); |
| 206 CFAttributedStringSetAttribute(attr_string, range, | 210 CFAttributedStringSetAttribute(attr_string, range, |
| 207 kCTUnderlineStyleAttributeName, | 211 kCTUnderlineStyleAttributeName, |
| 208 underline_value); | 212 underline_value); |
| 209 CFArrayAppendValue(attributes_, underline_value); | 213 CFArrayAppendValue(attributes_, underline_value); |
| 210 } | 214 } |
| 211 | 215 |
| 212 const int traits = (style.style(BOLD) ? kCTFontBoldTrait : 0) | | 216 const int traits = (style.style(BOLD) ? kCTFontBoldTrait : 0) | |
| 213 (style.style(ITALIC) ? kCTFontItalicTrait : 0); | 217 (style.style(ITALIC) ? kCTFontItalicTrait : 0); |
| 214 if (traits != 0) { | 218 if (traits != 0) { |
| 215 base::mac::ScopedCFTypeRef<CTFontRef> styled_font( | 219 base::ScopedCFTypeRef<CTFontRef> styled_font( |
| 216 CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, traits, traits)); | 220 CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, traits, traits)); |
| 217 // TODO(asvitkine): Handle |styled_font| == NULL case better. | 221 // TODO(asvitkine): Handle |styled_font| == NULL case better. |
| 218 if (styled_font) { | 222 if (styled_font) { |
| 219 CFAttributedStringSetAttribute(attr_string, range, kCTFontAttributeName, | 223 CFAttributedStringSetAttribute(attr_string, range, kCTFontAttributeName, |
| 220 styled_font); | 224 styled_font); |
| 221 CFArrayAppendValue(attributes_, styled_font); | 225 CFArrayAppendValue(attributes_, styled_font); |
| 222 } | 226 } |
| 223 } | 227 } |
| 224 | 228 |
| 225 style.UpdatePosition(LayoutIndexToTextIndex(end)); | 229 style.UpdatePosition(LayoutIndexToTextIndex(end)); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 point->set(x + SkDoubleToScalar(positions_ptr[glyph].x), | 290 point->set(x + SkDoubleToScalar(positions_ptr[glyph].x), |
| 287 y + SkDoubleToScalar(positions_ptr[glyph].y)); | 291 y + SkDoubleToScalar(positions_ptr[glyph].y)); |
| 288 } | 292 } |
| 289 | 293 |
| 290 // TODO(asvitkine): Style boundaries are not necessarily per-run. Handle | 294 // TODO(asvitkine): Style boundaries are not necessarily per-run. Handle |
| 291 // this better. Also, support strike and diagonal_strike. | 295 // this better. Also, support strike and diagonal_strike. |
| 292 CFDictionaryRef attributes = CTRunGetAttributes(ct_run); | 296 CFDictionaryRef attributes = CTRunGetAttributes(ct_run); |
| 293 CTFontRef ct_font = | 297 CTFontRef ct_font = |
| 294 base::mac::GetValueFromDictionary<CTFontRef>(attributes, | 298 base::mac::GetValueFromDictionary<CTFontRef>(attributes, |
| 295 kCTFontAttributeName); | 299 kCTFontAttributeName); |
| 296 base::mac::ScopedCFTypeRef<CFStringRef> font_name_ref( | 300 base::ScopedCFTypeRef<CFStringRef> font_name_ref( |
| 297 CTFontCopyFamilyName(ct_font)); | 301 CTFontCopyFamilyName(ct_font)); |
| 298 run->font_name = base::SysCFStringRefToUTF8(font_name_ref); | 302 run->font_name = base::SysCFStringRefToUTF8(font_name_ref); |
| 299 run->text_size = CTFontGetSize(ct_font); | 303 run->text_size = CTFontGetSize(ct_font); |
| 300 | 304 |
| 301 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(ct_font); | 305 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(ct_font); |
| 302 if (traits & kCTFontBoldTrait) | 306 if (traits & kCTFontBoldTrait) |
| 303 run->font_style |= Font::BOLD; | 307 run->font_style |= Font::BOLD; |
| 304 if (traits & kCTFontItalicTrait) | 308 if (traits & kCTFontItalicTrait) |
| 305 run->font_style |= Font::ITALIC; | 309 run->font_style |= Font::ITALIC; |
| 306 | 310 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 320 run_origin.offset(run_width, 0); | 324 run_origin.offset(run_width, 0); |
| 321 } | 325 } |
| 322 runs_valid_ = true; | 326 runs_valid_ = true; |
| 323 } | 327 } |
| 324 | 328 |
| 325 RenderText* RenderText::CreateInstance() { | 329 RenderText* RenderText::CreateInstance() { |
| 326 return new RenderTextMac; | 330 return new RenderTextMac; |
| 327 } | 331 } |
| 328 | 332 |
| 329 } // namespace gfx | 333 } // namespace gfx |
| OLD | NEW |