// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/fonts/mac/attributed_string_type_converter.h"
#include <AppKit/AppKit.h>
#include "base/apple/bridging.h"
#include "base/apple/foundation_util.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "ui/gfx/range/range.h"
namespace mojo {
ui::mojom::blink::AttributedStringPtr
TypeConverter<ui::mojom::blink::AttributedStringPtr, CFAttributedStringRef>::
Convert(CFAttributedStringRef cf_attributed_string) {
NSAttributedString* ns_attributed_string =
base::apple::CFToNSPtrCast(cf_attributed_string);
// Create the return value.
ui::mojom::blink::AttributedStringPtr attributed_string =
ui::mojom::blink::AttributedString::New();
attributed_string->string = String(ns_attributed_string.string);
// Iterate over all the attributes in the string.
NSUInteger length = ns_attributed_string.length;
for (NSUInteger i = 0; i < length;) {
NSRange effective_range;
NSDictionary* ns_attributes =
[ns_attributed_string attributesAtIndex:i
effectiveRange:&effective_range];
NSFont* font = ns_attributes[NSFontAttributeName];
String font_name;
float font_point_size;
// Only encode the attributes if the filtered set contains font information.
if (font) {
font_name = String(font.fontName);
font_point_size = font.pointSize;
if (!font_name.empty()) {
// Convert the attributes.
ui::mojom::blink::FontAttributePtr attrs =
ui::mojom::blink::FontAttribute::New(font_name, font_point_size,
gfx::Range(effective_range));
attributed_string->attributes.push_back(std::move(attrs));
}
}
// Advance the iterator to the position outside of the effective range.
i = NSMaxRange(effective_range);
}
return attributed_string;
}
} // namespace mojo