Rebase gpu_dev up to r5182

git-svn-id: http://skia.googlecode.com/svn/branches/gpu_dev@6187 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
bsalomon@google.com 2012-10-29 20:13:42 +00:00
commit 4b2e1c8807
15 changed files with 425 additions and 177 deletions

View File

@ -897,14 +897,14 @@ public:
fEmpty = true;
fDefer[0] = fDefer[1] = pt;
}
void deferredMoveLine(const SkPoint& pt) {
if (!fHasMove) {
deferredMove(pt);
}
deferredLine(pt);
}
bool hasMove() const {
return fHasMove;
}
@ -918,7 +918,7 @@ public:
bool isClosed() const {
return !fEmpty && fFirstPt == fDefer[1];
}
void lineTo() {
if (fDefer[0] == fDefer[1]) {
return;
@ -952,7 +952,7 @@ protected:
bool changedSlopes(const SkPoint& pt) const {
if (fDefer[0] == fDefer[1]) {
return false;
}
}
SkScalar deferDx = fDefer[1].fX - fDefer[0].fX;
SkScalar deferDy = fDefer[1].fY - fDefer[0].fY;
SkScalar lineDx = pt.fX - fDefer[1].fX;
@ -1205,7 +1205,7 @@ public:
init(pts, SkPath::kCubic_Verb, operand);
fBounds.setCubicBounds(pts);
}
/* SkPoint */ void addCurveTo(int start, int end, PathWrapper& path, bool active) const {
SkPoint edge[4];
const SkPoint* ePtr;
@ -1876,7 +1876,7 @@ public:
SkASSERT(fDoneSpans <= fTs.count());
return fDoneSpans == fTs.count();
}
bool done(int min) const {
return fTs[min].fDone;
}
@ -2250,7 +2250,7 @@ public:
}
continue;
}
if (!maxWinding && (!foundAngle || foundDone2)) {
#if DEBUG_WINDING
if (foundAngle && foundDone2) {
@ -2809,7 +2809,7 @@ public:
} while (++index < fTs.count() && approximately_negative(fTs[index].fT - referenceT));
#endif
}
void markOneDone(const char* funName, int tIndex, int winding) {
Span* span = markOneWinding(funName, tIndex, winding);
if (!span) {
@ -3511,7 +3511,7 @@ public:
}
return false;
}
const SkPoint& end() const {
const Segment& segment = fSegments.back();
return segment.pts()[segment.verb()];
@ -3635,7 +3635,7 @@ public:
}
path.close();
}
void toPartialBackward(PathWrapper& path) const {
int segmentCount = fSegments.count();
for (int test = segmentCount - 1; test >= 0; --test) {

View File

@ -16,6 +16,7 @@
#include "SkGraphics.h"
#include "SkImageDecoder.h"
#include "SkImageEncoder.h"
#include "SkOSFile.h"
#include "SkPicture.h"
#include "SkRefCnt.h"
#include "SkStream.h"
@ -64,13 +65,6 @@ const static ErrorBitfield ERROR_DIMENSION_MISMATCH = 0x04;
const static ErrorBitfield ERROR_READING_REFERENCE_IMAGE = 0x08;
const static ErrorBitfield ERROR_WRITING_REFERENCE_IMAGE = 0x10;
// TODO: This should be defined as "\\" on Windows, but this is the way this
// file has been working for a long time. We can fix it later.
const static char* PATH_SEPARATOR = "/";
// If true, emit a messange when we can't find a reference image to compare
static bool gNotifyMissingReadReference;
using namespace skiagm;
class Iter {
@ -156,9 +150,20 @@ static PipeFlagComboData gPipeWritingFlagCombos[] = {
class GMMain {
public:
static SkString make_name(const char shortName[], const char configName[]) {
SkString name(shortName);
name.appendf("_%s", configName);
GMMain() {
// Set default values of member variables, which tool_main()
// may override.
fNotifyMissingReadReference = true;
fUseFileHierarchy = false;
}
SkString make_name(const char shortName[], const char configName[]) {
SkString name;
if (fUseFileHierarchy) {
name.appendf("%s%c%s", configName, SkPATH_SEPARATOR, shortName);
} else {
name.appendf("%s_%s", shortName, configName);
}
return name;
}
@ -167,12 +172,11 @@ public:
const SkString& name,
const char suffix[]) {
SkString filename(path);
if (filename.endsWith(PATH_SEPARATOR)) {
if (filename.endsWith(SkPATH_SEPARATOR)) {
filename.remove(filename.size() - 1, 1);
}
filename.append(pathSuffix);
filename.append(PATH_SEPARATOR);
filename.appendf("%s.%s", name.c_str(), suffix);
filename.appendf("%s%c%s.%s", pathSuffix, SkPATH_SEPARATOR,
name.c_str(), suffix);
return filename;
}
@ -489,7 +493,7 @@ public:
// Returns a description of the difference between "bitmap" and
// the reference bitmap, or ERROR_READING_REFERENCE_IMAGE if
// unable to read the reference bitmap from disk.
static ErrorBitfield compare_to_reference_image_on_disk(
ErrorBitfield compare_to_reference_image_on_disk(
const char readPath [], const SkString& name, SkBitmap &bitmap,
const char diffPath [], const char renderModeDescriptor []) {
SkString path = make_filename(readPath, "", name, "png");
@ -503,7 +507,7 @@ public:
diffPath,
renderModeDescriptor);
} else {
if (gNotifyMissingReadReference) {
if (fNotifyMissingReadReference) {
fprintf(stderr, "FAILED to read %s\n", path.c_str());
}
return ERROR_READING_REFERENCE_IMAGE;
@ -515,15 +519,15 @@ public:
// both NULL (and thus no images are read from or written to disk).
// So I don't trust that the renderModeDescriptor is being used for
// anything other than debug output these days.
static ErrorBitfield handle_test_results(GM* gm,
const ConfigData& gRec,
const char writePath [],
const char readPath [],
const char diffPath [],
const char renderModeDescriptor [],
SkBitmap& bitmap,
SkDynamicMemoryWStream* pdf,
const SkBitmap* referenceBitmap) {
ErrorBitfield handle_test_results(GM* gm,
const ConfigData& gRec,
const char writePath [],
const char readPath [],
const char diffPath [],
const char renderModeDescriptor [],
SkBitmap& bitmap,
SkDynamicMemoryWStream* pdf,
const SkBitmap* referenceBitmap) {
SkString name = make_name(gm->shortName(), gRec.fName);
ErrorBitfield retval = ERROR_NONE;
@ -580,14 +584,14 @@ public:
// Test: draw into a bitmap or pdf.
// Depending on flags, possibly compare to an expected image
// and possibly output a diff image if it fails to match.
static ErrorBitfield test_drawing(GM* gm,
const ConfigData& gRec,
const char writePath [],
const char readPath [],
const char diffPath [],
GrContext* context,
GrRenderTarget* rt,
SkBitmap* bitmap) {
ErrorBitfield test_drawing(GM* gm,
const ConfigData& gRec,
const char writePath [],
const char readPath [],
const char diffPath [],
GrContext* context,
GrRenderTarget* rt,
SkBitmap* bitmap) {
SkDynamicMemoryWStream document;
if (gRec.fBackend == kRaster_Backend ||
@ -612,12 +616,12 @@ public:
"", *bitmap, &document, NULL);
}
static ErrorBitfield test_deferred_drawing(GM* gm,
const ConfigData& gRec,
const SkBitmap& referenceBitmap,
const char diffPath [],
GrContext* context,
GrRenderTarget* rt) {
ErrorBitfield test_deferred_drawing(GM* gm,
const ConfigData& gRec,
const SkBitmap& referenceBitmap,
const char diffPath [],
GrContext* context,
GrRenderTarget* rt) {
SkDynamicMemoryWStream document;
if (gRec.fBackend == kRaster_Backend ||
@ -635,11 +639,11 @@ public:
return ERROR_NONE;
}
static ErrorBitfield test_pipe_playback(GM* gm,
const ConfigData& gRec,
const SkBitmap& referenceBitmap,
const char readPath [],
const char diffPath []) {
ErrorBitfield test_pipe_playback(GM* gm,
const ConfigData& gRec,
const SkBitmap& referenceBitmap,
const char readPath [],
const char diffPath []) {
ErrorBitfield errors = ERROR_NONE;
for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) {
SkBitmap bitmap;
@ -664,7 +668,7 @@ public:
return errors;
}
static ErrorBitfield test_tiled_pipe_playback(
ErrorBitfield test_tiled_pipe_playback(
GM* gm, const ConfigData& gRec, const SkBitmap& referenceBitmap,
const char readPath [], const char diffPath []) {
ErrorBitfield errors = ERROR_NONE;
@ -690,6 +694,17 @@ public:
}
return errors;
}
//
// member variables.
// They are public for now, to allow easier setting by tool_main().
//
// if true, emit a message when we can't find a reference image to compare
bool fNotifyMissingReadReference;
bool fUseFileHierarchy;
}; // end of GMMain class definition
#if SK_SUPPORT_GPU
@ -734,8 +749,6 @@ static const ConfigData gRec[] = {
static void usage(const char * argv0) {
SkDebugf("%s\n", argv0);
SkDebugf(" [-w writePath] [-r readPath] [-d diffPath] [-i resourcePath]\n");
SkDebugf(" [-wp writePicturePath]\n");
SkDebugf(" [--config ");
for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
if (i > 0) {
@ -743,30 +756,37 @@ static void usage(const char * argv0) {
}
SkDebugf(gRec[i].fName);
}
SkDebugf(" ]\n");
SkDebugf(" [--noreplay] [--nopipe] [--noserialize] [--forceBWtext] [--nopdf] \n"
" [--tiledPipe] \n"
" [--nodeferred] [--match substring] [--notexturecache]\n"
" [-h|--help]\n"
SkDebugf("]:\n run these configurations\n");
SkDebugf(
// Alphabetized ignoring "no" prefix ("readPath", "noreplay", "resourcePath").
// It would probably be better if we allowed both yes-and-no settings for each
// one, e.g.:
// [--replay|--noreplay]: whether to exercise SkPicture replay; default is yes
" [--nodeferred]: skip the deferred rendering test pass\n"
" [--diffPath|-d <path>]: write difference images into this directory\n"
" [--disable-missing-warning]: don't print a message to stderr if\n"
" unable to read a reference image for any tests (NOT default behavior)\n"
" [--enable-missing-warning]: print message to stderr (but don't fail) if\n"
" unable to read a reference image for any tests (default behavior)\n"
" [--forceBWtext]: disable text anti-aliasing\n"
" [--help|-h]: show this help message\n"
" [--hierarchy|--nohierarchy]: whether to use multilevel directory structure\n"
" when reading/writing files; default is no\n"
" [--match <substring>]: only run tests whose name includes this substring\n"
" [--modulo <remainder> <divisor>]: only run tests for which \n"
" testIndex %% divisor == remainder\n"
" [--nopdf]: skip the pdf rendering test pass\n"
" [--nopipe]: Skip SkGPipe replay\n"
" [--readPath|-r <path>]: read reference images from this dir, and report\n"
" any differences between those and the newly generated ones\n"
" [--noreplay]: do not exercise SkPicture replay\n"
" [--resourcePath|-i <path>]: directory that stores image resources\n"
" [--noserialize]: do not exercise SkPicture serialization & deserialization\n"
" [--notexturecache]: disable the gpu texture cache\n"
" [--tiledPipe]: Exercise tiled SkGPipe replay\n"
" [--writePath|-w <path>]: write rendered images into this directory\n"
" [--writePicturePath|-wp <path>]: write .skp files into this directory\n"
);
SkDebugf(" writePath: directory to write rendered images in.\n");
SkDebugf(" writePicturePath: directory to write images to in .skp format.\n");
SkDebugf(
" readPath: directory to read reference images from;\n"
" reports if any pixels mismatch between reference and new images\n");
SkDebugf(" diffPath: directory to write difference images in.\n");
SkDebugf(" resourcePath: directory that stores image resources.\n");
SkDebugf(" --noreplay: do not exercise SkPicture replay.\n");
SkDebugf(" --nopipe: Skip SkGPipe replay.\n");
SkDebugf(" --tiledPipe: Exercise tiled SkGPipe replay.\n");
SkDebugf(
" --noserialize: do not exercise SkPicture serialization & deserialization.\n");
SkDebugf(" --forceBWtext: disable text anti-aliasing.\n");
SkDebugf(" --nopdf: skip the pdf rendering test pass.\n");
SkDebugf(" --nodeferred: skip the deferred rendering test pass.\n");
SkDebugf(" --match foo: will only run tests that substring match foo.\n");
SkDebugf(" --notexturecache: disable the gpu texture cache.\n");
SkDebugf(" -h|--help : Show this help message. \n");
}
static int findConfig(const char config[]) {
@ -869,82 +889,13 @@ int tool_main(int argc, char** argv) {
SkTDArray<size_t> configs;
bool userConfig = false;
int moduloIndex = -1;
int moduloCount = -1;
gNotifyMissingReadReference = true;
int moduloRemainder = -1;
int moduloDivisor = -1;
const char* const commandName = argv[0];
char* const* stop = argv + argc;
for (++argv; argv < stop; ++argv) {
if (strcmp(*argv, "-w") == 0) {
argv++;
if (argv < stop && **argv) {
writePath = *argv;
}
} else if (strcmp(*argv, "-wp") == 0) {
argv++;
if (argv < stop && **argv) {
writePicturePath = *argv;
}
} else if (strcmp(*argv, "-r") == 0) {
argv++;
if (argv < stop && **argv) {
readPath = *argv;
}
} else if (strcmp(*argv, "-d") == 0) {
argv++;
if (argv < stop && **argv) {
diffPath = *argv;
}
} else if (strcmp(*argv, "-i") == 0) {
argv++;
if (argv < stop && **argv) {
resourcePath = *argv;
}
} else if (strcmp(*argv, "--forceBWtext") == 0) {
gForceBWtext = true;
} else if (strcmp(*argv, "--nopipe") == 0) {
doPipe = false;
} else if (strcmp(*argv, "--tiledPipe") == 0) {
doTiledPipe = true;
} else if (strcmp(*argv, "--noreplay") == 0) {
doReplay = false;
} else if (strcmp(*argv, "--nopdf") == 0) {
doPDF = false;
} else if (strcmp(*argv, "--nodeferred") == 0) {
doDeferred = false;
} else if (strcmp(*argv, "--modulo") == 0) {
++argv;
if (argv >= stop) {
continue;
}
moduloIndex = atoi(*argv);
++argv;
if (argv >= stop) {
continue;
}
moduloCount = atoi(*argv);
} else if (strcmp(*argv, "--disable-missing-warning") == 0) {
gNotifyMissingReadReference = false;
} else if (strcmp(*argv, "--enable-missing-warning") == 0) {
gNotifyMissingReadReference = true;
} else if (strcmp(*argv, "--serialize") == 0) {
// Leaving in this option so that a user need not modify
// their command line arguments to still run.
doSerialize = true;
} else if (strcmp(*argv, "--noserialize") == 0) {
doSerialize = false;
} else if (strcmp(*argv, "--match") == 0) {
++argv;
if (argv < stop && **argv) {
// just record the ptr, no need for a deep copy
*fMatches.append() = *argv;
}
} else if (strcmp(*argv, "--notexturecache") == 0) {
disableTextureCache = true;
} else if (strcmp(*argv, "--config") == 0) {
if (strcmp(*argv, "--config") == 0) {
argv++;
if (argv < stop) {
int index = findConfig(*argv);
@ -963,9 +914,83 @@ int tool_main(int argc, char** argv) {
usage(commandName);
return -1;
}
} else if (strcmp(*argv, "--nodeferred") == 0) {
doDeferred = false;
} else if ((0 == strcmp(*argv, "--diffPath")) ||
(0 == strcmp(*argv, "-d"))) {
argv++;
if (argv < stop && **argv) {
diffPath = *argv;
}
} else if (strcmp(*argv, "--disable-missing-warning") == 0) {
gmmain.fNotifyMissingReadReference = false;
} else if (strcmp(*argv, "--enable-missing-warning") == 0) {
gmmain.fNotifyMissingReadReference = true;
} else if (strcmp(*argv, "--forceBWtext") == 0) {
gForceBWtext = true;
} else if (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0) {
usage(commandName);
return -1;
} else if (strcmp(*argv, "--hierarchy") == 0) {
gmmain.fUseFileHierarchy = true;
} else if (strcmp(*argv, "--nohierarchy") == 0) {
gmmain.fUseFileHierarchy = false;
} else if (strcmp(*argv, "--match") == 0) {
++argv;
if (argv < stop && **argv) {
// just record the ptr, no need for a deep copy
*fMatches.append() = *argv;
}
} else if (strcmp(*argv, "--modulo") == 0) {
++argv;
if (argv >= stop) {
continue;
}
moduloRemainder = atoi(*argv);
++argv;
if (argv >= stop) {
continue;
}
moduloDivisor = atoi(*argv);
} else if (strcmp(*argv, "--nopdf") == 0) {
doPDF = false;
} else if (strcmp(*argv, "--nopipe") == 0) {
doPipe = false;
} else if ((0 == strcmp(*argv, "--readPath")) ||
(0 == strcmp(*argv, "-r"))) {
argv++;
if (argv < stop && **argv) {
readPath = *argv;
}
} else if (strcmp(*argv, "--noreplay") == 0) {
doReplay = false;
} else if ((0 == strcmp(*argv, "--resourcePath")) ||
(0 == strcmp(*argv, "-i"))) {
argv++;
if (argv < stop && **argv) {
resourcePath = *argv;
}
} else if (strcmp(*argv, "--serialize") == 0) {
doSerialize = true;
} else if (strcmp(*argv, "--noserialize") == 0) {
doSerialize = false;
} else if (strcmp(*argv, "--notexturecache") == 0) {
disableTextureCache = true;
} else if (strcmp(*argv, "--tiledPipe") == 0) {
doTiledPipe = true;
} else if ((0 == strcmp(*argv, "--writePath")) ||
(0 == strcmp(*argv, "-w"))) {
argv++;
if (argv < stop && **argv) {
writePath = *argv;
}
} else if ((0 == strcmp(*argv, "--writePicturePath")) ||
(0 == strcmp(*argv, "-wp"))) {
argv++;
if (argv < stop && **argv) {
writePicturePath = *argv;
}
} else {
usage(commandName);
return -1;
@ -998,11 +1023,11 @@ int tool_main(int argc, char** argv) {
fprintf(stderr, "reading resources from %s\n", resourcePath);
}
if (moduloCount <= 0) {
moduloIndex = -1;
if (moduloDivisor <= 0) {
moduloRemainder = -1;
}
if (moduloIndex < 0 || moduloIndex >= moduloCount) {
moduloIndex = -1;
if (moduloRemainder < 0 || moduloRemainder >= moduloDivisor) {
moduloRemainder = -1;
}
// Accumulate success of all tests.
@ -1023,16 +1048,34 @@ int tool_main(int argc, char** argv) {
int gmIndex = -1;
SkString moduloStr;
// If we will be writing out files, prepare subdirectories.
if (writePath) {
if (!sk_mkdir(writePath)) {
return -1;
}
if (gmmain.fUseFileHierarchy) {
for (int i = 0; i < configs.count(); i++) {
ConfigData config = gRec[configs[i]];
SkString subdir;
subdir.appendf("%s%c%s", writePath, SkPATH_SEPARATOR,
config.fName);
if (!sk_mkdir(subdir.c_str())) {
return -1;
}
}
}
}
Iter iter;
GM* gm;
while ((gm = iter.next()) != NULL) {
++gmIndex;
if (moduloIndex >= 0) {
if ((gmIndex % moduloCount) != moduloIndex) {
if (moduloRemainder >= 0) {
if ((gmIndex % moduloDivisor) != moduloRemainder) {
continue;
}
moduloStr.printf("[%d.%d] ", gmIndex, moduloCount);
moduloStr.printf("[%d.%d] ", gmIndex, moduloDivisor);
}
const char* shortName = gm->shortName();
@ -1050,6 +1093,7 @@ int tool_main(int argc, char** argv) {
for (int i = 0; i < configs.count(); i++) {
ConfigData config = gRec[configs[i]];
// Skip any tests that we don't even need to try.
if ((kPDF_Backend == config.fBackend) &&
(!doPDF || (gmFlags & GM::kSkipPDF_Flag)))

View File

@ -47,6 +47,18 @@ protected:
make_bitmap();
fInitialized = true;
}
canvas->clear(0xFF101010);
SkPaint checkPaint;
checkPaint.setColor(0xFF202020);
for (int y = 0; y < HEIGHT; y += 16) {
for (int x = 0; x < WIDTH; x += 16) {
canvas->save();
canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
canvas->drawRect(SkRect::MakeXYWH(8, 0, 8, 8), checkPaint);
canvas->drawRect(SkRect::MakeXYWH(0, 8, 8, 8), checkPaint);
canvas->restore();
}
}
SkPoint3 pointLocation(0, 0, SkIntToScalar(10));
SkScalar azimuthRad = SkDegreesToRadians(SkIntToScalar(225));
SkScalar elevationRad = SkDegreesToRadians(SkIntToScalar(5));

View File

@ -81,6 +81,7 @@
'skia_scalar%': 'float',
'skia_mesa%': 0,
'skia_nv_path_rendering%': 0,
'skia_texture_cache_mb_limit%': 0,
'skia_angle%': 0,
'skia_directwrite%': 0,
'skia_nacl%': 0,
@ -97,6 +98,7 @@
'skia_scalar%': '<(skia_scalar)',
'skia_mesa%': '<(skia_mesa)',
'skia_nv_path_rendering%': '<(skia_nv_path_rendering)',
'skia_texture_cache_mb_limit%': '<(skia_texture_cache_mb_limit)',
'skia_angle%': '<(skia_angle)',
'skia_arch_width%': '<(skia_arch_width)',
'skia_arch_type%': '<(skia_arch_type)',

View File

@ -71,6 +71,11 @@
],
},
}],
[ 'skia_texture_cache_mb_limit != 0', {
'defines': [
'GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT=<(skia_texture_cache_mb_limit)',
],
}],
],
'direct_dependent_settings': {
'conditions': [

View File

@ -7,7 +7,8 @@
*/
//
// TODO: add unittests for all these operations
#ifndef SkOSFile_DEFINED
#define SkOSFile_DEFINED
@ -24,6 +25,12 @@ enum SkFILE_Flags {
kWrite_SkFILE_Flag = 0x02
};
#ifdef _WIN32
const static char SkPATH_SEPARATOR = '\\';
#else
const static char SkPATH_SEPARATOR = '/';
#endif
SkFILE* sk_fopen(const char path[], SkFILE_Flags);
void sk_fclose(SkFILE*);
@ -39,6 +46,17 @@ void sk_fflush(SkFILE*);
int sk_fseek( SkFILE*, size_t, int );
size_t sk_ftell( SkFILE* );
// Returns true if something (file, directory, ???) exists at this path.
bool sk_exists(const char *path);
// Returns true if a directory exists at this path.
bool sk_isdir(const char *path);
// Create a new directory at this path; returns true if successful.
// If the directory already existed, this will return true.
// Description of the error, if any, will be written to stderr.
bool sk_mkdir(const char* path);
class SkOSFile {
public:
class Iter {
@ -79,4 +97,3 @@ private:
};
#endif

View File

@ -15,18 +15,30 @@
/* Some helper functions for C strings
*/
static bool SkStrStartsWith(const char string[], const char prefix[]) {
static bool SkStrStartsWith(const char string[], const char prefixStr[]) {
SkASSERT(string);
SkASSERT(prefix);
return !strncmp(string, prefix, strlen(prefix));
SkASSERT(prefixStr);
return !strncmp(string, prefixStr, strlen(prefixStr));
}
bool SkStrEndsWith(const char string[], const char suffix[]);
static bool SkStrStartsWith(const char string[], const char prefixChar) {
SkASSERT(string);
return (prefixChar == *string);
}
bool SkStrEndsWith(const char string[], const char suffixStr[]);
bool SkStrEndsWith(const char string[], const char suffixChar);
int SkStrStartsWithOneOf(const char string[], const char prefixes[]);
static bool SkStrContains(const char string[], const char substring[]) {
SkASSERT(string);
SkASSERT(substring);
return (NULL != strstr(string, substring));
}
static bool SkStrContains(const char string[], const char subchar) {
SkASSERT(string);
return (NULL != strchr(string, subchar));
}
#define SkStrAppendS32_MaxSize 11
char* SkStrAppendS32(char buffer[], int32_t);
@ -82,15 +94,24 @@ public:
bool equals(const char text[]) const;
bool equals(const char text[], size_t len) const;
bool startsWith(const char prefix[]) const {
return SkStrStartsWith(fRec->data(), prefix);
bool startsWith(const char prefixStr[]) const {
return SkStrStartsWith(fRec->data(), prefixStr);
}
bool endsWith(const char suffix[]) const {
return SkStrEndsWith(fRec->data(), suffix);
bool startsWith(const char prefixChar) const {
return SkStrStartsWith(fRec->data(), prefixChar);
}
bool endsWith(const char suffixStr[]) const {
return SkStrEndsWith(fRec->data(), suffixStr);
}
bool endsWith(const char suffixChar) const {
return SkStrEndsWith(fRec->data(), suffixChar);
}
bool contains(const char substring[]) const {
return SkStrContains(fRec->data(), substring);
}
bool contains(const char subchar) const {
return SkStrContains(fRec->data(), subchar);
}
friend bool operator==(const SkString& a, const SkString& b) {
return a.equals(b);

View File

@ -369,6 +369,15 @@ inline void GrCrash(const char* msg) { GrPrintf(msg); GrAlwaysAssert(false); }
#define GR_GEOM_BUFFER_LOCK_THRESHOLD (1 << 15)
#endif
/**
* GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT gives a threshold (in megabytes) for the
* maximum size of the texture cache in vram. The value is only a default and
* can be overridden at runtime.
*/
#if !defined(GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT)
#define GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT 96
#endif
///////////////////////////////////////////////////////////////////////////////
// tail section:
//

View File

@ -54,6 +54,12 @@
*/
//#define GR_GEOM_BUFFER_LOCK_THRESHOLD (1<<15)
/**
* This gives a threshold in megabytes for the maximum size of the texture cache
* in vram. The value is only a default and can be overridden at runtime.
*/
//#define GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT 96
///////////////////////////////////////////////////////////////////////////////
// Decide Ganesh types

View File

@ -36,13 +36,23 @@ static const size_t kBufferSize = 512;
///////////////////////////////////////////////////////////////////////////////
bool SkStrEndsWith(const char string[], const char suffix[]) {
bool SkStrEndsWith(const char string[], const char suffixStr[]) {
SkASSERT(string);
SkASSERT(suffix);
SkASSERT(suffixStr);
size_t strLen = strlen(string);
size_t suffixLen = strlen(suffix);
size_t suffixLen = strlen(suffixStr);
return strLen >= suffixLen &&
!strncmp(string + strLen - suffixLen, suffix, suffixLen);
!strncmp(string + strLen - suffixLen, suffixStr, suffixLen);
}
bool SkStrEndsWith(const char string[], const char suffixChar) {
SkASSERT(string);
size_t strLen = strlen(string);
if (0 == strLen) {
return false;
} else {
return (suffixChar == string[strLen-1]);
}
}
int SkStrStartsWithOneOf(const char string[], const char prefixes[]) {
@ -602,4 +612,3 @@ SkString SkStringPrintf(const char* format, ...) {
#undef VSNPRINTF
#undef SNPRINTF

View File

@ -1282,7 +1282,8 @@ void GrGLSpecularLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStr
SkString lightBody;
lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0, 0, 1)));\n");
lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\n", ks, shininess);
lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1.0);\n");
lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\n");
lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b));\n");
builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType,
kVec4f_GrSLType,
"light",

View File

@ -49,7 +49,7 @@ SK_DEFINE_INST_COUNT(GrDrawState)
#endif
static const size_t MAX_TEXTURE_CACHE_COUNT = 2048;
static const size_t MAX_TEXTURE_CACHE_BYTES = 96 * 1024 * 1024;
static const size_t MAX_TEXTURE_CACHE_BYTES = GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT * 1024 * 1024;
static const size_t DRAW_BUFFER_VBPOOL_BUFFER_SIZE = 1 << 15;
static const int DRAW_BUFFER_VBPOOL_PREALLOC_BUFFERS = 4;

View File

@ -9,8 +9,17 @@
#include "SkOSFile.h"
#include <stdio.h>
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#ifdef _WIN32
#include <direct.h>
#include <io.h>
#else
#include <unistd.h>
#endif
SkFILE* sk_fopen(const char path[], SkFILE_Flags flags)
{
@ -98,3 +107,46 @@ void sk_fclose(SkFILE* f)
::fclose((FILE*)f);
}
bool sk_exists(const char *path)
{
#ifdef _WIN32
return (0 == _access(path, 0));
#else
return (0 == access(path, 0));
#endif
}
bool sk_isdir(const char *path)
{
struct stat status;
if (0 != stat(path, &status)) {
return false;
}
return (status.st_mode & S_IFDIR);
}
bool sk_mkdir(const char* path)
{
if (sk_isdir(path)) {
return true;
}
if (sk_exists(path)) {
fprintf(stderr,
"sk_mkdir: path '%s' already exists but is not a directory\n",
path);
return false;
}
int retval;
#ifdef _WIN32
retval = _mkdir(path);
#else
retval = mkdir(path, 0777);
#endif
if (0 == retval) {
return true;
} else {
fprintf(stderr, "sk_mkdir: error %d creating dir '%s'\n", errno, path);
return false;
}
}

View File

@ -57,10 +57,14 @@ static void TestString(skiatest::Reporter* reporter) {
REPORTER_ASSERT(reporter, !a.equals("help"));
REPORTER_ASSERT(reporter, a.startsWith("hell"));
REPORTER_ASSERT(reporter, a.startsWith('h'));
REPORTER_ASSERT(reporter, !a.startsWith( "ell"));
REPORTER_ASSERT(reporter, !a.startsWith( 'e'));
REPORTER_ASSERT(reporter, a.startsWith(""));
REPORTER_ASSERT(reporter, a.endsWith("llo"));
REPORTER_ASSERT(reporter, a.endsWith('o'));
REPORTER_ASSERT(reporter, !a.endsWith("ll" ));
REPORTER_ASSERT(reporter, !a.endsWith('l'));
REPORTER_ASSERT(reporter, a.endsWith(""));
REPORTER_ASSERT(reporter, a.contains("he"));
REPORTER_ASSERT(reporter, a.contains("ll"));
@ -68,6 +72,8 @@ static void TestString(skiatest::Reporter* reporter) {
REPORTER_ASSERT(reporter, a.contains("hello"));
REPORTER_ASSERT(reporter, !a.contains("hellohello"));
REPORTER_ASSERT(reporter, a.contains(""));
REPORTER_ASSERT(reporter, a.contains('e'));
REPORTER_ASSERT(reporter, !a.contains('z'));
SkString e(a);
SkString f("hello");

64
tools/rebaseline.py Executable file
View File

@ -0,0 +1,64 @@
#!/usr/bin/python
'''
Copyright 2012 Google Inc.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
'''
'''
Rebaselines a single GM test, on all bots and all configurations.
Must be run from an SVN checkout of the gm-expected directory.
'''
import os, subprocess, sys, tempfile
pairs = [
['base-shuttle-win7-intel-float',
'Skia_Shuttle_Win7_Intel_Float_Release_32'],
# ['base-shuttle-win7-intel-angle',
# 'Skia_Shuttle_Win7_Intel_Float_ANGLE_Release_32'],
# ['base-shuttle-win7-intel-directwrite',
# 'Skia_Shuttle_Win7_Intel_Float_DirectWrite_Release_32'],
['base-shuttle_ubuntu12_ati5770',
'Skia_Shuttle_Ubuntu12_ATI5770_Float_Release_64'],
['base-macmini',
'Skia_Mac_Float_Release_32'],
['base-macmini-lion-float',
'Skia_MacMiniLion_Float_Release_32'],
['base-android-galaxy-nexus',
'Skia_GalaxyNexus_4-1_Float_Release_32'],
['base-android-nexus-7',
'Skia_Nexus7_4-1_Float_Release_32'],
['base-android-nexus-s',
'Skia_NexusS_4-1_Float_Release_32'],
['base-android-xoom',
'Skia_Xoom_4-1_Float_Release_32'],
]
if len(sys.argv) != 2:
print 'Usage: ' + os.path.basename(sys.argv[0]) + ' <testname>'
exit(1)
testname = sys.argv[1]
testtypes = [ '4444', '565', '8888', 'gpu', 'pdf' ]
for pair in pairs:
print pair[0] + ':'
for testtype in testtypes:
infilename = testname + '_' + testtype + '.png'
print infilename
url = 'http://skia-autogen.googlecode.com/svn/gm-actual/' + pair[0] + '/' + pair[1] + '/' + pair[0] + '/' + infilename
cmd = [ 'curl', '--fail', '--silent', url ]
temp = tempfile.NamedTemporaryFile()
ret = subprocess.call(cmd, stdout=temp)
if ret != 0:
print 'Couldn\'t fetch ' + url
continue
outfilename = os.path.join(pair[0], infilename);
cmd = [ 'cp', temp.name, outfilename ]
subprocess.call(cmd);
cmd = [ 'svn', 'add', '--quiet', outfilename ]
subprocess.call(cmd)