@shopify/react-native-skia 0.1.221 → 0.1.223
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/cpp/rnskia-android/RNSkAndroidView.h +3 -0
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +1 -0
- package/android/cpp/rnskia-android/SkiaOpenGLHelper.h +0 -1
- package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h +46 -6
- package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java +3 -3
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +8 -14
- package/android/src/main/java/com/shopify/reactnative/skia/ViewScreenshotService.java +93 -105
- package/cpp/api/JsiSkApi.h +5 -0
- package/cpp/api/JsiSkFontMgrFactory.h +9 -4
- package/cpp/api/JsiSkParagraph.h +135 -0
- package/cpp/api/JsiSkParagraphBuilder.h +159 -0
- package/cpp/api/JsiSkParagraphStyle.h +124 -0
- package/cpp/api/JsiSkStrutStyle.h +96 -0
- package/cpp/api/JsiSkTextStyle.h +185 -0
- package/cpp/jsi/JsiHostObject.h +21 -0
- package/cpp/rnskia/dom/JsiDomApi.h +4 -0
- package/cpp/rnskia/dom/nodes/JsiParagraphNode.h +62 -0
- package/cpp/rnskia/dom/props/ParagraphProp.h +45 -0
- package/cpp/skia/modules/skunicode/include/SkUnicode.h +312 -0
- package/cpp/skia/src/base/SkTInternalLList.h +304 -0
- package/cpp/skia/src/base/SkUTF.h +95 -0
- package/cpp/skia/src/core/SkLRUCache.h +130 -0
- package/cpp/utils/RNSkLog.h +3 -3
- package/lib/commonjs/dom/nodes/JsiSkDOM.d.ts +2 -0
- package/lib/commonjs/dom/nodes/JsiSkDOM.js +7 -0
- package/lib/commonjs/dom/nodes/JsiSkDOM.js.map +1 -1
- package/lib/commonjs/dom/nodes/drawings/ParagraphNode.d.ts +8 -0
- package/lib/commonjs/dom/nodes/drawings/ParagraphNode.js +41 -0
- package/lib/commonjs/dom/nodes/drawings/ParagraphNode.js.map +1 -0
- package/lib/commonjs/dom/types/NodeType.d.ts +2 -1
- package/lib/commonjs/dom/types/NodeType.js +1 -0
- package/lib/commonjs/dom/types/NodeType.js.map +1 -1
- package/lib/commonjs/dom/types/Paragraph.d.ts +8 -0
- package/lib/commonjs/dom/types/Paragraph.js +6 -0
- package/lib/commonjs/dom/types/Paragraph.js.map +1 -0
- package/lib/commonjs/dom/types/SkDOM.d.ts +2 -0
- package/lib/commonjs/dom/types/SkDOM.js.map +1 -1
- package/lib/commonjs/dom/types/index.d.ts +1 -0
- package/lib/commonjs/dom/types/index.js +13 -0
- package/lib/commonjs/dom/types/index.js.map +1 -1
- package/lib/commonjs/renderer/HostComponents.d.ts +3 -1
- package/lib/commonjs/renderer/HostComponents.js +4 -0
- package/lib/commonjs/renderer/HostComponents.js.map +1 -1
- package/lib/commonjs/renderer/components/index.d.ts +1 -0
- package/lib/commonjs/renderer/components/index.js +13 -0
- package/lib/commonjs/renderer/components/index.js.map +1 -1
- package/lib/commonjs/renderer/components/paragraph/Paragraph.d.ts +4 -0
- package/lib/commonjs/renderer/components/paragraph/Paragraph.js +17 -0
- package/lib/commonjs/renderer/components/paragraph/Paragraph.js.map +1 -0
- package/lib/commonjs/renderer/components/paragraph/index.d.ts +1 -0
- package/lib/commonjs/renderer/components/paragraph/index.js +19 -0
- package/lib/commonjs/renderer/components/paragraph/index.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/Paragraph.d.ts +56 -0
- package/lib/commonjs/skia/types/Paragraph/Paragraph.js +6 -0
- package/lib/commonjs/skia/types/Paragraph/Paragraph.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphBuilder.d.ts +60 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphBuilder.js +18 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphBuilder.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphStyle.d.ts +41 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphStyle.js +36 -0
- package/lib/commonjs/skia/types/Paragraph/ParagraphStyle.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/TextStyle.d.ts +62 -0
- package/lib/commonjs/skia/types/Paragraph/TextStyle.js +35 -0
- package/lib/commonjs/skia/types/Paragraph/TextStyle.js.map +1 -0
- package/lib/commonjs/skia/types/Paragraph/index.d.ts +6 -0
- package/lib/commonjs/skia/types/Paragraph/index.js +84 -0
- package/lib/commonjs/skia/types/Paragraph/index.js.map +1 -0
- package/lib/commonjs/skia/types/Skia.d.ts +2 -0
- package/lib/commonjs/skia/types/Skia.js.map +1 -1
- package/lib/commonjs/skia/types/index.d.ts +1 -0
- package/lib/commonjs/skia/types/index.js +13 -0
- package/lib/commonjs/skia/types/index.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkImage.js +0 -6
- package/lib/commonjs/skia/web/JsiSkImage.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkParagraph.d.ts +16 -0
- package/lib/commonjs/skia/web/JsiSkParagraph.js +91 -0
- package/lib/commonjs/skia/web/JsiSkParagraph.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilder.d.ts +15 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilder.js +85 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilder.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilderFactory.d.ts +8 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilderFactory.js +34 -0
- package/lib/commonjs/skia/web/JsiSkParagraphBuilderFactory.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkParagraphStyle.d.ts +5 -0
- package/lib/commonjs/skia/web/JsiSkParagraphStyle.js +59 -0
- package/lib/commonjs/skia/web/JsiSkParagraphStyle.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkTextStyle.d.ts +5 -0
- package/lib/commonjs/skia/web/JsiSkTextStyle.js +54 -0
- package/lib/commonjs/skia/web/JsiSkTextStyle.js.map +1 -0
- package/lib/commonjs/skia/web/JsiSkia.js +4 -1
- package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
- package/lib/module/dom/nodes/JsiSkDOM.d.ts +2 -0
- package/lib/module/dom/nodes/JsiSkDOM.js +6 -0
- package/lib/module/dom/nodes/JsiSkDOM.js.map +1 -1
- package/lib/module/dom/nodes/drawings/ParagraphNode.d.ts +8 -0
- package/lib/module/dom/nodes/drawings/ParagraphNode.js +30 -0
- package/lib/module/dom/nodes/drawings/ParagraphNode.js.map +1 -0
- package/lib/module/dom/types/NodeType.d.ts +2 -1
- package/lib/module/dom/types/NodeType.js +1 -0
- package/lib/module/dom/types/NodeType.js.map +1 -1
- package/lib/module/dom/types/Paragraph.d.ts +8 -0
- package/lib/module/dom/types/Paragraph.js +2 -0
- package/lib/module/dom/types/Paragraph.js.map +1 -0
- package/lib/module/dom/types/SkDOM.d.ts +2 -0
- package/lib/module/dom/types/SkDOM.js.map +1 -1
- package/lib/module/dom/types/index.d.ts +1 -0
- package/lib/module/dom/types/index.js +1 -0
- package/lib/module/dom/types/index.js.map +1 -1
- package/lib/module/renderer/HostComponents.d.ts +3 -1
- package/lib/module/renderer/HostComponents.js +4 -0
- package/lib/module/renderer/HostComponents.js.map +1 -1
- package/lib/module/renderer/components/index.d.ts +1 -0
- package/lib/module/renderer/components/index.js +1 -0
- package/lib/module/renderer/components/index.js.map +1 -1
- package/lib/module/renderer/components/paragraph/Paragraph.d.ts +4 -0
- package/lib/module/renderer/components/paragraph/Paragraph.js +5 -0
- package/lib/module/renderer/components/paragraph/Paragraph.js.map +1 -0
- package/lib/module/renderer/components/paragraph/index.d.ts +1 -0
- package/lib/module/renderer/components/paragraph/index.js +2 -0
- package/lib/module/renderer/components/paragraph/index.js.map +1 -0
- package/lib/module/skia/types/Paragraph/Paragraph.d.ts +56 -0
- package/lib/module/skia/types/Paragraph/Paragraph.js +2 -0
- package/lib/module/skia/types/Paragraph/Paragraph.js.map +1 -0
- package/lib/module/skia/types/Paragraph/ParagraphBuilder.d.ts +60 -0
- package/lib/module/skia/types/Paragraph/ParagraphBuilder.js +11 -0
- package/lib/module/skia/types/Paragraph/ParagraphBuilder.js.map +1 -0
- package/lib/module/skia/types/Paragraph/ParagraphStyle.d.ts +41 -0
- package/lib/module/skia/types/Paragraph/ParagraphStyle.js +27 -0
- package/lib/module/skia/types/Paragraph/ParagraphStyle.js.map +1 -0
- package/lib/module/skia/types/Paragraph/TextStyle.d.ts +62 -0
- package/lib/module/skia/types/Paragraph/TextStyle.js +26 -0
- package/lib/module/skia/types/Paragraph/TextStyle.js.map +1 -0
- package/lib/module/skia/types/Paragraph/index.d.ts +6 -0
- package/lib/module/skia/types/Paragraph/index.js +7 -0
- package/lib/module/skia/types/Paragraph/index.js.map +1 -0
- package/lib/module/skia/types/Skia.d.ts +2 -0
- package/lib/module/skia/types/Skia.js.map +1 -1
- package/lib/module/skia/types/index.d.ts +1 -0
- package/lib/module/skia/types/index.js +1 -0
- package/lib/module/skia/types/index.js.map +1 -1
- package/lib/module/skia/web/JsiSkImage.js +0 -6
- package/lib/module/skia/web/JsiSkImage.js.map +1 -1
- package/lib/module/skia/web/JsiSkParagraph.d.ts +16 -0
- package/lib/module/skia/web/JsiSkParagraph.js +81 -0
- package/lib/module/skia/web/JsiSkParagraph.js.map +1 -0
- package/lib/module/skia/web/JsiSkParagraphBuilder.d.ts +15 -0
- package/lib/module/skia/web/JsiSkParagraphBuilder.js +73 -0
- package/lib/module/skia/web/JsiSkParagraphBuilder.js.map +1 -0
- package/lib/module/skia/web/JsiSkParagraphBuilderFactory.d.ts +8 -0
- package/lib/module/skia/web/JsiSkParagraphBuilderFactory.js +21 -0
- package/lib/module/skia/web/JsiSkParagraphBuilderFactory.js.map +1 -0
- package/lib/module/skia/web/JsiSkParagraphStyle.d.ts +5 -0
- package/lib/module/skia/web/JsiSkParagraphStyle.js +49 -0
- package/lib/module/skia/web/JsiSkParagraphStyle.js.map +1 -0
- package/lib/module/skia/web/JsiSkTextStyle.d.ts +5 -0
- package/lib/module/skia/web/JsiSkTextStyle.js +45 -0
- package/lib/module/skia/web/JsiSkTextStyle.js.map +1 -0
- package/lib/module/skia/web/JsiSkia.js +3 -1
- package/lib/module/skia/web/JsiSkia.js.map +1 -1
- package/lib/typescript/src/dom/nodes/JsiSkDOM.d.ts +2 -0
- package/lib/typescript/src/dom/nodes/drawings/ParagraphNode.d.ts +8 -0
- package/lib/typescript/src/dom/types/NodeType.d.ts +2 -1
- package/lib/typescript/src/dom/types/Paragraph.d.ts +8 -0
- package/lib/typescript/src/dom/types/SkDOM.d.ts +2 -0
- package/lib/typescript/src/dom/types/index.d.ts +1 -0
- package/lib/typescript/src/renderer/HostComponents.d.ts +3 -1
- package/lib/typescript/src/renderer/components/index.d.ts +1 -0
- package/lib/typescript/src/renderer/components/paragraph/Paragraph.d.ts +4 -0
- package/lib/typescript/src/renderer/components/paragraph/index.d.ts +1 -0
- package/lib/typescript/src/skia/types/Paragraph/Paragraph.d.ts +56 -0
- package/lib/typescript/src/skia/types/Paragraph/ParagraphBuilder.d.ts +60 -0
- package/lib/typescript/src/skia/types/Paragraph/ParagraphStyle.d.ts +41 -0
- package/lib/typescript/src/skia/types/Paragraph/TextStyle.d.ts +62 -0
- package/lib/typescript/src/skia/types/Paragraph/index.d.ts +6 -0
- package/lib/typescript/src/skia/types/Skia.d.ts +2 -0
- package/lib/typescript/src/skia/types/index.d.ts +1 -0
- package/lib/typescript/src/skia/web/JsiSkParagraph.d.ts +16 -0
- package/lib/typescript/src/skia/web/JsiSkParagraphBuilder.d.ts +15 -0
- package/lib/typescript/src/skia/web/JsiSkParagraphBuilderFactory.d.ts +8 -0
- package/lib/typescript/src/skia/web/JsiSkParagraphStyle.d.ts +5 -0
- package/lib/typescript/src/skia/web/JsiSkTextStyle.d.ts +5 -0
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
- package/libs/ios/libskottie.xcframework/Info.plist +5 -5
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
- package/libs/ios/libskparagraph.xcframework/Info.plist +5 -5
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e/libskparagraph.a +0 -0
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
- package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e/libskunicode.a +0 -0
- package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode.a +0 -0
- package/libs/ios/libsvg.xcframework/Info.plist +5 -5
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
- package/package.json +1 -1
- package/src/dom/nodes/JsiSkDOM.ts +9 -0
- package/src/dom/nodes/drawings/ParagraphNode.ts +22 -0
- package/src/dom/types/NodeType.ts +3 -0
- package/src/dom/types/Paragraph.ts +10 -0
- package/src/dom/types/SkDOM.ts +4 -0
- package/src/dom/types/index.ts +1 -0
- package/src/renderer/HostComponents.ts +10 -0
- package/src/renderer/components/index.ts +2 -0
- package/src/renderer/components/paragraph/Paragraph.tsx +8 -0
- package/src/renderer/components/paragraph/index.ts +1 -0
- package/src/skia/types/Paragraph/Paragraph.ts +59 -0
- package/src/skia/types/Paragraph/ParagraphBuilder.ts +96 -0
- package/src/skia/types/Paragraph/ParagraphStyle.ts +45 -0
- package/src/skia/types/Paragraph/TextStyle.ts +70 -0
- package/src/skia/types/Paragraph/index.ts +6 -0
- package/src/skia/types/Skia.ts +3 -0
- package/src/skia/types/index.ts +1 -0
- package/src/skia/web/JsiSkImage.ts +0 -6
- package/src/skia/web/JsiSkParagraph.ts +69 -0
- package/src/skia/web/JsiSkParagraphBuilder.ts +99 -0
- package/src/skia/web/JsiSkParagraphBuilderFactory.ts +42 -0
- package/src/skia/web/JsiSkParagraphStyle.ts +65 -0
- package/src/skia/web/JsiSkTextStyle.ts +53 -0
- package/src/skia/web/JsiSkia.ts +2 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "DerivedNodeProp.h"
|
|
4
|
+
|
|
5
|
+
#include "JsiSkParagraph.h"
|
|
6
|
+
|
|
7
|
+
#include <memory>
|
|
8
|
+
#include <string>
|
|
9
|
+
|
|
10
|
+
namespace RNSkia {
|
|
11
|
+
|
|
12
|
+
class ParagraphProp : public DerivedProp<para::Paragraph *> {
|
|
13
|
+
public:
|
|
14
|
+
explicit ParagraphProp(PropId name,
|
|
15
|
+
const std::function<void(BaseNodeProp *)> &onChange)
|
|
16
|
+
: DerivedProp<para::Paragraph *>(onChange) {
|
|
17
|
+
_paragraphProp = defineProperty<NodeProp>(name);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
void updateDerivedValue() override {
|
|
21
|
+
if (_paragraphProp->isSet()) {
|
|
22
|
+
if (_paragraphProp->value().getType() != PropType::HostObject) {
|
|
23
|
+
throw std::runtime_error("Expected Paragraph object for the " +
|
|
24
|
+
std::string(getName()) + " property.");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
auto ptr = std::dynamic_pointer_cast<JsiSkParagraph>(
|
|
28
|
+
_paragraphProp->value().getAsHostObject());
|
|
29
|
+
|
|
30
|
+
if (ptr == nullptr) {
|
|
31
|
+
throw std::runtime_error("Expected paragraph object for the " +
|
|
32
|
+
std::string(getName()) + " property.");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
setDerivedValue(ptr->getParagraph());
|
|
36
|
+
} else {
|
|
37
|
+
setDerivedValue(nullptr);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private:
|
|
42
|
+
NodeProp *_paragraphProp;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
} // namespace RNSkia
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2020 Google LLC
|
|
3
|
+
*
|
|
4
|
+
* Use of this source code is governed by a BSD-style license that can be
|
|
5
|
+
* found in the LICENSE file.
|
|
6
|
+
*/
|
|
7
|
+
#ifndef SkUnicode_DEFINED
|
|
8
|
+
#define SkUnicode_DEFINED
|
|
9
|
+
#include "include/core/SkSpan.h"
|
|
10
|
+
#include "include/core/SkString.h"
|
|
11
|
+
#include "include/core/SkTypes.h"
|
|
12
|
+
#include "include/private/base/SkTArray.h"
|
|
13
|
+
#include "include/private/base/SkTo.h"
|
|
14
|
+
#include "src/base/SkUTF.h"
|
|
15
|
+
|
|
16
|
+
#include <cstddef>
|
|
17
|
+
#include <cstdint>
|
|
18
|
+
#include <memory>
|
|
19
|
+
#include <string>
|
|
20
|
+
#include <vector>
|
|
21
|
+
|
|
22
|
+
#if !defined(SKUNICODE_IMPLEMENTATION)
|
|
23
|
+
#define SKUNICODE_IMPLEMENTATION 0
|
|
24
|
+
#endif
|
|
25
|
+
|
|
26
|
+
#if !defined(SKUNICODE_API)
|
|
27
|
+
#if defined(SKUNICODE_DLL)
|
|
28
|
+
#if defined(_MSC_VER)
|
|
29
|
+
#if SKUNICODE_IMPLEMENTATION
|
|
30
|
+
#define SKUNICODE_API __declspec(dllexport)
|
|
31
|
+
#else
|
|
32
|
+
#define SKUNICODE_API __declspec(dllimport)
|
|
33
|
+
#endif
|
|
34
|
+
#else
|
|
35
|
+
#define SKUNICODE_API __attribute__((visibility("default")))
|
|
36
|
+
#endif
|
|
37
|
+
#else
|
|
38
|
+
#define SKUNICODE_API
|
|
39
|
+
#endif
|
|
40
|
+
#endif
|
|
41
|
+
|
|
42
|
+
namespace sknonstd {
|
|
43
|
+
template <typename T> struct is_bitmask_enum;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
class SKUNICODE_API SkBidiIterator {
|
|
47
|
+
public:
|
|
48
|
+
typedef int32_t Position;
|
|
49
|
+
typedef uint8_t Level;
|
|
50
|
+
struct Region {
|
|
51
|
+
Region(Position start, Position end, Level level)
|
|
52
|
+
: start(start), end(end), level(level) { }
|
|
53
|
+
Position start;
|
|
54
|
+
Position end;
|
|
55
|
+
Level level;
|
|
56
|
+
};
|
|
57
|
+
enum Direction {
|
|
58
|
+
kLTR,
|
|
59
|
+
kRTL,
|
|
60
|
+
};
|
|
61
|
+
virtual ~SkBidiIterator() = default;
|
|
62
|
+
virtual Position getLength() = 0;
|
|
63
|
+
virtual Level getLevelAt(Position) = 0;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
class SKUNICODE_API SkBreakIterator {
|
|
67
|
+
public:
|
|
68
|
+
typedef int32_t Position;
|
|
69
|
+
typedef int32_t Status;
|
|
70
|
+
virtual ~SkBreakIterator() = default;
|
|
71
|
+
virtual Position first() = 0;
|
|
72
|
+
virtual Position current() = 0;
|
|
73
|
+
virtual Position next() = 0;
|
|
74
|
+
virtual Status status() = 0;
|
|
75
|
+
virtual bool isDone() = 0;
|
|
76
|
+
virtual bool setText(const char utftext8[], int utf8Units) = 0;
|
|
77
|
+
virtual bool setText(const char16_t utftext16[], int utf16Units) = 0;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
class SKUNICODE_API SkUnicode {
|
|
81
|
+
public:
|
|
82
|
+
enum CodeUnitFlags {
|
|
83
|
+
kNoCodeUnitFlag = 0x00,
|
|
84
|
+
kPartOfWhiteSpaceBreak = 0x01,
|
|
85
|
+
kGraphemeStart = 0x02,
|
|
86
|
+
kSoftLineBreakBefore = 0x04,
|
|
87
|
+
kHardLineBreakBefore = 0x08,
|
|
88
|
+
kPartOfIntraWordBreak = 0x10,
|
|
89
|
+
kControl = 0x20,
|
|
90
|
+
kTabulation = 0x40,
|
|
91
|
+
kGlyphClusterStart = 0x80,
|
|
92
|
+
kIdeographic = 0x100,
|
|
93
|
+
kEmoji = 0x200,
|
|
94
|
+
kWordBreak = 0x400,
|
|
95
|
+
kSentenceBreak = 0x800,
|
|
96
|
+
};
|
|
97
|
+
enum class TextDirection {
|
|
98
|
+
kLTR,
|
|
99
|
+
kRTL,
|
|
100
|
+
};
|
|
101
|
+
typedef size_t Position;
|
|
102
|
+
typedef uint8_t BidiLevel;
|
|
103
|
+
struct BidiRegion {
|
|
104
|
+
BidiRegion(Position start, Position end, BidiLevel level)
|
|
105
|
+
: start(start), end(end), level(level) { }
|
|
106
|
+
Position start;
|
|
107
|
+
Position end;
|
|
108
|
+
BidiLevel level;
|
|
109
|
+
};
|
|
110
|
+
enum class LineBreakType {
|
|
111
|
+
kSoftLineBreak = 0,
|
|
112
|
+
kHardLineBreak = 100,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
enum class BreakType { kWords, kGraphemes, kLines, kSentences };
|
|
116
|
+
struct LineBreakBefore {
|
|
117
|
+
LineBreakBefore(Position pos, LineBreakType breakType)
|
|
118
|
+
: pos(pos), breakType(breakType) { }
|
|
119
|
+
Position pos;
|
|
120
|
+
LineBreakType breakType;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
virtual ~SkUnicode() = default;
|
|
124
|
+
|
|
125
|
+
virtual SkString toUpper(const SkString&) = 0;
|
|
126
|
+
|
|
127
|
+
virtual bool isControl(SkUnichar utf8) = 0;
|
|
128
|
+
virtual bool isWhitespace(SkUnichar utf8) = 0;
|
|
129
|
+
virtual bool isSpace(SkUnichar utf8) = 0;
|
|
130
|
+
virtual bool isTabulation(SkUnichar utf8) = 0;
|
|
131
|
+
virtual bool isHardBreak(SkUnichar utf8) = 0;
|
|
132
|
+
virtual bool isEmoji(SkUnichar utf8) = 0;
|
|
133
|
+
virtual bool isIdeographic(SkUnichar utf8) = 0;
|
|
134
|
+
|
|
135
|
+
// Methods used in SkShaper and SkText
|
|
136
|
+
virtual std::unique_ptr<SkBidiIterator> makeBidiIterator
|
|
137
|
+
(const uint16_t text[], int count, SkBidiIterator::Direction) = 0;
|
|
138
|
+
virtual std::unique_ptr<SkBidiIterator> makeBidiIterator
|
|
139
|
+
(const char text[], int count, SkBidiIterator::Direction) = 0;
|
|
140
|
+
virtual std::unique_ptr<SkBreakIterator> makeBreakIterator
|
|
141
|
+
(const char locale[], BreakType breakType) = 0;
|
|
142
|
+
virtual std::unique_ptr<SkBreakIterator> makeBreakIterator(BreakType type) = 0;
|
|
143
|
+
|
|
144
|
+
// Methods used in SkParagraph
|
|
145
|
+
static bool hasTabulationFlag(SkUnicode::CodeUnitFlags flags);
|
|
146
|
+
static bool hasHardLineBreakFlag(SkUnicode::CodeUnitFlags flags);
|
|
147
|
+
static bool hasSoftLineBreakFlag(SkUnicode::CodeUnitFlags flags);
|
|
148
|
+
static bool hasGraphemeStartFlag(SkUnicode::CodeUnitFlags flags);
|
|
149
|
+
static bool hasControlFlag(SkUnicode::CodeUnitFlags flags);
|
|
150
|
+
static bool hasPartOfWhiteSpaceBreakFlag(SkUnicode::CodeUnitFlags flags);
|
|
151
|
+
|
|
152
|
+
static bool extractBidi(const char utf8[],
|
|
153
|
+
int utf8Units,
|
|
154
|
+
TextDirection dir,
|
|
155
|
+
std::vector<BidiRegion>* bidiRegions);
|
|
156
|
+
virtual bool getBidiRegions(const char utf8[],
|
|
157
|
+
int utf8Units,
|
|
158
|
+
TextDirection dir,
|
|
159
|
+
std::vector<BidiRegion>* results) = 0;
|
|
160
|
+
// Returns results in utf16
|
|
161
|
+
virtual bool getWords(const char utf8[], int utf8Units, const char* locale,
|
|
162
|
+
std::vector<Position>* results) = 0;
|
|
163
|
+
virtual bool getUtf8Words(const char utf8[],
|
|
164
|
+
int utf8Units,
|
|
165
|
+
const char* locale,
|
|
166
|
+
std::vector<Position>* results) = 0;
|
|
167
|
+
virtual bool getSentences(const char utf8[],
|
|
168
|
+
int utf8Units,
|
|
169
|
+
const char* locale,
|
|
170
|
+
std::vector<Position>* results) = 0;
|
|
171
|
+
virtual bool computeCodeUnitFlags(
|
|
172
|
+
char utf8[], int utf8Units, bool replaceTabs,
|
|
173
|
+
skia_private::TArray<SkUnicode::CodeUnitFlags, true>* results) = 0;
|
|
174
|
+
virtual bool computeCodeUnitFlags(
|
|
175
|
+
char16_t utf16[], int utf16Units, bool replaceTabs,
|
|
176
|
+
skia_private::TArray<SkUnicode::CodeUnitFlags, true>* results) = 0;
|
|
177
|
+
|
|
178
|
+
static SkString convertUtf16ToUtf8(const char16_t * utf16, int utf16Units);
|
|
179
|
+
static SkString convertUtf16ToUtf8(const std::u16string& utf16);
|
|
180
|
+
static std::u16string convertUtf8ToUtf16(const char* utf8, int utf8Units);
|
|
181
|
+
static std::u16string convertUtf8ToUtf16(const SkString& utf8);
|
|
182
|
+
|
|
183
|
+
template <typename Appender8, typename Appender16>
|
|
184
|
+
static bool extractUtfConversionMapping(SkSpan<const char> utf8, Appender8&& appender8, Appender16&& appender16) {
|
|
185
|
+
size_t size8 = 0;
|
|
186
|
+
size_t size16 = 0;
|
|
187
|
+
auto ptr = utf8.begin();
|
|
188
|
+
auto end = utf8.end();
|
|
189
|
+
while (ptr < end) {
|
|
190
|
+
|
|
191
|
+
size_t index = SkToSizeT(ptr - utf8.begin());
|
|
192
|
+
SkUnichar u = SkUTF::NextUTF8(&ptr, end);
|
|
193
|
+
|
|
194
|
+
// All UTF8 code units refer to the same codepoint
|
|
195
|
+
size_t next = SkToSizeT(ptr - utf8.begin());
|
|
196
|
+
for (auto i = index; i < next; ++i) {
|
|
197
|
+
//fUTF16IndexForUTF8Index.emplace_back(fUTF8IndexForUTF16Index.size());
|
|
198
|
+
appender16(size8);
|
|
199
|
+
++size16;
|
|
200
|
+
}
|
|
201
|
+
//SkASSERT(fUTF16IndexForUTF8Index.size() == next);
|
|
202
|
+
SkASSERT(size16 == next);
|
|
203
|
+
if (size16 != next) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// One or two UTF16 code units refer to the same codepoint
|
|
208
|
+
uint16_t buffer[2];
|
|
209
|
+
size_t count = SkUTF::ToUTF16(u, buffer);
|
|
210
|
+
//fUTF8IndexForUTF16Index.emplace_back(index);
|
|
211
|
+
appender8(index);
|
|
212
|
+
++size8;
|
|
213
|
+
if (count > 1) {
|
|
214
|
+
//fUTF8IndexForUTF16Index.emplace_back(index);
|
|
215
|
+
appender8(index);
|
|
216
|
+
++size8;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//fUTF16IndexForUTF8Index.emplace_back(fUTF8IndexForUTF16Index.size());
|
|
220
|
+
appender16(size8);
|
|
221
|
+
++size16;
|
|
222
|
+
//fUTF8IndexForUTF16Index.emplace_back(fText.size());
|
|
223
|
+
appender8(utf8.size());
|
|
224
|
+
++size8;
|
|
225
|
+
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
template <typename Callback>
|
|
230
|
+
void forEachCodepoint(const char* utf8, int32_t utf8Units, Callback&& callback) {
|
|
231
|
+
const char* current = utf8;
|
|
232
|
+
const char* end = utf8 + utf8Units;
|
|
233
|
+
while (current < end) {
|
|
234
|
+
auto before = current - utf8;
|
|
235
|
+
SkUnichar unichar = SkUTF::NextUTF8(¤t, end);
|
|
236
|
+
if (unichar < 0) unichar = 0xFFFD;
|
|
237
|
+
auto after = current - utf8;
|
|
238
|
+
uint16_t buffer[2];
|
|
239
|
+
size_t count = SkUTF::ToUTF16(unichar, buffer);
|
|
240
|
+
callback(unichar, before, after, count);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
template <typename Callback>
|
|
245
|
+
void forEachCodepoint(const char16_t* utf16, int32_t utf16Units, Callback&& callback) {
|
|
246
|
+
const char16_t* current = utf16;
|
|
247
|
+
const char16_t* end = utf16 + utf16Units;
|
|
248
|
+
while (current < end) {
|
|
249
|
+
auto before = current - utf16;
|
|
250
|
+
SkUnichar unichar = SkUTF::NextUTF16((const uint16_t**)¤t, (const uint16_t*)end);
|
|
251
|
+
auto after = current - utf16;
|
|
252
|
+
callback(unichar, before, after);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
template <typename Callback>
|
|
257
|
+
void forEachBidiRegion(const uint16_t utf16[], int utf16Units, SkBidiIterator::Direction dir, Callback&& callback) {
|
|
258
|
+
auto iter = makeBidiIterator(utf16, utf16Units, dir);
|
|
259
|
+
const uint16_t* start16 = utf16;
|
|
260
|
+
const uint16_t* end16 = utf16 + utf16Units;
|
|
261
|
+
SkBidiIterator::Level currentLevel = 0;
|
|
262
|
+
|
|
263
|
+
SkBidiIterator::Position pos16 = 0;
|
|
264
|
+
while (pos16 <= iter->getLength()) {
|
|
265
|
+
auto level = iter->getLevelAt(pos16);
|
|
266
|
+
if (pos16 == 0) {
|
|
267
|
+
currentLevel = level;
|
|
268
|
+
} else if (level != currentLevel) {
|
|
269
|
+
callback(pos16, start16 - utf16, currentLevel);
|
|
270
|
+
currentLevel = level;
|
|
271
|
+
}
|
|
272
|
+
if (start16 == end16) {
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
SkUnichar u = SkUTF::NextUTF16(&start16, end16);
|
|
276
|
+
pos16 += SkUTF::ToUTF16(u);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
template <typename Callback>
|
|
281
|
+
void forEachBreak(const char16_t utf16[], int utf16Units, SkUnicode::BreakType type, Callback&& callback) {
|
|
282
|
+
auto iter = makeBreakIterator(type);
|
|
283
|
+
iter->setText(utf16, utf16Units);
|
|
284
|
+
auto pos = iter->first();
|
|
285
|
+
do {
|
|
286
|
+
callback(pos, iter->status());
|
|
287
|
+
pos = iter->next();
|
|
288
|
+
} while (!iter->isDone());
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
virtual void reorderVisual(const BidiLevel runLevels[], int levelsCount, int32_t logicalFromVisual[]) = 0;
|
|
292
|
+
|
|
293
|
+
virtual std::unique_ptr<SkUnicode> copy() = 0;
|
|
294
|
+
|
|
295
|
+
static std::unique_ptr<SkUnicode> Make();
|
|
296
|
+
|
|
297
|
+
static std::unique_ptr<SkUnicode> MakeIcuBasedUnicode();
|
|
298
|
+
|
|
299
|
+
static std::unique_ptr<SkUnicode> MakeClientBasedUnicode(
|
|
300
|
+
SkSpan<char> text,
|
|
301
|
+
std::vector<SkUnicode::Position> words,
|
|
302
|
+
std::vector<SkUnicode::Position> graphemeBreaks,
|
|
303
|
+
std::vector<SkUnicode::LineBreakBefore> lineBreaks);
|
|
304
|
+
|
|
305
|
+
static std::unique_ptr<SkUnicode> MakeLibgraphemeBasedUnicode();
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
namespace sknonstd {
|
|
309
|
+
template <> struct is_bitmask_enum<SkUnicode::CodeUnitFlags> : std::true_type {};
|
|
310
|
+
} // namespace sknonstd
|
|
311
|
+
|
|
312
|
+
#endif // SkUnicode_DEFINED
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2012 Google Inc.
|
|
3
|
+
*
|
|
4
|
+
* Use of this source code is governed by a BSD-style license that can be
|
|
5
|
+
* found in the LICENSE file.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#ifndef SkTInternalLList_DEFINED
|
|
9
|
+
#define SkTInternalLList_DEFINED
|
|
10
|
+
|
|
11
|
+
#include "include/private/base/SkAssert.h"
|
|
12
|
+
#include "include/private/base/SkDebug.h"
|
|
13
|
+
#include "include/private/base/SkTo.h"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* This macro creates the member variables required by the SkTInternalLList class. It should be
|
|
17
|
+
* placed in the private section of any class that will be stored in a double linked list.
|
|
18
|
+
*/
|
|
19
|
+
#define SK_DECLARE_INTERNAL_LLIST_INTERFACE(ClassName) \
|
|
20
|
+
friend class SkTInternalLList<ClassName>; \
|
|
21
|
+
/* back pointer to the owning list - for debugging */ \
|
|
22
|
+
SkDEBUGCODE(SkTInternalLList<ClassName>* fList = nullptr;) \
|
|
23
|
+
ClassName* fPrev = nullptr; \
|
|
24
|
+
ClassName* fNext = nullptr
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* This class implements a templated internal doubly linked list data structure.
|
|
28
|
+
*/
|
|
29
|
+
template <class T> class SkTInternalLList {
|
|
30
|
+
public:
|
|
31
|
+
SkTInternalLList() {}
|
|
32
|
+
|
|
33
|
+
void reset() {
|
|
34
|
+
fHead = nullptr;
|
|
35
|
+
fTail = nullptr;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
void remove(T* entry) {
|
|
39
|
+
SkASSERT(fHead && fTail);
|
|
40
|
+
SkASSERT(this->isInList(entry));
|
|
41
|
+
|
|
42
|
+
T* prev = entry->fPrev;
|
|
43
|
+
T* next = entry->fNext;
|
|
44
|
+
|
|
45
|
+
if (prev) {
|
|
46
|
+
prev->fNext = next;
|
|
47
|
+
} else {
|
|
48
|
+
fHead = next;
|
|
49
|
+
}
|
|
50
|
+
if (next) {
|
|
51
|
+
next->fPrev = prev;
|
|
52
|
+
} else {
|
|
53
|
+
fTail = prev;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
entry->fPrev = nullptr;
|
|
57
|
+
entry->fNext = nullptr;
|
|
58
|
+
|
|
59
|
+
#ifdef SK_DEBUG
|
|
60
|
+
entry->fList = nullptr;
|
|
61
|
+
#endif
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
void addToHead(T* entry) {
|
|
65
|
+
SkASSERT(nullptr == entry->fPrev && nullptr == entry->fNext);
|
|
66
|
+
SkASSERT(nullptr == entry->fList);
|
|
67
|
+
|
|
68
|
+
entry->fPrev = nullptr;
|
|
69
|
+
entry->fNext = fHead;
|
|
70
|
+
if (fHead) {
|
|
71
|
+
fHead->fPrev = entry;
|
|
72
|
+
}
|
|
73
|
+
fHead = entry;
|
|
74
|
+
if (nullptr == fTail) {
|
|
75
|
+
fTail = entry;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#ifdef SK_DEBUG
|
|
79
|
+
entry->fList = this;
|
|
80
|
+
#endif
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
void addToTail(T* entry) {
|
|
84
|
+
SkASSERT(nullptr == entry->fPrev && nullptr == entry->fNext);
|
|
85
|
+
SkASSERT(nullptr == entry->fList);
|
|
86
|
+
|
|
87
|
+
entry->fPrev = fTail;
|
|
88
|
+
entry->fNext = nullptr;
|
|
89
|
+
if (fTail) {
|
|
90
|
+
fTail->fNext = entry;
|
|
91
|
+
}
|
|
92
|
+
fTail = entry;
|
|
93
|
+
if (nullptr == fHead) {
|
|
94
|
+
fHead = entry;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
#ifdef SK_DEBUG
|
|
98
|
+
entry->fList = this;
|
|
99
|
+
#endif
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Inserts a new list entry before an existing list entry. The new entry must not already be
|
|
104
|
+
* a member of this or any other list. If existingEntry is NULL then the new entry is added
|
|
105
|
+
* at the tail.
|
|
106
|
+
*/
|
|
107
|
+
void addBefore(T* newEntry, T* existingEntry) {
|
|
108
|
+
SkASSERT(newEntry);
|
|
109
|
+
|
|
110
|
+
if (nullptr == existingEntry) {
|
|
111
|
+
this->addToTail(newEntry);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
SkASSERT(this->isInList(existingEntry));
|
|
116
|
+
newEntry->fNext = existingEntry;
|
|
117
|
+
T* prev = existingEntry->fPrev;
|
|
118
|
+
existingEntry->fPrev = newEntry;
|
|
119
|
+
newEntry->fPrev = prev;
|
|
120
|
+
if (nullptr == prev) {
|
|
121
|
+
SkASSERT(fHead == existingEntry);
|
|
122
|
+
fHead = newEntry;
|
|
123
|
+
} else {
|
|
124
|
+
prev->fNext = newEntry;
|
|
125
|
+
}
|
|
126
|
+
#ifdef SK_DEBUG
|
|
127
|
+
newEntry->fList = this;
|
|
128
|
+
#endif
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Inserts a new list entry after an existing list entry. The new entry must not already be
|
|
133
|
+
* a member of this or any other list. If existingEntry is NULL then the new entry is added
|
|
134
|
+
* at the head.
|
|
135
|
+
*/
|
|
136
|
+
void addAfter(T* newEntry, T* existingEntry) {
|
|
137
|
+
SkASSERT(newEntry);
|
|
138
|
+
|
|
139
|
+
if (nullptr == existingEntry) {
|
|
140
|
+
this->addToHead(newEntry);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
SkASSERT(this->isInList(existingEntry));
|
|
145
|
+
newEntry->fPrev = existingEntry;
|
|
146
|
+
T* next = existingEntry->fNext;
|
|
147
|
+
existingEntry->fNext = newEntry;
|
|
148
|
+
newEntry->fNext = next;
|
|
149
|
+
if (nullptr == next) {
|
|
150
|
+
SkASSERT(fTail == existingEntry);
|
|
151
|
+
fTail = newEntry;
|
|
152
|
+
} else {
|
|
153
|
+
next->fPrev = newEntry;
|
|
154
|
+
}
|
|
155
|
+
#ifdef SK_DEBUG
|
|
156
|
+
newEntry->fList = this;
|
|
157
|
+
#endif
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
void concat(SkTInternalLList&& list) {
|
|
161
|
+
if (list.isEmpty()) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
list.fHead->fPrev = fTail;
|
|
166
|
+
if (!fHead) {
|
|
167
|
+
SkASSERT(!list.fHead->fPrev);
|
|
168
|
+
fHead = list.fHead;
|
|
169
|
+
} else {
|
|
170
|
+
SkASSERT(fTail);
|
|
171
|
+
fTail->fNext = list.fHead;
|
|
172
|
+
}
|
|
173
|
+
fTail = list.fTail;
|
|
174
|
+
|
|
175
|
+
#ifdef SK_DEBUG
|
|
176
|
+
for (T* node = list.fHead; node; node = node->fNext) {
|
|
177
|
+
SkASSERT(node->fList == &list);
|
|
178
|
+
node->fList = this;
|
|
179
|
+
}
|
|
180
|
+
#endif
|
|
181
|
+
|
|
182
|
+
list.fHead = list.fTail = nullptr;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
bool isEmpty() const {
|
|
186
|
+
SkASSERT(SkToBool(fHead) == SkToBool(fTail));
|
|
187
|
+
return !fHead;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
T* head() const { return fHead; }
|
|
191
|
+
T* tail() const { return fTail; }
|
|
192
|
+
|
|
193
|
+
class Iter {
|
|
194
|
+
public:
|
|
195
|
+
enum IterStart {
|
|
196
|
+
kHead_IterStart,
|
|
197
|
+
kTail_IterStart
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
Iter() : fCurr(nullptr) {}
|
|
201
|
+
Iter(const Iter& iter) : fCurr(iter.fCurr) {}
|
|
202
|
+
Iter& operator= (const Iter& iter) { fCurr = iter.fCurr; return *this; }
|
|
203
|
+
|
|
204
|
+
T* init(const SkTInternalLList& list, IterStart startLoc) {
|
|
205
|
+
if (kHead_IterStart == startLoc) {
|
|
206
|
+
fCurr = list.fHead;
|
|
207
|
+
} else {
|
|
208
|
+
SkASSERT(kTail_IterStart == startLoc);
|
|
209
|
+
fCurr = list.fTail;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return fCurr;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
T* get() { return fCurr; }
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Return the next/previous element in the list or NULL if at the end.
|
|
219
|
+
*/
|
|
220
|
+
T* next() {
|
|
221
|
+
if (nullptr == fCurr) {
|
|
222
|
+
return nullptr;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
fCurr = fCurr->fNext;
|
|
226
|
+
return fCurr;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
T* prev() {
|
|
230
|
+
if (nullptr == fCurr) {
|
|
231
|
+
return nullptr;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
fCurr = fCurr->fPrev;
|
|
235
|
+
return fCurr;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* C++11 range-for interface.
|
|
240
|
+
*/
|
|
241
|
+
bool operator!=(const Iter& that) { return fCurr != that.fCurr; }
|
|
242
|
+
T* operator*() { return this->get(); }
|
|
243
|
+
void operator++() { this->next(); }
|
|
244
|
+
|
|
245
|
+
private:
|
|
246
|
+
T* fCurr;
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
Iter begin() const {
|
|
250
|
+
Iter iter;
|
|
251
|
+
iter.init(*this, Iter::kHead_IterStart);
|
|
252
|
+
return iter;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
Iter end() const { return Iter(); }
|
|
256
|
+
|
|
257
|
+
#ifdef SK_DEBUG
|
|
258
|
+
void validate() const {
|
|
259
|
+
SkASSERT(!fHead == !fTail);
|
|
260
|
+
Iter iter;
|
|
261
|
+
for (T* item = iter.init(*this, Iter::kHead_IterStart); item; item = iter.next()) {
|
|
262
|
+
SkASSERT(this->isInList(item));
|
|
263
|
+
if (nullptr == item->fPrev) {
|
|
264
|
+
SkASSERT(fHead == item);
|
|
265
|
+
} else {
|
|
266
|
+
SkASSERT(item->fPrev->fNext == item);
|
|
267
|
+
}
|
|
268
|
+
if (nullptr == item->fNext) {
|
|
269
|
+
SkASSERT(fTail == item);
|
|
270
|
+
} else {
|
|
271
|
+
SkASSERT(item->fNext->fPrev == item);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Debugging-only method that uses the list back pointer to check if 'entry' is indeed in 'this'
|
|
278
|
+
* list.
|
|
279
|
+
*/
|
|
280
|
+
bool isInList(const T* entry) const {
|
|
281
|
+
return entry->fList == this;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Debugging-only method that laboriously counts the list entries.
|
|
286
|
+
*/
|
|
287
|
+
int countEntries() const {
|
|
288
|
+
int count = 0;
|
|
289
|
+
for (T* entry = fHead; entry; entry = entry->fNext) {
|
|
290
|
+
++count;
|
|
291
|
+
}
|
|
292
|
+
return count;
|
|
293
|
+
}
|
|
294
|
+
#endif // SK_DEBUG
|
|
295
|
+
|
|
296
|
+
private:
|
|
297
|
+
T* fHead = nullptr;
|
|
298
|
+
T* fTail = nullptr;
|
|
299
|
+
|
|
300
|
+
SkTInternalLList(const SkTInternalLList&) = delete;
|
|
301
|
+
SkTInternalLList& operator=(const SkTInternalLList&) = delete;
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
#endif
|