ec3ed6a5eb
I have manually examined all of these diffs and restored a few files that seem to require manual adjustment. The following files still need to be modified manually, in a separate CL: android_sample/SampleApp/AndroidManifest.xml android_sample/SampleApp/res/layout/layout.xml android_sample/SampleApp/res/menu/sample.xml android_sample/SampleApp/res/values/strings.xml android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java android_sample/SampleApp/src/com/skia/sampleapp/SampleView.java experimental/CiCarbonSampleMain.c experimental/CocoaDebugger/main.m experimental/FileReaderApp/main.m experimental/SimpleCocoaApp/main.m experimental/iOSSampleApp/Shared/SkAlertPrompt.h experimental/iOSSampleApp/Shared/SkAlertPrompt.m experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Debug.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Release.xcconfig gpu/src/android/GrGLDefaultInterface_android.cpp gyp/common.gypi gyp_skia include/ports/SkHarfBuzzFont.h include/views/SkOSWindow_wxwidgets.h make.bat make.py src/opts/memset.arm.S src/opts/memset16_neon.S src/opts/memset32_neon.S src/opts/opts_check_arm.cpp src/ports/SkDebug_brew.cpp src/ports/SkMemory_brew.cpp src/ports/SkOSFile_brew.cpp src/ports/SkXMLParser_empty.cpp src/utils/ios/SkImageDecoder_iOS.mm src/utils/ios/SkOSFile_iOS.mm src/utils/ios/SkStream_NSData.mm tests/FillPathTest.cpp Review URL: http://codereview.appspot.com/4816058 git-svn-id: http://skia.googlecode.com/svn/trunk@1982 2bbb7eff-a529-9590-31e7-b0007b416f81
104 lines
2.7 KiB
C++
104 lines
2.7 KiB
C++
|
|
/*
|
|
* Copyright 2011 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
|
|
|
|
#include "SkData.h"
|
|
|
|
SkData::SkData(const void* ptr, size_t size, ReleaseProc proc, void* context) {
|
|
fPtr = ptr;
|
|
fSize = size;
|
|
fReleaseProc = proc;
|
|
fReleaseProcContext = context;
|
|
}
|
|
|
|
SkData::~SkData() {
|
|
if (fReleaseProc) {
|
|
fReleaseProc(fPtr, fSize, fReleaseProcContext);
|
|
}
|
|
}
|
|
|
|
size_t SkData::copyRange(size_t offset, size_t length, void* buffer) const {
|
|
size_t available = fSize;
|
|
if (offset >= available || 0 == length) {
|
|
return 0;
|
|
}
|
|
available -= offset;
|
|
if (length > available) {
|
|
length = available;
|
|
}
|
|
SkASSERT(length > 0);
|
|
|
|
memcpy(buffer, this->bytes() + offset, length);
|
|
return length;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
SkData* SkData::NewEmpty() {
|
|
static SkData* gEmptyRef;
|
|
if (NULL == gEmptyRef) {
|
|
gEmptyRef = new SkData(NULL, 0, NULL, NULL);
|
|
}
|
|
gEmptyRef->ref();
|
|
return gEmptyRef;
|
|
}
|
|
|
|
// assumes fPtr was allocated via sk_malloc
|
|
static void sk_free_releaseproc(const void* ptr, size_t, void*) {
|
|
sk_free((void*)ptr);
|
|
}
|
|
|
|
SkData* SkData::NewFromMalloc(const void* data, size_t length) {
|
|
return new SkData(data, length, sk_free_releaseproc, NULL);
|
|
}
|
|
|
|
SkData* SkData::NewWithCopy(const void* data, size_t length) {
|
|
if (0 == length) {
|
|
return SkData::NewEmpty();
|
|
}
|
|
|
|
void* copy = sk_malloc_throw(length); // balanced in sk_free_releaseproc
|
|
memcpy(copy, data, length);
|
|
return new SkData(copy, length, sk_free_releaseproc, NULL);
|
|
}
|
|
|
|
SkData* SkData::NewWithProc(const void* data, size_t length,
|
|
ReleaseProc proc, void* context) {
|
|
return new SkData(data, length, proc, context);
|
|
}
|
|
|
|
// assumes context is a SkData
|
|
static void sk_dataref_releaseproc(const void*, size_t, void* context) {
|
|
SkData* src = reinterpret_cast<SkData*>(context);
|
|
src->unref();
|
|
}
|
|
|
|
SkData* SkData::NewSubset(const SkData* src, size_t offset, size_t length) {
|
|
/*
|
|
We could, if we wanted/need to, just make a deep copy of src's data,
|
|
rather than referencing it. This would duplicate the storage (of the
|
|
subset amount) but would possibly allow src to go out of scope sooner.
|
|
*/
|
|
|
|
size_t available = src->size();
|
|
if (offset >= available || 0 == length) {
|
|
return SkData::NewEmpty();
|
|
}
|
|
available -= offset;
|
|
if (length > available) {
|
|
length = available;
|
|
}
|
|
SkASSERT(length > 0);
|
|
|
|
src->ref(); // this will be balanced in sk_dataref_releaseproc
|
|
return new SkData(src->bytes() + offset, length, sk_dataref_releaseproc,
|
|
const_cast<SkData*>(src));
|
|
}
|
|
|