Add BOT/EOT to Shaper.

This informs HarfBuzz when we are at the beginning or end of a
paragraph so that it can handle a few rules in a special way.

Change-Id: I66a306f1ff7ddb2c1546b0fd9c0cee94cb9f7006
Reviewed-on: https://skia-review.googlesource.com/c/189850
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Ben Wagner <bungeman@google.com>
diff --git a/modules/skshaper/src/SkShaper_harfbuzz.cpp b/modules/skshaper/src/SkShaper_harfbuzz.cpp
index 9d52336..a74d0c0 100644
--- a/modules/skshaper/src/SkShaper_harfbuzz.cpp
+++ b/modules/skshaper/src/SkShaper_harfbuzz.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "SkBitmaskEnum.h"
 #include "SkFont.h"
 #include "SkFontArguments.h"
 #include "SkFontMetrics.h"
@@ -44,6 +45,10 @@
 #include "SkLoadICU.h"
 #endif
 
+namespace skstd {
+template <> struct is_bitmask_enum<hb_buffer_flags_t> : std::true_type {};
+}
+
 namespace {
 template <class T, void(*P)(T*)> using resource = std::unique_ptr<T, SkFunctionWrapper<void, T, P>>;
 using HBBlob   = resource<hb_blob_t     , hb_blob_destroy  >;
@@ -1105,7 +1110,7 @@
 
 
 ShapedRun SkShaper::Impl::shape(const char* utf8,
-                                size_t utf8Bytes,
+                                const size_t utf8Bytes,
                                 const char* utf8Start,
                                 const char* utf8End,
                                 const BiDiRunIterator* bidi,
@@ -1120,6 +1125,9 @@
     hb_buffer_set_content_type(buffer, HB_BUFFER_CONTENT_TYPE_UNICODE);
     hb_buffer_set_cluster_level(buffer, HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS);
 
+    // See 763e5466c0a03a7c27020e1e2598e488612529a7 for documentation.
+    hb_buffer_set_flags(buffer, HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT);
+
     // Add precontext.
     hb_buffer_add_utf8(buffer, utf8, utf8Start - utf8, utf8Start - utf8, 0);