| Index: src/core/SkError.cpp
|
| diff --git a/src/core/SkError.cpp b/src/core/SkError.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3555c6961c0fac40286e5382faa7eb09300d2b32
|
| --- /dev/null
|
| +++ b/src/core/SkError.cpp
|
| @@ -0,0 +1,143 @@
|
| +
|
| +/*
|
| + * Copyright 2013 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "SkTLS.h"
|
| +#include "SkTypes.h"
|
| +#include "SkError.h"
|
| +#include "SkErrorInternals.h"
|
| +
|
| +#include <stdio.h>
|
| +#include <stdarg.h>
|
| +
|
| +namespace {
|
| + void *CreateThreadError() {
|
| + return SkNEW_ARGS(SkError, (kNoError_SkError));
|
| + }
|
| + void DeleteThreadError(void* v) {
|
| + SkDELETE(reinterpret_cast<SkError*>(v));
|
| + }
|
| + #define THREAD_ERROR \
|
| + (*reinterpret_cast<SkError*>(SkTLS::Get(CreateThreadError, DeleteThreadError)))
|
| +
|
| + void *CreateThreadErrorCallback() {
|
| + return SkNEW_ARGS(SkErrorCallbackFunction, (SkErrorInternals::DefaultErrorCallback));
|
| + }
|
| + void DeleteThreadErrorCallback(void* v) {
|
| + SkDELETE(reinterpret_cast<SkErrorCallbackFunction *>(v));
|
| + }
|
| +
|
| + #define THREAD_ERROR_CALLBACK \
|
| + *(reinterpret_cast<SkErrorCallbackFunction *>(SkTLS::Get(CreateThreadErrorCallback, \
|
| + DeleteThreadErrorCallback)))
|
| +
|
| + void *CreateThreadErrorContext() {
|
| + return SkNEW_ARGS(void **, (NULL));
|
| + }
|
| + void DeleteThreadErrorContext(void* v) {
|
| + SkDELETE(reinterpret_cast<void **>(v));
|
| + }
|
| + #define THREAD_ERROR_CONTEXT \
|
| + (*reinterpret_cast<void **>(SkTLS::Get(CreateThreadErrorContext, DeleteThreadErrorContext)))
|
| +
|
| + #define ERROR_STRING_LENGTH 2048
|
| +
|
| + void *CreateThreadErrorString() {
|
| + return SkNEW_ARRAY(char, (ERROR_STRING_LENGTH));
|
| + }
|
| + void DeleteThreadErrorString(void* v) {
|
| + SkDELETE_ARRAY(reinterpret_cast<char *>(v));
|
| + }
|
| + #define THREAD_ERROR_STRING \
|
| + (reinterpret_cast<char *>(SkTLS::Get(CreateThreadErrorString, DeleteThreadErrorString)))
|
| +}
|
| +
|
| +SkError SkGetLastError() {
|
| + return SkErrorInternals::GetLastError();
|
| +}
|
| +void SkClearLastError() {
|
| + SkErrorInternals::ClearError();
|
| +}
|
| +void SkSetErrorCallback(SkErrorCallbackFunction cb, void *context) {
|
| + SkErrorInternals::SetErrorCallback(cb, context);
|
| +}
|
| +const char *SkGetLastErrorString() {
|
| + return SkErrorInternals::GetLastErrorString();
|
| +}
|
| +
|
| +// ------------ Private Error functions ---------
|
| +
|
| +void SkErrorInternals::SetErrorCallback(SkErrorCallbackFunction cb, void *context) {
|
| + if (cb == NULL) {
|
| + THREAD_ERROR_CALLBACK = SkErrorInternals::DefaultErrorCallback;
|
| + } else {
|
| + THREAD_ERROR_CALLBACK = cb;
|
| + }
|
| + THREAD_ERROR_CONTEXT = context;
|
| +}
|
| +
|
| +void SkErrorInternals::DefaultErrorCallback(SkError code, void *context) {
|
| + SkDebugf("Skia Error: %s\n", SkGetLastErrorString());
|
| +}
|
| +
|
| +void SkErrorInternals::ClearError() {
|
| + SkErrorInternals::SetError( kNoError_SkError, "All is well" );
|
| +}
|
| +
|
| +SkError SkErrorInternals::GetLastError() {
|
| + return THREAD_ERROR;
|
| +}
|
| +
|
| +const char *SkErrorInternals::GetLastErrorString() {
|
| + return THREAD_ERROR_STRING;
|
| +}
|
| +
|
| +void SkErrorInternals::SetError(SkError code, const char *fmt, ...) {
|
| + THREAD_ERROR = code;
|
| + va_list args;
|
| +
|
| + char *str = THREAD_ERROR_STRING;
|
| + const char *error_name = NULL;
|
| + switch( code ) {
|
| + case kNoError_SkError:
|
| + error_name = "No Error";
|
| + break;
|
| + case kInvalidArgument_SkError:
|
| + error_name = "Invalid Argument";
|
| + break;
|
| + case kInvalidOperation_SkError:
|
| + error_name = "Invalid Operation";
|
| + break;
|
| + case kInvalidHandle_SkError:
|
| + error_name = "Invalid Handle";
|
| + break;
|
| + case kInvalidPaint_SkError:
|
| + error_name = "Invalid Paint";
|
| + break;
|
| + case kOutOfMemory_SkError:
|
| + error_name = "Out Of Memory";
|
| + break;
|
| + case kParseError_SkError:
|
| + error_name = "Parse Error";
|
| + break;
|
| + default:
|
| + error_name = "Unknown error";
|
| + break;
|
| + }
|
| +
|
| + sprintf( str, "%s: ", error_name );
|
| + int string_left = ERROR_STRING_LENGTH - strlen( str );
|
| + str += strlen(str);
|
| +
|
| + va_start( args, fmt );
|
| + vsnprintf( str, string_left, fmt, args );
|
| + va_end( args );
|
| + SkErrorCallbackFunction fn = THREAD_ERROR_CALLBACK;
|
| + if (fn && code != kNoError_SkError) {
|
| + fn(code, THREAD_ERROR_CONTEXT);
|
| + }
|
| +}
|
|
|