| 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 #import <AppKit/AppKit.h> | 7 #import <AppKit/AppKit.h> |
| 8 #include <ApplicationServices/ApplicationServices.h> | 8 #include <ApplicationServices/ApplicationServices.h> |
| 9 #include <CoreText/CoreText.h> | 9 #include <CoreText/CoreText.h> |
| 10 | 10 |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 // Skia will draw glyphs with respect to the baseline. | 365 // Skia will draw glyphs with respect to the baseline. |
| 366 text_offset += Vector2d(0, common_baseline_); | 366 text_offset += Vector2d(0, common_baseline_); |
| 367 | 367 |
| 368 const SkScalar x = SkIntToScalar(text_offset.x()); | 368 const SkScalar x = SkIntToScalar(text_offset.x()); |
| 369 const SkScalar y = SkIntToScalar(text_offset.y()); | 369 const SkScalar y = SkIntToScalar(text_offset.y()); |
| 370 SkPoint run_origin = SkPoint::Make(x, y); | 370 SkPoint run_origin = SkPoint::Make(x, y); |
| 371 | 371 |
| 372 const CFRange empty_cf_range = CFRangeMake(0, 0); | 372 const CFRange empty_cf_range = CFRangeMake(0, 0); |
| 373 for (CFIndex i = 0; i < ct_runs_count; ++i) { | 373 for (CFIndex i = 0; i < ct_runs_count; ++i) { |
| 374 CTRunRef ct_run = | 374 CTRunRef ct_run = |
| 375 base::mac::CFCast<CTRunRef>(CFArrayGetValueAtIndex(ct_runs, i)); | 375 base::mac::CFStaticCast<CTRunRef>(CFArrayGetValueAtIndex(ct_runs, i)); |
| 376 const size_t glyph_count = CTRunGetGlyphCount(ct_run); | 376 const size_t glyph_count = CTRunGetGlyphCount(ct_run); |
| 377 const double run_width = | 377 const double run_width = |
| 378 CTRunGetTypographicBounds(ct_run, empty_cf_range, NULL, NULL, NULL); | 378 CTRunGetTypographicBounds(ct_run, empty_cf_range, NULL, NULL, NULL); |
| 379 if (glyph_count == 0) { | 379 if (glyph_count == 0) { |
| 380 run_origin.offset(run_width, 0); | 380 run_origin.offset(run_width, 0); |
| 381 continue; | 381 continue; |
| 382 } | 382 } |
| 383 | 383 |
| 384 runs_.emplace_back(); | 384 runs_.emplace_back(); |
| 385 TextRun* run = &runs_.back(); | 385 TextRun* run = &runs_.back(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 407 } | 407 } |
| 408 for (size_t glyph = 0; glyph < glyph_count; glyph++) { | 408 for (size_t glyph = 0; glyph < glyph_count; glyph++) { |
| 409 SkPoint* point = &run->glyph_positions[glyph]; | 409 SkPoint* point = &run->glyph_positions[glyph]; |
| 410 point->set(x + SkDoubleToScalar(positions_ptr[glyph].x), | 410 point->set(x + SkDoubleToScalar(positions_ptr[glyph].x), |
| 411 y + SkDoubleToScalar(positions_ptr[glyph].y)); | 411 y + SkDoubleToScalar(positions_ptr[glyph].y)); |
| 412 } | 412 } |
| 413 | 413 |
| 414 // TODO(asvitkine): Style boundaries are not necessarily per-run. Handle | 414 // TODO(asvitkine): Style boundaries are not necessarily per-run. Handle |
| 415 // this better. Also, support strike and diagonal_strike. | 415 // this better. Also, support strike and diagonal_strike. |
| 416 CFDictionaryRef attributes = CTRunGetAttributes(ct_run); | 416 CFDictionaryRef attributes = CTRunGetAttributes(ct_run); |
| 417 CTFontRef ct_font = base::mac::GetValueFromDictionary<CTFontRef>( | 417 CTFontRef ct_font = base::mac::CFStaticCast<CTFontRef>( |
| 418 attributes, kCTFontAttributeName); | 418 CFDictionaryGetValue(attributes, kCTFontAttributeName)); |
| 419 run->ct_font.reset(ct_font, base::scoped_policy::RETAIN); | 419 run->ct_font.reset(ct_font, base::scoped_policy::RETAIN); |
| 420 run->typeface.reset(SkCreateTypefaceFromCTFont(ct_font)); | 420 run->typeface.reset(SkCreateTypefaceFromCTFont(ct_font)); |
| 421 | 421 |
| 422 const CGColorRef foreground = base::mac::GetValueFromDictionary<CGColorRef>( | 422 const CGColorRef foreground = base::mac::CFStaticCast<CGColorRef>( |
| 423 attributes, kCTForegroundColorAttributeName); | 423 CFDictionaryGetValue(attributes, kCTForegroundColorAttributeName)); |
| 424 if (foreground) | 424 if (foreground) |
| 425 run->foreground = skia::CGColorRefToSkColor(foreground); | 425 run->foreground = skia::CGColorRefToSkColor(foreground); |
| 426 | 426 |
| 427 const CFNumberRef underline = | 427 const CFNumberRef underline = base::mac::CFStaticCast<CFNumberRef>( |
| 428 base::mac::GetValueFromDictionary<CFNumberRef>( | 428 CFDictionaryGetValue(attributes, kCTUnderlineStyleAttributeName)); |
| 429 attributes, kCTUnderlineStyleAttributeName); | |
| 430 CTUnderlineStyle value = kCTUnderlineStyleNone; | 429 CTUnderlineStyle value = kCTUnderlineStyleNone; |
| 431 if (underline && CFNumberGetValue(underline, kCFNumberSInt32Type, &value)) | 430 if (underline && CFNumberGetValue(underline, kCFNumberSInt32Type, &value)) |
| 432 run->underline = (value == kCTUnderlineStyleSingle); | 431 run->underline = (value == kCTUnderlineStyleSingle); |
| 433 | 432 |
| 434 run_origin.offset(run_width, 0); | 433 run_origin.offset(run_width, 0); |
| 435 } | 434 } |
| 436 runs_valid_ = true; | 435 runs_valid_ = true; |
| 437 } | 436 } |
| 438 | 437 |
| 439 void RenderTextMac::InvalidateStyle() { | 438 void RenderTextMac::InvalidateStyle() { |
| 440 line_.reset(); | 439 line_.reset(); |
| 441 attributes_.reset(); | 440 attributes_.reset(); |
| 442 runs_.clear(); | 441 runs_.clear(); |
| 443 runs_valid_ = false; | 442 runs_valid_ = false; |
| 444 } | 443 } |
| 445 | 444 |
| 446 } // namespace gfx | 445 } // namespace gfx |
| OLD | NEW |