aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2016-08-03 10:43:55 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-03 10:43:55 -0700
commit13cba49982ea3a4032dc78f2b61d7c1968d4b8eb (patch)
tree506ff4cd66448e3ef1ccae3e76a75914023e8edf
parentbc20a701d8bd3df9d8cf8a20eeb17c3f90c99364 (diff)
SkShaper: optionally disable harfbuzz
also, re-enable warnings. motivation: used by me for PDF testing. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2201153002 Review-Url: https://codereview.chromium.org/2201153002
-rw-r--r--gyp/tools.gyp18
-rw-r--r--tools/SkShaper.h4
-rw-r--r--tools/SkShaper_harfbuzz.cpp (renamed from tools/SkShaper.cpp)8
-rw-r--r--tools/SkShaper_primitive.cpp51
-rw-r--r--tools/using_skia_and_harfbuzz.cpp12
5 files changed, 76 insertions, 17 deletions
diff --git a/gyp/tools.gyp b/gyp/tools.gyp
index b5ec80473e..b41ecc4847 100644
--- a/gyp/tools.gyp
+++ b/gyp/tools.gyp
@@ -463,18 +463,22 @@
{
'target_name': 'using_skia_and_harfbuzz',
'type': 'executable',
- 'sources': [
- '../tools/using_skia_and_harfbuzz.cpp',
- '../tools/SkShaper.cpp',
+ 'sources': [ '../tools/using_skia_and_harfbuzz.cpp', ],
+ 'variables': { 'skia_example_use_harfbuzz%': 1, },
+ 'conditions': [
+ [ 'skia_example_use_harfbuzz',
+ {
+ 'dependencies': [ 'harfbuzz.gyp:harfbuzz', ],
+ 'sources' : [ '../tools/SkShaper_harfbuzz.cpp', ],
+ }, {
+ 'sources' : [ '../tools/SkShaper_primitive.cpp', ],
+ },
+ ]
],
'dependencies': [
'skia_lib.gyp:skia_lib',
'pdf.gyp:pdf',
- 'harfbuzz.gyp:harfbuzz',
],
- 'cflags': [ '-w', ],
- 'msvs_settings': { 'VCCLCompilerTool': { 'WarningLevel': '0', }, },
- 'xcode_settings': { 'WARNING_CFLAGS': [ '-w', ], },
},
{
'target_name': 'visualize_color_gamut',
diff --git a/tools/SkShaper.h b/tools/SkShaper.h
index 5aa93a7dbc..bc78be7d54 100644
--- a/tools/SkShaper.h
+++ b/tools/SkShaper.h
@@ -17,8 +17,10 @@ class SkPaint;
class SkTextBlobBuilder;
/**
- Shapes text using harfbuzz and places the shaped text into a
+ Shapes text using HarfBuzz and places the shaped text into a
TextBlob.
+
+ If compiled without HarfBuzz, fall back on SkPaint::textToGlyphs.
*/
class SkShaper {
public:
diff --git a/tools/SkShaper.cpp b/tools/SkShaper_harfbuzz.cpp
index 44dd8fc7f1..29dd1b00f5 100644
--- a/tools/SkShaper.cpp
+++ b/tools/SkShaper_harfbuzz.cpp
@@ -23,7 +23,7 @@ std::unique_ptr<hb_blob_t, HBFBlobDel> stream_to_blob(std::unique_ptr<SkStreamAs
size_t size = asset->getLength();
std::unique_ptr<hb_blob_t, HBFBlobDel> blob;
if (const void* base = asset->getMemoryBase()) {
- blob.reset(hb_blob_create((char*)base, size,
+ blob.reset(hb_blob_create((char*)base, SkToUInt(size),
HB_MEMORY_MODE_READONLY, asset.release(),
[](void* p) { delete (SkStreamAsset*)p; }));
} else {
@@ -31,7 +31,7 @@ std::unique_ptr<hb_blob_t, HBFBlobDel> stream_to_blob(std::unique_ptr<SkStreamAs
SkAutoMalloc autoMalloc(size);
asset->read(autoMalloc.get(), size);
void* ptr = autoMalloc.get();
- blob.reset(hb_blob_create((char*)autoMalloc.release(), size,
+ blob.reset(hb_blob_create((char*)autoMalloc.release(), SkToUInt(size),
HB_MEMORY_MODE_READONLY, ptr, sk_free));
}
SkASSERT(blob);
@@ -116,8 +116,8 @@ SkScalar SkShaper::shape(SkTextBlobBuilder* builder,
for (unsigned i = 0; i < len; i++) {
runBuffer.glyphs[i] = info[i].codepoint;
reinterpret_cast<SkPoint*>(runBuffer.pos)[i] =
- SkPoint::Make(x + pos[i].x_offset * textSizeX,
- y - pos[i].y_offset * textSizeY);
+ SkPoint::Make(SkDoubleToScalar(x + pos[i].x_offset * textSizeX),
+ SkDoubleToScalar(y - pos[i].y_offset * textSizeY));
x += pos[i].x_advance * textSizeX;
y += pos[i].y_advance * textSizeY;
}
diff --git a/tools/SkShaper_primitive.cpp b/tools/SkShaper_primitive.cpp
new file mode 100644
index 0000000000..65081b3447
--- /dev/null
+++ b/tools/SkShaper_primitive.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "SkShaper.h"
+#include "SkStream.h"
+#include "SkTextBlob.h"
+#include "SkTypeface.h"
+
+struct SkShaper::Impl {
+ sk_sp<SkTypeface> fTypeface;
+};
+
+SkShaper::SkShaper(sk_sp<SkTypeface> tf) : fImpl(new Impl) {
+ fImpl->fTypeface = tf ? std::move(tf) : SkTypeface::MakeDefault();
+}
+
+SkShaper::~SkShaper() {}
+
+bool SkShaper::good() const { return true; }
+
+SkScalar SkShaper::shape(SkTextBlobBuilder* builder,
+ const SkPaint& srcPaint,
+ const char* utf8text,
+ size_t textBytes,
+ SkPoint point) const {
+ SkPaint paint(srcPaint);
+ paint.setTypeface(fImpl->fTypeface);
+ paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
+ int glyphCount = paint.countText(utf8text, textBytes);
+ if (glyphCount <= 0) {
+ return 0;
+ }
+ SkRect bounds;
+ (void)paint.measureText(utf8text, textBytes, &bounds);
+ paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
+ const SkTextBlobBuilder::RunBuffer& runBuffer = builder->allocRunPosH(
+ paint, glyphCount, point.y(), &bounds);
+ paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
+ (void)paint.textToGlyphs(utf8text, textBytes, runBuffer.glyphs);
+ (void)paint.getTextWidths(utf8text, textBytes, runBuffer.pos);
+ SkScalar x = point.x();
+ for (int i = 0; i < glyphCount; ++i) {
+ SkScalar w = runBuffer.pos[i];
+ runBuffer.pos[i] = x;
+ x += w;
+ }
+ return (SkScalar)x;
+}
diff --git a/tools/using_skia_and_harfbuzz.cpp b/tools/using_skia_and_harfbuzz.cpp
index 782103465e..f17a26d12b 100644
--- a/tools/using_skia_and_harfbuzz.cpp
+++ b/tools/using_skia_and_harfbuzz.cpp
@@ -134,7 +134,7 @@ public:
glyph_paint.setColor(SK_ColorBLACK);
glyph_paint.setFlags(SkPaint::kAntiAlias_Flag |
SkPaint::kSubpixelText_Flag);
- glyph_paint.setTextSize(config->font_size.value);
+ glyph_paint.setTextSize(SkDoubleToScalar(config->font_size.value));
}
void WriteLine(const SkShaper& shaper, const char *text, size_t textBytes) {
@@ -142,8 +142,9 @@ public:
if (pageCanvas) {
document->endPage();
}
- pageCanvas = document->beginPage(config->page_width.value,
- config->page_height.value);
+ pageCanvas = document->beginPage(
+ SkDoubleToScalar(config->page_width.value),
+ SkDoubleToScalar(config->page_height.value));
pageCanvas->drawPaint(white_paint);
current_x = config->left_margin.value;
current_y = config->line_spacing_ratio.value * config->font_size.value;
@@ -151,8 +152,9 @@ public:
SkTextBlobBuilder textBlobBuilder;
shaper.shape(&textBlobBuilder, glyph_paint, text, textBytes, SkPoint{0, 0});
sk_sp<const SkTextBlob> blob(textBlobBuilder.build());
- pageCanvas->drawTextBlob(blob.get(), current_x, current_y, glyph_paint);
-
+ pageCanvas->drawTextBlob(
+ blob.get(), SkDoubleToScalar(current_x),
+ SkDoubleToScalar(current_y), glyph_paint);
// Advance to the next line.
current_y += config->line_spacing_ratio.value * config->font_size.value;
}