36constexpr char kFontFile[] =
"fonts/sbix_uncompressed_flags.ttf";
45static inline int16_t sk_float_saturate2int16(
float x) {
51struct ShortCoordinate {
bool negative; uint8_t magnitude; };
52static inline ShortCoordinate sk_float_saturate2sm8(
float x) {
53 bool negative =
x < 0;
54 x =
x < 255 ?
x : 255;
55 x =
x > -255 ?
x : -255;
56 return ShortCoordinate{ negative, negative ? (uint8_t)-
x : (uint8_t)
x };
69 static constexpr const int kGlyfXYMin = 0;
70 static constexpr const int kGlyfXYMax = 1;
71 static constexpr const int kGlyfLSB = 2;
72 static constexpr const int kGlyfFirstPoint = 3;
74 std::vector<sk_sp<SkFontMgr>> fFontMgr;
75 std::vector<SkFont> fFonts;
77 bool fInputChanged =
false;
81 SBIXSlide() {
fName =
"SBIX"; }
90 updateSBIXData(fSBIXData.
get(),
true);
105 for (
auto&& fontmgr : fFontMgr) {
106 fFonts.emplace_back(fontmgr->makeFromData(data),
kFontSize);
110 for (
auto&& font : fFonts) {
130 for (
auto&& pt :
fPts) {
131 paint.setColor(pt.color);
147 for (
size_t i = 0; i < std::size(fPts); ++i) {
149 return new PtClick((
int)i);
155 bool onClick(Click* click)
override {
156 fPts[((PtClick*)click)->fIndex].location.
set(click->fCurr.fX - DX, click->fCurr.fY - DY);
162 class PtClick :
public Click {
165 PtClick(
int index) : fIndex(index) {}
178 SkTAfter<SkSFNTHeader::TableDirectoryEntry>(sfntHeader);
186 for (
int tableEntryIndex = 0; tableEntryIndex < numTables; ++tableEntryIndex) {
188 glyfTableEntry = tableEntry + tableEntryIndex;
191 headTableEntry = tableEntry + tableEntryIndex;
194 hheaTableEntry = tableEntry + tableEntryIndex;
197 hmtxTableEntry = tableEntry + tableEntryIndex;
200 locaTableEntry = tableEntry + tableEntryIndex;
203 maxpTableEntry = tableEntry + tableEntryIndex;
215 SkTAddOffset<SkOTTableGlyph>(sfntHeader, glyfTableOffset);
219 SkTAddOffset<SkOTTableHead>(sfntHeader, headTableOffset);
223 SkTAddOffset<SkOTTableHorizontalHeader>(sfntHeader, hheaTableOffset);
227 SkTAddOffset<SkOTTableHorizontalMetrics>(sfntHeader, hmtxTableOffset);
231 SkTAddOffset<SkOTTableIndexToLocation>(sfntHeader, locaTableOffset);
235 SkTAddOffset<SkOTTableMaximumProfile>(sfntHeader, maxpTableOffset);
261 if (contourCount > 0) {
262 SK_OT_USHORT* endPtsOfContours = SkTAfter<SK_OT_USHORT>(glyphData);
263 SK_OT_USHORT* numInstructions = SkTAfter<SK_OT_USHORT>(endPtsOfContours,
265 SK_OT_BYTE* instructions = SkTAfter<SK_OT_BYTE>(numInstructions);
267 SkTAfter<SkOTTableGlyphData::Simple::Flags>(
273 size_t offsetToXDelta;
275 size_t offsetToYDelta;
278 std::vector<Coordinate> coordinates(numResultPoints);
280 size_t offsetToXDelta = 0;
281 size_t offsetToYDelta = 0;
283 for (
int i = 0; i < numResultPoints; ++i) {
286 if (currentFlags->
field.Repeat) {
289 nextFlags = SkTAfter<SkOTTableGlyphData::Simple::Flags>(
repeat);
291 nextFlags = SkTAfter<SkOTTableGlyphData::Simple::Flags>(currentFlags);
295 for (
int time = 0; time <
times; ++time) {
297 coordinates[i].flags = currentFlags;
298 coordinates[i].offsetToXDelta = offsetToXDelta;
299 coordinates[i].offsetToYDelta = offsetToYDelta;
301 if (currentFlags->
field.xShortVector) {
303 coordinates[i].xDeltaSize = 1;
304 }
else if (currentFlags->
field.xIsSame_xShortVectorPositive) {
307 coordinates[i].xDeltaSize = 0;
309 coordinates[i].xDeltaSize = coordinates[i-1].xDeltaSize;
313 coordinates[i].xDeltaSize = 2;
316 if (currentFlags->
field.yShortVector) {
318 coordinates[i].yDeltaSize = 1;
319 }
else if (currentFlags->
field.yIsSame_yShortVectorPositive) {
322 coordinates[i].yDeltaSize = 0;
324 coordinates[i].yDeltaSize = coordinates[i-1].yDeltaSize;
328 coordinates[i].yDeltaSize = 2;
331 currentFlags = nextFlags;
334 SK_OT_BYTE* yCoordinates = xCoordinates + offsetToXDelta;
337 if (coordinates[pointIndex].xDeltaSize == 0) {
339 SkDebugf(
"Failed to move point in X at all.\n");
340 }
else if (coordinates[pointIndex].xDeltaSize == 1) {
341 ShortCoordinate
x = sk_float_saturate2sm8(fPts[kGlyfFirstPoint].location.x()*toEm);
342 xCoordinates[coordinates[pointIndex].offsetToXDelta] =
x.magnitude;
343 coordinates[pointIndex].flags->field.xIsSame_xShortVectorPositive = !
x.negative;
345 *
reinterpret_cast<SK_OT_SHORT*
>(xCoordinates + coordinates[pointIndex].offsetToXDelta) =
346 SkEndian_SwapBE16(sk_float_saturate2int16(fPts[kGlyfFirstPoint].location.x()*toEm));
349 if (coordinates[pointIndex].yDeltaSize == 0) {
351 SkDebugf(
"Failed to move point in Y at all.\n");
352 }
else if (coordinates[pointIndex].yDeltaSize == 1) {
353 ShortCoordinate
y = sk_float_saturate2sm8(-fPts[kGlyfFirstPoint].location.y()*toEm);
354 yCoordinates[coordinates[pointIndex].offsetToYDelta] =
y.magnitude;
355 coordinates[pointIndex].flags->field.yIsSame_yShortVectorPositive = !
y.negative;
357 *
reinterpret_cast<SK_OT_SHORT*
>(yCoordinates + coordinates[pointIndex].offsetToYDelta) =
358 SkEndian_SwapBE16(sk_float_saturate2int16(-fPts[kGlyfFirstPoint].location.y()*toEm));
366 if (
kGlyphID < numberOfFullMetrics) {
374 SkTAfter<SkOTTableHorizontalMetrics::ShortMetric>(fullMetrics, numberOfFullMetrics);
375 int shortMetricIndex =
kGlyphID - numberOfFullMetrics;
379 shortMetrics[shortMetricIndex].
lsb = lsb;
static SkISize times(const SkISize &size, float factor)
static bool hittest(const SkPoint &target, SkScalar x, SkScalar y)
sk_sp< SkData > GetResourceAsData(const char *resource)
#define SkASSERT_RELEASE(cond)
static unsigned repeat(SkFixed fx, int max)
constexpr SkColor SK_ColorGRAY
constexpr SkColor SK_ColorBLUE
constexpr SkColor SK_ColorRED
constexpr SkColor SK_ColorBLACK
constexpr SkColor SK_ColorGREEN
constexpr SkColor SK_ColorWHITE
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
#define SkEndian_SwapBE32(n)
#define SkEndian_SwapBE16(n)
@ kGlyphID
uses two byte words to represent glyph indices
static constexpr int16_t SK_MaxS16
static constexpr int16_t SK_MinS16
virtual bool onClick(Click *)=0
virtual Click * onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi)=0
void drawRect(const SkRect &rect, const SkPaint &paint)
void drawPoints(PointMode mode, size_t count, const SkPoint pts[], const SkPaint &paint)
void drawPoint(SkScalar x, SkScalar y, const SkPaint &paint)
void translate(SkScalar dx, SkScalar dy)
void drawLine(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1, const SkPaint &paint)
void drawGlyphs(int count, const SkGlyphID glyphs[], const SkPoint positions[], const uint32_t clusters[], int textByteCount, const char utf8text[], SkPoint origin, const SkFont &font, const SkPaint &paint)
void clear(SkColor color)
@ kPoints_PointMode
draw each point separately
const void * data() const
static sk_sp< SkData > MakeWithCopy(const void *data, size_t length)
@ kStroke_Style
set to stroke geometry
@ kFill_Style
set to fill geometry
virtual void load(SkScalar winWidth, SkScalar winHeight)
virtual void draw(SkCanvas *canvas)=0
FlutterSemanticsFlag flags
sk_sp< SkBlender > blender SkRect rect
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
font
Font Metadata and Metrics.
SK_OT_SHORT numberOfContours
static const SK_OT_ULONG TAG
struct SkOTTableHead::IndexToLocFormat indexToLocFormat
static const SK_OT_ULONG TAG
union SkOTTableHead::Flags flags
static const SK_OT_ULONG TAG
struct SkOTTableHorizontalMetrics::FullMetric longHorMetric[1/*hhea::numberOfHMetrics */]
static const SK_OT_ULONG TAG
union SkOTTableMaximumProfile::Version version
static const SK_OT_ULONG TAG
void set(float x, float y)
static float Length(float x, float y)
struct SkOTTableGlyphData::Simple::Flags::Field field
struct SkOTTableHead::Flags::Field field
SkOTTableMaximumProfile::Version::TT tt