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

Unified Diff: src/core/SkAdvancedTypefaceMetrics.h

Issue 1953153004: SkAdvancedTypefaceMetrics: abstract out linked list (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2016-05-06 (Friday) 17:00:24 EDT Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gyp/pdf.gypi ('k') | src/core/SkAdvancedTypefaceMetrics.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkAdvancedTypefaceMetrics.h
diff --git a/src/core/SkAdvancedTypefaceMetrics.h b/src/core/SkAdvancedTypefaceMetrics.h
index eae73182158f013847c35b7561c20c45b0c3d2a4..5e7e59331f73e44bbf65a14537fb6f5c15742e93 100644
--- a/src/core/SkAdvancedTypefaceMetrics.h
+++ b/src/core/SkAdvancedTypefaceMetrics.h
@@ -14,34 +14,7 @@
#include "SkString.h"
#include "SkTDArray.h"
#include "SkTemplates.h"
-
-// Whatever std::unique_ptr Clank's using doesn't seem to work with AdvanceMetric's
-// style of forward-declaration. Probably just a bug in an old libc++ / libstdc++.
-// For now, hack around it with our own smart pointer. It'd be nice to clean up.
-template <typename T>
-class SkHackyAutoTDelete : SkNoncopyable {
-public:
- explicit SkHackyAutoTDelete(T* ptr = nullptr) : fPtr(ptr) {}
- ~SkHackyAutoTDelete() { delete fPtr; }
-
- T* get() const { return fPtr; }
- T* operator->() const { return fPtr; }
-
- void reset(T* ptr = nullptr) {
- if (ptr != fPtr) {
- delete fPtr;
- fPtr = ptr;
- }
- }
- T* release() {
- T* ptr = fPtr;
- fPtr = nullptr;
- return ptr;
- }
-
-private:
- T* fPtr;
-};
+#include "SkSinglyLinkedList.h"
/** \class SkAdvancedTypefaceMetrics
@@ -68,6 +41,29 @@ public:
~SkAdvancedTypefaceMetrics();
+ /** Retrieve advance data for glyphs. Used by the PDF backend. It
+ calls underlying platform dependent API getAdvance to acquire
+ the data.
+ @param num_glyphs Total number of glyphs in the given font.
+ @param glyphIDs For per-glyph info, specify subset of the
+ font by giving glyph ids. Each integer
+ represents a glyph id. Passing nullptr
+ means all glyphs in the font.
+ @param glyphIDsCount Number of elements in subsetGlyphIds.
+ Ignored if glyphIDs is nullptr.
+ @param getAdvance A function that takes a glyph id and
+ passes back advance data from the
+ typeface. Returns false on failure.
+ */
+ template <typename FontHandle>
+ void setGlyphWidths(FontHandle fontHandle,
+ int num_glyphs,
+ const uint32_t* subsetGlyphIDs,
+ uint32_t subsetGlyphIDsLength,
+ bool (*getAdvance)(FontHandle fontHandle,
+ int gId,
+ int16_t* data));
+
SkString fFontName;
enum FontType {
@@ -126,7 +122,22 @@ public:
uint16_t fStartId;
uint16_t fEndId;
SkTDArray<Data> fAdvance;
- SkHackyAutoTDelete<AdvanceMetric<Data> > fNext;
+ AdvanceMetric(uint16_t startId) : fStartId(startId) {}
+ AdvanceMetric(AdvanceMetric&& other)
+ : fType(other.fType)
+ , fStartId(other.fStartId)
+ , fEndId(other.fEndId) {
+ fAdvance.swap(other.fAdvance);
+ }
+ AdvanceMetric& operator=(AdvanceMetric&& other) {
+ fType = other.fType;
+ fStartId = other.fStartId;
+ fEndId = other.fEndId;
+ fAdvance.swap(other.fAdvance);
+ return *this;
+ }
+ AdvanceMetric(const AdvanceMetric&) = delete;
+ AdvanceMetric& operator=(const AdvanceMetric&) = delete;
};
struct VerticalMetric {
@@ -138,9 +149,9 @@ public:
typedef AdvanceMetric<VerticalMetric> VerticalAdvanceRange;
// This is indexed by glyph id.
- SkAutoTDelete<WidthRange> fGlyphWidths;
+ SkSinglyLinkedList<WidthRange> fGlyphWidths;
// Only used for Vertical CID fonts.
- SkAutoTDelete<VerticalAdvanceRange> fVerticalMetrics;
+ SkSinglyLinkedList<VerticalAdvanceRange> fVerticalMetrics;
// The names of each glyph, only populated for postscript fonts.
SkAutoTDelete<SkAutoTArray<SkString> > fGlyphNames;
@@ -149,45 +160,13 @@ public:
// kToUnicode_PerGlyphInfo is passed to GetAdvancedTypefaceMetrics.
SkTDArray<SkUnichar> fGlyphToUnicode;
+ static void FinishRange(WidthRange* range,
+ int endId,
+ WidthRange::MetricType type);
+
private:
typedef SkRefCnt INHERITED;
};
-namespace skia_advanced_typeface_metrics_utils {
-
-template <typename Data>
-void resetRange(SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range,
- int startId);
-
-template <typename Data, template<typename> class AutoTDelete>
-SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* appendRange(
- AutoTDelete<SkAdvancedTypefaceMetrics::AdvanceMetric<Data> >* nextSlot,
- int startId);
-
-template <typename Data>
-void finishRange(
- SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range,
- int endId,
- typename SkAdvancedTypefaceMetrics::AdvanceMetric<Data>::MetricType
- type);
-
-/** Retrieve advance data for glyphs. Used by the PDF backend. It calls
- underlying platform dependent API getAdvance to acquire the data.
- @param num_glyphs Total number of glyphs in the given font.
- @param glyphIDs For per-glyph info, specify subset of the font by
- giving glyph ids. Each integer represents a glyph
- id. Passing nullptr means all glyphs in the font.
- @param glyphIDsCount Number of elements in subsetGlyphIds. Ignored if
- glyphIDs is nullptr.
-*/
-template <typename Data, typename FontHandle>
-SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData(
- FontHandle fontHandle,
- int num_glyphs,
- const uint32_t* glyphIDs,
- uint32_t glyphIDsCount,
- bool (*getAdvance)(FontHandle fontHandle, int gId, Data* data));
-
-} // namespace skia_advanced_typeface_metrics_utils
#endif
« no previous file with comments | « gyp/pdf.gypi ('k') | src/core/SkAdvancedTypefaceMetrics.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698