aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkDataTable.h15
-rw-r--r--include/ports/SkFontConfigInterface.h2
-rw-r--r--include/ports/SkFontMgr_indirect.h2
-rw-r--r--include/ports/SkRemotableFontMgr.h4
-rw-r--r--src/core/SkDataTable.cpp46
-rw-r--r--src/fonts/SkFontMgr_indirect.cpp2
-rw-r--r--src/ports/SkFontConfigInterface_direct.cpp6
-rw-r--r--src/ports/SkFontConfigInterface_direct.h2
-rw-r--r--src/ports/SkFontMgr_FontConfigInterface.cpp2
-rw-r--r--src/ports/SkFontMgr_fontconfig.cpp8
-rw-r--r--src/ports/SkRemotableFontMgr_win_dw.cpp2
-rw-r--r--tests/DataRefTest.cpp43
12 files changed, 62 insertions, 72 deletions
diff --git a/include/core/SkDataTable.h b/include/core/SkDataTable.h
index c9d915d255..2ec2d0f2e2 100644
--- a/include/core/SkDataTable.h
+++ b/include/core/SkDataTable.h
@@ -63,7 +63,7 @@ public:
typedef void (*FreeProc)(void* context);
- static SkDataTable* NewEmpty();
+ static sk_sp<SkDataTable> MakeEmpty();
/**
* Return a new DataTable that contains a copy of the data stored in each
@@ -74,8 +74,8 @@ public:
* ptrs[] array.
* @param count the number of array elements in ptrs[] and sizes[] to copy.
*/
- static SkDataTable* NewCopyArrays(const void * const * ptrs,
- const size_t sizes[], int count);
+ static sk_sp<SkDataTable> MakeCopyArrays(const void * const * ptrs,
+ const size_t sizes[], int count);
/**
* Return a new table that contains a copy of the data in array.
@@ -85,11 +85,10 @@ public:
* @param count the number of entries to be copied out of array. The number
* of bytes that will be copied is count * elemSize.
*/
- static SkDataTable* NewCopyArray(const void* array, size_t elemSize,
- int count);
+ static sk_sp<SkDataTable> MakeCopyArray(const void* array, size_t elemSize, int count);
- static SkDataTable* NewArrayProc(const void* array, size_t elemSize,
- int count, FreeProc proc, void* context);
+ static sk_sp<SkDataTable> MakeArrayProc(const void* array, size_t elemSize, int count,
+ FreeProc proc, void* context);
private:
struct Dir {
@@ -164,7 +163,7 @@ public:
* calls to append(). This call also clears any accumluated entries from
* this builder, so its count() will be 0 after this call.
*/
- SkDataTable* detachDataTable();
+ sk_sp<SkDataTable> detachDataTable();
private:
SkTDArray<SkDataTable::Dir> fDir;
diff --git a/include/ports/SkFontConfigInterface.h b/include/ports/SkFontConfigInterface.h
index 536768a8bf..30fc8a35fb 100644
--- a/include/ports/SkFontConfigInterface.h
+++ b/include/ports/SkFontConfigInterface.h
@@ -111,7 +111,7 @@ public:
// New APIS, which have default impls for now (which do nothing)
- virtual SkDataTable* getFamilyNames() { return SkDataTable::NewEmpty(); }
+ virtual sk_sp<SkDataTable> getFamilyNames() { return SkDataTable::MakeEmpty(); }
typedef SkRefCnt INHERITED;
};
diff --git a/include/ports/SkFontMgr_indirect.h b/include/ports/SkFontMgr_indirect.h
index d3f47cb82b..406a75a7ee 100644
--- a/include/ports/SkFontMgr_indirect.h
+++ b/include/ports/SkFontMgr_indirect.h
@@ -95,7 +95,7 @@ private:
mutable SkTArray<DataEntry> fDataCache;
mutable SkMutex fDataCacheMutex;
- mutable SkAutoTUnref<SkDataTable> fFamilyNames;
+ mutable sk_sp<SkDataTable> fFamilyNames;
mutable SkOnce fFamilyNamesInitOnce;
static void set_up_family_names(const SkFontMgr_Indirect* self);
diff --git a/include/ports/SkRemotableFontMgr.h b/include/ports/SkRemotableFontMgr.h
index ddc8e50a12..2e028cee26 100644
--- a/include/ports/SkRemotableFontMgr.h
+++ b/include/ports/SkRemotableFontMgr.h
@@ -61,10 +61,8 @@ public:
*
* The indexes may be used with getIndex(int) and
* matchIndexStyle(int, SkFontStyle).
- *
- * The caller must unref() the returned object.
*/
- virtual SkDataTable* getFamilyNames() const = 0;
+ virtual sk_sp<SkDataTable> getFamilyNames() const = 0;
/**
* Returns all of the fonts with the given familyIndex.
diff --git a/src/core/SkDataTable.cpp b/src/core/SkDataTable.cpp
index 32e30af64d..ea2b91b903 100644
--- a/src/core/SkDataTable.cpp
+++ b/src/core/SkDataTable.cpp
@@ -7,6 +7,7 @@
#include "SkData.h"
#include "SkDataTable.h"
+#include "SkOnce.h"
static void malloc_freeproc(void* context) {
sk_free(context);
@@ -76,19 +77,17 @@ const void* SkDataTable::at(int index, size_t* size) const {
///////////////////////////////////////////////////////////////////////////////
-SkDataTable* SkDataTable::NewEmpty() {
- static SkDataTable* gEmpty;
- if (nullptr == gEmpty) {
- gEmpty = new SkDataTable;
- }
- gEmpty->ref();
- return gEmpty;
+sk_sp<SkDataTable> SkDataTable::MakeEmpty() {
+ static SkDataTable* singleton;
+ static SkOnce once;
+ once([]{ singleton = new SkDataTable(); });
+ return sk_ref_sp(singleton);
}
-SkDataTable* SkDataTable::NewCopyArrays(const void * const * ptrs,
- const size_t sizes[], int count) {
+sk_sp<SkDataTable> SkDataTable::MakeCopyArrays(const void * const * ptrs,
+ const size_t sizes[], int count) {
if (count <= 0) {
- return SkDataTable::NewEmpty();
+ return SkDataTable::MakeEmpty();
}
size_t dataSize = 0;
@@ -108,28 +107,27 @@ SkDataTable* SkDataTable::NewCopyArrays(const void * const * ptrs,
elem += sizes[i];
}
- return new SkDataTable(dir, count, malloc_freeproc, buffer);
+ return sk_sp<SkDataTable>(new SkDataTable(dir, count, malloc_freeproc, buffer));
}
-SkDataTable* SkDataTable::NewCopyArray(const void* array, size_t elemSize,
- int count) {
+sk_sp<SkDataTable> SkDataTable::MakeCopyArray(const void* array, size_t elemSize, int count) {
if (count <= 0) {
- return SkDataTable::NewEmpty();
+ return SkDataTable::MakeEmpty();
}
size_t bufferSize = elemSize * count;
void* buffer = sk_malloc_throw(bufferSize);
memcpy(buffer, array, bufferSize);
- return new SkDataTable(buffer, elemSize, count, malloc_freeproc, buffer);
+ return sk_sp<SkDataTable>(new SkDataTable(buffer, elemSize, count, malloc_freeproc, buffer));
}
-SkDataTable* SkDataTable::NewArrayProc(const void* array, size_t elemSize,
- int count, FreeProc proc, void* ctx) {
+sk_sp<SkDataTable> SkDataTable::MakeArrayProc(const void* array, size_t elemSize, int count,
+ FreeProc proc, void* ctx) {
if (count <= 0) {
- return SkDataTable::NewEmpty();
+ return SkDataTable::MakeEmpty();
}
- return new SkDataTable(array, elemSize, count, proc, ctx);
+ return sk_sp<SkDataTable>(new SkDataTable(array, elemSize, count, proc, ctx));
}
///////////////////////////////////////////////////////////////////////////////
@@ -164,18 +162,18 @@ void SkDataTableBuilder::append(const void* src, size_t size) {
dir->fSize = size;
}
-SkDataTable* SkDataTableBuilder::detachDataTable() {
+sk_sp<SkDataTable> SkDataTableBuilder::detachDataTable() {
const int count = fDir.count();
if (0 == count) {
- return SkDataTable::NewEmpty();
+ return SkDataTable::MakeEmpty();
}
// Copy the dir into the heap;
- void* dir = fHeap->alloc(count * sizeof(SkDataTable::Dir),
- SkChunkAlloc::kThrow_AllocFailType);
+ void* dir = fHeap->alloc(count * sizeof(SkDataTable::Dir), SkChunkAlloc::kThrow_AllocFailType);
memcpy(dir, fDir.begin(), count * sizeof(SkDataTable::Dir));
- SkDataTable* table = new SkDataTable((SkDataTable::Dir*)dir, count, chunkalloc_freeproc, fHeap);
+ sk_sp<SkDataTable> table(
+ new SkDataTable((SkDataTable::Dir*)dir, count, chunkalloc_freeproc, fHeap));
// we have to detach our fHeap, since we are giving that to the table
fHeap = nullptr;
fDir.reset();
diff --git a/src/fonts/SkFontMgr_indirect.cpp b/src/fonts/SkFontMgr_indirect.cpp
index 01a24c5174..070c0aa402 100644
--- a/src/fonts/SkFontMgr_indirect.cpp
+++ b/src/fonts/SkFontMgr_indirect.cpp
@@ -61,7 +61,7 @@ private:
};
void SkFontMgr_Indirect::set_up_family_names(const SkFontMgr_Indirect* self) {
- self->fFamilyNames.reset(self->fProxy->getFamilyNames());
+ self->fFamilyNames = self->fProxy->getFamilyNames();
}
int SkFontMgr_Indirect::onCountFamilies() const {
diff --git a/src/ports/SkFontConfigInterface_direct.cpp b/src/ports/SkFontConfigInterface_direct.cpp
index 3cde837b9e..3455447246 100644
--- a/src/ports/SkFontConfigInterface_direct.cpp
+++ b/src/ports/SkFontConfigInterface_direct.cpp
@@ -698,7 +698,7 @@ static bool find_name(const SkTDArray<const char*>& list, const char* str) {
return false;
}
-SkDataTable* SkFontConfigInterfaceDirect::getFamilyNames() {
+sk_sp<SkDataTable> SkFontConfigInterfaceDirect::getFamilyNames() {
FCLocker lock;
FcPattern* pat = FcPatternCreate();
@@ -730,6 +730,6 @@ SkDataTable* SkFontConfigInterfaceDirect::getFamilyNames() {
}
}
- return SkDataTable::NewCopyArrays((const void*const*)names.begin(),
- sizes.begin(), names.count());
+ return SkDataTable::MakeCopyArrays((const void*const*)names.begin(),
+ sizes.begin(), names.count());
}
diff --git a/src/ports/SkFontConfigInterface_direct.h b/src/ports/SkFontConfigInterface_direct.h
index 3ccb390a70..6cd0a8f9ba 100644
--- a/src/ports/SkFontConfigInterface_direct.h
+++ b/src/ports/SkFontConfigInterface_direct.h
@@ -25,7 +25,7 @@ public:
SkStreamAsset* openStream(const FontIdentity&) override;
// new APIs
- SkDataTable* getFamilyNames() override;
+ sk_sp<SkDataTable> getFamilyNames() override;
protected:
virtual bool isAccessible(const char* filename);
diff --git a/src/ports/SkFontMgr_FontConfigInterface.cpp b/src/ports/SkFontMgr_FontConfigInterface.cpp
index 09b4d13dd4..133b503444 100644
--- a/src/ports/SkFontMgr_FontConfigInterface.cpp
+++ b/src/ports/SkFontMgr_FontConfigInterface.cpp
@@ -139,7 +139,7 @@ static bool find_by_FontIdentity(SkTypeface* cachedTypeface, void* ctx) {
class SkFontMgr_FCI : public SkFontMgr {
SkAutoTUnref<SkFontConfigInterface> fFCI;
- SkAutoTUnref<SkDataTable> fFamilyNames;
+ sk_sp<SkDataTable> fFamilyNames;
SkTypeface_FreeType::Scanner fScanner;
mutable SkMutex fMutex;
diff --git a/src/ports/SkFontMgr_fontconfig.cpp b/src/ports/SkFontMgr_fontconfig.cpp
index 0336e5d921..fd5f1b0830 100644
--- a/src/ports/SkFontMgr_fontconfig.cpp
+++ b/src/ports/SkFontMgr_fontconfig.cpp
@@ -503,7 +503,7 @@ private:
class SkFontMgr_fontconfig : public SkFontMgr {
mutable SkAutoFcConfig fFC;
- SkAutoTUnref<SkDataTable> fFamilyNames;
+ sk_sp<SkDataTable> fFamilyNames;
SkTypeface_FreeType::Scanner fScanner;
class StyleSet : public SkFontStyleSet {
@@ -579,7 +579,7 @@ class SkFontMgr_fontconfig : public SkFontMgr {
return false;
}
- static SkDataTable* GetFamilyNames(FcConfig* fcconfig) {
+ static sk_sp<SkDataTable> GetFamilyNames(FcConfig* fcconfig) {
FCLocker lock;
SkTDArray<const char*> names;
@@ -613,8 +613,8 @@ class SkFontMgr_fontconfig : public SkFontMgr {
}
}
- return SkDataTable::NewCopyArrays((void const *const *)names.begin(),
- sizes.begin(), names.count());
+ return SkDataTable::MakeCopyArrays((void const *const *)names.begin(),
+ sizes.begin(), names.count());
}
static bool FindByFcPattern(SkTypeface* cached, void* ctx) {
diff --git a/src/ports/SkRemotableFontMgr_win_dw.cpp b/src/ports/SkRemotableFontMgr_win_dw.cpp
index ea5562cfbc..a4c895ad0d 100644
--- a/src/ports/SkRemotableFontMgr_win_dw.cpp
+++ b/src/ports/SkRemotableFontMgr_win_dw.cpp
@@ -90,7 +90,7 @@ public:
memcpy(fLocaleName.get(), localeName, localeNameLength * sizeof(WCHAR));
}
- SkDataTable* getFamilyNames() const override {
+ sk_sp<SkDataTable> getFamilyNames() const override {
int count = fFontCollection->GetFontFamilyCount();
SkDataTableBuilder names(1024);
diff --git a/tests/DataRefTest.cpp b/tests/DataRefTest.cpp
index 59b56fb362..391124e840 100644
--- a/tests/DataRefTest.cpp
+++ b/tests/DataRefTest.cpp
@@ -25,35 +25,31 @@ static void test_is_equal(skiatest::Reporter* reporter,
}
}
-static void test_datatable_is_empty(skiatest::Reporter* reporter,
- SkDataTable* table) {
+static void test_datatable_is_empty(skiatest::Reporter* reporter, SkDataTable* table) {
REPORTER_ASSERT(reporter, table->isEmpty());
REPORTER_ASSERT(reporter, 0 == table->count());
}
static void test_emptytable(skiatest::Reporter* reporter) {
- SkAutoTUnref<SkDataTable> table0(SkDataTable::NewEmpty());
- SkAutoTUnref<SkDataTable> table1(SkDataTable::NewCopyArrays(nullptr, nullptr, 0));
- SkAutoTUnref<SkDataTable> table2(SkDataTable::NewCopyArray(nullptr, 0, 0));
- SkAutoTUnref<SkDataTable> table3(SkDataTable::NewArrayProc(nullptr, 0, 0,
- nullptr, nullptr));
-
- test_datatable_is_empty(reporter, table0);
- test_datatable_is_empty(reporter, table1);
- test_datatable_is_empty(reporter, table2);
- test_datatable_is_empty(reporter, table3);
-
- test_is_equal(reporter, table0, table1);
- test_is_equal(reporter, table0, table2);
- test_is_equal(reporter, table0, table3);
+ sk_sp<SkDataTable> table0(SkDataTable::MakeEmpty());
+ sk_sp<SkDataTable> table1(SkDataTable::MakeCopyArrays(nullptr, nullptr, 0));
+ sk_sp<SkDataTable> table2(SkDataTable::MakeCopyArray(nullptr, 0, 0));
+ sk_sp<SkDataTable> table3(SkDataTable::MakeArrayProc(nullptr, 0, 0, nullptr, nullptr));
+
+ test_datatable_is_empty(reporter, table0.get());
+ test_datatable_is_empty(reporter, table1.get());
+ test_datatable_is_empty(reporter, table2.get());
+ test_datatable_is_empty(reporter, table3.get());
+
+ test_is_equal(reporter, table0.get(), table1.get());
+ test_is_equal(reporter, table0.get(), table2.get());
+ test_is_equal(reporter, table0.get(), table3.get());
}
static void test_simpletable(skiatest::Reporter* reporter) {
const int idata[] = { 1, 4, 9, 16, 25, 63 };
int icount = SK_ARRAY_COUNT(idata);
- SkAutoTUnref<SkDataTable> itable(SkDataTable::NewCopyArray(idata,
- sizeof(idata[0]),
- icount));
+ sk_sp<SkDataTable> itable(SkDataTable::MakeCopyArray(idata, sizeof(idata[0]), icount));
REPORTER_ASSERT(reporter, itable->count() == icount);
for (int i = 0; i < icount; ++i) {
size_t size;
@@ -73,8 +69,7 @@ static void test_vartable(skiatest::Reporter* reporter) {
sizes[i] = strlen(str[i]) + 1;
}
- SkAutoTUnref<SkDataTable> table(SkDataTable::NewCopyArrays(
- (const void*const*)str, sizes, count));
+ sk_sp<SkDataTable> table(SkDataTable::MakeCopyArrays((const void*const*)str, sizes, count));
REPORTER_ASSERT(reporter, table->count() == count);
for (int i = 0; i < count; ++i) {
@@ -100,7 +95,7 @@ static void test_tablebuilder(skiatest::Reporter* reporter) {
for (int i = 0; i < count; ++i) {
builder.append(str[i], strlen(str[i]) + 1);
}
- SkAutoTUnref<SkDataTable> table(builder.detachDataTable());
+ sk_sp<SkDataTable> table(builder.detachDataTable());
REPORTER_ASSERT(reporter, table->count() == count);
for (int i = 0; i < count; ++i) {
@@ -121,8 +116,8 @@ static void test_globaltable(skiatest::Reporter* reporter) {
};
int count = SK_ARRAY_COUNT(gData);
- SkAutoTUnref<SkDataTable> table(SkDataTable::NewArrayProc(gData,
- sizeof(gData[0]), count, nullptr, nullptr));
+ sk_sp<SkDataTable> table(
+ SkDataTable::MakeArrayProc(gData, sizeof(gData[0]), count, nullptr, nullptr));
REPORTER_ASSERT(reporter, table->count() == count);
for (int i = 0; i < count; ++i) {