Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: tools/SkShaper.cpp

Issue 2201153002: SkShaper: optionally disable harfbuzz (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2016-08-02 (Tuesday) 17:13:48 EDT Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/SkShaper.h ('k') | tools/using_skia_and_harfbuzz.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7
8 #include <hb-ot.h>
9
10 #include "SkShaper.h" 7 #include "SkShaper.h"
11 #include "SkStream.h" 8 #include "SkStream.h"
12 #include "SkTextBlob.h" 9 #include "SkTextBlob.h"
13 #include "SkTypeface.h" 10 #include "SkTypeface.h"
14 11
12 #ifdef SK_ENABLE_HARFBUZZ
bungeman-skia 2016/08/02 21:38:36 I know it's a bit more work, but these two impleme
hal.canary 2016/08/02 23:00:45 Done.
13
14 #include <hb-ot.h>
15
15 static const int FONT_SIZE_SCALE = 512; 16 static const int FONT_SIZE_SCALE = 512;
16 17
17 namespace { 18 namespace {
18 struct HBFBlobDel { 19 struct HBFBlobDel {
19 void operator()(hb_blob_t* b) { hb_blob_destroy(b); } 20 void operator()(hb_blob_t* b) { hb_blob_destroy(b); }
20 }; 21 };
21 22
22 std::unique_ptr<hb_blob_t, HBFBlobDel> stream_to_blob(std::unique_ptr<SkStreamAs set> asset) { 23 std::unique_ptr<hb_blob_t, HBFBlobDel> stream_to_blob(std::unique_ptr<SkStreamAs set> asset) {
23 size_t size = asset->getLength(); 24 size_t size = asset->getLength();
24 std::unique_ptr<hb_blob_t, HBFBlobDel> blob; 25 std::unique_ptr<hb_blob_t, HBFBlobDel> blob;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 110
110 double x = point.x(); 111 double x = point.x();
111 double y = point.y(); 112 double y = point.y();
112 113
113 double textSizeY = paint.getTextSize() / (double)FONT_SIZE_SCALE; 114 double textSizeY = paint.getTextSize() / (double)FONT_SIZE_SCALE;
114 double textSizeX = textSizeY * paint.getTextScaleX(); 115 double textSizeX = textSizeY * paint.getTextScaleX();
115 116
116 for (unsigned i = 0; i < len; i++) { 117 for (unsigned i = 0; i < len; i++) {
117 runBuffer.glyphs[i] = info[i].codepoint; 118 runBuffer.glyphs[i] = info[i].codepoint;
118 reinterpret_cast<SkPoint*>(runBuffer.pos)[i] = 119 reinterpret_cast<SkPoint*>(runBuffer.pos)[i] =
119 SkPoint::Make(x + pos[i].x_offset * textSizeX, 120 SkPoint::Make(SkDoubleToScalar(x + pos[i].x_offset * textSizeX),
120 y - pos[i].y_offset * textSizeY); 121 SkDoubleToScalar(y - pos[i].y_offset * textSizeY)) ;
121 x += pos[i].x_advance * textSizeX; 122 x += pos[i].x_advance * textSizeX;
122 y += pos[i].y_advance * textSizeY; 123 y += pos[i].y_advance * textSizeY;
123 } 124 }
124 hb_buffer_clear_contents(buffer); 125 hb_buffer_clear_contents(buffer);
125 return (SkScalar)x; 126 return (SkScalar)x;
126 } 127 }
128
129 #else // !SK_ENABLE_HARFBUZZ
130
131 struct SkShaper::Impl {
132 sk_sp<SkTypeface> fTypeface;
133 };
134
135 SkShaper::SkShaper(sk_sp<SkTypeface> tf) : fImpl(new Impl) {
136 fImpl->fTypeface = tf ? std::move(tf) : SkTypeface::MakeDefault();
137 }
138
139 SkShaper::~SkShaper() {}
140
141 bool SkShaper::good() const { return true; }
142
143 SkScalar SkShaper::shape(SkTextBlobBuilder* builder,
144 const SkPaint& srcPaint,
145 const char* utf8text,
146 size_t textBytes,
147 SkPoint point) const {
148 SkPaint paint(srcPaint);
149 paint.setTypeface(fImpl->fTypeface);
150 paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
151 int glyphCount = paint.countText(utf8text, textBytes);
152 if (glyphCount <= 0) {
153 return 0;
154 }
155 SkRect bounds;
156 (void)paint.measureText(utf8text, textBytes, &bounds);
157 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
158 const SkTextBlobBuilder::RunBuffer& runBuffer = builder->allocRunPosH(
159 paint, glyphCount, point.y(), &bounds);
160 paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
161 (void)paint.textToGlyphs(utf8text, textBytes, runBuffer.glyphs);
162 (void)paint.getTextWidths(utf8text, textBytes, runBuffer.pos);
163 SkScalar x = point.x();
164 for (int i = 0; i < glyphCount; ++i) {
165 SkScalar w = runBuffer.pos[i];
166 runBuffer.pos[i] = x;
167 x += w;
168 }
169 return (SkScalar)x;
170 }
171
172 #endif // !SK_ENABLE_HARFBUZZ
OLDNEW
« no previous file with comments | « tools/SkShaper.h ('k') | tools/using_skia_and_harfbuzz.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698