Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support of kerning to Text #537

Merged
merged 3 commits into from
Mar 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions Example-macOS/Example-macOS.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
objects = {

/* Begin PBXBuildFile section */
49265C832227BB7A00923A66 /* TextsExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49265C822227BB7A00923A66 /* TextsExampleView.swift */; };
970AB811D179560D74930D39 /* Pods_Example_macOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5184A00051CAC5E360198B48 /* Pods_Example_macOS.framework */; };
A715CA7D215E472800EE7651 /* ExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A715CA7C215E472800EE7651 /* ExampleViewController.swift */; };
A72862CB1F4308A50033893D /* AnimationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72862CA1F4308A50033893D /* AnimationsViewController.swift */; };
Expand All @@ -25,6 +26,7 @@
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
49265C822227BB7A00923A66 /* TextsExampleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextsExampleView.swift; sourceTree = "<group>"; };
5184A00051CAC5E360198B48 /* Pods_Example_macOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example_macOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
A715CA7C215E472800EE7651 /* ExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleViewController.swift; sourceTree = "<group>"; };
A72862CA1F4308A50033893D /* AnimationsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AnimationsViewController.swift; path = Examples/Animations/AnimationsViewController.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -66,6 +68,15 @@
name = Frameworks;
sourceTree = "<group>";
};
49265C812227BB7A00923A66 /* Text */ = {
isa = PBXGroup;
children = (
49265C822227BB7A00923A66 /* TextsExampleView.swift */,
);
name = Text;
path = ../../Example/Example/Examples/Text;
sourceTree = "<group>";
};
4F8946156C3F28DC7B262776 /* Pods */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -110,6 +121,7 @@
A759399F1F41C51A000CE329 /* Examples */ = {
isa = PBXGroup;
children = (
49265C812227BB7A00923A66 /* Text */,
A715CA7C215E472800EE7651 /* ExampleViewController.swift */,
A75939A01F41C544000CE329 /* Shapes */,
A75939A61F41C58D000CE329 /* Transform */,
Expand Down Expand Up @@ -281,7 +293,7 @@
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Example-macOS/Pods-Example-macOS-frameworks.sh",
"${SRCROOT}/Pods/Target Support Files/Pods-Example-macOS/Pods-Example-macOS-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/Macaw/Macaw.framework",
"${BUILT_PRODUCTS_DIR}/SWXMLHash/SWXMLHash.framework",
);
Expand All @@ -292,7 +304,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example-macOS/Pods-Example-macOS-frameworks.sh\"\n";
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Example-macOS/Pods-Example-macOS-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
Expand All @@ -310,6 +322,7 @@
A768EAD81F42C98E00F22A17 /* EventsExampleController.swift in Sources */,
A72862CE1F430DF00033893D /* EasingViewController.swift in Sources */,
A72862CB1F4308A50033893D /* AnimationsViewController.swift in Sources */,
49265C832227BB7A00923A66 /* TextsExampleView.swift in Sources */,
A768EADE1F42CCBC00F22A17 /* AnimationsView.swift in Sources */,
A75939A81F41C5A8000CE329 /* TransformExampleView.swift in Sources */,
A768EADC1F42CC7C00F22A17 /* EasingView.swift in Sources */,
Expand Down
32 changes: 29 additions & 3 deletions Example-macOS/Example-macOS/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14313.18"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
Expand Down Expand Up @@ -111,7 +111,7 @@
<!--Tab View Controller-->
<scene sceneID="HCD-4m-c8h">
<objects>
<tabViewController selectedTabViewItemIndex="0" id="hdB-7F-R9Q" sceneMemberID="viewController">
<tabViewController selectedTabViewItemIndex="6" id="hdB-7F-R9Q" sceneMemberID="viewController">
<tabViewItems>
<tabViewItem identifier="" id="3QN-7z-LrX"/>
<tabViewItem id="1e3-gs-UK8"/>
Expand All @@ -120,6 +120,7 @@
<tabViewItem id="cOY-ae-H1s"/>
<tabViewItem id="h85-ch-mEO"/>
<tabViewItem id="fd7-0D-v5P"/>
<tabViewItem id="Lcq-hY-C2R"/>
</tabViewItems>
<tabView key="tabView" type="noTabsNoBorder" id="2WP-RT-S1E">
<rect key="frame" x="-57" y="5" width="615" height="95"/>
Expand All @@ -138,6 +139,7 @@
<segue destination="6Ok-1N-J6E" kind="relationship" relationship="tabItems" id="Oei-AM-VA1"/>
<segue destination="Rn8-Li-WZ2" kind="relationship" relationship="tabItems" id="XnE-5e-LQB"/>
<segue destination="9aj-uf-eJX" kind="relationship" relationship="tabItems" id="dm1-xg-c0C"/>
<segue destination="UV0-nl-E6y" kind="relationship" relationship="tabItems" id="10z-7p-st3"/>
</connections>
</tabViewController>
<customObject id="vzO-zk-Zwd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
Expand Down Expand Up @@ -345,5 +347,29 @@
</objects>
<point key="canvasLocation" x="57" y="2256"/>
</scene>
<!--Texts-->
<scene sceneID="X4E-CY-SgF">
<objects>
<viewController title="Texts" id="UV0-nl-E6y" sceneMemberID="viewController">
<view key="view" id="Sna-Mq-RHP">
<rect key="frame" x="0.0" y="0.0" width="400" height="300"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="6Dc-5k-wX7" customClass="TextsExampleView" customModule="Example_macOS" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="400" height="300"/>
</customView>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="6Dc-5k-wX7" secondAttribute="bottom" id="MpI-b9-QYF"/>
<constraint firstItem="6Dc-5k-wX7" firstAttribute="top" secondItem="Sna-Mq-RHP" secondAttribute="top" id="VVy-XW-3NP"/>
<constraint firstItem="6Dc-5k-wX7" firstAttribute="leading" secondItem="Sna-Mq-RHP" secondAttribute="leading" id="o8h-7H-raU"/>
<constraint firstAttribute="trailing" secondItem="6Dc-5k-wX7" secondAttribute="trailing" id="pk8-Tx-3CR"/>
</constraints>
</view>
</viewController>
<customObject id="uqV-13-To9" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1128" y="350"/>
</scene>
</scenes>
</document>
12 changes: 12 additions & 0 deletions Example/Example.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

/* Begin PBXBuildFile section */
48BC2FE8BD3BF26100D04E07 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A92F90D3D20D2A289BED45F /* Pods_Example.framework */; };
49265C802227B1EB00923A66 /* TextsExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49265C7F2227B1EB00923A66 /* TextsExampleView.swift */; };
5747F9BD1E38B683004E338F /* MorphingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5747F9BC1E38B683004E338F /* MorphingView.swift */; };
574EC43E1CB7DE7F0063F317 /* ShapesExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 574EC4341CB7DE7F0063F317 /* ShapesExampleView.swift */; };
574EC4411CB7E2440063F317 /* MenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 574EC4401CB7E2440063F317 /* MenuViewController.swift */; };
Expand Down Expand Up @@ -41,6 +42,7 @@
/* Begin PBXFileReference section */
0A92F90D3D20D2A289BED45F /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
131DDFA4A9D164CC4B64C3E8 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
49265C7F2227B1EB00923A66 /* TextsExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextsExampleView.swift; sourceTree = "<group>"; };
5747F9BC1E38B683004E338F /* MorphingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MorphingView.swift; sourceTree = "<group>"; };
574EC4341CB7DE7F0063F317 /* ShapesExampleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShapesExampleView.swift; sourceTree = "<group>"; };
574EC4401CB7E2440063F317 /* MenuViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MenuViewController.swift; path = Example/MenuViewController.swift; sourceTree = SOURCE_ROOT; };
Expand Down Expand Up @@ -82,6 +84,14 @@
name = Pods;
sourceTree = "<group>";
};
49265C7E2227B1B200923A66 /* Text */ = {
isa = PBXGroup;
children = (
49265C7F2227B1EB00923A66 /* TextsExampleView.swift */,
);
path = Text;
sourceTree = "<group>";
};
5747F9BB1E38B660004E338F /* Morphing */ = {
isa = PBXGroup;
children = (
Expand All @@ -93,6 +103,7 @@
574EC4271CB7DE7F0063F317 /* Examples */ = {
isa = PBXGroup;
children = (
49265C7E2227B1B200923A66 /* Text */,
574EC4331CB7DE7F0063F317 /* Shapes */,
6699B7CE1DFFE8B90072585E /* Transform */,
574EC4421CBB607E0063F317 /* Animations */,
Expand Down Expand Up @@ -353,6 +364,7 @@
5BAE3CB120C54E3D006BEF51 /* FiltersViewController.swift in Sources */,
57AF398C1E67E9DB00F0BFE2 /* EventsExampleController.swift in Sources */,
B04416FA1E041A420016BC50 /* EasingView.swift in Sources */,
49265C802227B1EB00923A66 /* TextsExampleView.swift in Sources */,
574EC4411CB7E2440063F317 /* MenuViewController.swift in Sources */,
574EC43E1CB7DE7F0063F317 /* ShapesExampleView.swift in Sources */,
B04416FC1E04282A0016BC50 /* EasingExampleController.swift in Sources */,
Expand Down
34 changes: 32 additions & 2 deletions Example/Example/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="pJi-Pa-uLB">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="pJi-Pa-uLB">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14283.14"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
Expand Down Expand Up @@ -353,5 +353,35 @@
</objects>
<point key="canvasLocation" x="-82.400000000000006" y="1915.5922038980511"/>
</scene>
<!--Texts-->
<scene sceneID="bTW-zB-L9Y">
<objects>
<viewController storyboardIdentifier="TextsViewController" title="Texts" id="WKi-9n-Pbh" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="ECn-an-4YB"/>
<viewControllerLayoutGuide type="bottom" id="dI3-Tc-JoV"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="eF2-bs-oUF">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hPm-Wd-j2e" customClass="TextsExampleView" customModule="Example" customModuleProvider="target">
<rect key="frame" x="0.0" y="20" width="375" height="647"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="hPm-Wd-j2e" firstAttribute="leading" secondItem="eF2-bs-oUF" secondAttribute="leading" id="YKn-kZ-CQC"/>
<constraint firstItem="hPm-Wd-j2e" firstAttribute="top" secondItem="ECn-an-4YB" secondAttribute="bottom" id="gIj-5H-QLF"/>
<constraint firstItem="dI3-Tc-JoV" firstAttribute="top" secondItem="hPm-Wd-j2e" secondAttribute="bottom" id="kLf-IH-dyy"/>
<constraint firstAttribute="trailing" secondItem="hPm-Wd-j2e" secondAttribute="trailing" id="xIq-DI-gT3"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="oGc-AF-UNq" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-113" y="1196"/>
</scene>
</scenes>
</document>
46 changes: 46 additions & 0 deletions Example/Example/Examples/Text/TextsExampleView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// TextsExampleView.swift
// Example
//
// Created by Andrew Romanov on 28/02/2019.
// Copyright © 2019 Exyte. All rights reserved.
//

import Macaw

class TextsExampleView: MacawView {

required init?(coder aDecoder: NSCoder) {
let text1 = TextsExampleView.newText("Font", .move(dx: 100, dy: 40))
text1.font = Font(name: "Helvetica", size: 20, weight: "normal")

let text2 = TextsExampleView.newText("Stroke", .move(dx: 100, dy: 200))
text2.font = Font(name: "Helvetica", size: 40, weight: "normal")
text2.fill = Color(val: 0xFF0000);
text2.stroke = Stroke(fill: Color(val: 0x00FF00), width: 20.0);

let text4 = TextsExampleView.newText("Stroke", .move(dx: 100, dy: 200))
text4.font = Font(name: "Helvetica", size: 40, weight: "normal")
text4.fill = Color(val: 0xFF0000);

let text3 = TextsExampleView.newText("Kern inc", .move(dx: 100, dy: 250))
text3.kerning = 3.0

let text5 = TextsExampleView.newText("Kern dec", .move(dx: 100, dy: 300))
text5.kerning = -1.0

let group = Group(
contents: [
text1, text2, text3, text4, text5
]
)

super.init(node: group, coder: aDecoder)
}

fileprivate static func newText(_ text: String, _ place: Transform, baseline: Baseline = .bottom) -> Text {
return Text(text: text, fill: Color.black, align: .mid, baseline: baseline, place: place)
}

}

3 changes: 2 additions & 1 deletion Example/Example/MenuViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ open class MenuViewController: UIViewController, UITableViewDataSource, UITableV
"EasingExampleController",
"MorphingExampleController",
"EventsExampleController",
"FiltersViewController"
"FiltersViewController",
"TextsViewController"
].map {
UIStoryboard(name: "Main", bundle: .none).instantiateViewController(withIdentifier: $0)
}
Expand Down
19 changes: 19 additions & 0 deletions MacawTests/Bounds/NodeBoundsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,25 @@ class NodeBoundsTests: XCTestCase {
}
}


func testTextWithKerning() {
let texts = ["", "Hello, World", "Hello,\nWorld", "\nHello\n,\nWorld"]
let kernings : [Float] = [-1.0, -0.5, 0.5, 1.0]

texts.forEach { (text) in
kernings.forEach({ (kerning) in
let text = Text(text: text, kerning: kerning)

let stringAttributes = [NSAttributedString.Key.font: MFont.systemFont(ofSize: MFont.systemFontSize),
NSAttributedString.Key.kern: NSNumber(value: kerning)]
let size = text.text.size(withAttributes: stringAttributes)
let targetRect = Rect(x: 0.0, y: 0.0, w: size.width.doubleValue, h: size.height.doubleValue)

checkBounds(rect1: text.bounds, rect2: targetRect)
})
}
}

// MARK: - Group

func testSimpleGroupZeroBounds() {
Expand Down
2 changes: 0 additions & 2 deletions Source/MCAMediaTimingFunctionName_macOS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@

import Foundation

import Foundation

#if os(OSX)
import AppKit

Expand Down
12 changes: 11 additions & 1 deletion Source/model/scene/Text.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,20 @@ open class Text: Node {
set(val) { baselineVar.value = val }
}

public init(text: String, font: Font? = nil, fill: Fill? = Color.black, stroke: Stroke? = nil, align: Align = .min, baseline: Baseline = .top, place: Transform = Transform.identity, opaque: Bool = true, opacity: Double = 1, clip: Locus? = nil, mask: Node? = nil, effect: Effect? = nil, visible: Bool = true, tag: [String] = []) {
public let kerningVar: Variable<Float>
open var kerning: Float {
get { return kerningVar.value }
set(val) { kerningVar.value = val }
}

public init(text: String, font: Font? = nil, fill: Fill? = Color.black, stroke: Stroke? = nil, align: Align = .min, baseline: Baseline = .top, kerning: Float = 0.0, place: Transform = Transform.identity, opaque: Bool = true, opacity: Double = 1, clip: Locus? = nil, mask: Node? = nil, effect: Effect? = nil, visible: Bool = true, tag: [String] = []) {
self.textVar = Variable<String>(text)
self.fontVar = Variable<Font?>(font)
self.fillVar = Variable<Fill?>(fill)
self.strokeVar = Variable<Stroke?>(stroke)
self.alignVar = Variable<Align>(align)
self.baselineVar = Variable<Baseline>(baseline)
self.kerningVar = Variable<Float>(kerning)
super.init(
place: place,
opaque: opaque,
Expand All @@ -75,6 +82,9 @@ open class Text: Node {
}
var stringAttributes: [NSAttributedString.Key: AnyObject] = [:]
stringAttributes[NSAttributedString.Key.font] = font
if self.kerning != 0.0 {
stringAttributes[NSAttributedString.Key.kern] = NSNumber(value: self.kerning)
}
let size = (text as NSString).size(withAttributes: stringAttributes)
return Rect(
x: calculateAlignmentOffset(font: font),
Expand Down
Loading