diff options
author | skia.committer@gmail.com <skia.committer@gmail.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-02 13:36:22 +0000 |
---|---|---|
committer | skia.committer@gmail.com <skia.committer@gmail.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-02 13:36:22 +0000 |
commit | 5b39f5ba9c339d1e4dae391fee9ec1396feec180 (patch) | |
tree | 1c9ae56ec4e8faec6f4422d7a506423425ccde6b | |
parent | 742058f0ca473dd871a1235a0f30b1736b045ec9 (diff) |
Sanitizing source files in Housekeeper-Nightly
git-svn-id: http://skia.googlecode.com/svn/trunk@12427 2bbb7eff-a529-9590-31e7-b0007b416f81
126 files changed, 1360 insertions, 916 deletions
@@ -10,7 +10,8 @@ use_relative_paths = True deps = { # DEPS using https://chromium.googlesource.com are pulled from chromium @ r205199 # (see https://chromium.googlesource.com/chromium/chromium/+/c59bfa8ef877f45bfa859669053859857af1d279) - "third_party/externals/angle" : "https://chromium.googlesource.com/external/angleproject.git", + # NOTE: Angle has been reverted to http://angleproject.googlecode.com/svn/trunk@1268 + "third_party/externals/angle" : "https://chromium.googlesource.com/external/angleproject.git@e574e26f48223a6718feab841b4a7720785b497a", "third_party/externals/fontconfig" : "https://skia.googlesource.com/third_party/fontconfig.git@2.10.93", "third_party/externals/freetype" : "https://skia.googlesource.com/third_party/freetype2.git@VER-2-5-0-1", "third_party/externals/gyp" : "https://chromium.googlesource.com/external/gyp.git@d0176c0a2a9e558662905c328c3aa93fd25bbf12", @@ -6,7 +6,6 @@ #include "SkCommandLineFlags.h" #include "SkForceLinking.h" #include "SkGraphics.h" -#include "SkString.h" #include "gm.h" #include "DMReporter.h" @@ -40,6 +39,19 @@ DEFINE_string(config, "8888 gpu", __SK_FORCE_IMAGE_DECODER_LINKING; +// Split str on any characters in delimiters into out. (Think, strtok with a sane API.) +static void split(const char* str, const char* delimiters, SkTArray<SkString>* out) { + const char* end = str + strlen(str); + while (str != end) { + // Find a token. + const size_t len = strcspn(str, delimiters); + out->push_back().set(str, len); + str += len; + // Skip any delimiters. + str += strspn(str, delimiters); + } +} + // "FooBar" -> "foobar". Obviously, ASCII only. static SkString lowercase(SkString s) { for (size_t i = 0; i < s.size(); i++) { @@ -122,7 +134,7 @@ int tool_main(int argc, char** argv) { GM::SetResourcePath(FLAGS_resources[0]); SkTArray<SkString> configs; for (int i = 0; i < FLAGS_config.count(); i++) { - SkStrSplit(FLAGS_config[i], ", ", &configs); + split(FLAGS_config[i], ", ", &configs); } SkTDArray<GMRegistry::Factory> gms; diff --git a/dm/DMComparisonTask.cpp b/dm/DMComparisonTask.cpp new file mode 100644 index 0000000000..bb4e656754 --- /dev/null +++ b/dm/DMComparisonTask.cpp @@ -0,0 +1,21 @@ +#include "DMComparisonTask.h" +#include "DMUtil.h" + +namespace DM { + +ComparisonTask::ComparisonTask(const Task& parent, + skiagm::Expectations expectations, + SkBitmap bitmap) + : Task(parent) + , fName(parent.name()) // Masquerade as parent so failures are attributed to it. + , fExpectations(expectations) + , fBitmap(bitmap) + {} + +void ComparisonTask::draw() { + if (!MeetsExpectations(fExpectations, fBitmap)) { + this->fail(); + } +} + +} // namespace DM diff --git a/dm/DMComparisonTask.h b/dm/DMComparisonTask.h new file mode 100644 index 0000000000..265a58ce32 --- /dev/null +++ b/dm/DMComparisonTask.h @@ -0,0 +1,31 @@ +#ifndef DMComparisonTask_DEFINED +#define DMComparisonTask_DEFINED + +#include "DMTask.h" +#include "SkBitmap.h" +#include "SkString.h" +#include "gm_expectations.h" + +namespace DM { + +// We use ComparisonTask to move CPU-bound comparison work of GpuTasks back to +// the main thread pool, where we probably have more threads available. + +class ComparisonTask : public Task { +public: + ComparisonTask(const Task& parent, skiagm::Expectations, SkBitmap); + + virtual void draw() SK_OVERRIDE; + virtual bool usesGpu() const SK_OVERRIDE { return false; } + virtual bool shouldSkip() const SK_OVERRIDE { return false; } + virtual SkString name() const SK_OVERRIDE { return fName; } + +private: + const SkString fName; + const skiagm::Expectations fExpectations; + const SkBitmap fBitmap; +}; + +} // namespace DM + +#endif // DMComparisonTask_DEFINED diff --git a/dm/DMCpuTask.cpp b/dm/DMCpuTask.cpp index 3f51c8a318..1d1d4010f7 100644 --- a/dm/DMCpuTask.cpp +++ b/dm/DMCpuTask.cpp @@ -1,9 +1,7 @@ #include "DMCpuTask.h" -#include "DMChecksumTask.h" #include "DMPipeTask.h" #include "DMReplayTask.h" #include "DMSerializeTask.h" -#include "DMTileGridTask.h" #include "DMUtil.h" #include "DMWriteTask.h" @@ -32,19 +30,19 @@ void CpuTask::draw() { fGM->draw(&canvas); canvas.flush(); -#define SPAWN(ChildTask, ...) this->spawnChild(SkNEW_ARGS(ChildTask, (*this, __VA_ARGS__))) - SPAWN(ChecksumTask, fExpectations, bitmap); + if (!MeetsExpectations(fExpectations, bitmap)) { + this->fail(); + } + + this->spawnChild(SkNEW_ARGS(PipeTask, (*this, fGMFactory(NULL), bitmap, false, false))); + this->spawnChild(SkNEW_ARGS(PipeTask, (*this, fGMFactory(NULL), bitmap, true, false))); + this->spawnChild(SkNEW_ARGS(PipeTask, (*this, fGMFactory(NULL), bitmap, true, true))); - SPAWN(PipeTask, fGMFactory(NULL), bitmap, false, false); - SPAWN(PipeTask, fGMFactory(NULL), bitmap, true, false); - SPAWN(PipeTask, fGMFactory(NULL), bitmap, true, true); - SPAWN(ReplayTask, fGMFactory(NULL), bitmap, false); - SPAWN(ReplayTask, fGMFactory(NULL), bitmap, true); - SPAWN(SerializeTask, fGMFactory(NULL), bitmap); - SPAWN(TileGridTask, fGMFactory(NULL), bitmap, SkISize::Make(16,16)); + this->spawnChild(SkNEW_ARGS(ReplayTask, (*this, fGMFactory(NULL), bitmap, true))); + this->spawnChild(SkNEW_ARGS(ReplayTask, (*this, fGMFactory(NULL), bitmap, false))); - SPAWN(WriteTask, bitmap); -#undef SPAWN + this->spawnChild(SkNEW_ARGS(SerializeTask, (*this, fGMFactory(NULL), bitmap))); + this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap))); } bool CpuTask::shouldSkip() const { diff --git a/dm/DMGpuTask.cpp b/dm/DMGpuTask.cpp index d4c4254c62..4d99356237 100644 --- a/dm/DMGpuTask.cpp +++ b/dm/DMGpuTask.cpp @@ -1,6 +1,6 @@ #include "DMGpuTask.h" -#include "DMChecksumTask.h" +#include "DMComparisonTask.h" #include "DMUtil.h" #include "DMWriteTask.h" #include "SkCommandLineFlags.h" @@ -60,7 +60,9 @@ void GpuTask::draw() { gr->printCacheStats(); #endif - this->spawnChild(SkNEW_ARGS(ChecksumTask, (*this, fExpectations, bitmap))); + // We offload checksum comparison to the main CPU threadpool. + // This cuts run time by about 30%. + this->spawnChild(SkNEW_ARGS(ComparisonTask, (*this, fExpectations, bitmap))); this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap))); } diff --git a/dm/DMPipeTask.cpp b/dm/DMPipeTask.cpp index de3897a898..8a8fe62000 100644 --- a/dm/DMPipeTask.cpp +++ b/dm/DMPipeTask.cpp @@ -6,7 +6,7 @@ #include "SkCommandLineFlags.h" #include "SkGPipe.h" -DEFINE_bool(pipe, true, "If true, check several pipe variants against the reference bitmap."); +DEFINE_bool(pipe, false, "If true, check several pipe variants against the reference bitmap."); namespace DM { diff --git a/dm/DMReplayTask.cpp b/dm/DMReplayTask.cpp index af8669b7d1..0ec9e250d9 100644 --- a/dm/DMReplayTask.cpp +++ b/dm/DMReplayTask.cpp @@ -5,8 +5,8 @@ #include "SkCommandLineFlags.h" #include "SkPicture.h" -DEFINE_bool(replay, true, "If true, run picture replay tests."); -DEFINE_bool(rtree, true, "If true, run picture replay tests with an rtree."); +DEFINE_bool(replay, false, "If true, run picture replay tests."); +DEFINE_bool(rtree, false, "If true, run picture replay tests with an rtree."); namespace DM { diff --git a/dm/DMReplayTask.h b/dm/DMReplayTask.h index 1245009923..1217c07396 100644 --- a/dm/DMReplayTask.h +++ b/dm/DMReplayTask.h @@ -15,8 +15,8 @@ class ReplayTask : public Task { public: ReplayTask(const Task& parent, // ReplayTask must be a child task. Pass its parent here. - skiagm::GM*, // GM to run through a picture. Takes ownership. - SkBitmap reference, // Bitmap to compare picture replay results to. + skiagm::GM*, // GM to run through a pipe. Takes ownership. + SkBitmap reference, // Bitmap to compare pipe results to. bool useRTree); // Record with an RTree? virtual void draw() SK_OVERRIDE; diff --git a/dm/DMReporter.cpp b/dm/DMReporter.cpp index 31310d1cd9..0e01d71f20 100644 --- a/dm/DMReporter.cpp +++ b/dm/DMReporter.cpp @@ -12,7 +12,7 @@ void Reporter::updateStatusLine() const { } SkString status; - status.printf("\r\033[K%d tasks left", this->started() - this->finished()); + status.printf("\r\033[K%d / %d", this->finished(), this->started()); const int failed = this->failed(); if (failed > 0) { status.appendf(", %d failed", failed); diff --git a/dm/DMSerializeTask.cpp b/dm/DMSerializeTask.cpp index 8bc8c8ef98..d71dfdccfa 100644 --- a/dm/DMSerializeTask.cpp +++ b/dm/DMSerializeTask.cpp @@ -6,7 +6,7 @@ #include "SkPicture.h" #include "SkPixelRef.h" -DEFINE_bool(serialize, true, "If true, run picture serialization tests."); +DEFINE_bool(serialize, false, "If true, run picture serialization tests."); namespace DM { diff --git a/dm/DMTask.cpp b/dm/DMTask.cpp index a5c75f0f8a..ba74a5f409 100644 --- a/dm/DMTask.cpp +++ b/dm/DMTask.cpp @@ -8,15 +8,14 @@ namespace DM { Task::Task(Reporter* reporter, TaskRunner* taskRunner) - : fReporter(reporter), fTaskRunner(taskRunner), fDepth(0) { + : fReporter(reporter), fTaskRunner(taskRunner) { fReporter->start(); } -Task::Task(const Task& parent) - : INHERITED(parent) - , fReporter(parent.fReporter) - , fTaskRunner(parent.fTaskRunner) - , fDepth(parent.depth()+1) { +Task::Task(const Task& that) + : INHERITED(that) + , fReporter(that.fReporter) + , fTaskRunner(that.fTaskRunner) { fReporter->start(); } diff --git a/dm/DMTask.h b/dm/DMTask.h index 0d3ef74cc3..5388196ffd 100644 --- a/dm/DMTask.h +++ b/dm/DMTask.h @@ -18,7 +18,7 @@ class TaskRunner; class Task : public SkRunnable { public: Task(Reporter* reporter, TaskRunner* taskRunner); - Task(const Task& parent); + Task(const Task& that); virtual ~Task(); void run() SK_OVERRIDE; @@ -28,10 +28,6 @@ public: virtual bool shouldSkip() const = 0; virtual SkString name() const = 0; - // Returns the number of parents above this task. - // Top-level tasks return 0, their children 1, and so on. - int depth() const { return fDepth; } - protected: void spawnChild(Task* task); void fail(); @@ -40,7 +36,6 @@ private: // Both unowned. Reporter* fReporter; TaskRunner* fTaskRunner; - int fDepth; typedef SkRunnable INHERITED; }; diff --git a/dm/DMUtil.cpp b/dm/DMUtil.cpp index 6cf6c22e2a..d5214849e6 100644 --- a/dm/DMUtil.cpp +++ b/dm/DMUtil.cpp @@ -15,9 +15,18 @@ SkString Png(SkString s) { return s; } +bool MeetsExpectations(const skiagm::Expectations& expectations, const SkBitmap bitmap) { + if (expectations.ignoreFailure() || expectations.empty()) { + return true; + } + const skiagm::GmResultDigest digest(bitmap); + return expectations.match(digest); +} + void RecordPicture(skiagm::GM* gm, SkPicture* picture, uint32_t recordFlags) { - const SkISize size = gm->getISize(); - SkCanvas* canvas = picture->beginRecording(size.width(), size.height(), recordFlags); + SkCanvas* canvas = picture->beginRecording(SkScalarCeilToInt(gm->width()), + SkScalarCeilToInt(gm->height()), + recordFlags); canvas->concat(gm->getInitialTransform()); gm->draw(canvas); canvas->flush(); @@ -25,8 +34,7 @@ void RecordPicture(skiagm::GM* gm, SkPicture* picture, uint32_t recordFlags) { } void SetupBitmap(const SkBitmap::Config config, skiagm::GM* gm, SkBitmap* bitmap) { - const SkISize size = gm->getISize(); - bitmap->setConfig(config, size.width(), size.height()); + bitmap->setConfig(config, SkScalarCeilToInt(gm->width()), SkScalarCeilToInt(gm->height())); bitmap->allocPixels(); bitmap->eraseColor(0x00000000); } diff --git a/dm/DMUtil.h b/dm/DMUtil.h index 5f22df0878..512ad64eb6 100644 --- a/dm/DMUtil.h +++ b/dm/DMUtil.h @@ -15,6 +15,9 @@ SkString UnderJoin(const char* a, const char* b); // Png("a") -> "a.png" SkString Png(SkString s); +// Roughly, expectations.match(GmResultDigest(bitmap)), but calculates the digest lazily. +bool MeetsExpectations(const skiagm::Expectations& expectations, const SkBitmap bitmap); + // Draw gm to picture. Passes recordFlags to SkPicture::beginRecording(). void RecordPicture(skiagm::GM* gm, SkPicture* picture, uint32_t recordFlags = 0); diff --git a/dm/DMWriteTask.cpp b/dm/DMWriteTask.cpp index c86381f78a..011b339540 100644 --- a/dm/DMWriteTask.cpp +++ b/dm/DMWriteTask.cpp @@ -3,54 +3,41 @@ #include "DMUtil.h" #include "SkCommandLineFlags.h" #include "SkImageEncoder.h" -#include "SkString.h" + +#include <string.h> DEFINE_string2(writePath, w, "", "If set, write GMs here as .pngs."); namespace DM { -WriteTask::WriteTask(const Task& parent, SkBitmap bitmap) : Task(parent), fBitmap(bitmap) { - const int suffixes = parent.depth() + 1; - const char* name = parent.name().c_str(); - SkTArray<SkString> split; - SkStrSplit(name, "_", &split); - int totalSuffixLength = 0; - for (int i = 0; i < suffixes; i++) { - // We're splitting off suffixes from the back to front. - fSuffixes.push_back(split[split.count()-i-1]); - totalSuffixLength += fSuffixes.back().size() + 1; - } - fGmName.set(name, strlen(name)-totalSuffixLength); -} +WriteTask::WriteTask(const Task& parent, SkBitmap bitmap) + : Task(parent) + , fBitmap(bitmap) { + // Split parent's name <gmName>_<config> into gmName and config. + const char* parentName = parent.name().c_str(); + const char* fromLastUnderscore = strrchr(parentName, '_'); + const ptrdiff_t gmNameLength = fromLastUnderscore - parentName; -void WriteTask::makeDirOrFail(SkString dir) { - if (!sk_mkdir(dir.c_str())) { - this->fail(); - } + fConfig.set(fromLastUnderscore+1); + fGmName.set(parentName, gmNameLength); } void WriteTask::draw() { - SkString dir(FLAGS_writePath[0]); - this->makeDirOrFail(dir); - for (int i = 0; i < fSuffixes.count(); i++) { - dir = SkOSPath::SkPathJoin(dir.c_str(), fSuffixes[i].c_str()); - this->makeDirOrFail(dir); - } - if (!SkImageEncoder::EncodeFile(Png(SkOSPath::SkPathJoin(dir.c_str(), fGmName.c_str())).c_str(), + const char* root = FLAGS_writePath[0]; + const SkString dir = SkOSPath::SkPathJoin(root, fConfig.c_str()); + if (!sk_mkdir(root) || + !sk_mkdir(dir.c_str()) || + !SkImageEncoder::EncodeFile(Png(SkOSPath::SkPathJoin(dir.c_str(), fGmName.c_str())).c_str(), fBitmap, SkImageEncoder::kPNG_Type, - 100/*quality*/)) { + 100/*quality*/)) + { this->fail(); } } SkString WriteTask::name() const { - SkString name("writing "); - for (int i = 0; i < fSuffixes.count(); i++) { - name.appendf("%s/", fSuffixes[i].c_str()); - } - name.append(fGmName.c_str()); - return name; + return SkStringPrintf("writing %s/%s.png", fConfig.c_str(), fGmName.c_str()); } bool WriteTask::shouldSkip() const { diff --git a/dm/DMWriteTask.h b/dm/DMWriteTask.h index 82a26bc928..7a9b4faf8a 100644 --- a/dm/DMWriteTask.h +++ b/dm/DMWriteTask.h @@ -4,7 +4,6 @@ #include "DMTask.h" #include "SkBitmap.h" #include "SkString.h" -#include "SkTArray.h" // Writes a bitmap to a file. @@ -13,8 +12,7 @@ namespace DM { class WriteTask : public Task { public: - WriteTask(const Task& parent, // WriteTask must be a child Task. Pass its parent here. - SkBitmap bitmap); // Bitmap to write. + WriteTask(const Task& parent, SkBitmap bitmap); virtual void draw() SK_OVERRIDE; virtual bool usesGpu() const SK_OVERRIDE { return false; } @@ -22,11 +20,9 @@ public: virtual SkString name() const SK_OVERRIDE; private: - SkTArray<SkString> fSuffixes; + SkString fConfig; SkString fGmName; const SkBitmap fBitmap; - - void makeDirOrFail(SkString dir); }; } // namespace DM @@ -7,6 +7,7 @@ Current approximate list of missing features: --writePicturePath --deferred + --tiledGrid DM's design is based around Tasks and a TaskRunner. diff --git a/expectations/gm/Test-Android-GalaxyNexus-SGX540-Arm7-Debug/expected-results.json b/expectations/gm/Test-Android-GalaxyNexus-SGX540-Arm7-Debug/expected-results.json index 5b0db71a34..67676ab426 100644 --- a/expectations/gm/Test-Android-GalaxyNexus-SGX540-Arm7-Debug/expected-results.json +++ b/expectations/gm/Test-Android-GalaxyNexus-SGX540-Arm7-Debug/expected-results.json @@ -2095,18 +2095,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16101291896048576683 + 2789357359936426897 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 6958362917585628191 + 11420474396559742656 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-GalaxyNexus-SGX540-Arm7-Release/expected-results.json b/expectations/gm/Test-Android-GalaxyNexus-SGX540-Arm7-Release/expected-results.json index 28f1c4a431..8a6155956c 100644 --- a/expectations/gm/Test-Android-GalaxyNexus-SGX540-Arm7-Release/expected-results.json +++ b/expectations/gm/Test-Android-GalaxyNexus-SGX540-Arm7-Release/expected-results.json @@ -2095,18 +2095,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16101291896048576683 + 2789357359936426897 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 6958362917585628191 + 11420474396559742656 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-IntelRhb-SGX544-x86-Debug/expected-results.json b/expectations/gm/Test-Android-IntelRhb-SGX544-x86-Debug/expected-results.json index f0f3b237d9..c0de7a6d7b 100644 --- a/expectations/gm/Test-Android-IntelRhb-SGX544-x86-Debug/expected-results.json +++ b/expectations/gm/Test-Android-IntelRhb-SGX544-x86-Debug/expected-results.json @@ -2634,27 +2634,36 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 7789211976036245847 + 2481797737367594615 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 12063547141229638542 + 8086938262113983689 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 8512582036956628519 + 10512095643464253945 ] ], + "bugs": [ + 1759 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-IntelRhb-SGX544-x86-Release/expected-results.json b/expectations/gm/Test-Android-IntelRhb-SGX544-x86-Release/expected-results.json index 10b6836473..aa47a6713f 100644 --- a/expectations/gm/Test-Android-IntelRhb-SGX544-x86-Release/expected-results.json +++ b/expectations/gm/Test-Android-IntelRhb-SGX544-x86-Release/expected-results.json @@ -2634,28 +2634,37 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 7789211976036245847 + 2481797737367594615 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 12063547141229638542 + 8086938262113983689 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 8512582036956628519 + 10512095643464253945 ] ], - "reviewed-by-human": true + "bugs": [ + 1759 + ], + "reviewed-by-human": false }, "complexclip2_565.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-Android-Nexus10-MaliT604-Arm7-Debug/expected-results.json b/expectations/gm/Test-Android-Nexus10-MaliT604-Arm7-Debug/expected-results.json index d90dab3851..423b235822 100644 --- a/expectations/gm/Test-Android-Nexus10-MaliT604-Arm7-Debug/expected-results.json +++ b/expectations/gm/Test-Android-Nexus10-MaliT604-Arm7-Debug/expected-results.json @@ -3214,36 +3214,48 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16101291896048576683 + 2789357359936426897 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 6958362917585628191 + 11420474396559742656 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 17182697123061500145 + 12902148816415894358 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_msaa4.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 17182697123061500145 + 12902148816415894358 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-Nexus10-MaliT604-Arm7-Release/expected-results.json b/expectations/gm/Test-Android-Nexus10-MaliT604-Arm7-Release/expected-results.json index d90dab3851..423b235822 100644 --- a/expectations/gm/Test-Android-Nexus10-MaliT604-Arm7-Release/expected-results.json +++ b/expectations/gm/Test-Android-Nexus10-MaliT604-Arm7-Release/expected-results.json @@ -3214,36 +3214,48 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16101291896048576683 + 2789357359936426897 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 6958362917585628191 + 11420474396559742656 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 17182697123061500145 + 12902148816415894358 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_msaa4.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 17182697123061500145 + 12902148816415894358 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-Nexus7-Tegra3-Arm7-Debug/expected-results.json b/expectations/gm/Test-Android-Nexus7-Tegra3-Arm7-Debug/expected-results.json index ae5d2b9466..90af7d7ef3 100644 --- a/expectations/gm/Test-Android-Nexus7-Tegra3-Arm7-Debug/expected-results.json +++ b/expectations/gm/Test-Android-Nexus7-Tegra3-Arm7-Debug/expected-results.json @@ -2437,27 +2437,36 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16101291896048576683 + 2789357359936426897 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 6958362917585628191 + 11420474396559742656 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 829525110335272310 + 6811779909537199081 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-Nexus7-Tegra3-Arm7-Release/expected-results.json b/expectations/gm/Test-Android-Nexus7-Tegra3-Arm7-Release/expected-results.json index ae5d2b9466..90af7d7ef3 100644 --- a/expectations/gm/Test-Android-Nexus7-Tegra3-Arm7-Release/expected-results.json +++ b/expectations/gm/Test-Android-Nexus7-Tegra3-Arm7-Release/expected-results.json @@ -2437,27 +2437,36 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16101291896048576683 + 2789357359936426897 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 6958362917585628191 + 11420474396559742656 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 829525110335272310 + 6811779909537199081 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-NexusS-SGX540-Arm7-Debug/expected-results.json b/expectations/gm/Test-Android-NexusS-SGX540-Arm7-Debug/expected-results.json index be01d1c849..f5cdea25d2 100644 --- a/expectations/gm/Test-Android-NexusS-SGX540-Arm7-Debug/expected-results.json +++ b/expectations/gm/Test-Android-NexusS-SGX540-Arm7-Debug/expected-results.json @@ -2125,18 +2125,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 7322753158848112633 + 2407516010050573816 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 13587257461703619696 + 5735401648209592903 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-NexusS-SGX540-Arm7-Release/expected-results.json b/expectations/gm/Test-Android-NexusS-SGX540-Arm7-Release/expected-results.json index be01d1c849..f5cdea25d2 100644 --- a/expectations/gm/Test-Android-NexusS-SGX540-Arm7-Release/expected-results.json +++ b/expectations/gm/Test-Android-NexusS-SGX540-Arm7-Release/expected-results.json @@ -2125,18 +2125,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 7322753158848112633 + 2407516010050573816 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 13587257461703619696 + 5735401648209592903 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-Xoom-Tegra2-Arm7-Debug/expected-results.json b/expectations/gm/Test-Android-Xoom-Tegra2-Arm7-Debug/expected-results.json index 077035b0ad..f950faa603 100644 --- a/expectations/gm/Test-Android-Xoom-Tegra2-Arm7-Debug/expected-results.json +++ b/expectations/gm/Test-Android-Xoom-Tegra2-Arm7-Debug/expected-results.json @@ -2485,27 +2485,36 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 7322753158848112633 + 2407516010050573816 ] ], + "bugs": [ + 1759 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 13587257461703619696 + 5735401648209592903 ] ], + "bugs": [ + 1759 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 10584626711301986223 + 16722577663537717052 ] ], + "bugs": [ + 1759 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Android-Xoom-Tegra2-Arm7-Release/expected-results.json b/expectations/gm/Test-Android-Xoom-Tegra2-Arm7-Release/expected-results.json index f934f7ec97..b693c15eec 100644 --- a/expectations/gm/Test-Android-Xoom-Tegra2-Arm7-Release/expected-results.json +++ b/expectations/gm/Test-Android-Xoom-Tegra2-Arm7-Release/expected-results.json @@ -2485,28 +2485,37 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 7322753158848112633 + 2407516010050573816 ] ], - "reviewed-by-human": true + "bugs": [ + 1759 + ], + "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 13587257461703619696 + 5735401648209592903 ] ], - "reviewed-by-human": true + "bugs": [ + 1759 + ], + "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 10584626711301986223 + 16722577663537717052 ] ], - "reviewed-by-human": true + "bugs": [ + 1759 + ], + "reviewed-by-human": false }, "complexclip2_565.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-ChromeOS-Alex-GMA3150-x86-Debug/expected-results.json b/expectations/gm/Test-ChromeOS-Alex-GMA3150-x86-Debug/expected-results.json index 767cef65e3..af5c50cecd 100644 --- a/expectations/gm/Test-ChromeOS-Alex-GMA3150-x86-Debug/expected-results.json +++ b/expectations/gm/Test-ChromeOS-Alex-GMA3150-x86-Debug/expected-results.json @@ -1900,19 +1900,25 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 4055619075226987340 + 10175733445319554072 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 4557992853592297566 + 2036989462359391258 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "complexclip2_565.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-ChromeOS-Alex-GMA3150-x86-Release/expected-results.json b/expectations/gm/Test-ChromeOS-Alex-GMA3150-x86-Release/expected-results.json index d9b5065efa..85a0df3819 100644 --- a/expectations/gm/Test-ChromeOS-Alex-GMA3150-x86-Release/expected-results.json +++ b/expectations/gm/Test-ChromeOS-Alex-GMA3150-x86-Release/expected-results.json @@ -1900,18 +1900,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 4055619075226987340 + 10175733445319554072 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 4557992853592297566 + 2036989462359391258 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-ChromeOS-Daisy-MaliT604-Arm7-Debug/expected-results.json b/expectations/gm/Test-ChromeOS-Daisy-MaliT604-Arm7-Debug/expected-results.json index f3e12355ce..0883236b6e 100644 --- a/expectations/gm/Test-ChromeOS-Daisy-MaliT604-Arm7-Debug/expected-results.json +++ b/expectations/gm/Test-ChromeOS-Daisy-MaliT604-Arm7-Debug/expected-results.json @@ -1900,19 +1900,25 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 4723751871359287410 + 7633944210736451677 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 16275740961157987318 + 2594983628740042115 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "complexclip2_565.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-ChromeOS-Daisy-MaliT604-Arm7-Release/expected-results.json b/expectations/gm/Test-ChromeOS-Daisy-MaliT604-Arm7-Release/expected-results.json index 80a500e762..0883236b6e 100644 --- a/expectations/gm/Test-ChromeOS-Daisy-MaliT604-Arm7-Release/expected-results.json +++ b/expectations/gm/Test-ChromeOS-Daisy-MaliT604-Arm7-Release/expected-results.json @@ -1900,18 +1900,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 4723751871359287410 + 7633944210736451677 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 16275740961157987318 + 2594983628740042115 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-ChromeOS-Link-HD4000-x86_64-Debug/expected-results.json b/expectations/gm/Test-ChromeOS-Link-HD4000-x86_64-Debug/expected-results.json index 7f779292f8..b3b2c303cc 100644 --- a/expectations/gm/Test-ChromeOS-Link-HD4000-x86_64-Debug/expected-results.json +++ b/expectations/gm/Test-ChromeOS-Link-HD4000-x86_64-Debug/expected-results.json @@ -1900,18 +1900,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 4055619075226987340 + 10175733445319554072 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 4557992853592297566 + 2036989462359391258 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-ChromeOS-Link-HD4000-x86_64-Release/expected-results.json b/expectations/gm/Test-ChromeOS-Link-HD4000-x86_64-Release/expected-results.json index 7f779292f8..b3b2c303cc 100644 --- a/expectations/gm/Test-ChromeOS-Link-HD4000-x86_64-Release/expected-results.json +++ b/expectations/gm/Test-ChromeOS-Link-HD4000-x86_64-Release/expected-results.json @@ -1900,18 +1900,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 4055619075226987340 + 10175733445319554072 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 4557992853592297566 + 2036989462359391258 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "complexclip2_565.png": { diff --git a/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86-Debug/expected-results.json b/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86-Debug/expected-results.json index 7641da113c..317e32ee57 100644 --- a/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86-Debug/expected-results.json +++ b/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86-Debug/expected-results.json @@ -4588,9 +4588,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-mac.png": { diff --git a/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86-Release/expected-results.json b/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86-Release/expected-results.json index 743fbf12c1..ade1275611 100644 --- a/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86-Release/expected-results.json +++ b/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86-Release/expected-results.json @@ -4048,9 +4048,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-mac.png": { diff --git a/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json b/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json index bf3379e4f2..02c316e9ec 100644 --- a/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json +++ b/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json @@ -4588,10 +4588,13 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_pdf-mac.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json b/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json index caaec84a41..89df3d4d13 100644 --- a/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json +++ b/expectations/gm/Test-Mac10.6-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json @@ -3724,9 +3724,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-mac.png": { diff --git a/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86-Debug/expected-results.json b/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86-Debug/expected-results.json index 8d472c36a6..4c9d2077bb 100644 --- a/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86-Debug/expected-results.json +++ b/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86-Debug/expected-results.json @@ -4927,9 +4927,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-mac.png": { diff --git a/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86-Release/expected-results.json b/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86-Release/expected-results.json index 3e214644d2..8b0e389e97 100644 --- a/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86-Release/expected-results.json +++ b/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86-Release/expected-results.json @@ -4483,10 +4483,13 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_pdf-mac.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json b/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json index d14b99696f..989a3843a8 100644 --- a/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json +++ b/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json @@ -4927,9 +4927,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-mac.png": { diff --git a/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json b/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json index da61ed9749..20e9ca9173 100644 --- a/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json +++ b/expectations/gm/Test-Mac10.7-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json @@ -4075,9 +4075,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-mac.png": { diff --git a/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86-Debug/expected-results.json b/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86-Debug/expected-results.json index 40de340a8d..77fe9e86c6 100644 --- a/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86-Debug/expected-results.json +++ b/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86-Debug/expected-results.json @@ -4789,10 +4789,13 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_pdf-mac.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86-Release/expected-results.json b/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86-Release/expected-results.json index 964263f512..d31b0ec4f1 100644 --- a/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86-Release/expected-results.json +++ b/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86-Release/expected-results.json @@ -4513,9 +4513,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-mac.png": { diff --git a/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json b/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json index e1a0d9c39c..bcd9ee160a 100644 --- a/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json +++ b/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86_64-Debug/expected-results.json @@ -4789,9 +4789,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-mac.png": { diff --git a/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json b/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json index 09cb6ebbcd..35ec04a4cf 100644 --- a/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json +++ b/expectations/gm/Test-Mac10.8-MacMini4.1-GeForce320M-x86_64-Release/expected-results.json @@ -4378,9 +4378,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 15826989673456070846 + 3224501961775566147 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-mac.png": { diff --git a/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86-Debug/expected-results.json b/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86-Debug/expected-results.json index fdd0ce5e78..3a5992cf21 100644 --- a/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86-Debug/expected-results.json +++ b/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86-Debug/expected-results.json @@ -3502,27 +3502,36 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 14602262721761630857 + 11405847735693538070 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 3481217777013051559 + 4978814888142061167 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 16802525720487425080 + 10275865613222220507 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { diff --git a/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86-Release/expected-results.json b/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86-Release/expected-results.json index 4d014d193f..31009a5069 100644 --- a/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86-Release/expected-results.json +++ b/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86-Release/expected-results.json @@ -3502,27 +3502,36 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 14602262721761630857 + 11405847735693538070 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 3481217777013051559 + 4978814888142061167 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 16802525720487425080 + 10275865613222220507 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { diff --git a/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Debug/expected-results.json b/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Debug/expected-results.json index b04d258ca3..dcc6e941b9 100644 --- a/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Debug/expected-results.json +++ b/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Debug/expected-results.json @@ -3502,28 +3502,37 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 14602262721761630857 + 11405847735693538070 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 3481217777013051559 + 4978814888142061167 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 16802525720487425080 + 10275865613222220507 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_pdf-poppler.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Release/expected-results.json b/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Release/expected-results.json index 5ee204cf2d..851a205059 100644 --- a/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Release/expected-results.json +++ b/expectations/gm/Test-Ubuntu12-ShuttleA-ATI5770-x86_64-Release/expected-results.json @@ -3502,27 +3502,36 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 14602262721761630857 + 11405847735693538070 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 3481217777013051559 + 4978814888142061167 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 16802525720487425080 + 10275865613222220507 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { diff --git a/expectations/gm/Test-Ubuntu12-ShuttleA-NoGPU-x86_64-Debug/expected-results.json b/expectations/gm/Test-Ubuntu12-ShuttleA-NoGPU-x86_64-Debug/expected-results.json index e02d876a33..63be5e1420 100644 --- a/expectations/gm/Test-Ubuntu12-ShuttleA-NoGPU-x86_64-Debug/expected-results.json +++ b/expectations/gm/Test-Ubuntu12-ShuttleA-NoGPU-x86_64-Debug/expected-results.json @@ -3142,18 +3142,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 14602262721761630857 + 11405847735693538070 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 3481217777013051559 + 4978814888142061167 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { diff --git a/expectations/gm/Test-Ubuntu13-ShuttleA-HD2000-x86_64-Debug-ASAN/expected-results.json b/expectations/gm/Test-Ubuntu13-ShuttleA-HD2000-x86_64-Debug-ASAN/expected-results.json index 43fb2e669d..86f232402c 100644 --- a/expectations/gm/Test-Ubuntu13-ShuttleA-HD2000-x86_64-Debug-ASAN/expected-results.json +++ b/expectations/gm/Test-Ubuntu13-ShuttleA-HD2000-x86_64-Debug-ASAN/expected-results.json @@ -3832,28 +3832,37 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 14602262721761630857 + 11405847735693538070 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_8888.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 3481217777013051559 + 4978814888142061167 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 16802525720487425080 + 1439955102723765584 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_pdf-poppler.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug-ANGLE/expected-results.json b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug-ANGLE/expected-results.json index b18d04c22b..2bb4b09ec1 100644 --- a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug-ANGLE/expected-results.json +++ b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug-ANGLE/expected-results.json @@ -1149,11 +1149,9 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 12587234088162094708 + 8745200028676261652 ] - ], - "ignore-failure": true, - "reviewed-by-human": true + ] }, "bleed_gpu.png": { "allowed-digests": [ @@ -4686,18 +4684,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16744651928576717976 + 11235313591528676486 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 16744651928576717976 + 11235313591528676486 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { @@ -5936,8 +5940,10 @@ 12241316569839901585 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_checkerboard_high_512_256_gpu.png": { "allowed-digests": [ @@ -6054,8 +6060,10 @@ 12241316569839901585 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_checkerboard_medium_512_256_gpu.png": { "allowed-digests": [ @@ -6172,8 +6180,10 @@ 13919524755191883787 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_image_high_mandrill_512.png_gpu.png": { "allowed-digests": [ @@ -6290,8 +6300,10 @@ 13919524755191883787 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_image_medium_mandrill_512.png_gpu.png": { "allowed-digests": [ @@ -6408,8 +6420,10 @@ 3631077966779184085 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_text_high_72.00pt_gpu.png": { "allowed-digests": [ @@ -6526,8 +6540,10 @@ 3631077966779184085 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_text_medium_72.00pt_gpu.png": { "allowed-digests": [ @@ -7166,8 +7182,10 @@ 8650483291288564728 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "filterbitmap_checkerboard_192_192_gpu.png": { "allowed-digests": [ @@ -7584,8 +7602,10 @@ 7154075947687660440 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "filterbitmap_image_mandrill_256.png_gpu.png": { "allowed-digests": [ @@ -7702,8 +7722,10 @@ 14830136006359090292 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "filterbitmap_image_mandrill_512.png_gpu.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug-DirectWrite/expected-results.json b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug-DirectWrite/expected-results.json index d68a12b82d..0c8720a48c 100644 --- a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug-DirectWrite/expected-results.json +++ b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug-DirectWrite/expected-results.json @@ -3541,9 +3541,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 14984702717513096997 + 2373323581539004655 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { diff --git a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug/expected-results.json b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug/expected-results.json index 2d328f5e98..04e392d934 100644 --- a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug/expected-results.json +++ b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Debug/expected-results.json @@ -3523,9 +3523,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16744651928576717976 + 11235313591528676486 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { diff --git a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release-ANGLE/expected-results.json b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release-ANGLE/expected-results.json index 104c394244..39bcba2883 100644 --- a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release-ANGLE/expected-results.json +++ b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release-ANGLE/expected-results.json @@ -1149,11 +1149,9 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 12587234088162094708 + 8745200028676261652 ] - ], - "ignore-failure": true, - "reviewed-by-human": true + ] }, "bleed_gpu.png": { "allowed-digests": [ @@ -4686,18 +4684,24 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16744651928576717976 + 11235313591528676486 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_gpu.png": { "allowed-digests": [ [ "bitmap-64bitMD5", - 16744651928576717976 + 11235313591528676486 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { @@ -5936,8 +5940,10 @@ 12241316569839901585 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_checkerboard_high_512_256_gpu.png": { "allowed-digests": [ @@ -6054,8 +6060,10 @@ 12241316569839901585 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_checkerboard_medium_512_256_gpu.png": { "allowed-digests": [ @@ -6172,8 +6180,10 @@ 13919524755191883787 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_image_high_mandrill_512.png_gpu.png": { "allowed-digests": [ @@ -6290,8 +6300,10 @@ 13919524755191883787 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_image_medium_mandrill_512.png_gpu.png": { "allowed-digests": [ @@ -6408,8 +6420,10 @@ 3631077966779184085 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_text_high_72.00pt_gpu.png": { "allowed-digests": [ @@ -6526,8 +6540,10 @@ 3631077966779184085 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "downsamplebitmap_text_medium_72.00pt_gpu.png": { "allowed-digests": [ @@ -7166,8 +7182,10 @@ 8650483291288564728 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "filterbitmap_checkerboard_192_192_gpu.png": { "allowed-digests": [ @@ -7584,8 +7602,10 @@ 7154075947687660440 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "filterbitmap_image_mandrill_256.png_gpu.png": { "allowed-digests": [ @@ -7702,8 +7722,10 @@ 14830136006359090292 ] ], - "ignore-failure": true, - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "filterbitmap_image_mandrill_512.png_gpu.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release-DirectWrite/expected-results.json b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release-DirectWrite/expected-results.json index bb697973f8..2d2dd03987 100644 --- a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release-DirectWrite/expected-results.json +++ b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release-DirectWrite/expected-results.json @@ -3541,10 +3541,13 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 13257802686942423930 + 7353287899127074472 ] ], - "reviewed-by-human": true + "bugs": [ + 1578 + ], + "reviewed-by-human": false }, "colortype_pdf-poppler.png": { "allowed-digests": [ diff --git a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release/expected-results.json b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release/expected-results.json index b6f3c433ec..450fdaad2d 100644 --- a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release/expected-results.json +++ b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86-Release/expected-results.json @@ -3523,9 +3523,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16744651928576717976 + 11235313591528676486 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { diff --git a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86_64-Debug/expected-results.json b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86_64-Debug/expected-results.json index d1c8f1faf7..7790e15f86 100644 --- a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86_64-Debug/expected-results.json +++ b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86_64-Debug/expected-results.json @@ -3523,9 +3523,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16744651928576717976 + 11235313591528676486 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { diff --git a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86_64-Release/expected-results.json b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86_64-Release/expected-results.json index d1c8f1faf7..7790e15f86 100644 --- a/expectations/gm/Test-Win7-ShuttleA-HD2000-x86_64-Release/expected-results.json +++ b/expectations/gm/Test-Win7-ShuttleA-HD2000-x86_64-Release/expected-results.json @@ -3523,9 +3523,12 @@ "allowed-digests": [ [ "bitmap-64bitMD5", - 16744651928576717976 + 11235313591528676486 ] ], + "bugs": [ + 1578 + ], "reviewed-by-human": false }, "colortype_pdf-poppler.png": { diff --git a/gm/bitmapcopy.cpp b/gm/bitmapcopy.cpp index 928b4037c1..5e88cfdd0f 100644 --- a/gm/bitmapcopy.cpp +++ b/gm/bitmapcopy.cpp @@ -11,6 +11,7 @@ namespace skiagm { static const char* gConfigNames[] = { "unknown config", + "A1", "A8", "Index8", "565", diff --git a/gm/bitmapfilters.cpp b/gm/bitmapfilters.cpp index 5856f87f66..f0153e482b 100644 --- a/gm/bitmapfilters.cpp +++ b/gm/bitmapfilters.cpp @@ -47,6 +47,7 @@ static SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x, static const char* gConfigNames[] = { "unknown config", + "A1", "A8", "Index8", "565", diff --git a/gm/rebaseline_server/server.py b/gm/rebaseline_server/server.py index 670c94de28..47ee236f77 100755 --- a/gm/rebaseline_server/server.py +++ b/gm/rebaseline_server/server.py @@ -19,10 +19,8 @@ import posixpath import re import shutil import socket -import subprocess import sys import thread -import threading import time import urlparse @@ -44,6 +42,8 @@ import results ACTUALS_SVN_REPO = 'http://skia-autogen.googlecode.com/svn/gm-actual' PATHSPLIT_RE = re.compile('/([^/]+)/(.+)') +TRUNK_DIRECTORY = os.path.dirname(os.path.dirname(os.path.dirname( + os.path.realpath(__file__)))) EXPECTATIONS_DIR = os.path.join(TRUNK_DIRECTORY, 'expectations', 'gm') GENERATED_IMAGES_ROOT = os.path.join(PARENT_DIRECTORY, 'static', 'generated-images') @@ -67,29 +67,6 @@ _HTTP_HEADER_CONTENT_TYPE = 'Content-Type' _SERVER = None # This gets filled in by main() - -def _run_command(args, directory): - """Runs a command and returns stdout as a single string. - - Args: - args: the command to run, as a list of arguments - directory: directory within which to run the command - - Returns: stdout, as a string - - Raises an Exception if the command failed (exited with nonzero return code). - """ - logging.debug('_run_command: %s in directory %s' % (args, directory)) - proc = subprocess.Popen(args, cwd=directory, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - if proc.returncode is not 0: - raise Exception('command "%s" failed in dir "%s": %s' % - (args, directory, stderr)) - return stdout - - def _get_routable_ip_address(): """Returns routable IP address of this host (the IP address of its network interface that would be used for most traffic, not its localhost @@ -100,7 +77,6 @@ def _get_routable_ip_address(): sock.close() return host - def _create_svn_checkout(dir_path, repo_url): """Creates local checkout of an SVN repository at the specified directory path, returning an svn.Svn object referring to the local checkout. @@ -144,87 +120,69 @@ class Server(object): self._actuals_repo = _create_svn_checkout( dir_path=actuals_dir, repo_url=ACTUALS_SVN_REPO) - # Reentrant lock that must be held whenever updating EITHER of: - # 1. self._results - # 2. the expected or actual results on local disk - self.results_rlock = threading.RLock() - # self._results will be filled in by calls to update_results() - self._results = None - - @property - def results(self): - """ Returns the most recently generated results, or None if update_results() - has not been called yet. """ - return self._results + # We only update the expectations dir if the server was run with a + # nonzero --reload argument; otherwise, we expect the user to maintain + # her own expectations as she sees fit. + # + # TODO(epoger): Use git instead of svn to update the expectations dir, since + # the Skia repo is moving to git. + # When we make that change, we will have to update the entire workspace, + # not just the expectations dir, because git only operates on the repo + # as a whole. + # And since Skia uses depot_tools to manage its dependencies, we will have + # to run "gclient sync" rather than a raw "git pull". + if reload_seconds: + self._expectations_repo = svn.Svn(EXPECTATIONS_DIR) + else: + self._expectations_repo = None - @property def is_exported(self): """ Returns true iff HTTP clients on other hosts are allowed to access this server. """ return self._export - @property def is_editable(self): """ Returns true iff HTTP clients are allowed to submit new baselines. """ return self._editable - @property def reload_seconds(self): """ Returns the result reload period in seconds, or 0 if we don't reload results. """ return self._reload_seconds def update_results(self): - """ Create or update self._results, based on the expectations in + """ Create or update self.results, based on the expectations in EXPECTATIONS_DIR and the latest actuals from skia-autogen. - - We hold self.results_rlock while we do this, to guarantee that no other - thread attempts to update either self._results or the underlying files at - the same time. """ - with self.results_rlock: - logging.info('Updating actual GM results in %s from SVN repo %s ...' % ( - self._actuals_dir, ACTUALS_SVN_REPO)) - self._actuals_repo.Update('.') - - # We only update the expectations dir if the server was run with a - # nonzero --reload argument; otherwise, we expect the user to maintain - # her own expectations as she sees fit. - # - # Because the Skia repo is moving from SVN to git, and git does not - # support updating a single directory tree, we have to update the entire - # repo checkout. - # - # Because Skia uses depot_tools, we have to update using "gclient sync" - # instead of raw git (or SVN) update. Happily, this will work whether - # the checkout was created using git or SVN. - if self._reload_seconds: - logging.info( - 'Updating expected GM results in %s by syncing Skia repo ...' % - EXPECTATIONS_DIR) - _run_command(['gclient', 'sync'], TRUNK_DIRECTORY) + logging.info('Updating actual GM results in %s from SVN repo %s ...' % ( + self._actuals_dir, ACTUALS_SVN_REPO)) + self._actuals_repo.Update('.') + if self._expectations_repo: logging.info( + 'Updating expected GM results in %s ...' % EXPECTATIONS_DIR) + self._expectations_repo.Update('.') + + logging.info( ('Parsing results from actuals in %s and expectations in %s, ' - + 'and generating pixel diffs (may take a while) ...') % ( - self._actuals_dir, EXPECTATIONS_DIR)) - self._results = results.Results( - actuals_root=self._actuals_dir, - expected_root=EXPECTATIONS_DIR, - generated_images_root=GENERATED_IMAGES_ROOT) + + 'and generating pixel diffs (may take a while) ...') % ( + self._actuals_dir, EXPECTATIONS_DIR)) + self.results = results.Results( + actuals_root=self._actuals_dir, + expected_root=EXPECTATIONS_DIR, + generated_images_root=GENERATED_IMAGES_ROOT) def _result_reloader(self): - """ Reload results at the appropriate interval. This never exits, so it - should be run in its own thread. + """ If --reload argument was specified, reload results at the appropriate + interval. """ - while True: + while self._reload_seconds: time.sleep(self._reload_seconds) self.update_results() def run(self): self.update_results() - if self._reload_seconds: - thread.start_new_thread(self._result_reloader, ()) + thread.start_new_thread(self._result_reloader, ()) if self._export: server_address = ('', self._port) @@ -298,9 +256,9 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): # We only return these timestamps if the --reload argument was passed; # otherwise, we have no idea when the expectations were last updated # (we allow the user to maintain her own expectations as she sees fit). - 'timeUpdated': time_updated if _SERVER.reload_seconds else None, + 'timeUpdated': time_updated if _SERVER.reload_seconds() else None, 'timeNextUpdateAvailable': ( - (time_updated+_SERVER.reload_seconds) if _SERVER.reload_seconds + (time_updated+_SERVER.reload_seconds()) if _SERVER.reload_seconds() else None), # The type we passed to get_results_of_type() @@ -311,10 +269,10 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 'dataHash': str(hash(repr(response_dict['testData']))), # Whether the server will accept edits back. - 'isEditable': _SERVER.is_editable, + 'isEditable': _SERVER.is_editable(), # Whether the service is accessible from other hosts. - 'isExported': _SERVER.is_exported, + 'isExported': _SERVER.is_exported(), } self.send_json_dict(response_dict) except: @@ -385,7 +343,7 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): Raises an Exception if there were any problems. """ - if not _SERVER.is_editable: + if not _SERVER.is_editable(): raise Exception('this server is not running in --editable mode') content_type = self.headers[_HTTP_HEADER_CONTENT_TYPE] @@ -399,23 +357,22 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): logging.debug('do_POST_edits: received new GM expectations data [%s]' % data) - # Update the results on disk with the information we received from the - # client. - # We must hold _SERVER.results_rlock while we do this, to guarantee that - # no other thread updates expectations (from the Skia repo) while we are - # updating them (using the info we received from the client). - with _SERVER.results_rlock: - oldResultsType = data['oldResultsType'] - oldResults = _SERVER.results.get_results_of_type(oldResultsType) - oldResultsHash = str(hash(repr(oldResults['testData']))) - if oldResultsHash != data['oldResultsHash']: - raise Exception('results of type "%s" changed while the client was ' - 'making modifications. The client should reload the ' - 'results and submit the modifications again.' % - oldResultsType) - _SERVER.results.edit_expectations(data['modifications']) - # Read the updated results back from disk. - _SERVER.update_results() + # Since we must make multiple calls to the Results object, grab a + # reference to it in case it is updated to point at a new Results + # object within another thread. + results_obj = _SERVER.results + oldResultsType = data['oldResultsType'] + oldResults = results_obj.get_results_of_type(oldResultsType) + oldResultsHash = str(hash(repr(oldResults['testData']))) + if oldResultsHash != data['oldResultsHash']: + raise Exception('results of type "%s" changed while the client was ' + 'making modifications. The client should reload the ' + 'results and submit the modifications again.' % + oldResultsType) + results_obj.edit_expectations(data['modifications']) + + # Now that the edits have been committed, update results to reflect them. + _SERVER.update_results() def redirect_to(self, url): """ Redirect the HTTP client to a different url. @@ -488,8 +445,7 @@ def main(): parser.add_argument('--reload', type=int, help=('How often (a period in seconds) to update the ' 'results. If specified, both expected and actual ' - 'results will be updated by running "gclient sync" ' - 'on your Skia checkout as a whole. ' + 'results will be updated. ' 'By default, we do not reload at all, and you ' 'must restart the server to pick up new data.'), default=0) @@ -500,6 +456,5 @@ def main(): reload_seconds=args.reload) _SERVER.run() - if __name__ == '__main__': main() diff --git a/gyp/angle.gyp b/gyp/angle.gyp index 2b38abfe8a..2a88d56b60 100644 --- a/gyp/angle.gyp +++ b/gyp/angle.gyp @@ -4,30 +4,9 @@ 'conditions': [ [ 'skia_angle', { 'target_defaults': { - 'include_dirs': [ - '$(DXSDK_DIR)/Include', - ], - 'msvs_settings': { - 'VCLinkerTool': { - 'conditions': [ - [ 'skia_arch_width == 32 ', { - 'AdditionalLibraryDirectories': [ - '$(DXSDK_DIR)/Lib/x86', - ], - },{ - 'AdditionalLibraryDirectories': [ - '$(DXSDK_DIR)/Lib/x64', - ], - }], - ], - }, - }, 'defines': [ 'NOMINMAX', ], - 'defines/': [ - ['exclude', 'ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES'], - ], }, 'variables': { 'component': 'static_library', diff --git a/gyp/bench.gyp b/gyp/bench.gyp index 595d77cd54..040f7a4fcf 100644 --- a/gyp/bench.gyp +++ b/gyp/bench.gyp @@ -13,89 +13,14 @@ '../src/effects', '../src/utils', ], + 'includes': [ + 'bench.gypi' + ], 'dependencies': [ 'skia_lib.gyp:skia_lib', 'bench_timer', 'flags.gyp:flags', ], - 'sources': [ - '../bench/AAClipBench.cpp', - '../bench/BicubicBench.cpp', - '../bench/BitmapBench.cpp', - '../bench/BitmapRectBench.cpp', - '../bench/BitmapScaleBench.cpp', - '../bench/BlurBench.cpp', - '../bench/BlurImageFilterBench.cpp', - '../bench/BlurRectBench.cpp', - '../bench/BlurRoundRectBench.cpp', - '../bench/ChartBench.cpp', - '../bench/ChecksumBench.cpp', - '../bench/ChromeBench.cpp', - '../bench/CmapBench.cpp', - '../bench/ColorFilterBench.cpp', - '../bench/CoverageBench.cpp', - '../bench/DashBench.cpp', - '../bench/DecodeBench.cpp', - '../bench/DeferredCanvasBench.cpp', - '../bench/DeferredSurfaceCopyBench.cpp', - '../bench/DisplacementBench.cpp', - '../bench/FSRectBench.cpp', - '../bench/FontCacheBench.cpp', - '../bench/FontScalerBench.cpp', - '../bench/GameBench.cpp', - '../bench/GrMemoryPoolBench.cpp', - '../bench/GrResourceCacheBench.cpp', - '../bench/GradientBench.cpp', - '../bench/HairlinePathBench.cpp', - '../bench/ImageCacheBench.cpp', - '../bench/ImageDecodeBench.cpp', - '../bench/InterpBench.cpp', - '../bench/LightingBench.cpp', - '../bench/LineBench.cpp', - '../bench/MagnifierBench.cpp', - '../bench/MathBench.cpp', - '../bench/Matrix44Bench.cpp', - '../bench/MatrixBench.cpp', - '../bench/MatrixConvolutionBench.cpp', - '../bench/MemoryBench.cpp', - '../bench/MemsetBench.cpp', - '../bench/MergeBench.cpp', - '../bench/MorphologyBench.cpp', - '../bench/MutexBench.cpp', - '../bench/PathBench.cpp', - '../bench/PathIterBench.cpp', - '../bench/PathUtilsBench.cpp', - '../bench/PerlinNoiseBench.cpp', - '../bench/PicturePlaybackBench.cpp', - '../bench/PictureRecordBench.cpp', - '../bench/PremulAndUnpremulAlphaOpsBench.cpp', - '../bench/RTreeBench.cpp', - '../bench/ReadPixBench.cpp', - '../bench/RectBench.cpp', - '../bench/RectoriBench.cpp', - '../bench/RefCntBench.cpp', - '../bench/RegionBench.cpp', - '../bench/RegionContainBench.cpp', - '../bench/RepeatTileBench.cpp', - '../bench/ScalarBench.cpp', - '../bench/ShaderMaskBench.cpp', - '../bench/SkipZeroesBench.cpp', - '../bench/SortBench.cpp', - '../bench/StrokeBench.cpp', - '../bench/TableBench.cpp', - '../bench/TextBench.cpp', - '../bench/TileBench.cpp', - '../bench/VertBench.cpp', - '../bench/WritePixelsBench.cpp', - '../bench/WriterBench.cpp', - '../bench/XfermodeBench.cpp', - - '../bench/SkBenchLogger.cpp', - '../bench/SkBenchLogger.h', - '../bench/SkBenchmark.cpp', - '../bench/SkBenchmark.h', - '../bench/benchmain.cpp', - ], 'conditions': [ ['skia_gpu == 1', { diff --git a/gyp/bench.gypi b/gyp/bench.gypi new file mode 100644 index 0000000000..33f0dbac52 --- /dev/null +++ b/gyp/bench.gypi @@ -0,0 +1,88 @@ +# sources and conditions used in skia's bench.gyp and chromium's skia.gyp +# +{ + 'sources': [ + '../bench/benchmain.cpp', + '../bench/SkBenchmark.h', + '../bench/SkBenchmark.cpp', + '../bench/AAClipBench.cpp', + '../bench/BicubicBench.cpp', + '../bench/BitmapBench.cpp', + '../bench/BitmapRectBench.cpp', + '../bench/BitmapScaleBench.cpp', + '../bench/BlurBench.cpp', + '../bench/BlurImageFilterBench.cpp', + '../bench/BlurRectBench.cpp', + '../bench/BlurRoundRectBench.cpp', + '../bench/ChecksumBench.cpp', + '../bench/ChartBench.cpp', + '../bench/ChromeBench.cpp', + '../bench/CmapBench.cpp', + '../bench/ColorFilterBench.cpp', + '../bench/CoverageBench.cpp', + '../bench/DashBench.cpp', + '../bench/DecodeBench.cpp', + '../bench/DeferredCanvasBench.cpp', + '../bench/DeferredSurfaceCopyBench.cpp', + '../bench/DisplacementBench.cpp', + '../bench/FontCacheBench.cpp', + '../bench/FontScalerBench.cpp', + '../bench/FSRectBench.cpp', + '../bench/GameBench.cpp', + '../bench/GradientBench.cpp', + '../bench/GrMemoryPoolBench.cpp', + '../bench/GrResourceCacheBench.cpp', + '../bench/ImageCacheBench.cpp', + '../bench/ImageDecodeBench.cpp', + '../bench/InterpBench.cpp', + '../bench/HairlinePathBench.cpp', + '../bench/LineBench.cpp', + '../bench/LightingBench.cpp', + '../bench/MagnifierBench.cpp', + '../bench/MathBench.cpp', + '../bench/Matrix44Bench.cpp', + '../bench/MatrixBench.cpp', + '../bench/MatrixConvolutionBench.cpp', + '../bench/MemoryBench.cpp', + '../bench/MemsetBench.cpp', + '../bench/MergeBench.cpp', + '../bench/MorphologyBench.cpp', + '../bench/MutexBench.cpp', + '../bench/PathBench.cpp', + '../bench/PathIterBench.cpp', + '../bench/PathUtilsBench.cpp', + '../bench/PerlinNoiseBench.cpp', + '../bench/PicturePlaybackBench.cpp', + '../bench/PictureRecordBench.cpp', + '../bench/ReadPixBench.cpp', + '../bench/PremulAndUnpremulAlphaOpsBench.cpp', + '../bench/RectBench.cpp', + '../bench/RectoriBench.cpp', + '../bench/RefCntBench.cpp', + '../bench/RegionBench.cpp', + '../bench/RegionContainBench.cpp', + '../bench/RepeatTileBench.cpp', + '../bench/RTreeBench.cpp', + '../bench/ScalarBench.cpp', + '../bench/ShaderMaskBench.cpp', + '../bench/SkipZeroesBench.cpp', + '../bench/SortBench.cpp', + '../bench/StrokeBench.cpp', + '../bench/TableBench.cpp', + '../bench/TextBench.cpp', + '../bench/TileBench.cpp', + '../bench/VertBench.cpp', + '../bench/WriterBench.cpp', + '../bench/XfermodeBench.cpp', + '../bench/WritePixelsBench.cpp', + + '../bench/SkBenchLogger.h', + '../bench/SkBenchLogger.cpp', + ], +} + +# Local Variables: +# tab-width:2 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=2 shiftwidth=2: diff --git a/gyp/core.gypi b/gyp/core.gypi index 530b11831a..54e23efb4f 100644 --- a/gyp/core.gypi +++ b/gyp/core.gypi @@ -44,6 +44,7 @@ '<(skia_src_path)/core/SkBlitRow_D32.cpp', '<(skia_src_path)/core/SkBlitter.h', '<(skia_src_path)/core/SkBlitter.cpp', + '<(skia_src_path)/core/SkBlitter_A1.cpp', '<(skia_src_path)/core/SkBlitter_A8.cpp', '<(skia_src_path)/core/SkBlitter_ARGB32.cpp', '<(skia_src_path)/core/SkBlitter_RGB16.cpp', diff --git a/gyp/dm.gyp b/gyp/dm.gyp index 7d8d5d8d38..80838a98ec 100644 --- a/gyp/dm.gyp +++ b/gyp/dm.gyp @@ -18,7 +18,7 @@ 'includes': [ 'gmslides.gypi' ], 'sources': [ '../dm/DM.cpp', - '../dm/DMChecksumTask.cpp', + '../dm/DMComparisonTask.cpp', '../dm/DMCpuTask.cpp', '../dm/DMGpuTask.cpp', '../dm/DMPipeTask.cpp', @@ -27,7 +27,6 @@ '../dm/DMSerializeTask.cpp', '../dm/DMTask.cpp', '../dm/DMTaskRunner.cpp', - '../dm/DMTileGridTask.cpp', '../dm/DMUtil.cpp', '../dm/DMWriteTask.cpp', '../gm/gm.cpp', diff --git a/gyp/gmslides.gypi b/gyp/gmslides.gypi index c8a82c2ffb..542de0f121 100644 --- a/gyp/gmslides.gypi +++ b/gyp/gmslides.gypi @@ -50,7 +50,6 @@ '../gm/downsamplebitmap.cpp', '../gm/drawbitmaprect.cpp', '../gm/drawlooper.cpp', - '../gm/dropshadowimagefilter.cpp', '../gm/extractbitmap.cpp', '../gm/emptypath.cpp', '../gm/fatpathfill.cpp', @@ -105,7 +104,6 @@ '../gm/perlinnoise.cpp', '../gm/points.cpp', '../gm/poly2poly.cpp', - '../gm/polygons.cpp', '../gm/quadpaths.cpp', '../gm/rects.cpp', '../gm/rrect.cpp', diff --git a/gyp/gpu.gypi b/gyp/gpu.gypi index f4c243cf60..16f5369dd1 100644 --- a/gyp/gpu.gypi +++ b/gyp/gpu.gypi @@ -126,6 +126,7 @@ '<(skia_src_path)/gpu/GrTextureAccess.cpp', '<(skia_src_path)/gpu/GrTHashTable.h', '<(skia_src_path)/gpu/GrVertexBuffer.h', + '<(skia_src_path)/gpu/gr_unittests.cpp', '<(skia_src_path)/gpu/effects/Gr1DKernelEffect.h', '<(skia_src_path)/gpu/effects/GrConfigConversionEffect.cpp', diff --git a/gyp/opts.gyp b/gyp/opts.gyp index bf93926859..01bcddefdb 100644 --- a/gyp/opts.gyp +++ b/gyp/opts.gyp @@ -177,7 +177,6 @@ '../src/opts/SkBitmapProcState_matrixProcs_neon.cpp', '../src/opts/SkBitmapProcState_matrix_clamp_neon.h', '../src/opts/SkBitmapProcState_matrix_repeat_neon.h', - '../src/opts/SkBlitMask_opts_arm_neon.cpp', '../src/opts/SkBlitRow_opts_arm_neon.cpp', '../src/opts/SkMorphology_opts_neon.cpp', '../src/opts/SkXfermode_opts_arm_neon.cpp', diff --git a/gyp/tests.gyp b/gyp/tests.gyp index 5525b8410c..841baf7606 100644 --- a/gyp/tests.gyp +++ b/gyp/tests.gyp @@ -83,7 +83,6 @@ '../tests/GradientTest.cpp', '../tests/GrMemoryPoolTest.cpp', '../tests/GrSurfaceTest.cpp', - '../tests/GrUnitTests.cpp', '../tests/HashCacheTest.cpp', '../tests/ImageCacheTest.cpp', '../tests/ImageDecodingTest.cpp', diff --git a/include/core/SkBitmap.h b/include/core/SkBitmap.h index cd85b6a9b1..b58925c9db 100644 --- a/include/core/SkBitmap.h +++ b/include/core/SkBitmap.h @@ -42,6 +42,12 @@ public: enum Config { kNo_Config, //!< bitmap has not been configured + /** + * 1-bit per pixel, (0 is transparent, 1 is opaque) + * Valid as a destination (target of a canvas), but not valid as a src. + * i.e. you can draw into a 1-bit bitmap, but you cannot draw from one. + */ + kA1_Config, kA8_Config, //!< 8-bits per pixel, with only alpha specified (0 is transparent, 0xFF is opaque) kIndex8_Config, //!< 8-bits per pixel, using SkColorTable to specify the colors kRGB_565_Config, //!< 16-bits per pixel, (see SkColorPriv.h for packing) @@ -483,6 +489,14 @@ public: */ inline uint8_t* getAddr8(int x, int y) const; + /** Returns the address of the byte containing the pixel specified by x,y + * for 1bit pixels. + * In debug build, this asserts that the pixels are allocated and locked, + * and that the config is 1-bit, however none of these checks are performed + * in the release build. + */ + inline uint8_t* getAddr1(int x, int y) const; + /** Returns the color corresponding to the pixel specified by x,y for * colortable based bitmaps. * In debug build, this asserts that the pixels are allocated and locked, @@ -804,4 +818,12 @@ inline SkPMColor SkBitmap::getIndex8Color(int x, int y) const { return (*fColorTable)[*((const uint8_t*)fPixels + y * fRowBytes + x)]; } +// returns the address of the byte that contains the x coordinate +inline uint8_t* SkBitmap::getAddr1(int x, int y) const { + SkASSERT(fPixels); + SkASSERT(fConfig == kA1_Config); + SkASSERT((unsigned)x < fWidth && (unsigned)y < fHeight); + return (uint8_t*)fPixels + y * fRowBytes + (x >> 3); +} + #endif diff --git a/include/core/SkImageDecoder.h b/include/core/SkImageDecoder.h index 5745dbd5ba..a7e3646553 100644 --- a/include/core/SkImageDecoder.h +++ b/include/core/SkImageDecoder.h @@ -186,7 +186,7 @@ public: src: 32/24, no-alpha -> 4 src: 32/24, yes-alpha -> 5 */ - void setPrefConfigTable(const SkBitmap::Config pref[5]); + void setPrefConfigTable(const SkBitmap::Config pref[6]); /** * Optional table describing the caller's preferred config based on diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h index 42566eddbd..e371c4369d 100644 --- a/include/core/SkPicture.h +++ b/include/core/SkPicture.h @@ -218,14 +218,13 @@ protected: // V13: add flag to drawBitmapRectToRect // parameterize blurs by sigma rather than radius // V14: Add flags word to PathRef serialization - // V15: Remove A1 bitmpa config (and renumber remaining configs) #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V13_AND_ALL_OTHER_INSTANCES_TOO static const uint32_t PRIOR_PRIOR_PICTURE_VERSION = 12; // TODO: remove when .skps regenerated #endif #ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V14_AND_ALL_OTHER_INSTANCES_TOO static const uint32_t PRIOR_PICTURE_VERSION2 = 13; // TODO: remove when .skps regenerated #endif - static const uint32_t PICTURE_VERSION = 15; + static const uint32_t PICTURE_VERSION = 14; // fPlayback, fRecord, fWidth & fHeight are protected to allow derived classes to // install their own SkPicturePlayback-derived players,SkPictureRecord-derived diff --git a/include/core/SkString.h b/include/core/SkString.h index ce87312f12..291bd65696 100644 --- a/include/core/SkString.h +++ b/include/core/SkString.h @@ -11,7 +11,6 @@ #define SkString_DEFINED #include "SkScalar.h" -#include "SkTArray.h" #include <stdarg.h> @@ -245,7 +244,4 @@ template <> inline void SkTSwap(SkString& a, SkString& b) { a.swap(b); } -// Split str on any characters in delimiters into out. (Think, strtok with a sane API.) -void SkStrSplit(const char* str, const char* delimiters, SkTArray<SkString>* out); - #endif diff --git a/include/effects/SkDropShadowImageFilter.h b/include/effects/SkDropShadowImageFilter.h index 5a58a0a06a..501df7cf7f 100644 --- a/include/effects/SkDropShadowImageFilter.h +++ b/include/effects/SkDropShadowImageFilter.h @@ -12,7 +12,6 @@ class SK_API SkDropShadowImageFilter : public SkImageFilter { public: SkDropShadowImageFilter(SkScalar dx, SkScalar dy, SkScalar sigma, SkColor, SkImageFilter* input = NULL); - SkDropShadowImageFilter(SkScalar dx, SkScalar dy, SkScalar sigmaX, SkScalar sigmaY, SkColor, SkImageFilter* input = NULL, const CropRect* cropRect = NULL); SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDropShadowImageFilter) protected: @@ -21,7 +20,7 @@ protected: virtual bool onFilterImage(Proxy*, const SkBitmap& source, const SkMatrix&, SkBitmap* result, SkIPoint* loc) SK_OVERRIDE; private: - SkScalar fDx, fDy, fSigmaX, fSigmaY; + SkScalar fDx, fDy, fSigma; SkColor fColor; typedef SkImageFilter INHERITED; }; diff --git a/include/ports/SkFontMgr.h b/include/ports/SkFontMgr.h index 97ae2f15be..accb0c5860 100644 --- a/include/ports/SkFontMgr.h +++ b/include/ports/SkFontMgr.h @@ -105,6 +105,7 @@ protected: virtual SkTypeface* onCreateFromStream(SkStream*, int ttcIndex) = 0; virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) = 0; + // TODO: make this pure-virtual once all ports know about it virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], unsigned styleBits) = 0; private: diff --git a/platform_tools/android/app/src/com/skia/SkiaSampleActivity.java b/platform_tools/android/app/src/com/skia/SkiaSampleActivity.java index 0a7a569728..62f81a58f5 100644 --- a/platform_tools/android/app/src/com/skia/SkiaSampleActivity.java +++ b/platform_tools/android/app/src/com/skia/SkiaSampleActivity.java @@ -43,11 +43,6 @@ public class SkiaSampleActivity extends Activity try { System.loadLibrary("skia_android"); - } catch (UnsatisfiedLinkError e) { - // This might be because skia was linked to SampleApp statically. - } - - try { System.loadLibrary("SampleApp"); LinearLayout holder = (LinearLayout) findViewById(R.id.holder); diff --git a/platform_tools/android/bin/android_run_skia b/platform_tools/android/bin/android_run_skia index 11c36756f5..3314225ba4 100755 --- a/platform_tools/android/bin/android_run_skia +++ b/platform_tools/android/bin/android_run_skia @@ -28,10 +28,7 @@ then fi adb_push_if_needed "${SKIA_OUT}/${configuration}/skia_launcher" /data/local/tmp -if [ -f "${SKIA_OUT}/${configuration}/lib.target/libskia_android.so" ]; then - # Does not exist for builds with static skia. - adb_push_if_needed "${SKIA_OUT}/${configuration}/lib.target/libskia_android.so" /data/local/tmp -fi +adb_push_if_needed "${SKIA_OUT}/${configuration}/lib.target/libskia_android.so" /data/local/tmp adb_push_if_needed "${SKIA_OUT}/${configuration}/lib.target/lib${runVars[0]}.so" /data/local/tmp STATUS_FILENAME="/data/local/tmp/.skia_tmp_$(date +%s%N)" diff --git a/platform_tools/android/bin/android_setup.sh b/platform_tools/android/bin/android_setup.sh index b11fcaccb4..1a5ccf9908 100755 --- a/platform_tools/android/bin/android_setup.sh +++ b/platform_tools/android/bin/android_setup.sh @@ -161,9 +161,7 @@ setup_device() { DEFINES="${DEFINES} host_os=$(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')" DEFINES="${DEFINES} skia_os=android" DEFINES="${DEFINES} android_base=${SCRIPT_DIR}/.." - if [[ "$GYP_DEFINES" != *skia_shared_lib=* ]]; then - DEFINES="${DEFINES} skia_shared_lib=1" - fi + DEFINES="${DEFINES} skia_shared_lib=1" # Setup the build variation depending on the target device TARGET_DEVICE="$1" diff --git a/platform_tools/android/gyp/skia_android.gypi b/platform_tools/android/gyp/skia_android.gypi index 270b934baf..d4f865a1ae 100644 --- a/platform_tools/android/gyp/skia_android.gypi +++ b/platform_tools/android/gyp/skia_android.gypi @@ -30,16 +30,9 @@ # still build. { 'destination': '<(PRODUCT_DIR)/android/libs/<(android_arch)', - 'conditions': [ - [ 'skia_shared_lib', { - 'files': [ - '<(SHARED_LIB_DIR)/libSampleApp.so', - '<(SHARED_LIB_DIR)/libskia_android.so', - ]}, { - 'files': [ - '<(SHARED_LIB_DIR)/libSampleApp.so', - ]} - ], + 'files': [ + '<(SHARED_LIB_DIR)/libSampleApp.so', + '<(SHARED_LIB_DIR)/libskia_android.so', ], }, ], diff --git a/platform_tools/android/launcher/skia_launcher.cpp b/platform_tools/android/launcher/skia_launcher.cpp index 746d470a3c..718a7173da 100644 --- a/platform_tools/android/launcher/skia_launcher.cpp +++ b/platform_tools/android/launcher/skia_launcher.cpp @@ -67,16 +67,12 @@ int main(int argc, const char** argv) { return -1; } - void* skiaLibrary; - -#if defined(SKIA_DLL) // load the local skia shared library - skiaLibrary = load_library(appLocation, "skia_android"); + void* skiaLibrary = load_library(appLocation, "skia_android"); if (NULL == skiaLibrary) { return -1; } -#endif // load the appropriate library void* appLibrary = load_library(appLocation, argv[1]); @@ -84,10 +80,6 @@ int main(int argc, const char** argv) { return -1; } -#if !defined(SKIA_DLL) - skiaLibrary = appLibrary; -#endif - // find the address of the main function int (*app_main)(int, const char**); *(void **) (&app_main) = dlsym(appLibrary, "main"); diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp index 7162b7b2ad..bb22685e24 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -1537,6 +1537,7 @@ void SampleWindow::afterChild(SkView* child, SkCanvas* canvas) { static SkBitmap::Config gConfigCycle[] = { SkBitmap::kNo_Config, // none -> none + SkBitmap::kNo_Config, // a1 -> none SkBitmap::kNo_Config, // a8 -> none SkBitmap::kNo_Config, // index8 -> none SkBitmap::kARGB_4444_Config, // 565 -> 4444 @@ -2073,6 +2074,7 @@ void SampleWindow::loadView(SkView* view) { static const char* gConfigNames[] = { "unknown config", + "A1", "A8", "Index8", "565", diff --git a/samplecode/SampleFilter.cpp b/samplecode/SampleFilter.cpp index 7f902d5b2e..71ab62fd55 100644 --- a/samplecode/SampleFilter.cpp +++ b/samplecode/SampleFilter.cpp @@ -67,6 +67,7 @@ static SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x, SkPaint* p static const char* gConfigNames[] = { "unknown config", + "A1", "A8", "Index8", "565", diff --git a/src/animator/SkDrawBitmap.cpp b/src/animator/SkDrawBitmap.cpp index 327e81365a..568401d0e6 100644 --- a/src/animator/SkDrawBitmap.cpp +++ b/src/animator/SkDrawBitmap.cpp @@ -75,10 +75,11 @@ void SkDrawBitmap::dump(SkAnimateMaker* maker) { const char* formatName; switch (format) { case 0: formatName = "none"; break; - case 1: formatName = "A8"; break; - case 2: formatName = "Index8"; break; - case 3: formatName = "RGB16"; break; - case 4: formatName = "RGB32"; break; + case 1: formatName = "A1"; break; + case 2: formatName = "A8"; break; + case 3: formatName = "Index8"; break; + case 4: formatName = "RGB16"; break; + case 5: formatName = "RGB32"; break; } SkDebugf("format=\"%s\" />\n", formatName); } diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp index 9d4aa87c85..429d09216a 100644 --- a/src/core/SkBitmap.cpp +++ b/src/core/SkBitmap.cpp @@ -161,6 +161,7 @@ int SkBitmap::ComputeBytesPerPixel(SkBitmap::Config config) { int bpp; switch (config) { case kNo_Config: + case kA1_Config: bpp = 0; // not applicable break; case kA8_Config: @@ -193,6 +194,11 @@ size_t SkBitmap::ComputeRowBytes(Config c, int width) { switch (c) { case kNo_Config: break; + case kA1_Config: + rowBytes.set(width); + rowBytes.add(7); + rowBytes.shiftRight(3); + break; case kA8_Config: case kIndex8_Config: rowBytes.set(width); @@ -269,6 +275,7 @@ static bool validate_alphaType(SkBitmap::Config config, SkAlphaType alphaType, case SkBitmap::kNo_Config: alphaType = kIgnore_SkAlphaType; break; + case SkBitmap::kA1_Config: case SkBitmap::kA8_Config: if (kUnpremul_SkAlphaType == alphaType) { alphaType = kPremul_SkAlphaType; @@ -284,8 +291,6 @@ static bool validate_alphaType(SkBitmap::Config config, SkAlphaType alphaType, case SkBitmap::kRGB_565_Config: alphaType = kOpaque_SkAlphaType; break; - default: - return false; } if (canonical) { *canonical = alphaType; @@ -601,6 +606,8 @@ void* SkBitmap::getAddr(int x, int y) const { case SkBitmap::kIndex8_Config: base += x; break; + case SkBitmap::kA1_Config: + base += x >> 3; break; default: SkDEBUGFAIL("Can't return addr for config"); @@ -616,6 +623,15 @@ SkColor SkBitmap::getColor(int x, int y) const { SkASSERT((unsigned)y < (unsigned)this->height()); switch (this->config()) { + case SkBitmap::kA1_Config: { + uint8_t* addr = this->getAddr1(x, y); + uint8_t mask = 1 << (7 - (x % 8)); + if (addr[0] & mask) { + return SK_ColorBLACK; + } else { + return 0; + } + } case SkBitmap::kA8_Config: { uint8_t* addr = this->getAddr8(x, y); return SkColorSetA(0, addr[0]); @@ -638,7 +654,6 @@ SkColor SkBitmap::getColor(int x, int y) const { return SkUnPreMultiply::PMColorToColor(addr[0]); } case kNo_Config: - default: SkASSERT(false); return 0; } @@ -656,6 +671,9 @@ bool SkBitmap::ComputeIsOpaque(const SkBitmap& bm) { const int width = bm.width(); switch (bm.config()) { + case SkBitmap::kA1_Config: { + // TODO + } break; case SkBitmap::kA8_Config: { unsigned a = 0xFF; for (int y = 0; y < height; ++y) { @@ -761,6 +779,38 @@ void SkBitmap::internalErase(const SkIRect& area, } switch (fConfig) { + case kA1_Config: { + uint8_t* p = this->getAddr1(area.fLeft, area.fTop); + const int left = area.fLeft >> 3; + const int right = area.fRight >> 3; + + int middle = right - left - 1; + + uint8_t leftMask = 0xFF >> (area.fLeft & 7); + uint8_t rightMask = ~(0xFF >> (area.fRight & 7)); + if (left == right) { + leftMask &= rightMask; + rightMask = 0; + } + + a = (a >> 7) ? 0xFF : 0; + while (--height >= 0) { + uint8_t* startP = p; + + *p = (*p & ~leftMask) | (a & leftMask); + p++; + if (middle > 0) { + memset(p, a, middle); + p += middle; + } + if (rightMask) { + *p = (*p & ~rightMask) | (a & rightMask); + } + + p = startP + rowBytes; + } + break; + } case kA8_Config: { uint8_t* p = this->getAddr8(area.fLeft, area.fTop); while (--height >= 0) { @@ -846,6 +896,7 @@ static size_t get_sub_offset(const SkBitmap& bm, int x, int y) { break; case SkBitmap::kNo_Config: + case SkBitmap::kA1_Config: default: return SUB_OFFSET_FAILURE; } @@ -888,6 +939,8 @@ bool get_upper_left_from_offset(SkBitmap::Config config, size_t offset, size_t r case SkBitmap::kNo_Config: // Fall through. + case SkBitmap::kA1_Config: + // Fall through. default: return false; } @@ -968,6 +1021,7 @@ bool SkBitmap::canCopyTo(Config dstConfig) const { case kRGB_565_Config: case kARGB_8888_Config: break; + case kA1_Config: case kIndex8_Config: if (!sameConfigs) { return false; @@ -978,6 +1032,12 @@ bool SkBitmap::canCopyTo(Config dstConfig) const { default: return false; } + + // do not copy src if srcConfig == kA1_Config while dstConfig != kA1_Config + if (this->config() == kA1_Config && !sameConfigs) { + return false; + } + return true; } @@ -1623,7 +1683,7 @@ void SkBitmap::validate() const { void SkBitmap::toString(SkString* str) const { static const char* gConfigNames[kConfigCount] = { - "NONE", "A8", "INDEX8", "565", "4444", "8888" + "NONE", "A1", "A8", "INDEX8", "565", "4444", "8888" }; str->appendf("bitmap: ((%d, %d) %s", this->width(), this->height(), diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp index 9682d5572a..dc7946a4bd 100644 --- a/src/core/SkBlitter.cpp +++ b/src/core/SkBlitter.cpp @@ -945,6 +945,11 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device, switch (device.config()) { + case SkBitmap::kA1_Config: + SK_PLACEMENT_NEW_ARGS(blitter, SkA1_Blitter, + storage, storageSize, (device, *paint)); + break; + case SkBitmap::kA8_Config: if (drawCoverage) { SkASSERT(NULL == shader); diff --git a/src/core/SkBlitter_A1.cpp b/src/core/SkBlitter_A1.cpp new file mode 100644 index 0000000000..b64afe2ae9 --- /dev/null +++ b/src/core/SkBlitter_A1.cpp @@ -0,0 +1,50 @@ + +/* + * 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. + */ + + +#include "SkCoreBlitters.h" + +SkA1_Blitter::SkA1_Blitter(const SkBitmap& device, const SkPaint& paint) + : INHERITED(device) { + fSrcA = paint.getAlpha(); +} + +void SkA1_Blitter::blitH(int x, int y, int width) { + SkASSERT(x >= 0 && y >= 0 && + (unsigned)(x + width) <= (unsigned)fDevice.width()); + + if (fSrcA <= 0x7F) { + return; + } + uint8_t* dst = fDevice.getAddr1(x, y); + int right = x + width; + + int left_mask = 0xFF >> (x & 7); + int rite_mask = 0xFF << (8 - (right & 7)); + int full_runs = (right >> 3) - ((x + 7) >> 3); + + // check for empty right mask, so we don't read off the end + // (or go slower than we need to) + if (rite_mask == 0) { + SkASSERT(full_runs >= 0); + full_runs -= 1; + rite_mask = 0xFF; + } + if (left_mask == 0xFF) { + full_runs -= 1; + } + if (full_runs < 0) { + SkASSERT((left_mask & rite_mask) != 0); + *dst |= (left_mask & rite_mask); + } else { + *dst++ |= left_mask; + memset(dst, 0xFF, full_runs); + dst += full_runs; + *dst |= rite_mask; + } +} diff --git a/src/core/SkCoreBlitters.h b/src/core/SkCoreBlitters.h index 1605a5273d..673b874545 100644 --- a/src/core/SkCoreBlitters.h +++ b/src/core/SkCoreBlitters.h @@ -162,6 +162,22 @@ private: /////////////////////////////////////////////////////////////////////////////// +class SkA1_Blitter : public SkRasterBlitter { +public: + SkA1_Blitter(const SkBitmap& device, const SkPaint& paint); + virtual void blitH(int x, int y, int width) SK_OVERRIDE; + +private: + uint8_t fSrcA; + + // illegal + SkA1_Blitter& operator=(const SkA1_Blitter&); + + typedef SkRasterBlitter INHERITED; +}; + +/////////////////////////////////////////////////////////////////////////////// + /* These return the correct subclass of blitter for their device config. Currently, they make the following assumptions about the state of the diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp index a78b197a55..faa3f89049 100644 --- a/src/core/SkGlyphCache.cpp +++ b/src/core/SkGlyphCache.cpp @@ -87,6 +87,8 @@ SkGlyphCache::SkGlyphCache(SkTypeface* typeface, const SkDescriptor* desc, SkSca fGlyphArray.setReserve(kMinGlyphCount); + fMetricsCount = 0; + fAdvanceCount = 0; fAuxProcList = NULL; } @@ -318,9 +320,11 @@ SkGlyph* SkGlyphCache::lookupMetrics(uint32_t id, MetricsType mtype) { if (kJustAdvance_MetricsType == mtype) { fScalerContext->getAdvance(glyph); + fAdvanceCount += 1; } else { SkASSERT(kFull_MetricsType == mtype); fScalerContext->getMetrics(glyph); + fMetricsCount += 1; } return glyph; diff --git a/src/core/SkGlyphCache.h b/src/core/SkGlyphCache.h index 7b2ebb844e..52a8132f72 100644 --- a/src/core/SkGlyphCache.h +++ b/src/core/SkGlyphCache.h @@ -211,6 +211,8 @@ private: SkTDArray<SkGlyph*> fGlyphArray; SkChunkAlloc fGlyphAlloc; + int fMetricsCount, fAdvanceCount; + struct CharGlyphRec { uint32_t fID; // unichar + subpixel SkGlyph* fGlyph; diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 91a76e151f..d6948dd83f 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -2005,7 +2005,11 @@ enum FlatFlags { }; // The size of a flat paint's POD fields -static const uint32_t kPODPaintSize = 5 * sizeof(SkScalar) + +// Include an SkScalar for hinting scale factor whether it is +// supported or not so that an SKP is valid whether it was +// created with support or not. + +static const uint32_t kPODPaintSize = 6 * sizeof(SkScalar) + 1 * sizeof(SkColor) + 1 * sizeof(uint16_t) + 6 * sizeof(uint8_t); @@ -2042,6 +2046,8 @@ void SkPaint::flatten(SkFlattenableWriteBuffer& buffer) const { ptr = write_scalar(ptr, this->getTextSize()); ptr = write_scalar(ptr, this->getTextScaleX()); ptr = write_scalar(ptr, this->getTextSkewX()); + // Dummy value for obsolete hinting scale factor. TODO: remove with next picture version + ptr = write_scalar(ptr, SK_Scalar1); ptr = write_scalar(ptr, this->getStrokeWidth()); ptr = write_scalar(ptr, this->getStrokeMiter()); *ptr++ = this->getColor(); @@ -2058,6 +2064,8 @@ void SkPaint::flatten(SkFlattenableWriteBuffer& buffer) const { buffer.writeScalar(fTextSize); buffer.writeScalar(fTextScaleX); buffer.writeScalar(fTextSkewX); + // Dummy value for obsolete hinting scale factor. TODO: remove with next picture version + buffer.writeScalar(SK_Scalar1); buffer.writeScalar(fWidth); buffer.writeScalar(fMiterLimit); buffer.writeColor(fColor); @@ -2112,6 +2120,8 @@ void SkPaint::unflatten(SkFlattenableReadBuffer& buffer) { this->setTextSize(read_scalar(pod)); this->setTextScaleX(read_scalar(pod)); this->setTextSkewX(read_scalar(pod)); + // Skip the hinting scalar factor, which is not supported. + read_scalar(pod); this->setStrokeWidth(read_scalar(pod)); this->setStrokeMiter(read_scalar(pod)); this->setColor(*pod++); diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp index 2520e6b9c9..4acc549377 100644 --- a/src/core/SkPicture.cpp +++ b/src/core/SkPicture.cpp @@ -266,20 +266,11 @@ void SkPicture::draw(SkCanvas* surface, SkDrawPictureCallback* callback) { #include "SkStream.h" -static const char kMagic[] = { 's', 'k', 'i', 'a', 'p', 'i', 'c', 't' }; - bool SkPicture::StreamIsSKP(SkStream* stream, SkPictInfo* pInfo) { if (NULL == stream) { return false; } - // Check magic bytes. - char magic[sizeof(kMagic)]; - stream->read(magic, sizeof(kMagic)); - if (0 != memcmp(magic, kMagic, sizeof(kMagic))) { - return false; - } - SkPictInfo info; if (!stream->read(&info, sizeof(SkPictInfo))) { return false; @@ -350,10 +341,6 @@ void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const { info.fFlags |= SkPictInfo::kPtrIs64Bit_Flag; } - // Write 8 magic bytes to ID this file format. - SkASSERT(sizeof(kMagic) == 8); - stream->write(kMagic, sizeof(kMagic)); - stream->write(&info, sizeof(info)); if (playback) { stream->writeBool(true); diff --git a/src/core/SkScaledImageCache.cpp b/src/core/SkScaledImageCache.cpp index 55eadb849e..ea29843c92 100644 --- a/src/core/SkScaledImageCache.cpp +++ b/src/core/SkScaledImageCache.cpp @@ -49,7 +49,7 @@ static uint32_t compute_hash(const uint32_t data[], int count) { return hash; } -struct SkScaledImageCache::Key { +struct Key { Key(uint32_t genID, SkScalar scaleX, SkScalar scaleY, @@ -129,24 +129,22 @@ struct SkScaledImageCache::Rec { #include "SkTDynamicHash.h" namespace { // can't use static functions w/ template parameters -const SkScaledImageCache::Key& key_from_rec(const SkScaledImageCache::Rec& rec) { +const Key& key_from_rec(const SkScaledImageCache::Rec& rec) { return rec.fKey; } -uint32_t hash_from_key(const SkScaledImageCache::Key& key) { +uint32_t hash_from_key(const Key& key) { return key.fHash; } -bool eq_rec_key(const SkScaledImageCache::Rec& rec, const SkScaledImageCache::Key& key) { +bool eq_rec_key(const SkScaledImageCache::Rec& rec, const Key& key) { return rec.fKey == key; } } class SkScaledImageCache::Hash : public SkTDynamicHash<SkScaledImageCache::Rec, - SkScaledImageCache::Key, - key_from_rec, - hash_from_key, - eq_rec_key> {}; + Key, key_from_rec, hash_from_key, + eq_rec_key> {}; /////////////////////////////////////////////////////////////////////////////// @@ -189,22 +187,17 @@ SkScaledImageCache::~SkScaledImageCache() { //////////////////////////////////////////////////////////////////////////////// - +/** + This private method is the fully general record finder. All other + record finders should call this funtion. */ SkScaledImageCache::Rec* SkScaledImageCache::findAndLock(uint32_t genID, SkScalar scaleX, SkScalar scaleY, const SkIRect& bounds) { - const Key key(genID, scaleX, scaleY, bounds); - return this->findAndLock(key); -} - -/** - This private method is the fully general record finder. All other - record finders should call this function or the one above. */ -SkScaledImageCache::Rec* SkScaledImageCache::findAndLock(const SkScaledImageCache::Key& key) { - if (key.fBounds.isEmpty()) { + if (bounds.isEmpty()) { return NULL; } + Key key(genID, scaleX, scaleY, bounds); #ifdef USE_HASH Rec* rec = fHash->find(key); #else @@ -282,14 +275,8 @@ SkScaledImageCache::ID* SkScaledImageCache::findAndLockMip(const SkBitmap& orig, /** This private method is the fully general record adder. All other record adders should call this funtion. */ -SkScaledImageCache::ID* SkScaledImageCache::addAndLock(SkScaledImageCache::Rec* rec) { +void SkScaledImageCache::addAndLock(SkScaledImageCache::Rec* rec) { SkASSERT(rec); - // See if we already have this key (racy inserts, etc.) - Rec* existing = this->findAndLock(rec->fKey); - if (existing != NULL) { - return rec_to_id(existing); - } - this->addToHead(rec); SkASSERT(1 == rec->fLockCount); #ifdef USE_HASH @@ -298,7 +285,6 @@ SkScaledImageCache::ID* SkScaledImageCache::addAndLock(SkScaledImageCache::Rec* #endif // We may (now) be overbudget, so see if we need to purge something. this->purgeAsNeeded(); - return rec_to_id(rec); } SkScaledImageCache::ID* SkScaledImageCache::addAndLock(uint32_t genID, @@ -307,7 +293,8 @@ SkScaledImageCache::ID* SkScaledImageCache::addAndLock(uint32_t genID, const SkBitmap& bitmap) { Key key(genID, SK_Scalar1, SK_Scalar1, SkIRect::MakeWH(width, height)); Rec* rec = SkNEW_ARGS(Rec, (key, bitmap)); - return this->addAndLock(rec); + this->addAndLock(rec); + return rec_to_id(rec); } SkScaledImageCache::ID* SkScaledImageCache::addAndLock(const SkBitmap& orig, @@ -324,7 +311,8 @@ SkScaledImageCache::ID* SkScaledImageCache::addAndLock(const SkBitmap& orig, } Key key(orig.getGenerationID(), scaleX, scaleY, bounds); Rec* rec = SkNEW_ARGS(Rec, (key, scaled)); - return this->addAndLock(rec); + this->addAndLock(rec); + return rec_to_id(rec); } SkScaledImageCache::ID* SkScaledImageCache::addAndLockMip(const SkBitmap& orig, @@ -335,7 +323,8 @@ SkScaledImageCache::ID* SkScaledImageCache::addAndLockMip(const SkBitmap& orig, } Key key(orig.getGenerationID(), 0, 0, bounds); Rec* rec = SkNEW_ARGS(Rec, (key, mip)); - return this->addAndLock(rec); + this->addAndLock(rec); + return rec_to_id(rec); } void SkScaledImageCache::unlock(SkScaledImageCache::ID* id) { diff --git a/src/core/SkScaledImageCache.h b/src/core/SkScaledImageCache.h index 44ef1f8a2c..fee69d2d58 100644 --- a/src/core/SkScaledImageCache.h +++ b/src/core/SkScaledImageCache.h @@ -126,7 +126,6 @@ public: public: struct Rec; - struct Key; private: Rec* fHead; Rec* fTail; @@ -140,8 +139,7 @@ private: Rec* findAndLock(uint32_t generationID, SkScalar sx, SkScalar sy, const SkIRect& bounds); - Rec* findAndLock(const Key& key); - ID* addAndLock(Rec* rec); + void addAndLock(Rec* rec); void purgeAsNeeded(); diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp index 4996a73f8d..1d6c2f79a5 100644 --- a/src/core/SkScalerContext.cpp +++ b/src/core/SkScalerContext.cpp @@ -352,16 +352,16 @@ void SkScalerContext::getMetrics(SkGlyph* glyph) { glyph->fHeight = SkToU16(ir.height()); if (glyph->fWidth > 0) { - switch (fRec.fMaskFormat) { - case SkMask::kLCD16_Format: - case SkMask::kLCD32_Format: - glyph->fWidth += 2; - glyph->fLeft -= 1; - break; - default: - break; - } + switch (fRec.fMaskFormat) { + case SkMask::kLCD16_Format: + case SkMask::kLCD32_Format: + glyph->fWidth += 2; + glyph->fLeft -= 1; + break; + default: + break; } + } } } @@ -523,54 +523,10 @@ static void pack4xHToLCD32(const SkBitmap& src, const SkMask& dst, } } -static inline int convert_8_to_1(unsigned byte) { - SkASSERT(byte <= 0xFF); - return byte >> 7; -} - -static uint8_t pack_8_to_1(const uint8_t alpha[8]) { - unsigned bits = 0; - for (int i = 0; i < 8; ++i) { - bits <<= 1; - bits |= convert_8_to_1(alpha[i]); - } - return SkToU8(bits); -} - -static void packA8ToA1(const SkMask& mask, const uint8_t* src, size_t srcRB) { - const int height = mask.fBounds.height(); - const int width = mask.fBounds.width(); - const int octs = width >> 3; - const int leftOverBits = width & 7; - - uint8_t* dst = mask.fImage; - const int dstPad = mask.fRowBytes - SkAlign8(width)/8; - SkASSERT(dstPad >= 0); - - const int srcPad = srcRB - width; - SkASSERT(srcPad >= 0); - - for (int y = 0; y < height; ++y) { - for (int i = 0; i < octs; ++i) { - *dst++ = pack_8_to_1(src); - src += 8; - } - if (leftOverBits > 0) { - unsigned bits = 0; - int shift = 7; - for (int i = 0; i < leftOverBits; ++i, --shift) { - bits |= convert_8_to_1(*src++ >> 7) << shift; - } - *dst++ = bits; - } - src += srcPad; - dst += dstPad; - } -} - static void generateMask(const SkMask& mask, const SkPath& path, const SkMaskGamma::PreBlend& maskPreBlend) { - SkPaint paint; + SkBitmap::Config config; + SkPaint paint; int srcW = mask.fBounds.width(); int srcH = mask.fBounds.height(); @@ -582,25 +538,27 @@ static void generateMask(const SkMask& mask, const SkPath& path, matrix.setTranslate(-SkIntToScalar(mask.fBounds.fLeft), -SkIntToScalar(mask.fBounds.fTop)); - SkBitmap::Config config = SkBitmap::kA8_Config; - paint.setAntiAlias(SkMask::kBW_Format != mask.fFormat); - switch (mask.fFormat) { - case SkMask::kBW_Format: - dstRB = 0; // signals we need a copy - break; - case SkMask::kA8_Format: - break; - case SkMask::kLCD16_Format: - case SkMask::kLCD32_Format: - // TODO: trigger off LCD orientation - dstW = 4*dstW - 8; - matrix.setTranslate(-SkIntToScalar(mask.fBounds.fLeft + 1), - -SkIntToScalar(mask.fBounds.fTop)); - matrix.postScale(SkIntToScalar(4), SK_Scalar1); - dstRB = 0; // signals we need a copy - break; - default: - SkDEBUGFAIL("unexpected mask format"); + if (SkMask::kBW_Format == mask.fFormat) { + config = SkBitmap::kA1_Config; + paint.setAntiAlias(false); + } else { + config = SkBitmap::kA8_Config; + paint.setAntiAlias(true); + switch (mask.fFormat) { + case SkMask::kA8_Format: + break; + case SkMask::kLCD16_Format: + case SkMask::kLCD32_Format: + // TODO: trigger off LCD orientation + dstW = 4*dstW - 8; + matrix.setTranslate(-SkIntToScalar(mask.fBounds.fLeft + 1), + -SkIntToScalar(mask.fBounds.fTop)); + matrix.postScale(SkIntToScalar(4), SK_Scalar1); + dstRB = 0; // signals we need a copy + break; + default: + SkDEBUGFAIL("unexpected mask format"); + } } SkRasterClip clip; @@ -629,9 +587,6 @@ static void generateMask(const SkMask& mask, const SkPath& path, draw.drawPath(path, paint); switch (mask.fFormat) { - case SkMask::kBW_Format: - packA8ToA1(mask, bm.getAddr8(0, 0), bm.rowBytes()); - break; case SkMask::kA8_Format: if (maskPreBlend.isApplicable()) { applyLUTToA8Mask(mask, maskPreBlend.fG); diff --git a/src/core/SkScalerContext.h b/src/core/SkScalerContext.h index e4950edee3..2820b5ac2d 100644 --- a/src/core/SkScalerContext.h +++ b/src/core/SkScalerContext.h @@ -202,57 +202,16 @@ protected: Rec fRec; unsigned fBaseGlyphCount; - /** Generates the contents of glyph.fAdvanceX and glyph.fAdvanceY. - * May call getMetrics if that would be just as fast. - */ - virtual void generateAdvance(SkGlyph* glyph) = 0; - - /** Generates the contents of glyph.fWidth, fHeight, fTop, fLeft, - * as well as fAdvanceX and fAdvanceY if not already set. - * - * TODO: fMaskFormat is set by getMetrics later; cannot be set here. - */ - virtual void generateMetrics(SkGlyph* glyph) = 0; - - /** Generates the contents of glyph.fImage. - * When called, glyph.fImage will be pointing to a pre-allocated, - * uninitialized region of memory of size glyph.computeImageSize(). - * This method may change glyph.fMaskFormat if the new image size is - * less than or equal to the old image size. - * - * Because glyph.computeImageSize() will determine the size of fImage, - * generateMetrics will be called before generateImage. - */ - virtual void generateImage(const SkGlyph& glyph) = 0; - - /** Sets the passed path to the glyph outline. - * If this cannot be done the path is set to empty; - * this is indistinguishable from a glyph with an empty path. - * This does not set glyph.fPath. - * - * TODO: path is always glyph.fPath, no reason to pass separately. - */ - virtual void generatePath(const SkGlyph& glyph, SkPath* path) = 0; - - /** Retrieves font metrics. - * TODO: there is now a vertical bit, no need for two parameters. - */ + virtual unsigned generateGlyphCount() = 0; + virtual uint16_t generateCharToGlyph(SkUnichar) = 0; + virtual void generateAdvance(SkGlyph*) = 0; + virtual void generateMetrics(SkGlyph*) = 0; + virtual void generateImage(const SkGlyph&) = 0; + virtual void generatePath(const SkGlyph&, SkPath*) = 0; virtual void generateFontMetrics(SkPaint::FontMetrics* mX, SkPaint::FontMetrics* mY) = 0; - - /** Returns the number of glyphs in the font. */ - virtual unsigned generateGlyphCount() = 0; - - /** Returns the glyph id for the given unichar. - * If there is no 1:1 mapping from the unichar to a glyph id, returns 0. - */ - virtual uint16_t generateCharToGlyph(SkUnichar unichar) = 0; - - /** Returns the unichar for the given glyph id. - * If there is no 1:1 mapping from the glyph id to a unichar, returns 0. - * The default implementation always returns 0, indicating failure. - */ - virtual SkUnichar generateGlyphToChar(uint16_t glyphId); + // default impl returns 0, indicating failure. + virtual SkUnichar generateGlyphToChar(uint16_t); void forceGenerateImageFromPath() { fGenerateImageFromPath = true; } diff --git a/src/core/SkString.cpp b/src/core/SkString.cpp index 643dfb1372..e30b89f199 100644 --- a/src/core/SkString.cpp +++ b/src/core/SkString.cpp @@ -634,17 +634,5 @@ SkString SkStringPrintf(const char* format, ...) { return formattedOutput; } -void SkStrSplit(const char* str, const char* delimiters, SkTArray<SkString>* out) { - const char* end = str + strlen(str); - while (str != end) { - // Find a token. - const size_t len = strcspn(str, delimiters); - out->push_back().set(str, len); - str += len; - // Skip any delimiters. - str += strspn(str, delimiters); - } -} - #undef VSNPRINTF #undef SNPRINTF diff --git a/src/core/SkValidatingReadBuffer.cpp b/src/core/SkValidatingReadBuffer.cpp index 4a8ac47247..a92c1b9b6f 100644 --- a/src/core/SkValidatingReadBuffer.cpp +++ b/src/core/SkValidatingReadBuffer.cpp @@ -203,7 +203,7 @@ bool SkValidatingReadBuffer::readScalarArray(SkScalar* values, size_t size) { uint32_t SkValidatingReadBuffer::getArrayCount() { const size_t inc = sizeof(uint32_t); fError = fError || !IsPtrAlign4(fReader.peek()) || !fReader.isAvailable(inc); - return fError ? 0 : *(uint32_t*)fReader.peek(); + return *(uint32_t*)fReader.peek(); } void SkValidatingReadBuffer::readBitmap(SkBitmap* bitmap) { diff --git a/src/effects/SkDropShadowImageFilter.cpp b/src/effects/SkDropShadowImageFilter.cpp index 5be633ea54..b4d8689f33 100644 --- a/src/effects/SkDropShadowImageFilter.cpp +++ b/src/effects/SkDropShadowImageFilter.cpp @@ -15,21 +15,10 @@ #include "SkFlattenableBuffers.h" SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, SkScalar sigma, SkColor color, SkImageFilter* input) - : INHERITED(input) + : SkImageFilter(input) , fDx(dx) , fDy(dy) - , fSigmaX(sigma) - , fSigmaY(sigma) - , fColor(color) -{ -} - -SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, SkScalar sigmaX, SkScalar sigmaY, SkColor color, SkImageFilter* input, const CropRect* cropRect) - : INHERITED(input, cropRect) - , fDx(dx) - , fDy(dy) - , fSigmaX(sigmaX) - , fSigmaY(sigmaY) + , fSigma(sigma) , fColor(color) { } @@ -38,13 +27,11 @@ SkDropShadowImageFilter::SkDropShadowImageFilter(SkFlattenableReadBuffer& buffer : INHERITED(1, buffer) { fDx = buffer.readScalar(); fDy = buffer.readScalar(); - fSigmaX = buffer.readScalar(); - fSigmaY = buffer.readScalar(); + fSigma = buffer.readScalar(); fColor = buffer.readColor(); buffer.validate(SkScalarIsFinite(fDx) && SkScalarIsFinite(fDy) && - SkScalarIsFinite(fSigmaX) && - SkScalarIsFinite(fSigmaY)); + SkScalarIsFinite(fSigma)); } void SkDropShadowImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const @@ -52,8 +39,7 @@ void SkDropShadowImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const this->INHERITED::flatten(buffer); buffer.writeScalar(fDx); buffer.writeScalar(fDy); - buffer.writeScalar(fSigmaX); - buffer.writeScalar(fSigmaY); + buffer.writeScalar(fSigma); buffer.writeColor(fColor); } @@ -63,26 +49,17 @@ bool SkDropShadowImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source if (getInput(0) && !getInput(0)->filterImage(proxy, source, matrix, &src, loc)) return false; - SkIRect bounds; - src.getBounds(&bounds); - if (!this->applyCropRect(&bounds, matrix)) { - return false; - } - - SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height())); + SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(src.width(), src.height())); SkCanvas canvas(device.get()); - SkAutoTUnref<SkImageFilter> blurFilter(new SkBlurImageFilter(fSigmaX, fSigmaY)); + SkAutoTUnref<SkImageFilter> blurFilter(new SkBlurImageFilter(fSigma, fSigma)); SkAutoTUnref<SkColorFilter> colorFilter(SkColorFilter::CreateModeFilter(fColor, SkXfermode::kSrcIn_Mode)); SkPaint paint; paint.setImageFilter(blurFilter.get()); paint.setColorFilter(colorFilter.get()); paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); - canvas.translate(-SkIntToScalar(bounds.fLeft), -SkIntToScalar(bounds.fTop)); canvas.drawBitmap(src, fDx, fDy, &paint); canvas.drawBitmap(src, 0, 0); *result = device->accessBitmap(false); - loc->fX += bounds.fLeft; - loc->fY += bounds.fTop; return true; } diff --git a/src/effects/SkTransparentShader.cpp b/src/effects/SkTransparentShader.cpp index 1d7e80877e..970e74faa8 100644 --- a/src/effects/SkTransparentShader.cpp +++ b/src/effects/SkTransparentShader.cpp @@ -94,6 +94,9 @@ void SkTransparentShader::shadeSpan(int x, int y, SkPMColor span[], int count) { } break; } + case SkBitmap::kA1_Config: + SkDEBUGFAIL("kA1_Config umimplemented at this time"); + break; default: // to avoid warnings break; } diff --git a/src/fonts/SkGScalerContext.cpp b/src/fonts/SkGScalerContext.cpp index 551b01c961..f0543c571a 100644 --- a/src/fonts/SkGScalerContext.cpp +++ b/src/fonts/SkGScalerContext.cpp @@ -176,8 +176,6 @@ SkScalerContext* SkGTypeface::onCreateScalerContext( void SkGTypeface::onFilterRec(SkScalerContextRec* rec) const { fProxy->filterRec(rec); - rec->setHinting(SkPaint::kNo_Hinting); - rec->fMaskFormat = SkMask::kARGB32_Format; } SkAdvancedTypefaceMetrics* SkGTypeface::onGetAdvancedTypefaceMetrics( diff --git a/src/gpu/GrBinHashKey.h b/src/gpu/GrBinHashKey.h index 585a1a1c01..7d4aa0fbe8 100644 --- a/src/gpu/GrBinHashKey.h +++ b/src/gpu/GrBinHashKey.h @@ -13,19 +13,37 @@ #include "GrTypes.h" /** - * GrBinHashKey is a hash key class that can take a data chunk of any predetermined - * length. The hash function used is the One-at-a-Time Hash - * (http://burtleburtle.net/bob/hash/doobs.html). + * Hash function class that can take a data chunk of any predetermined length. The hash function + * used is the One-at-a-Time Hash (http://burtleburtle.net/bob/hash/doobs.html). + * + * Keys are computed from ENTRY objects. ENTRY must be fully ordered by a member: + * int compare(const GrTBinHashKey<ENTRY, ..>& k); + * which returns negative if the ENTRY < k, 0 if it equals k, and positive if k < the ENTRY. + * Additionally, ENTRY must be flattenable into the key using setKeyData. + * + * This class satisfies the requirements to be a key for a GrTHashTable. */ -template<size_t KEY_SIZE> -class GrBinHashKey { +template<typename ENTRY, size_t KEY_SIZE> +class GrTBinHashKey { public: enum { kKeySize = KEY_SIZE }; - GrBinHashKey() { + GrTBinHashKey() { this->reset(); } + GrTBinHashKey(const GrTBinHashKey<ENTRY, KEY_SIZE>& other) { + *this = other; + } + + GrTBinHashKey<ENTRY, KEY_SIZE>& operator=(const GrTBinHashKey<ENTRY, KEY_SIZE>& other) { + memcpy(this, &other, sizeof(*this)); + return *this; + } + + ~GrTBinHashKey() { + } + void reset() { fHash = 0; #ifdef SK_DEBUG @@ -34,49 +52,39 @@ public: } void setKeyData(const uint32_t* SK_RESTRICT data) { - SK_COMPILE_ASSERT(KEY_SIZE % 4 == 0, key_size_mismatch); + SkASSERT(GrIsALIGN4(KEY_SIZE)); memcpy(&fData, data, KEY_SIZE); uint32_t hash = 0; size_t len = KEY_SIZE; while (len >= 4) { hash += *data++; - hash += (hash << 10); + hash += (fHash << 10); hash ^= (hash >> 6); len -= 4; } - hash += (hash << 3); - hash ^= (hash >> 11); - hash += (hash << 15); + hash += (fHash << 3); + hash ^= (fHash >> 11); + hash += (fHash << 15); #ifdef SK_DEBUG fIsValid = true; #endif fHash = hash; } - bool operator==(const GrBinHashKey<KEY_SIZE>& key) const { + int compare(const GrTBinHashKey<ENTRY, KEY_SIZE>& key) const { SkASSERT(fIsValid && key.fIsValid); - if (fHash != key.fHash) { - return false; - } - for (size_t i = 0; i < SK_ARRAY_COUNT(fData); ++i) { - if (fData[i] != key.fData[i]) { - return false; - } - } - return true; + return memcmp(fData, key.fData, KEY_SIZE); } - bool operator<(const GrBinHashKey<KEY_SIZE>& key) const { - SkASSERT(fIsValid && key.fIsValid); - for (size_t i = 0; i < SK_ARRAY_COUNT(fData); ++i) { - if (fData[i] < key.fData[i]) { - return true; - } else if (fData[i] > key.fData[i]) { - return false; - } - } - return false; + static bool EQ(const ENTRY& entry, const GrTBinHashKey<ENTRY, KEY_SIZE>& key) { + SkASSERT(key.fIsValid); + return 0 == entry.compare(key); + } + + static bool LT(const ENTRY& entry, const GrTBinHashKey<ENTRY, KEY_SIZE>& key) { + SkASSERT(key.fIsValid); + return entry.compare(key) < 0; } uint32_t getHash() const { @@ -86,12 +94,12 @@ public: const uint8_t* getData() const { SkASSERT(fIsValid); - return reinterpret_cast<const uint8_t*>(fData); + return fData; } private: uint32_t fHash; - uint32_t fData[KEY_SIZE / sizeof(uint32_t)]; // Buffer for key storage. + uint8_t fData[KEY_SIZE]; // Buffer for key storage #ifdef SK_DEBUG public: diff --git a/src/gpu/GrResourceCache.h b/src/gpu/GrResourceCache.h index ca30732bbc..38378ac771 100644 --- a/src/gpu/GrResourceCache.h +++ b/src/gpu/GrResourceCache.h @@ -54,7 +54,7 @@ public: } GrResourceKey() { - fKey.reset(); + fKey.fHashedKey.reset(); } void reset(const GrCacheID& id, ResourceType type, ResourceFlags flags) { @@ -63,34 +63,41 @@ public: //!< returns hash value [0..kHashMask] for the key int getHash() const { - return fKey.getHash() & kHashMask; + return fKey.fHashedKey.getHash() & kHashMask; } bool isScratch() const { return ScratchDomain() == - *reinterpret_cast<const GrCacheID::Domain*>(fKey.getData() + + *reinterpret_cast<const GrCacheID::Domain*>(fKey.fHashedKey.getData() + kCacheIDDomainOffset); } ResourceType getResourceType() const { - return *reinterpret_cast<const ResourceType*>(fKey.getData() + + return *reinterpret_cast<const ResourceType*>(fKey.fHashedKey.getData() + kResourceTypeOffset); } ResourceFlags getResourceFlags() const { - return *reinterpret_cast<const ResourceFlags*>(fKey.getData() + + return *reinterpret_cast<const ResourceFlags*>(fKey.fHashedKey.getData() + kResourceFlagsOffset); } - bool operator==(const GrResourceKey& other) const { return fKey == other.fKey; } - bool operator<(const GrResourceKey& other) const { return fKey < other.fKey; } + int compare(const GrResourceKey& other) const { + return fKey.fHashedKey.compare(other.fKey.fHashedKey); + } - static bool LessThan(const GrResourceEntry& entry, const GrResourceKey& key); - static bool Equals(const GrResourceEntry& entry, const GrResourceKey& key); -#ifdef SK_DEBUG - static bool LessThan(const GrResourceEntry& a, const GrResourceEntry& b); - static bool Equals(const GrResourceEntry& a, const GrResourceEntry& b); -#endif + static bool LT(const GrResourceKey& a, const GrResourceKey& b) { + return a.compare(b) < 0; + } + + static bool EQ(const GrResourceKey& a, const GrResourceKey& b) { + return 0 == a.compare(b); + } + + inline static bool LT(const GrResourceEntry& entry, const GrResourceKey& key); + inline static bool EQ(const GrResourceEntry& entry, const GrResourceKey& key); + inline static bool LT(const GrResourceEntry& a, const GrResourceEntry& b); + inline static bool EQ(const GrResourceEntry& a, const GrResourceEntry& b); private: enum { @@ -118,9 +125,21 @@ private: memcpy(k + kResourceTypeOffset, &type, sizeof(ResourceType)); memcpy(k + kResourceFlagsOffset, &flags, sizeof(ResourceFlags)); memset(k + kPadOffset, 0, kPadSize); - fKey.setKeyData(keyData.fKey32); + fKey.fHashedKey.setKeyData(keyData.fKey32); } - GrBinHashKey<kKeySize> fKey; + + struct Key; + typedef GrTBinHashKey<Key, kKeySize> HashedKey; + + struct Key { + int compare(const HashedKey& hashedKey) const { + return fHashedKey.compare(hashedKey); + } + + HashedKey fHashedKey; + }; + + Key fKey; }; // The cache listens for these messages to purge junk resources proactively. @@ -155,23 +174,21 @@ private: friend class GrDLinkedList; }; -inline bool GrResourceKey::LessThan(const GrResourceEntry& entry, const GrResourceKey& key) { - return entry.key() < key; +bool GrResourceKey::LT(const GrResourceEntry& entry, const GrResourceKey& key) { + return LT(entry.key(), key); } -inline bool GrResourceKey::Equals(const GrResourceEntry& entry, const GrResourceKey& key) { - return entry.key() == key; +bool GrResourceKey::EQ(const GrResourceEntry& entry, const GrResourceKey& key) { + return EQ(entry.key(), key); } -#ifdef SK_DEBUG -inline bool GrResourceKey::LessThan(const GrResourceEntry& a, const GrResourceEntry& b) { - return a.key() < b.key(); +bool GrResourceKey::LT(const GrResourceEntry& a, const GrResourceEntry& b) { + return LT(a.key(), b.key()); } -inline bool GrResourceKey::Equals(const GrResourceEntry& a, const GrResourceEntry& b) { - return a.key() == b.key(); +bool GrResourceKey::EQ(const GrResourceEntry& a, const GrResourceEntry& b) { + return EQ(a.key(), b.key()); } -#endif /////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/GrTHashTable.h b/src/gpu/GrTHashTable.h index 83462c70c9..3b32977846 100644 --- a/src/gpu/GrTHashTable.h +++ b/src/gpu/GrTHashTable.h @@ -16,10 +16,8 @@ /** * Key needs - * static bool Equals(const Entry&, const Key&); - * static bool LessThan(const Entry&, const Key&); - * static bool Equals(const Entry&, const Entry&); for SK_DEBUG if GrTHashTable::validate() is called - * static bool LessThan(const Entry&, const Entry&); for SK_DEBUG if GrTHashTable::validate() is called + * static bool EQ(const Entry&, const HashKey&); + * static bool LT(const Entry&, const HashKey&); * uint32_t getHash() const; * * Allows duplicate key entries but on find you may get @@ -92,7 +90,7 @@ int GrTHashTable<T, Key, kHashBits>::searchArray(const Key& key) const { int low = 0; while (high > low) { int index = (low + high) >> 1; - if (Key::LessThan(*array[index], key)) { + if (Key::LT(*array[index], key)) { low = index + 1; } else { high = index; @@ -100,15 +98,15 @@ int GrTHashTable<T, Key, kHashBits>::searchArray(const Key& key) const { } // check if we found it - if (Key::Equals(*array[high], key)) { + if (Key::EQ(*array[high], key)) { // above search should have found the first occurrence if there // are multiple. - SkASSERT(0 == high || Key::LessThan(*array[high - 1], key)); + SkASSERT(0 == high || Key::LT(*array[high - 1], key)); return high; } // now return the ~ of where we should insert it - if (Key::LessThan(*array[high], key)) { + if (Key::LT(*array[high], key)) { high += 1; } return ~high; @@ -121,7 +119,7 @@ T* GrTHashTable<T, Key, kHashBits>::find(const Key& key, Filter filter) const { int hashIndex = hash2Index(key.getHash()); T* elem = fHash[hashIndex]; - if (NULL != elem && Key::Equals(*elem, key) && filter(elem)) { + if (NULL != elem && Key::EQ(*elem, key) && filter(elem)) { return elem; } @@ -135,9 +133,9 @@ T* GrTHashTable<T, Key, kHashBits>::find(const Key& key, Filter filter) const { // above search should have found the first occurrence if there // are multiple. - SkASSERT(0 == index || Key::LessThan(*array[index - 1], key)); + SkASSERT(0 == index || Key::LT(*array[index - 1], key)); - for ( ; index < count() && Key::Equals(*array[index], key); ++index) { + for ( ; index < count() && Key::EQ(*array[index], key); ++index) { if (filter(fSorted[index])) { // update the hash fHash[hashIndex] = fSorted[index]; @@ -194,8 +192,8 @@ template <typename T, typename Key, size_t kHashBits> void GrTHashTable<T, Key, kHashBits>::validate() const { int count = fSorted.count(); for (int i = 1; i < count; i++) { - SkASSERT(Key::LessThan(*fSorted[i - 1], *fSorted[i]) || - Key::Equals(*fSorted[i - 1], *fSorted[i])); + SkASSERT(Key::LT(*fSorted[i - 1], *fSorted[i]) || + Key::EQ(*fSorted[i - 1], *fSorted[i])); } } diff --git a/src/gpu/GrTextStrike_impl.h b/src/gpu/GrTextStrike_impl.h index 0691eaa643..42971855ff 100644 --- a/src/gpu/GrTextStrike_impl.h +++ b/src/gpu/GrTextStrike_impl.h @@ -19,10 +19,10 @@ public: intptr_t getHash() const { return fFontScalerKey->getHash(); } - static bool LessThan(const GrTextStrike& strike, const Key& key) { + static bool LT(const GrTextStrike& strike, const Key& key) { return *strike.getFontScalerKey() < *key.fFontScalerKey; } - static bool Equals(const GrTextStrike& strike, const Key& key) { + static bool EQ(const GrTextStrike& strike, const Key& key) { return *strike.getFontScalerKey() == *key.fFontScalerKey; } @@ -88,10 +88,10 @@ public: uint32_t getHash() const { return fPackedID; } - static bool LessThan(const GrGlyph& glyph, const Key& key) { + static bool LT(const GrGlyph& glyph, const Key& key) { return glyph.fPackedID < key.fPackedID; } - static bool Equals(const GrGlyph& glyph, const Key& key) { + static bool EQ(const GrGlyph& glyph, const Key& key) { return glyph.fPackedID == key.fPackedID; } diff --git a/src/gpu/SkGrFontScaler.cpp b/src/gpu/SkGrFontScaler.cpp index 1ca9357c6b..651486665b 100644 --- a/src/gpu/SkGrFontScaler.cpp +++ b/src/gpu/SkGrFontScaler.cpp @@ -85,8 +85,6 @@ GrMaskFormat SkGrFontScaler::getMaskFormat() { return kA8_GrMaskFormat; case SkMask::kLCD16_Format: return kA565_GrMaskFormat; - // TODO: properly support kARGB32_Format. - case SkMask::kARGB32_Format: case SkMask::kLCD32_Format: return kA888_GrMaskFormat; default: diff --git a/src/gpu/effects/GrTextureStripAtlas.h b/src/gpu/effects/GrTextureStripAtlas.h index e06e273e26..e56e736d77 100644 --- a/src/gpu/effects/GrTextureStripAtlas.h +++ b/src/gpu/effects/GrTextureStripAtlas.h @@ -136,15 +136,12 @@ private: // Hash table entry for atlases class AtlasEntry; - class AtlasHashKey : public GrBinHashKey<sizeof(GrTextureStripAtlas::Desc)> { - public: - static bool Equals(const AtlasEntry& entry, const AtlasHashKey& key); - static bool LessThan(const AtlasEntry& entry, const AtlasHashKey& key); - }; + typedef GrTBinHashKey<AtlasEntry, sizeof(GrTextureStripAtlas::Desc)> AtlasHashKey; class AtlasEntry : public ::SkNoncopyable { public: AtlasEntry() : fAtlas(NULL) {} ~AtlasEntry() { SkDELETE(fAtlas); } + int compare(const AtlasHashKey& key) const { return fKey.compare(key); } AtlasHashKey fKey; GrTextureStripAtlas* fAtlas; }; @@ -181,14 +178,4 @@ private: SkTDArray<AtlasRow*> fKeyTable; }; -inline bool GrTextureStripAtlas::AtlasHashKey::Equals(const AtlasEntry& entry, - const AtlasHashKey& key) { - return entry.fKey == key; -} - -inline bool GrTextureStripAtlas::AtlasHashKey::LessThan(const AtlasEntry& entry, - const AtlasHashKey& key) { - return entry.fKey < key; -} - #endif diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp index 00d27b31ef..9cf39b6534 100644 --- a/src/gpu/gl/GrGpuGL.cpp +++ b/src/gpu/gl/GrGpuGL.cpp @@ -1276,7 +1276,6 @@ void GrGpuGL::onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect) { return; } } - this->flushRenderTarget(rect); GrAutoTRestore<ScissorState> asr(&fScissorState); fScissorState.fEnabled = (NULL != rect); @@ -1523,16 +1522,10 @@ void GrGpuGL::flushRenderTarget(const SkIRect* bound) { if (fHWBoundRenderTarget != rt) { GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, rt->renderFBOID())); #ifdef SK_DEBUG - // don't do this check in Chromium -- this is causing - // lots of repeated command buffer flushes when the compositor is - // rendering with Ganesh, which is really slow; even too slow for - // Debug mode. - if (!this->glContext().info().isChromium()) { - GrGLenum status; - GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); - if (status != GR_GL_FRAMEBUFFER_COMPLETE) { - GrPrintf("GrGpuGL::flushRenderTarget glCheckFramebufferStatus %x\n", status); - } + GrGLenum status; + GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); + if (status != GR_GL_FRAMEBUFFER_COMPLETE) { + GrPrintf("GrGpuGL::flushRenderTarget glCheckFramebufferStatus %x\n", status); } #endif fHWBoundRenderTarget = rt; diff --git a/src/gpu/gr_unittests.cpp b/src/gpu/gr_unittests.cpp new file mode 100644 index 0000000000..ae9f67f28e --- /dev/null +++ b/src/gpu/gr_unittests.cpp @@ -0,0 +1,80 @@ + +/* + * Copyright 2010 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "GrBinHashKey.h" +#include "GrDrawTarget.h" +#include "SkMatrix.h" +#include "GrRedBlackTree.h" + +// FIXME: needs to be in a header +void gr_run_unittests(); + +// If we aren't inheriting these as #defines from elsewhere, +// clang demands they be declared before we #include the template +// that relies on them. +#ifdef SK_DEBUG +static bool LT(const int& elem, int value) { + return elem < value; +} +static bool EQ(const int& elem, int value) { + return elem == value; +} +#include "GrTBSearch.h" + +static void test_bsearch() { + const int array[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99 + }; + + for (int n = 0; n < static_cast<int>(GR_ARRAY_COUNT(array)); ++n) { + for (int i = 0; i < n; i++) { + int index = GrTBSearch<int, int>(array, n, array[i]); + SkASSERT(index == (int) i); + index = GrTBSearch<int, int>(array, n, -array[i]); + SkASSERT(index < 0); + } + } +} +#endif + +// bogus empty class for GrBinHashKey +class BogusEntry {}; + +static void test_binHashKey() +{ + const char* testStringA_ = "abcdABCD"; + const char* testStringB_ = "abcdBBCD"; + const uint32_t* testStringA = reinterpret_cast<const uint32_t*>(testStringA_); + const uint32_t* testStringB = reinterpret_cast<const uint32_t*>(testStringB_); + enum { + kDataLenUsedForKey = 8 + }; + + GrTBinHashKey<BogusEntry, kDataLenUsedForKey> keyA; + keyA.setKeyData(testStringA); + // test copy constructor and comparison + GrTBinHashKey<BogusEntry, kDataLenUsedForKey> keyA2(keyA); + SkASSERT(keyA.compare(keyA2) == 0); + SkASSERT(keyA.getHash() == keyA2.getHash()); + // test re-init + keyA2.setKeyData(testStringA); + SkASSERT(keyA.compare(keyA2) == 0); + SkASSERT(keyA.getHash() == keyA2.getHash()); + // test sorting + GrTBinHashKey<BogusEntry, kDataLenUsedForKey> keyB; + keyB.setKeyData(testStringB); + SkASSERT(keyA.compare(keyB) < 0); + SkASSERT(keyA.getHash() != keyB.getHash()); +} + + +void gr_run_unittests() { + SkDEBUGCODE(test_bsearch();) + test_binHashKey(); + GrRedBlackTree<int>::UnitTest(); +} diff --git a/src/opts/SkBlitMask_opts_arm.cpp b/src/opts/SkBlitMask_opts_arm.cpp index 2bf760313c..0ad0919387 100644 --- a/src/opts/SkBlitMask_opts_arm.cpp +++ b/src/opts/SkBlitMask_opts_arm.cpp @@ -1,39 +1,14 @@ -#include "SkColor.h" -#include "SkColorPriv.h" #include "SkBlitMask.h" -#include "SkUtilsArm.h" -#include "SkBlitMask_opts_arm_neon.h" SkBlitMask::ColorProc SkBlitMask::PlatformColorProcs(SkBitmap::Config dstConfig, SkMask::Format maskFormat, SkColor color) { -#if SK_ARM_NEON_IS_NONE - return NULL; -#else -#if SK_ARM_NEON_IS_DYNAMIC - if (!sk_cpu_arm_has_neon()) { - return NULL; - } -#endif - if ((SkBitmap::kARGB_8888_Config == dstConfig) && - (SkMask::kA8_Format == maskFormat)) { - return D32_A8_Factory_neon(color); - } -#endif - - // We don't need to handle the SkMask::kLCD16_Format case as the default - // LCD16 will call us through SkBlitMask::PlatformBlitRowProcs16() - return NULL; } SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) { - if (isOpaque) { - return SK_ARM_NEON_WRAP(SkBlitLCD16OpaqueRow); - } else { - return SK_ARM_NEON_WRAP(SkBlitLCD16Row); - } + return NULL; } SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkBitmap::Config dstConfig, diff --git a/src/opts/SkColor_opts_neon.h b/src/opts/SkColor_opts_neon.h index 85752f5558..f81239712a 100644 --- a/src/opts/SkColor_opts_neon.h +++ b/src/opts/SkColor_opts_neon.h @@ -2,7 +2,6 @@ #define SkColor_opts_neon_DEFINED #include "SkTypes.h" -#include "SkColorPriv.h" #include <arm_neon.h> @@ -66,20 +65,4 @@ static inline uint16x8_t SkPixel32ToPixel16_neon8(uint8x8x4_t vsrc) { return ret; } -/* This function blends 8 pixels of the same channel in the exact same way as - * SkBlend32. - */ -static inline uint8x8_t SkBlend32_neon8(uint8x8_t src, uint8x8_t dst, uint16x8_t scale) { - int16x8_t src_wide, dst_wide; - - src_wide = vreinterpretq_s16_u16(vmovl_u8(src)); - dst_wide = vreinterpretq_s16_u16(vmovl_u8(dst)); - - src_wide = (src_wide - dst_wide) * vreinterpretq_s16_u16(scale); - - dst_wide += vshrq_n_s16(src_wide, 5); - - return vmovn_u16(vreinterpretq_u16_s16(dst_wide)); -} - #endif /* #ifndef SkColor_opts_neon_DEFINED */ diff --git a/src/pdf/SkPDFImage.cpp b/src/pdf/SkPDFImage.cpp index 81adcc20d6..a99c9fe390 100644 --- a/src/pdf/SkPDFImage.cpp +++ b/src/pdf/SkPDFImage.cpp @@ -36,6 +36,7 @@ static size_t get_uncompressed_size(const SkBitmap& bitmap, return srcRect.width() * 3 * srcRect.height(); case SkBitmap::kARGB_8888_Config: return srcRect.width() * 3 * srcRect.height(); + case SkBitmap::kA1_Config: case SkBitmap::kA8_Config: return 1; default: @@ -165,6 +166,48 @@ static SkStream* extract_argb8888_data(const SkBitmap& bitmap, return stream; } +static SkStream* extract_a1_alpha(const SkBitmap& bitmap, + const SkIRect& srcRect, + bool* isOpaque, + bool* isTransparent) { + const int alphaRowBytes = (srcRect.width() + 7) / 8; + SkStream* stream = SkNEW_ARGS(SkMemoryStream, + (alphaRowBytes * srcRect.height())); + uint8_t* alphaDst = (uint8_t*)stream->getMemoryBase(); + + int offset1 = srcRect.fLeft % 8; + int offset2 = 8 - offset1; + + for (int y = srcRect.fTop; y < srcRect.fBottom; y++) { + uint8_t* src = bitmap.getAddr1(0, y); + // This may read up to one byte after src, but the + // potentially invalid bits are never used for computation. + for (int x = srcRect.fLeft; x < srcRect.fRight; x += 8) { + if (offset1) { + alphaDst[0] = src[x / 8] << offset1 | + src[x / 8 + 1] >> offset2; + } else { + alphaDst[0] = src[x / 8]; + } + if (x + 7 < srcRect.fRight) { + *isOpaque &= alphaDst[0] == SK_AlphaOPAQUE; + *isTransparent &= alphaDst[0] == SK_AlphaTRANSPARENT; + } + alphaDst++; + } + // Calculate the mask of bits we're interested in within the + // last byte of alphaDst. + // width mod 8 == 1 -> 0x80 ... width mod 8 == 7 -> 0xFE + uint8_t mask = ~((1 << (8 - (srcRect.width() % 8))) - 1); + if (srcRect.width() % 8) { + *isOpaque &= (alphaDst[-1] & mask) == (SK_AlphaOPAQUE & mask); + *isTransparent &= + (alphaDst[-1] & mask) == (SK_AlphaTRANSPARENT & mask); + } + } + return stream; +} + static SkStream* extract_a8_alpha(const SkBitmap& bitmap, const SkIRect& srcRect, bool* isOpaque, @@ -240,6 +283,14 @@ static SkStream* extract_image_data(const SkBitmap& bitmap, stream = extract_argb8888_data(bitmap, srcRect, extractAlpha, &isOpaque, &transparent); break; + case SkBitmap::kA1_Config: + if (!extractAlpha) { + stream = create_black_image(); + } else { + stream = extract_a1_alpha(bitmap, srcRect, + &isOpaque, &transparent); + } + break; case SkBitmap::kA8_Config: if (!extractAlpha) { stream = create_black_image(); @@ -523,7 +574,8 @@ SkPDFImage::SkPDFImage(SkStream* stream, insertName("Type", "XObject"); insertName("Subtype", "Image"); - bool alphaOnly = (config == SkBitmap::kA8_Config); + bool alphaOnly = (config == SkBitmap::kA1_Config || + config == SkBitmap::kA8_Config); if (!isAlpha && alphaOnly) { // For alpha only images, we stretch a single pixel of black for @@ -549,6 +601,8 @@ SkPDFImage::SkPDFImage(SkStream* stream, int bitsPerComp = 8; if (config == SkBitmap::kARGB_4444_Config) { bitsPerComp = 4; + } else if (isAlpha && config == SkBitmap::kA1_Config) { + bitsPerComp = 1; } insertInt("BitsPerComponent", bitsPerComp); diff --git a/src/utils/debugger/SkObjectParser.cpp b/src/utils/debugger/SkObjectParser.cpp index ebbd40018e..54ae0773fd 100644 --- a/src/utils/debugger/SkObjectParser.cpp +++ b/src/utils/debugger/SkObjectParser.cpp @@ -26,9 +26,9 @@ SkString* SkObjectParser::BitmapToString(const SkBitmap& bitmap) { mBitmap->appendS32(bitmap.height()); const char* gConfigStrings[] = { - "None", "A8", "Index8", "RGB565", "ARGB4444", "ARGB8888" + "None", "A1", "A8", "Index8", "RGB565", "ARGB4444", "ARGB8888" }; - SkASSERT(SkBitmap::kConfigCount == SK_ARRAY_COUNT(gConfigStrings)); + SkASSERT(SkBitmap::kConfigCount == 7); mBitmap->append(" Config: "); mBitmap->append(gConfigStrings[bitmap.config()]); diff --git a/tests/BitmapCopyTest.cpp b/tests/BitmapCopyTest.cpp index f61d55e953..5cef1eb986 100644 --- a/tests/BitmapCopyTest.cpp +++ b/tests/BitmapCopyTest.cpp @@ -15,7 +15,7 @@ static const char* boolStr(bool value) { // these are in the same order as the SkBitmap::Config enum static const char* gConfigName[] = { - "None", "A8", "Index8", "565", "4444", "8888" + "None", "A1", "A8", "Index8", "565", "4444", "8888", "RLE_Index8" }; static void report_opaqueness(skiatest::Reporter* reporter, const SkBitmap& src, @@ -57,6 +57,10 @@ static void init_src(const SkBitmap& bitmap) { if (bitmap.getPixels()) { if (bitmap.getColorTable()) { sk_bzero(bitmap.getPixels(), bitmap.getSize()); + } else if (SkBitmap::kA1_Config == bitmap.config()) { + // The A1 config can have uninitialized bits at the + // end of each row if eraseColor is used + memset(bitmap.getPixels(), 0xff, bitmap.getSafeSize()); } else { bitmap.eraseColor(SK_ColorWHITE); } @@ -88,7 +92,7 @@ struct Pair { static uint32_t getPixel(int x, int y, const SkBitmap& bm) { uint32_t val = 0; uint16_t val16; - uint8_t val8; + uint8_t val8, shift; SkAutoLockPixels lock(bm); const void* rawAddr = bm.getAddr(x,y); @@ -106,6 +110,11 @@ static uint32_t getPixel(int x, int y, const SkBitmap& bm) { memcpy(&val8, rawAddr, sizeof(uint8_t)); val = val8; break; + case SkBitmap::kA1_Config: + memcpy(&val8, rawAddr, sizeof(uint8_t)); + shift = x % 8; + val = (val8 >> shift) & 0x1 ; + break; default: break; } @@ -117,7 +126,7 @@ static uint32_t getPixel(int x, int y, const SkBitmap& bm) { // converted to, but at present uint32_t can handle all formats. static void setPixel(int x, int y, uint32_t val, SkBitmap& bm) { uint16_t val16; - uint8_t val8; + uint8_t val8, shift; SkAutoLockPixels lock(bm); void* rawAddr = bm.getAddr(x,y); @@ -135,6 +144,15 @@ static void setPixel(int x, int y, uint32_t val, SkBitmap& bm) { val8 = val & 0xFF; memcpy(rawAddr, &val8, sizeof(uint8_t)); break; + case SkBitmap::kA1_Config: + shift = x % 8; // We assume we're in the right byte. + memcpy(&val8, rawAddr, sizeof(uint8_t)); + if (val & 0x1) // Turn bit on. + val8 |= (0x1 << shift); + else // Turn bit off. + val8 &= ~(0x1 << shift); + memcpy(rawAddr, &val8, sizeof(uint8_t)); + break; default: // Ignore. break; @@ -146,6 +164,7 @@ static void setPixel(int x, int y, uint32_t val, SkBitmap& bm) { static const char* getSkConfigName(const SkBitmap& bm) { switch (bm.config()) { case SkBitmap::kNo_Config: return "SkBitmap::kNo_Config"; + case SkBitmap::kA1_Config: return "SkBitmap::kA1_Config"; case SkBitmap::kA8_Config: return "SkBitmap::kA8_Config"; case SkBitmap::kIndex8_Config: return "SkBitmap::kIndex8_Config"; case SkBitmap::kRGB_565_Config: return "SkBitmap::kRGB_565_Config"; @@ -206,12 +225,13 @@ static void writeCoordPixels(SkBitmap& bm, const Coordinates& coords) { static void TestBitmapCopy(skiatest::Reporter* reporter) { static const Pair gPairs[] = { - { SkBitmap::kNo_Config, "0000000" }, - { SkBitmap::kA8_Config, "0101010" }, - { SkBitmap::kIndex8_Config, "0111010" }, - { SkBitmap::kRGB_565_Config, "0101010" }, - { SkBitmap::kARGB_4444_Config, "0101110" }, - { SkBitmap::kARGB_8888_Config, "0101110" }, + { SkBitmap::kNo_Config, "00000000" }, + { SkBitmap::kA1_Config, "01000000" }, + { SkBitmap::kA8_Config, "00101010" }, + { SkBitmap::kIndex8_Config, "00111010" }, + { SkBitmap::kRGB_565_Config, "00101010" }, + { SkBitmap::kARGB_4444_Config, "00101110" }, + { SkBitmap::kARGB_8888_Config, "00101110" }, }; static const bool isExtracted[] = { @@ -355,6 +375,12 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) { case SkBitmap::kNo_Config: break; + case SkBitmap::kA1_Config: + if (safeSize.fHi != 0x470DE || + safeSize.fLo != 0x4DF82000) + sizeFail = true; + break; + case SkBitmap::kA8_Config: case SkBitmap::kIndex8_Config: if (safeSize.fHi != 0x2386F2 || @@ -385,8 +411,21 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) { reporter->reportFailed(str); } - int subW = 2; - int subH = 2; + int subW, subH; + // Set sizes to be height = 2 to force the last row of the + // source to be used, thus verifying correct operation if + // the bitmap is an extracted subset. + if (gPairs[i].fConfig == SkBitmap::kA1_Config) { + // If one-bit per pixel, use 9 pixels to force more than + // one byte per row. + subW = 9; + subH = 2; + } else { + // All other configurations are at least one byte per pixel, + // and different configs will test copying different numbers + // of bytes. + subW = subH = 2; + } // Create bitmap to act as source for copies and subsets. SkBitmap src, subset; @@ -410,7 +449,12 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) { // The extractedSubset() test case allows us to test copy- // ing when src and dst mave possibly different strides. SkIRect r; - r.set(1, 0, 1 + subW, subH); // 2x2 extracted bitmap + if (gPairs[i].fConfig == SkBitmap::kA1_Config) + // This config seems to need byte-alignment of + // extracted subset bits. + r.set(0, 0, subW, subH); + else + r.set(1, 0, 1 + subW, subH); // 2x2 extracted bitmap srcReady = src.extractSubset(&subset, r); } else { diff --git a/tests/BitmapGetColorTest.cpp b/tests/BitmapGetColorTest.cpp index 40aa3e26bf..11c22e6fa3 100644 --- a/tests/BitmapGetColorTest.cpp +++ b/tests/BitmapGetColorTest.cpp @@ -10,6 +10,67 @@ #include "SkRect.h" #include "SkRandom.h" +static int nextRand(SkRandom& rand, int min, int max) { + return min + (int)rand.nextRangeU(0, max - min); +} + +static void rand_irect(SkIRect* rect, int W, int H, SkRandom& rand) { + const int DX = W / 2; + const int DY = H / 2; + + rect->fLeft = nextRand(rand, -DX, W + DX); + rect->fTop = nextRand(rand, -DY, H + DY); + rect->fRight = nextRand(rand, -DX, W + DX); + rect->fBottom = nextRand(rand, -DY, H + DY); + rect->sort(); +} + +static void test_equal_A1_A8(skiatest::Reporter* reporter, + const SkBitmap& bm1, const SkBitmap& bm8) { + SkASSERT(SkBitmap::kA1_Config == bm1.config()); + SkASSERT(SkBitmap::kA8_Config == bm8.config()); + + REPORTER_ASSERT(reporter, bm1.width() == bm8.width()); + REPORTER_ASSERT(reporter, bm1.height() == bm8.height()); + for (int y = 0; y < bm1.height(); ++y) { + for (int x = 0; x < bm1.width(); ++x) { + int p1 = *bm1.getAddr1(x, y) & (1 << (7 - (x & 7))); + SkASSERT(SkIsPow2(p1)); + p1 = p1 ? 0xFF : 0; + + int p8 = *bm8.getAddr8(x, y); + SkASSERT(0 == p8 || 0xFF == p8); + + REPORTER_ASSERT(reporter, p1 == p8); + } + } +} + +static void test_eraserect_A1(skiatest::Reporter* reporter) { + const int W = 43; + const int H = 13; + + SkBitmap bm1, bm8; + + bm1.setConfig(SkBitmap::kA1_Config, W, H); + bm1.allocPixels(); + bm8.setConfig(SkBitmap::kA8_Config, W, H); + bm8.allocPixels(); + + SkRandom rand; + for (int i = 0; i < 10000; ++i) { + SkIRect area; + rand_irect(&area, W, H, rand); + + bm1.eraseColor(0); + bm8.eraseColor(0); + + bm1.eraseArea(area, SK_ColorWHITE); + bm8.eraseArea(area, SK_ColorWHITE); + test_equal_A1_A8(reporter, bm1, bm8); + } +} + static void TestGetColor(skiatest::Reporter* reporter) { static const struct Rec { SkBitmap::Config fConfig; @@ -44,6 +105,8 @@ static void TestGetColor(skiatest::Reporter* reporter) { SkColor c = bm.getColor(1, 1); REPORTER_ASSERT(reporter, c == gRec[i].fOutColor); } + + test_eraserect_A1(reporter); } #include "TestClassDef.h" diff --git a/tests/BlitRowTest.cpp b/tests/BlitRowTest.cpp index 85761104b2..3903efbfba 100644 --- a/tests/BlitRowTest.cpp +++ b/tests/BlitRowTest.cpp @@ -14,7 +14,7 @@ // these are in the same order as the SkBitmap::Config enum static const char* gConfigName[] = { - "None", "A8", "Index8", "565", "4444", "8888" + "None", "A1", "A8", "Index8", "565", "4444", "8888", "RLE_Index8" }; /** Returns -1 on success, else the x coord of the first bad pixel, return its diff --git a/tests/HashCacheTest.cpp b/tests/HashCacheTest.cpp index 1a5c4701cd..bd28c44197 100644 --- a/tests/HashCacheTest.cpp +++ b/tests/HashCacheTest.cpp @@ -39,18 +39,21 @@ public: uint32_t getHash() const { return fKey; } - static bool LessThan(const HashElement& entry, const HashKey& key) { + static bool LT(const HashElement& entry, const HashKey& key) { return entry.fKey < key.fKey; } - static bool Equals(const HashElement& entry, const HashKey& key) { + static bool EQ(const HashElement& entry, const HashKey& key) { return entry.fKey == key.fKey; } #ifdef SK_DEBUG - static bool LessThan(const HashElement& a, const HashElement& b) { + static uint32_t GetHash(const HashElement& entry) { + return entry.fKey; + } + static bool LT(const HashElement& a, const HashElement& b) { return a.fKey < b.fKey; } - static bool Equals(const HashElement& a, const HashElement& b) { + static bool EQ(const HashElement& a, const HashElement& b) { return a.fKey == b.fKey; } #endif diff --git a/tests/ImageCacheTest.cpp b/tests/ImageCacheTest.cpp index b8815a3217..877591acc7 100644 --- a/tests/ImageCacheTest.cpp +++ b/tests/ImageCacheTest.cpp @@ -63,22 +63,3 @@ static void TestImageCache(skiatest::Reporter* reporter) { #include "TestClassDef.h" DEFINE_TESTCLASS("ImageCache", TestImageCacheClass, TestImageCache) - -DEF_TEST(ImageCache_doubleAdd, r) { - // Adding the same key twice should be safe. - SkScaledImageCache cache(1024); - - SkBitmap original; - original.setConfig(SkBitmap::kARGB_8888_Config, 40, 40); - original.allocPixels(); - - SkBitmap scaled; - scaled.setConfig(SkBitmap::kARGB_8888_Config, 20, 20); - scaled.allocPixels(); - - SkScaledImageCache::ID* id1 = cache.addAndLock(original, 0.5f, 0.5f, scaled); - SkScaledImageCache::ID* id2 = cache.addAndLock(original, 0.5f, 0.5f, scaled); - // We don't really care if id1 == id2 as long as unlocking both works. - cache.unlock(id1); - cache.unlock(id2); -} diff --git a/tests/ImageDecodingTest.cpp b/tests/ImageDecodingTest.cpp index 6fcef1d315..56193f4e47 100644 --- a/tests/ImageDecodingTest.cpp +++ b/tests/ImageDecodingTest.cpp @@ -148,7 +148,7 @@ public: // the list is that each one is different, so we can test // to make sure the correct config is chosen. const SkBitmap::Config configs[] = { - SkBitmap::kA8_Config, + SkBitmap::kA1_Config, SkBitmap::kA8_Config, SkBitmap::kIndex8_Config, SkBitmap::kRGB_565_Config, diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp index 9e63249c62..f49abe9106 100644 --- a/tests/SerializationTest.cpp +++ b/tests/SerializationTest.cpp @@ -173,43 +173,37 @@ static void Tests(skiatest::Reporter* reporter) { // Test rrect serialization { - // SkRRect does not initialize anything. - // An uninitialized SkRRect can be serialized, - // but will branch on uninitialized data when deserialized. SkRRect rrect; - SkRect rect = SkRect::MakeXYWH(1, 2, 20, 30); - SkVector corners[4] = { {1, 2}, {2, 3}, {3,4}, {4,5} }; - rrect.setRectRadii(rect, corners); TestAlignment(&rrect, reporter); } // Test readByteArray { - unsigned char data[kArraySize] = { 1, 2, 3 }; + unsigned char data[kArraySize] = {0}; TestArraySerialization(data, reporter); } // Test readColorArray { - SkColor data[kArraySize] = { SK_ColorBLACK, SK_ColorWHITE, SK_ColorRED }; + SkColor data[kArraySize]; TestArraySerialization(data, reporter); } // Test readIntArray { - int32_t data[kArraySize] = { 1, 2, 4, 8 }; + int32_t data[kArraySize]; TestArraySerialization(data, reporter); } // Test readPointArray { - SkPoint data[kArraySize] = { {6, 7}, {42, 128} }; + SkPoint data[kArraySize]; TestArraySerialization(data, reporter); } // Test readScalarArray { - SkScalar data[kArraySize] = { SK_Scalar1, SK_ScalarHalf, SK_ScalarMax }; + SkScalar data[kArraySize]; TestArraySerialization(data, reporter); } } diff --git a/tests/StringTest.cpp b/tests/StringTest.cpp index c8c10e1925..462fcfadaf 100644 --- a/tests/StringTest.cpp +++ b/tests/StringTest.cpp @@ -192,16 +192,3 @@ static void TestString(skiatest::Reporter* reporter) { #include "TestClassDef.h" DEFINE_TESTCLASS("String", StringTestClass, TestString) - -DEF_TEST(String_SkStrSplit, r) { - SkTArray<SkString> results; - - SkStrSplit("a-_b_c-dee--f-_-_-g-", "-_", &results); - REPORTER_ASSERT(r, results.count() == 6); - REPORTER_ASSERT(r, results[0].equals("a")); - REPORTER_ASSERT(r, results[1].equals("b")); - REPORTER_ASSERT(r, results[2].equals("c")); - REPORTER_ASSERT(r, results[3].equals("dee")); - REPORTER_ASSERT(r, results[4].equals("f")); - REPORTER_ASSERT(r, results[5].equals("g")); -} diff --git a/whitespace.txt b/whitespace.txt index 3ee84cb3a0..eea24ccd96 100644 --- a/whitespace.txt +++ b/whitespace.txt @@ -172,11 +172,6 @@ You can modify this file to create no-op changelists (like this one). - - - - - This file has gotten so boring. |