| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 #include "Test.h" | 8 #include "Test.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkRect.h" | 10 #include "SkRect.h" |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 // simplify diagnostic output. | 176 // simplify diagnostic output. |
| 177 static const char* getSkConfigName(const SkBitmap& bm) { | 177 static const char* getSkConfigName(const SkBitmap& bm) { |
| 178 switch (bm.getConfig()) { | 178 switch (bm.getConfig()) { |
| 179 case SkBitmap::kNo_Config: return "SkBitmap::kNo_Config"; | 179 case SkBitmap::kNo_Config: return "SkBitmap::kNo_Config"; |
| 180 case SkBitmap::kA1_Config: return "SkBitmap::kA1_Config"; | 180 case SkBitmap::kA1_Config: return "SkBitmap::kA1_Config"; |
| 181 case SkBitmap::kA8_Config: return "SkBitmap::kA8_Config"; | 181 case SkBitmap::kA8_Config: return "SkBitmap::kA8_Config"; |
| 182 case SkBitmap::kIndex8_Config: return "SkBitmap::kIndex8_Config"; | 182 case SkBitmap::kIndex8_Config: return "SkBitmap::kIndex8_Config"; |
| 183 case SkBitmap::kRGB_565_Config: return "SkBitmap::kRGB_565_Config"; | 183 case SkBitmap::kRGB_565_Config: return "SkBitmap::kRGB_565_Config"; |
| 184 case SkBitmap::kARGB_4444_Config: return "SkBitmap::kARGB_4444_Config"; | 184 case SkBitmap::kARGB_4444_Config: return "SkBitmap::kARGB_4444_Config"; |
| 185 case SkBitmap::kARGB_8888_Config: return "SkBitmap::kARGB_8888_Config"; | 185 case SkBitmap::kARGB_8888_Config: return "SkBitmap::kARGB_8888_Config"; |
| 186 case SkBitmap::kRLE_Index8_Config: | |
| 187 return "SkBitmap::kRLE_Index8_Config,"; | |
| 188 default: return "Unknown SkBitmap configuration."; | 186 default: return "Unknown SkBitmap configuration."; |
| 189 } | 187 } |
| 190 } | 188 } |
| 191 | 189 |
| 192 // Helper struct to contain pixel locations, while avoiding need for STL. | 190 // Helper struct to contain pixel locations, while avoiding need for STL. |
| 193 struct Coordinates { | 191 struct Coordinates { |
| 194 | 192 |
| 195 const int length; | 193 const int length; |
| 196 SkIPoint* const data; | 194 SkIPoint* const data; |
| 197 | 195 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 | 238 |
| 241 static void TestBitmapCopy(skiatest::Reporter* reporter) { | 239 static void TestBitmapCopy(skiatest::Reporter* reporter) { |
| 242 static const Pair gPairs[] = { | 240 static const Pair gPairs[] = { |
| 243 { SkBitmap::kNo_Config, "00000000" }, | 241 { SkBitmap::kNo_Config, "00000000" }, |
| 244 { SkBitmap::kA1_Config, "01000000" }, | 242 { SkBitmap::kA1_Config, "01000000" }, |
| 245 { SkBitmap::kA8_Config, "00101010" }, | 243 { SkBitmap::kA8_Config, "00101010" }, |
| 246 { SkBitmap::kIndex8_Config, "00111010" }, | 244 { SkBitmap::kIndex8_Config, "00111010" }, |
| 247 { SkBitmap::kRGB_565_Config, "00101010" }, | 245 { SkBitmap::kRGB_565_Config, "00101010" }, |
| 248 { SkBitmap::kARGB_4444_Config, "00101110" }, | 246 { SkBitmap::kARGB_4444_Config, "00101110" }, |
| 249 { SkBitmap::kARGB_8888_Config, "00101010" }, | 247 { SkBitmap::kARGB_8888_Config, "00101010" }, |
| 250 // TODO: create valid RLE bitmap to test with | |
| 251 // { SkBitmap::kRLE_Index8_Config, "00101111" } | |
| 252 }; | 248 }; |
| 253 | 249 |
| 254 static const bool isExtracted[] = { | 250 static const bool isExtracted[] = { |
| 255 false, true | 251 false, true |
| 256 }; | 252 }; |
| 257 | 253 |
| 258 const int W = 20; | 254 const int W = 20; |
| 259 const int H = 33; | 255 const int H = 33; |
| 260 | 256 |
| 261 for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) { | 257 for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) { |
| 262 for (size_t j = 0; j < SK_ARRAY_COUNT(gPairs); j++) { | 258 for (size_t j = 0; j < SK_ARRAY_COUNT(gPairs); j++) { |
| 263 SkBitmap src, dst; | 259 SkBitmap src, dst; |
| 264 SkColorTable* ct = NULL; | 260 SkColorTable* ct = NULL; |
| 265 | 261 |
| 266 src.setConfig(gPairs[i].fConfig, W, H); | 262 src.setConfig(gPairs[i].fConfig, W, H); |
| 267 if (SkBitmap::kIndex8_Config == src.config() || | 263 if (SkBitmap::kIndex8_Config == src.config()) { |
| 268 SkBitmap::kRLE_Index8_Config == src.config()) { | |
| 269 ct = init_ctable(); | 264 ct = init_ctable(); |
| 270 } | 265 } |
| 271 src.allocPixels(ct); | 266 src.allocPixels(ct); |
| 272 SkSafeUnref(ct); | 267 SkSafeUnref(ct); |
| 273 | 268 |
| 274 init_src(src, ct); | 269 init_src(src, ct); |
| 275 bool success = src.copyTo(&dst, gPairs[j].fConfig); | 270 bool success = src.copyTo(&dst, gPairs[j].fConfig); |
| 276 bool expected = gPairs[i].fValid[j] != '0'; | 271 bool expected = gPairs[i].fValid[j] != '0'; |
| 277 if (success != expected) { | 272 if (success != expected) { |
| 278 SkString str; | 273 SkString str; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 } // for (size_t j = ... | 353 } // for (size_t j = ... |
| 359 | 354 |
| 360 // Tests for getSafeSize(), getSafeSize64(), copyPixelsTo(), | 355 // Tests for getSafeSize(), getSafeSize64(), copyPixelsTo(), |
| 361 // copyPixelsFrom(). | 356 // copyPixelsFrom(). |
| 362 // | 357 // |
| 363 for (size_t copyCase = 0; copyCase < SK_ARRAY_COUNT(isExtracted); | 358 for (size_t copyCase = 0; copyCase < SK_ARRAY_COUNT(isExtracted); |
| 364 ++copyCase) { | 359 ++copyCase) { |
| 365 // Test copying to/from external buffer. | 360 // Test copying to/from external buffer. |
| 366 // Note: the tests below have hard-coded values --- | 361 // Note: the tests below have hard-coded values --- |
| 367 // Please take care if modifying. | 362 // Please take care if modifying. |
| 368 if (gPairs[i].fConfig != SkBitmap::kRLE_Index8_Config) { | 363 |
| 369 | 364 // Tests for getSafeSize64(). |
| 370 // Tests for getSafeSize64(). | 365 // Test with a very large configuration without pixel buffer |
| 371 // Test with a very large configuration without pixel buffer | 366 // attached. |
| 372 // attached. | 367 SkBitmap tstSafeSize; |
| 373 SkBitmap tstSafeSize; | 368 tstSafeSize.setConfig(gPairs[i].fConfig, 100000000U, |
| 374 tstSafeSize.setConfig(gPairs[i].fConfig, 100000000U, | 369 100000000U); |
| 375 100000000U); | 370 Sk64 safeSize = tstSafeSize.getSafeSize64(); |
| 376 Sk64 safeSize = tstSafeSize.getSafeSize64(); | 371 if (safeSize.isNeg()) { |
| 377 if (safeSize.isNeg()) { | 372 SkString str; |
| 378 SkString str; | 373 str.printf("getSafeSize64() negative: %s", |
| 379 str.printf("getSafeSize64() negative: %s", | 374 getSkConfigName(tstSafeSize)); |
| 380 getSkConfigName(tstSafeSize)); | 375 reporter->reportFailed(str); |
| 381 reporter->reportFailed(str); | 376 } |
| 382 } | 377 bool sizeFail = false; |
| 383 bool sizeFail = false; | 378 // Compare against hand-computed values. |
| 384 // Compare against hand-computed values. | 379 switch (gPairs[i].fConfig) { |
| 385 switch (gPairs[i].fConfig) { | 380 case SkBitmap::kNo_Config: |
| 386 case SkBitmap::kNo_Config: | 381 break; |
| 387 break; | 382 |
| 388 | 383 case SkBitmap::kA1_Config: |
| 389 case SkBitmap::kA1_Config: | 384 if (safeSize.fHi != 0x470DE || |
| 390 if (safeSize.fHi != 0x470DE || | 385 safeSize.fLo != 0x4DF82000) |
| 391 safeSize.fLo != 0x4DF82000) | 386 sizeFail = true; |
| 392 sizeFail = true; | 387 break; |
| 393 break; | 388 |
| 394 | 389 case SkBitmap::kA8_Config: |
| 395 case SkBitmap::kA8_Config: | 390 case SkBitmap::kIndex8_Config: |
| 396 case SkBitmap::kIndex8_Config: | 391 if (safeSize.fHi != 0x2386F2 || |
| 397 if (safeSize.fHi != 0x2386F2 || | 392 safeSize.fLo != 0x6FC10000) |
| 398 safeSize.fLo != 0x6FC10000) | 393 sizeFail = true; |
| 399 sizeFail = true; | 394 break; |
| 400 break; | 395 |
| 401 | 396 case SkBitmap::kRGB_565_Config: |
| 402 case SkBitmap::kRGB_565_Config: | 397 case SkBitmap::kARGB_4444_Config: |
| 403 case SkBitmap::kARGB_4444_Config: | 398 if (safeSize.fHi != 0x470DE4 || |
| 404 if (safeSize.fHi != 0x470DE4 || | 399 safeSize.fLo != 0xDF820000) |
| 405 safeSize.fLo != 0xDF820000) | 400 sizeFail = true; |
| 406 sizeFail = true; | 401 break; |
| 407 break; | 402 |
| 408 | 403 case SkBitmap::kARGB_8888_Config: |
| 409 case SkBitmap::kARGB_8888_Config: | 404 if (safeSize.fHi != 0x8E1BC9 || |
| 410 if (safeSize.fHi != 0x8E1BC9 || | 405 safeSize.fLo != 0xBF040000) |
| 411 safeSize.fLo != 0xBF040000) | 406 sizeFail = true; |
| 412 sizeFail = true; | 407 break; |
| 413 break; | 408 |
| 414 | 409 default: |
| 415 case SkBitmap::kRLE_Index8_Config: | 410 break; |
| 416 break; | 411 } |
| 417 | 412 if (sizeFail) { |
| 418 default: | 413 SkString str; |
| 419 break; | 414 str.printf("getSafeSize64() wrong size: %s", |
| 420 } | 415 getSkConfigName(tstSafeSize)); |
| 421 if (sizeFail) { | 416 reporter->reportFailed(str); |
| 422 SkString str; | 417 } |
| 423 str.printf("getSafeSize64() wrong size: %s", | 418 |
| 424 getSkConfigName(tstSafeSize)); | 419 size_t subW, subH; |
| 425 reporter->reportFailed(str); | 420 // Set sizes to be height = 2 to force the last row of the |
| 426 } | 421 // source to be used, thus verifying correct operation if |
| 427 | 422 // the bitmap is an extracted subset. |
| 428 size_t subW, subH; | 423 if (gPairs[i].fConfig == SkBitmap::kA1_Config) { |
| 429 // Set sizes to be height = 2 to force the last row of the | 424 // If one-bit per pixel, use 9 pixels to force more than |
| 430 // source to be used, thus verifying correct operation if | 425 // one byte per row. |
| 431 // the bitmap is an extracted subset. | 426 subW = 9; |
| 432 if (gPairs[i].fConfig == SkBitmap::kA1_Config) { | 427 subH = 2; |
| 433 // If one-bit per pixel, use 9 pixels to force more than | 428 } else { |
| 434 // one byte per row. | 429 // All other configurations are at least one byte per pixel, |
| 435 subW = 9; | 430 // and different configs will test copying different numbers |
| 436 subH = 2; | 431 // of bytes. |
| 437 } else { | 432 subW = subH = 2; |
| 438 // All other configurations are at least one byte per pixel, | 433 } |
| 439 // and different configs will test copying different numbers | 434 |
| 440 // of bytes. | 435 // Create bitmap to act as source for copies and subsets. |
| 441 subW = subH = 2; | 436 SkBitmap src, subset; |
| 442 } | 437 SkColorTable* ct = NULL; |
| 443 | 438 if (isExtracted[copyCase]) { // A larger image to extract from. |
| 444 // Create bitmap to act as source for copies and subsets. | 439 src.setConfig(gPairs[i].fConfig, 2 * subW + 1, subH); |
| 445 SkBitmap src, subset; | 440 } else { // Tests expect a 2x2 bitmap, so make smaller. |
| 446 SkColorTable* ct = NULL; | 441 src.setConfig(gPairs[i].fConfig, subW, subH); |
| 447 if (isExtracted[copyCase]) { // A larger image to extract from. | 442 } |
| 448 src.setConfig(gPairs[i].fConfig, 2 * subW + 1, subH); | 443 if (SkBitmap::kIndex8_Config == src.config()) { |
| 449 } else // Tests expect a 2x2 bitmap, so make smaller. | 444 ct = init_ctable(); |
| 450 src.setConfig(gPairs[i].fConfig, subW, subH); | 445 } |
| 451 if (SkBitmap::kIndex8_Config == src.config() || | 446 |
| 452 SkBitmap::kRLE_Index8_Config == src.config()) { | 447 src.allocPixels(ct); |
| 453 ct = init_ctable(); | 448 SkSafeUnref(ct); |
| 454 } | 449 |
| 455 | 450 // Either copy src or extract into 'subset', which is used |
| 456 src.allocPixels(ct); | 451 // for subsequent calls to copyPixelsTo/From. |
| 457 SkSafeUnref(ct); | 452 bool srcReady = false; |
| 458 | 453 if (isExtracted[copyCase]) { |
| 459 // Either copy src or extract into 'subset', which is used | 454 // The extractedSubset() test case allows us to test copy- |
| 460 // for subsequent calls to copyPixelsTo/From. | 455 // ing when src and dst mave possibly different strides. |
| 461 bool srcReady = false; | 456 SkIRect r; |
| 462 if (isExtracted[copyCase]) { | 457 if (gPairs[i].fConfig == SkBitmap::kA1_Config) |
| 463 // The extractedSubset() test case allows us to test copy- | 458 // This config seems to need byte-alignment of |
| 464 // ing when src and dst mave possibly different strides. | 459 // extracted subset bits. |
| 465 SkIRect r; | 460 r.set(0, 0, subW, subH); |
| 466 if (gPairs[i].fConfig == SkBitmap::kA1_Config) | 461 else |
| 467 // This config seems to need byte-alignment of | 462 r.set(1, 0, 1 + subW, subH); // 2x2 extracted bitmap |
| 468 // extracted subset bits. | 463 |
| 469 r.set(0, 0, subW, subH); | 464 srcReady = src.extractSubset(&subset, r); |
| 470 else | 465 } else { |
| 471 r.set(1, 0, 1 + subW, subH); // 2x2 extracted bitmap | 466 srcReady = src.copyTo(&subset, src.getConfig()); |
| 472 | 467 } |
| 473 srcReady = src.extractSubset(&subset, r); | 468 |
| 474 } else { | 469 // Not all configurations will generate a valid 'subset'. |
| 475 srcReady = src.copyTo(&subset, src.getConfig()); | 470 if (srcReady) { |
| 476 } | 471 |
| 477 | 472 // Allocate our target buffer 'buf' for all copies. |
| 478 // Not all configurations will generate a valid 'subset'. | 473 // To simplify verifying correctness of copies attach |
| 479 if (srcReady) { | 474 // buf to a SkBitmap, but copies are done using the |
| 480 | 475 // raw buffer pointer. |
| 481 // Allocate our target buffer 'buf' for all copies. | 476 const uint32_t bufSize = subH * |
| 482 // To simplify verifying correctness of copies attach | 477 SkBitmap::ComputeRowBytes(src.getConfig(), subW) * 2; |
| 483 // buf to a SkBitmap, but copies are done using the | 478 SkAutoMalloc autoBuf (bufSize); |
| 484 // raw buffer pointer. | 479 uint8_t* buf = static_cast<uint8_t*>(autoBuf.get()); |
| 485 const uint32_t bufSize = subH * | 480 |
| 486 SkBitmap::ComputeRowBytes(src.getConfig(), subW) * 2; | 481 SkBitmap bufBm; // Attach buf to this bitmap. |
| 487 SkAutoMalloc autoBuf (bufSize); | 482 bool successExpected; |
| 488 uint8_t* buf = static_cast<uint8_t*>(autoBuf.get()); | 483 |
| 489 | 484 // Set up values for each pixel being copied. |
| 490 SkBitmap bufBm; // Attach buf to this bitmap. | 485 Coordinates coords(subW * subH); |
| 491 bool successExpected; | 486 for (size_t x = 0; x < subW; ++x) |
| 492 | 487 for (size_t y = 0; y < subH; ++y) |
| 493 // Set up values for each pixel being copied. | 488 { |
| 494 Coordinates coords(subW * subH); | 489 int index = y * subW + x; |
| 495 for (size_t x = 0; x < subW; ++x) | 490 SkASSERT(index < coords.length); |
| 496 for (size_t y = 0; y < subH; ++y) | 491 coords[index]->fX = x; |
| 497 { | 492 coords[index]->fY = y; |
| 498 int index = y * subW + x; | 493 } |
| 499 SkASSERT(index < coords.length); | 494 |
| 500 coords[index]->fX = x; | 495 writeCoordPixels(subset, coords); |
| 501 coords[index]->fY = y; | 496 |
| 502 } | 497 // Test #1 //////////////////////////////////////////// |
| 503 | 498 |
| 504 writeCoordPixels(subset, coords); | 499 // Before/after comparisons easier if we attach buf |
| 505 | 500 // to an appropriately configured SkBitmap. |
| 506 // Test #1 //////////////////////////////////////////// | 501 memset(buf, 0xFF, bufSize); |
| 507 | 502 // Config with stride greater than src but that fits in buf. |
| 508 // Before/after comparisons easier if we attach buf | 503 bufBm.setConfig(gPairs[i].fConfig, subW, subH, |
| 509 // to an appropriately configured SkBitmap. | 504 SkBitmap::ComputeRowBytes(subset.getConfig(), subW) |
| 510 memset(buf, 0xFF, bufSize); | 505 * 2); |
| 511 // Config with stride greater than src but that fits in buf. | 506 bufBm.setPixels(buf); |
| 512 bufBm.setConfig(gPairs[i].fConfig, subW, subH, | 507 successExpected = false; |
| 513 SkBitmap::ComputeRowBytes(subset.getConfig(), subW) | 508 // Then attempt to copy with a stride that is too large |
| 514 * 2); | 509 // to fit in the buffer. |
| 515 bufBm.setPixels(buf); | 510 REPORTER_ASSERT(reporter, |
| 516 successExpected = false; | 511 subset.copyPixelsTo(buf, bufSize, bufBm.rowBytes() * 3) |
| 517 // Then attempt to copy with a stride that is too large | 512 == successExpected); |
| 518 // to fit in the buffer. | 513 |
| 519 REPORTER_ASSERT(reporter, | 514 if (successExpected) |
| 520 subset.copyPixelsTo(buf, bufSize, bufBm.rowBytes() * 3) | 515 reportCopyVerification(subset, bufBm, coords, |
| 516 "copyPixelsTo(buf, bufSize, 1.5*maxRowBytes)", |
| 517 reporter); |
| 518 |
| 519 // Test #2 //////////////////////////////////////////// |
| 520 // This test should always succeed, but in the case |
| 521 // of extracted bitmaps only because we handle the |
| 522 // issue of getSafeSize(). Without getSafeSize() |
| 523 // buffer overrun/read would occur. |
| 524 memset(buf, 0xFF, bufSize); |
| 525 bufBm.setConfig(gPairs[i].fConfig, subW, subH, |
| 526 subset.rowBytes()); |
| 527 bufBm.setPixels(buf); |
| 528 successExpected = subset.getSafeSize() <= bufSize; |
| 529 REPORTER_ASSERT(reporter, |
| 530 subset.copyPixelsTo(buf, bufSize) == |
| 531 successExpected); |
| 532 if (successExpected) |
| 533 reportCopyVerification(subset, bufBm, coords, |
| 534 "copyPixelsTo(buf, bufSize)", reporter); |
| 535 |
| 536 // Test #3 //////////////////////////////////////////// |
| 537 // Copy with different stride between src and dst. |
| 538 memset(buf, 0xFF, bufSize); |
| 539 bufBm.setConfig(gPairs[i].fConfig, subW, subH, |
| 540 subset.rowBytes()+1); |
| 541 bufBm.setPixels(buf); |
| 542 successExpected = true; // Should always work. |
| 543 REPORTER_ASSERT(reporter, |
| 544 subset.copyPixelsTo(buf, bufSize, |
| 545 subset.rowBytes()+1) == successExpected); |
| 546 if (successExpected) |
| 547 reportCopyVerification(subset, bufBm, coords, |
| 548 "copyPixelsTo(buf, bufSize, rowBytes+1)", reporter); |
| 549 |
| 550 // Test #4 //////////////////////////////////////////// |
| 551 // Test copy with stride too small. |
| 552 memset(buf, 0xFF, bufSize); |
| 553 bufBm.setConfig(gPairs[i].fConfig, subW, subH); |
| 554 bufBm.setPixels(buf); |
| 555 successExpected = false; |
| 556 // Request copy with stride too small. |
| 557 REPORTER_ASSERT(reporter, |
| 558 subset.copyPixelsTo(buf, bufSize, bufBm.rowBytes()-1) |
| 521 == successExpected); | 559 == successExpected); |
| 522 | 560 if (successExpected) |
| 523 if (successExpected) | 561 reportCopyVerification(subset, bufBm, coords, |
| 524 reportCopyVerification(subset, bufBm, coords, | 562 "copyPixelsTo(buf, bufSize, rowBytes()-1)", reporter); |
| 525 "copyPixelsTo(buf, bufSize, 1.5*maxRowBytes)", | |
| 526 reporter); | |
| 527 | |
| 528 // Test #2 //////////////////////////////////////////// | |
| 529 // This test should always succeed, but in the case | |
| 530 // of extracted bitmaps only because we handle the | |
| 531 // issue of getSafeSize(). Without getSafeSize() | |
| 532 // buffer overrun/read would occur. | |
| 533 memset(buf, 0xFF, bufSize); | |
| 534 bufBm.setConfig(gPairs[i].fConfig, subW, subH, | |
| 535 subset.rowBytes()); | |
| 536 bufBm.setPixels(buf); | |
| 537 successExpected = subset.getSafeSize() <= bufSize; | |
| 538 REPORTER_ASSERT(reporter, | |
| 539 subset.copyPixelsTo(buf, bufSize) == | |
| 540 successExpected); | |
| 541 if (successExpected) | |
| 542 reportCopyVerification(subset, bufBm, coords, | |
| 543 "copyPixelsTo(buf, bufSize)", reporter); | |
| 544 | |
| 545 // Test #3 //////////////////////////////////////////// | |
| 546 // Copy with different stride between src and dst. | |
| 547 memset(buf, 0xFF, bufSize); | |
| 548 bufBm.setConfig(gPairs[i].fConfig, subW, subH, | |
| 549 subset.rowBytes()+1); | |
| 550 bufBm.setPixels(buf); | |
| 551 successExpected = true; // Should always work. | |
| 552 REPORTER_ASSERT(reporter, | |
| 553 subset.copyPixelsTo(buf, bufSize, | |
| 554 subset.rowBytes()+1) == successExpected); | |
| 555 if (successExpected) | |
| 556 reportCopyVerification(subset, bufBm, coords, | |
| 557 "copyPixelsTo(buf, bufSize, rowBytes+1)", reporter); | |
| 558 | |
| 559 // Test #4 //////////////////////////////////////////// | |
| 560 // Test copy with stride too small. | |
| 561 memset(buf, 0xFF, bufSize); | |
| 562 bufBm.setConfig(gPairs[i].fConfig, subW, subH); | |
| 563 bufBm.setPixels(buf); | |
| 564 successExpected = false; | |
| 565 // Request copy with stride too small. | |
| 566 REPORTER_ASSERT(reporter, | |
| 567 subset.copyPixelsTo(buf, bufSize, bufBm.rowBytes()-1) | |
| 568 == successExpected); | |
| 569 if (successExpected) | |
| 570 reportCopyVerification(subset, bufBm, coords, | |
| 571 "copyPixelsTo(buf, bufSize, rowBytes()-1)", reporter); | |
| 572 | 563 |
| 573 #if 0 // copyPixelsFrom is gone | 564 #if 0 // copyPixelsFrom is gone |
| 574 // Test #5 //////////////////////////////////////////// | 565 // Test #5 //////////////////////////////////////////// |
| 575 // Tests the case where the source stride is too small | 566 // Tests the case where the source stride is too small |
| 576 // for the source configuration. | 567 // for the source configuration. |
| 577 memset(buf, 0xFF, bufSize); | 568 memset(buf, 0xFF, bufSize); |
| 578 bufBm.setConfig(gPairs[i].fConfig, subW, subH); | 569 bufBm.setConfig(gPairs[i].fConfig, subW, subH); |
| 579 bufBm.setPixels(buf); | 570 bufBm.setPixels(buf); |
| 580 writeCoordPixels(bufBm, coords); | 571 writeCoordPixels(bufBm, coords); |
| 581 REPORTER_ASSERT(reporter, | 572 REPORTER_ASSERT(reporter, |
| 582 subset.copyPixelsFrom(buf, bufSize, 1) == false); | 573 subset.copyPixelsFrom(buf, bufSize, 1) == false); |
| 583 | 574 |
| 584 // Test #6 /////////////////////////////////////////// | 575 // Test #6 /////////////////////////////////////////// |
| 585 // Tests basic copy from an external buffer to the bitmap. | 576 // Tests basic copy from an external buffer to the bitmap. |
| 586 // If the bitmap is "extracted", this also tests the case | 577 // If the bitmap is "extracted", this also tests the case |
| 587 // where the source stride is different from the dest. | 578 // where the source stride is different from the dest. |
| 588 // stride. | 579 // stride. |
| 589 // We've made the buffer large enough to always succeed. | 580 // We've made the buffer large enough to always succeed. |
| 590 bufBm.setConfig(gPairs[i].fConfig, subW, subH); | 581 bufBm.setConfig(gPairs[i].fConfig, subW, subH); |
| 591 bufBm.setPixels(buf); | 582 bufBm.setPixels(buf); |
| 592 writeCoordPixels(bufBm, coords); | 583 writeCoordPixels(bufBm, coords); |
| 593 REPORTER_ASSERT(reporter, | 584 REPORTER_ASSERT(reporter, |
| 594 subset.copyPixelsFrom(buf, bufSize, bufBm.rowBytes()) == | 585 subset.copyPixelsFrom(buf, bufSize, bufBm.rowBytes()) == |
| 595 true); | 586 true); |
| 596 reportCopyVerification(bufBm, subset, coords, | 587 reportCopyVerification(bufBm, subset, coords, |
| 597 "copyPixelsFrom(buf, bufSize)", | 588 "copyPixelsFrom(buf, bufSize)", |
| 598 reporter); | 589 reporter); |
| 599 | 590 |
| 600 // Test #7 //////////////////////////////////////////// | 591 // Test #7 //////////////////////////////////////////// |
| 601 // Tests the case where the source buffer is too small | 592 // Tests the case where the source buffer is too small |
| 602 // for the transfer. | 593 // for the transfer. |
| 603 REPORTER_ASSERT(reporter, | 594 REPORTER_ASSERT(reporter, |
| 604 subset.copyPixelsFrom(buf, 1, subset.rowBytes()) == | 595 subset.copyPixelsFrom(buf, 1, subset.rowBytes()) == |
| 605 false); | 596 false); |
| 606 | 597 |
| 607 #endif | 598 #endif |
| 608 } | |
| 609 } | 599 } |
| 610 } // for (size_t copyCase ... | 600 } // for (size_t copyCase ... |
| 611 } | 601 } |
| 612 } | 602 } |
| 613 | 603 |
| 614 #include "TestClassDef.h" | 604 #include "TestClassDef.h" |
| 615 DEFINE_TESTCLASS("BitmapCopy", TestBitmapCopyClass, TestBitmapCopy) | 605 DEFINE_TESTCLASS("BitmapCopy", TestBitmapCopyClass, TestBitmapCopy) |
| OLD | NEW |