Remove SkThread.h, include SkMutex.h or SkAtomics.h as appropriate.

SkThread.h doesn't do anything anymore execept include those two,
and thankfully, it doesn't seem to be mentioned outside Skia.

No public API changes.
TBR=reed@google.com

BUG=skia:

Review URL: https://codereview.chromium.org/1215393002
This commit is contained in:
mtklein 2015-07-01 14:00:57 -07:00 committed by Commit bot
parent 64b4c789fd
commit c50acf2321
56 changed files with 94 additions and 105 deletions

View File

@ -5,7 +5,7 @@
* found in the LICENSE file.
*/
#include "Benchmark.h"
#include "SkThread.h"
#include "SkMutex.h"
class MutexBench : public Benchmark {
public:

View File

@ -6,8 +6,8 @@
*/
#include <memory>
#include "Benchmark.h"
#include "SkAtomics.h"
#include "SkRefCnt.h"
#include "SkThread.h"
#include "SkWeakRefCnt.h"
enum {

View File

@ -18,6 +18,7 @@
#include "SkForceLinking.h"
#include "SkGraphics.h"
#include "SkMD5.h"
#include "SkMutex.h"
#include "SkOSFile.h"
#include "SkTHash.h"
#include "SkTaskGroup.h"

View File

@ -11,10 +11,10 @@
#include "SkCommonFlags.h"
#include "SkData.h"
#include "SkJSONCPP.h"
#include "SkMutex.h"
#include "SkOSFile.h"
#include "SkStream.h"
#include "SkTArray.h"
#include "SkThread.h"
namespace DM {

View File

@ -323,7 +323,6 @@
'<(skia_include_path)/core/SkTSearch.h',
'<(skia_include_path)/core/SkTemplates.h',
'<(skia_include_path)/core/SkTextBlob.h',
'<(skia_include_path)/core/SkThread.h',
'<(skia_include_path)/core/SkTime.h',
'<(skia_include_path)/core/SkTLazy.h',
'<(skia_include_path)/core/SkTypeface.h',

View File

@ -1,16 +0,0 @@
/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkThread_DEFINED
#define SkThread_DEFINED
// TODO: delete this file, or maybe move the definition of SkThread here.
#include "SkAtomics.h"
#include "SkMutex.h"
#endif

View File

@ -9,7 +9,7 @@
#define SkWeakRefCnt_DEFINED
#include "SkRefCnt.h"
#include "SkThread.h"
#include "SkAtomics.h"
/** \class SkWeakRefCnt

View File

@ -11,6 +11,7 @@
#include "SkDataTable.h"
#include "SkFontMgr.h"
#include "SkFontStyle.h"
#include "SkMutex.h"
#include "SkRemotableFontMgr.h"
#include "SkTArray.h"
#include "SkTypeface.h"

View File

@ -7,11 +7,11 @@
*/
#include "SkAAClip.h"
#include "SkAtomics.h"
#include "SkBlitter.h"
#include "SkColorPriv.h"
#include "SkPath.h"
#include "SkScan.h"
#include "SkThread.h"
#include "SkUtils.h"
class AutoAAClipValidate {

View File

@ -7,6 +7,7 @@
*/
#include "SkAtomics.h"
#include "SkBitmap.h"
#include "SkColorPriv.h"
#include "SkDither.h"
@ -14,14 +15,13 @@
#include "SkImagePriv.h"
#include "SkMallocPixelRef.h"
#include "SkMask.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkPackBits.h"
#include "SkPixelRef.h"
#include "SkThread.h"
#include "SkReadBuffer.h"
#include "SkUnPreMultiply.h"
#include "SkUtils.h"
#include "SkValidationUtils.h"
#include "SkPackBits.h"
#include "SkWriteBuffer.h"
#include <new>
static bool reset_return_false(SkBitmap* bm) {

View File

@ -12,7 +12,7 @@
#include "SkFlattenable.h"
#include "SkRefCnt.h"
#include "SkTDArray.h"
#include "SkThread.h"
#include "SkAtomics.h"
/**
* SkBitmapHeapEntry provides users of SkBitmapHeap (using internal storage) with a means to...
@ -52,7 +52,7 @@ private:
class SkBitmapHeapReader : public SkRefCnt {
public:
SkBitmapHeapReader() : INHERITED() {}
virtual SkBitmap* getBitmap(int32_t slot) const = 0;
@ -69,7 +69,7 @@ class SkBitmapHeap : public SkBitmapHeapReader {
public:
class ExternalStorage : public SkRefCnt {
public:
virtual bool insert(const SkBitmap& bitmap, int32_t slot) = 0;

View File

@ -8,7 +8,7 @@
#ifndef SkCachedData_DEFINED
#define SkCachedData_DEFINED
#include "SkThread.h"
#include "SkMutex.h"
class SkDiscardableMemory;
@ -78,7 +78,7 @@ public:
#else
void validate() const {}
#endif
/*
* Attaching a data to to a SkResourceCache (only one at a time) enables the data to be
* unlocked when the cache is the only owner, thus freeing it to be purged (assuming the

View File

@ -5,11 +5,11 @@
* found in the LICENSE file.
*/
#include "SkAtomics.h"
#include "SkCanvas.h"
#include "SkClipStack.h"
#include "SkPath.h"
#include "SkPathOps.h"
#include "SkThread.h"
#include <new>

View File

@ -7,7 +7,7 @@
#include "SkDeviceProfile.h"
#include "SkThread.h"
#include "SkMutex.h"
#define DEFAULT_GAMMAEXP 2.2f
#define DEFAULT_CONTRASTSCALE 0.5f

View File

@ -5,9 +5,9 @@
* found in the LICENSE file.
*/
#include "SkAtomics.h"
#include "SkCanvas.h"
#include "SkDrawable.h"
#include "SkThread.h"
static int32_t next_generation_id() {
static int32_t gCanvasDrawableGenerationID;

View File

@ -9,10 +9,11 @@
#include "SkGlyphCache_Globals.h"
#include "SkGraphics.h"
#include "SkLazyPtr.h"
#include "SkMutex.h"
#include "SkPaint.h"
#include "SkPath.h"
#include "SkTemplates.h"
#include "SkTLS.h"
#include "SkTemplates.h"
#include "SkTypeface.h"
//#define SPEW_PURGE_STATUS
@ -417,8 +418,6 @@ void SkGlyphCache::invokeAndRemoveAuxProcs() {
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#include "SkThread.h"
size_t SkGlyphCache_Globals::setCacheSizeLimit(size_t newLimit) {
static const size_t minLimit = 256 * 1024;
if (newLimit < minLimit) {

View File

@ -9,6 +9,7 @@
#define SkGlyphCache_Globals_DEFINED
#include "SkGlyphCache.h"
#include "SkMutex.h"
#include "SkTLS.h"
#ifndef SK_DEFAULT_FONT_CACHE_COUNT_LIMIT

View File

@ -13,12 +13,13 @@
#include "SkDevice.h"
#include "SkLazyPtr.h"
#include "SkMatrixImageFilter.h"
#include "SkMutex.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkRect.h"
#include "SkTDynamicHash.h"
#include "SkTInternalLList.h"
#include "SkValidationUtils.h"
#include "SkWriteBuffer.h"
#if SK_SUPPORT_GPU
#include "GrContext.h"
#include "GrDrawContext.h"
@ -28,9 +29,9 @@
#ifdef SK_BUILD_FOR_IOS
enum { kDefaultCacheSize = 2 * 1024 * 1024 };
#else
#else
enum { kDefaultCacheSize = 128 * 1024 * 1024 };
#endif
#endif
static int32_t next_image_filter_unique_id() {
static int32_t gImageFilterUniqueID;
@ -546,4 +547,4 @@ bool SkImageFilter::Proxy::filterImage(const SkImageFilter* filter, const SkBitm
SkBitmap* result, SkIPoint* offset) {
return fDevice->filterImage(filter, src, ctx, result, offset);
}

View File

@ -9,9 +9,9 @@
#define SkMessageBus_DEFINED
#include "SkLazyPtr.h"
#include "SkMutex.h"
#include "SkTArray.h"
#include "SkTDArray.h"
#include "SkThread.h"
#include "SkTypes.h"
template <typename Message>

View File

@ -17,6 +17,7 @@
#include "SkImageFilter.h"
#include "SkMaskFilter.h"
#include "SkMaskGamma.h"
#include "SkMutex.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkPaintDefaults.h"

View File

@ -12,7 +12,6 @@
#include "SkPathPriv.h"
#include "SkPathRef.h"
#include "SkRRect.h"
#include "SkThread.h"
////////////////////////////////////////////////////////////////////////////
@ -1881,7 +1880,7 @@ size_t SkPath::readFromMemory(const void* storage, size_t length) {
}
unsigned version = packed & 0xFF;
fConvexity = (packed >> kConvexity_SerializationShift) & 0xFF;
fFillType = (packed >> kFillType_SerializationShift) & 0xFF;
uint8_t dir = (packed >> kDirection_SerializationShift) & 0x3;

View File

@ -6,8 +6,8 @@
*/
#include "SkBitmapCache.h"
#include "SkMutex.h"
#include "SkPixelRef.h"
#include "SkThread.h"
#include "SkTraceEvent.h"
//#define SK_SUPPORT_LEGACY_UNBALANCED_PIXELREF_LOCKCOUNT

View File

@ -7,9 +7,9 @@
*/
#include "SkAtomics.h"
#include "SkRegionPriv.h"
#include "SkTemplates.h"
#include "SkThread.h"
#include "SkUtils.h"
/* Region Layout

View File

@ -11,7 +11,7 @@
#define SkRegionPriv_DEFINED
#include "SkRegion.h"
#include "SkThread.h"
#include "SkAtomics.h"
#define assert_sentinel(value, isSentinel) \
SkASSERT(((value) == SkRegion::kRunTypeSentinel) == isSentinel)

View File

@ -8,6 +8,7 @@
#include "SkChecksum.h"
#include "SkMessageBus.h"
#include "SkMipMap.h"
#include "SkMutex.h"
#include "SkPixelRef.h"
#include "SkResourceCache.h"
@ -74,7 +75,7 @@ void SkResourceCache::init() {
class SkOneShotDiscardablePixelRef : public SkPixelRef {
public:
// Ownership of the discardablememory is transfered to the pixelref
SkOneShotDiscardablePixelRef(const SkImageInfo&, SkDiscardableMemory*, size_t rowBytes);
~SkOneShotDiscardablePixelRef();
@ -236,7 +237,7 @@ static bool gDumpCacheTransactions;
void SkResourceCache::add(Rec* rec) {
this->checkMessages();
SkASSERT(rec);
// See if we already have this key (racy inserts, etc.)
Rec* existing = fHash->find(rec->getKey());
@ -244,7 +245,7 @@ void SkResourceCache::add(Rec* rec) {
SkDELETE(rec);
return;
}
this->addToHead(rec);
fHash->add(rec);
@ -357,7 +358,7 @@ size_t SkResourceCache::setTotalByteLimit(size_t newLimit) {
SkCachedData* SkResourceCache::newCachedData(size_t bytes) {
this->checkMessages();
if (fDiscardableFactory) {
SkDiscardableMemory* dm = fDiscardableFactory(bytes);
return dm ? SkNEW_ARGS(SkCachedData, (bytes, dm)) : NULL;
@ -515,8 +516,6 @@ void SkResourceCache::checkMessages() {
///////////////////////////////////////////////////////////////////////////////
#include "SkThread.h"
SK_DECLARE_STATIC_MUTEX(gMutex);
static SkResourceCache* gResourceCache = NULL;
static void cleanup_gResourceCache() {

View File

@ -21,7 +21,6 @@
#include "SkRasterizer.h"
#include "SkRasterClip.h"
#include "SkStroke.h"
#include "SkThread.h"
#define ComputeBWRowBytes(width) (((unsigned)(width) + 7) >> 3)

View File

@ -5,17 +5,17 @@
* found in the LICENSE file.
*/
#include "SkAtomics.h"
#include "SkBitmapProcShader.h"
#include "SkColorShader.h"
#include "SkEmptyShader.h"
#include "SkReadBuffer.h"
#include "SkMallocPixelRef.h"
#include "SkPaint.h"
#include "SkPicture.h"
#include "SkPictureShader.h"
#include "SkReadBuffer.h"
#include "SkScalar.h"
#include "SkShader.h"
#include "SkThread.h"
#include "SkWriteBuffer.h"
//#define SK_TRACK_SHADER_LIFETIME

View File

@ -7,9 +7,9 @@
*/
#include "SkString.h"
#include "SkAtomics.h"
#include "SkFixed.h"
#include "SkThread.h"
#include "SkString.h"
#include "SkUtils.h"
#include <stdarg.h>
#include <stdio.h>

View File

@ -1,3 +1,10 @@
/*
* Copyright 2012 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"
// enable to help debug TLS storage
@ -5,7 +12,7 @@
#ifdef SK_TRACE_TLS_LIFETIME
#include "SkThread.h"
#include "SkAtomics.h"
static int32_t gTLSRecCount;
#endif

View File

@ -10,6 +10,7 @@
#include "SkFontDescriptor.h"
#include "SkFontMgr.h"
#include "SkLazyPtr.h"
#include "SkMutex.h"
#include "SkOTTable_OS_2.h"
#include "SkStream.h"
#include "SkTypeface.h"

View File

@ -9,7 +9,8 @@
#include "SkTypefaceCache.h"
#include "SkThread.h"
#include "SkAtomics.h"
#include "SkMutex.h"
#define TYPEFACE_CACHE_LIMIT 1024

View File

@ -5,14 +5,14 @@
* found in the LICENSE file.
*/
#include "SkFontMgr.h"
#include "SkFontStyle.h"
#include "SkFontConfigInterface.h"
#include "SkFontConfigTypeface.h"
#include "SkFontMgr.h"
#include "SkFontStyle.h"
#include "SkMath.h"
#include "SkMutex.h"
#include "SkString.h"
#include "SkTDArray.h"
#include "SkThread.h"
// for now we pull these in directly. eventually we will solely rely on the
// SkFontConfigInterface instance.

View File

@ -42,7 +42,7 @@ SkTestFont::~SkTestFont() {
#ifdef SK_DEBUG
#include "SkThread.h"
#include "SkMutex.h"
SK_DECLARE_STATIC_MUTEX(gUsedCharsMutex);
#endif

View File

@ -12,8 +12,8 @@
#include "GrBatchTarget.h"
#include "GrGeometryProcessor.h"
#include "GrVertices.h"
#include "SkAtomics.h"
#include "SkRefCnt.h"
#include "SkThread.h"
#include "SkTypes.h"
class GrGpu;
@ -39,7 +39,7 @@ struct GrInitInvariantOutput;
class GrBatch : public SkRefCnt {
public:
GrBatch() : fClassID(kIllegalBatchClassID), fNumberOfDraws(0) { SkDEBUGCODE(fUsed = false;) }
virtual ~GrBatch() {}

View File

@ -6,8 +6,8 @@
*/
#include "GrGLNoOpInterface.h"
#include "SkMutex.h"
#include "SkString.h"
#include "SkThread.h"
// the OpenGLES 2.0 spec says this must be >= 128
static const GrGLint kDefaultMaxVertexUniformVectors = 128;

View File

@ -9,8 +9,8 @@
#include "SkDiscardableMemoryPool.h"
#include "SkImageGenerator.h"
#include "SkLazyPtr.h"
#include "SkMutex.h"
#include "SkTInternalLList.h"
#include "SkThread.h"
// Note:
// A PoolDiscardableMemory is memory that is counted in a pool.

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "SkPathOpsDebug.h"
#include "SkMutex.h"
#include "SkPath.h"
#include "SkPathOpsDebug.h"
#include "SkString.h"
#include "SkThread.h"
#if DEBUG_VALIDATE
extern bool FLAGS_runFail;
@ -304,7 +304,7 @@ SkString SkOpAngle::debugPart() const {
break;
default:
SkASSERT(0);
}
}
return result;
}
#endif

View File

@ -15,6 +15,7 @@
#include "SkBuffer.h"
#include "SkFontConfigInterface.h"
#include "SkLazyPtr.h"
#include "SkMutex.h"
#include "SkStream.h"
#include "SkString.h"

View File

@ -17,12 +17,12 @@
#include "SkMask.h"
#include "SkMaskGamma.h"
#include "SkMatrix22.h"
#include "SkMutex.h"
#include "SkOTUtils.h"
#include "SkScalerContext.h"
#include "SkStream.h"
#include "SkString.h"
#include "SkTemplates.h"
#include "SkThread.h"
#include "SkTypes.h"
#if defined(SK_CAN_USE_DLOPEN)

View File

@ -10,6 +10,7 @@
#define SKFONTHOST_FREETYPE_COMMON_H_
#include "SkGlyph.h"
#include "SkMutex.h"
#include "SkScalerContext.h"
#include "SkTypeface.h"
#include "SkTypes.h"

View File

@ -24,12 +24,13 @@
#include "SkColorPriv.h"
#include "SkDescriptor.h"
#include "SkEndian.h"
#include "SkFontDescriptor.h"
#include "SkFloatingPoint.h"
#include "SkFontDescriptor.h"
#include "SkFontMgr.h"
#include "SkGlyph.h"
#include "SkLazyFnPtr.h"
#include "SkMaskGamma.h"
#include "SkSFNTHeader.h"
#include "SkMutex.h"
#include "SkOTTable_glyf.h"
#include "SkOTTable_head.h"
#include "SkOTTable_hhea.h"
@ -37,13 +38,12 @@
#include "SkOTUtils.h"
#include "SkPaint.h"
#include "SkPath.h"
#include "SkString.h"
#include "SkSFNTHeader.h"
#include "SkStream.h"
#include "SkThread.h"
#include "SkString.h"
#include "SkTypefaceCache.h"
#include "SkTypeface_mac.h"
#include "SkUtils.h"
#include "SkTypefaceCache.h"
#include "SkFontMgr.h"
#include "SkUtils.h"
#include <dlfcn.h>

View File

@ -23,7 +23,6 @@
#include "SkStream.h"
#include "SkString.h"
#include "SkTemplates.h"
#include "SkThread.h"
#include "SkTypeface_win.h"
#include "SkTypefaceCache.h"
#include "SkUtils.h"

View File

@ -15,7 +15,6 @@
#include "SkRTConf.h"
#include "SkString.h"
#include "SkStream.h"
#include "SkThread.h"
#include "SkTSearch.h"
#include "SkTypefaceCache.h"
#include "SkTArray.h"

View File

@ -11,10 +11,10 @@
#include "SkFontMgr.h"
#include "SkFontStyle.h"
#include "SkMath.h"
#include "SkMutex.h"
#include "SkString.h"
#include "SkStream.h"
#include "SkTDArray.h"
#include "SkThread.h"
#include "SkTypefaceCache.h"
#include "SkOSFile.h"

View File

@ -9,9 +9,9 @@
#include "SkDWriteFontFileStream.h"
#include "SkFontMgr.h"
#include "SkHRESULT.h"
#include "SkMutex.h"
#include "SkStream.h"
#include "SkTScopedComPtr.h"
#include "SkThread.h"
#include "SkTypeface.h"
#include "SkTypefaceCache.h"
#include "SkTypeface_win_dw.h"

View File

@ -5,15 +5,15 @@
* found in the LICENSE file.
*/
#include "SkDataTable.h"
#include "SkDWrite.h"
#include "SkDWriteFontFileStream.h"
#include "SkDataTable.h"
#include "SkHRESULT.h"
#include "SkMutex.h"
#include "SkRemotableFontMgr.h"
#include "SkStream.h"
#include "SkString.h"
#include "SkTArray.h"
#include "SkThread.h"
#include "SkTScopedComPtr.h"
#include "SkTypeface_win.h"
#include "SkTypes.h"
@ -80,7 +80,7 @@ private:
}
public:
/** localeNameLength must include the null terminator. */
SkRemotableFontMgr_DirectWrite(IDWriteFontCollection* fontCollection,

View File

@ -6,7 +6,7 @@
*/
#include "SkTLS.h"
#include "SkThread.h"
#include "SkMutex.h"
static bool gOnce = false;
static DWORD gTlsIndex;

View File

@ -265,7 +265,7 @@ void SkEvent::inflate(const SkDOM& dom, const SkDOM::Node* node)
#define EVENT_LOGN(s, n)
#endif
#include "SkThread.h"
#include "SkMutex.h"
#include "SkTime.h"
class SkEvent_Globals {

View File

@ -8,10 +8,8 @@
#include "SkEventSink.h"
#include "SkMutex.h"
#include "SkTagList.h"
#include "SkThread.h"
#include "SkThread.h"
#include "SkTime.h"
class SkEventSink_Globals {
@ -256,7 +254,7 @@ SkEventSink* SkEventSink::FindSink(SkEventSinkID sinkID)
#if 0 // experimental, not tested
#include "SkThread.h"
#include "SkMutex.h"
#include "SkTDict.h"
#define kMinStringBufferSize 128

View File

@ -4,9 +4,9 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include <stdarg.h>
#include "SkAtomics.h"
#include "SkOSMenu.h"
#include "SkThread.h"
#include <stdarg.h>
static int gOSMenuCmd = 7000;

View File

@ -5,7 +5,7 @@
* found in the LICENSE file.
*/
#include "SkThread.h"
#include "SkAtomics.h"
#include "SkThreadUtils.h"
#include "SkTypes.h"
#include "Test.h"

View File

@ -11,10 +11,10 @@
#include "SkCanvas.h"
#include "SkForceLinking.h"
#include "SkMatrix.h"
#include "SkMutex.h"
#include "SkPaint.h"
#include "SkRTConf.h"
#include "SkStream.h"
#include "SkThread.h"
#ifdef SK_BUILD_FOR_MAC
#include <sys/sysctl.h>

View File

@ -12,8 +12,6 @@
#include "SkPath.h"
#include "SkPathOpsTypes.h"
#include "SkStream.h"
#include "SkThread.h"
#include "SkThreadUtils.h"
#include "Test.h"
DECLARE_bool(runFail);

View File

@ -8,6 +8,7 @@
#include "CrashHandler.h"
#include "OverwriteLine.h"
#include "Resources.h"
#include "SkAtomics.h"
#include "SkCommonFlags.h"
#include "SkGraphics.h"
#include "SkOSFile.h"
@ -15,7 +16,6 @@
#include "SkTArray.h"
#include "SkTaskGroup.h"
#include "SkTemplates.h"
#include "SkThread.h"
#include "SkTime.h"
#include "Test.h"

View File

@ -7,9 +7,9 @@
#include "Resources.h"
#include "SkFontMgr.h"
#include "SkMutex.h"
#include "SkOSFile.h"
#include "SkTestScalerContext.h"
#include "SkThread.h"
#include "SkUtils.h"
#include "sk_tool_utils.h"

View File

@ -9,11 +9,11 @@
#define SkDiffContext_DEFINED
#include "SkImageDiffer.h"
#include "SkMutex.h"
#include "SkString.h"
#include "SkTArray.h"
#include "SkTDArray.h"
#include "SkTLList.h"
#include "SkThread.h"
class SkWStream;
@ -52,7 +52,7 @@ public:
void setWhiteDiffDir(const SkString& directory);
/**
* Modify the pattern used to generate commonName (= the
* Modify the pattern used to generate commonName (= the
* basename of rgb/white diff files).
*
* - true: basename is a combination of the input file names.
@ -61,10 +61,10 @@ public:
* For example, for:
* baselinePath=/tmp/dir/image-before.png
* testPath=/tmp/dir/image-after.png
*
*
* If setLongNames(true), commonName would be:
* image-before-png-vs-image-after-png.png
*
*
* If setLongNames(false), commonName would be:
* image-.png
*/
@ -104,8 +104,8 @@ public:
*
* The format of the JSON document is one top level array named "records".
* Each record in the array is an object with the following values:
* "commonName" : string containing the output filename (basename)
* depending on the value of 'longNames'.
* "commonName" : string containing the output filename (basename)
* depending on the value of 'longNames'.
* (see 'setLongNames' for an explanation and example).
* "baselinePath" : string containing the path to the baseline image
* "testPath" : string containing the path to the test image