OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 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 | 8 |
9 #include "ktx.h" | 9 #include "ktx.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 | 351 |
352 // Write the actual image data | 352 // Write the actual image data |
353 if (!stream->write(etc1Data, dataSize)) { | 353 if (!stream->write(etc1Data, dataSize)) { |
354 return false; | 354 return false; |
355 } | 355 } |
356 | 356 |
357 return true; | 357 return true; |
358 } | 358 } |
359 | 359 |
360 bool SkKTXFile::WriteBitmapToKTX(SkWStream* stream, const SkBitmap& bitmap) { | 360 bool SkKTXFile::WriteBitmapToKTX(SkWStream* stream, const SkBitmap& bitmap) { |
361 const SkBitmap::Config config = bitmap.config(); | 361 const SkColorType ct = bitmap.colorType(); |
362 SkAutoLockPixels alp(bitmap); | 362 SkAutoLockPixels alp(bitmap); |
363 | 363 |
364 const int width = bitmap.width(); | 364 const int width = bitmap.width(); |
365 const int height = bitmap.width(); | 365 const int height = bitmap.width(); |
366 const uint8_t* src = reinterpret_cast<uint8_t*>(bitmap.getPixels()); | 366 const uint8_t* src = reinterpret_cast<uint8_t*>(bitmap.getPixels()); |
367 if (NULL == bitmap.getPixels()) { | 367 if (NULL == bitmap.getPixels()) { |
368 return false; | 368 return false; |
369 } | 369 } |
370 | 370 |
371 // First thing's first, write out the magic identifier and endianness... | 371 // First thing's first, write out the magic identifier and endianness... |
372 if (!stream->write(KTX_FILE_IDENTIFIER, KTX_FILE_IDENTIFIER_SIZE) || | 372 if (!stream->write(KTX_FILE_IDENTIFIER, KTX_FILE_IDENTIFIER_SIZE) || |
373 !stream->write(&kKTX_ENDIANNESS_CODE, 4)) { | 373 !stream->write(&kKTX_ENDIANNESS_CODE, 4)) { |
374 return false; | 374 return false; |
375 } | 375 } |
376 | 376 |
377 // Collect our key/value pairs... | 377 // Collect our key/value pairs... |
378 SkTArray<KeyValue> kvPairs; | 378 SkTArray<KeyValue> kvPairs; |
379 | 379 |
380 // Next, write the header based on the bitmap's config. | 380 // Next, write the header based on the bitmap's config. |
381 Header hdr; | 381 Header hdr; |
382 switch (config) { | 382 switch (ct) { |
383 case SkBitmap::kIndex8_Config: | 383 case kIndex_8_SkColorType: |
384 // There is a compressed format for this, but we don't support it ye
t. | 384 // There is a compressed format for this, but we don't support it ye
t. |
385 SkDebugf("Writing indexed bitmap to KTX unsupported.\n"); | 385 SkDebugf("Writing indexed bitmap to KTX unsupported.\n"); |
386 // VVV fall through VVV | 386 // VVV fall through VVV |
387 default: | 387 default: |
388 case SkBitmap::kNo_Config: | 388 case kUnknown_SkColorType: |
389 // Bitmap hasn't been configured. | 389 // Bitmap hasn't been configured. |
390 return false; | 390 return false; |
391 | 391 |
392 case SkBitmap::kA8_Config: | 392 case kAlpha_8_SkColorType: |
393 hdr.fGLType = GR_GL_UNSIGNED_BYTE; | 393 hdr.fGLType = GR_GL_UNSIGNED_BYTE; |
394 hdr.fGLTypeSize = 1; | 394 hdr.fGLTypeSize = 1; |
395 hdr.fGLFormat = GR_GL_RED; | 395 hdr.fGLFormat = GR_GL_RED; |
396 hdr.fGLInternalFormat = GR_GL_R8; | 396 hdr.fGLInternalFormat = GR_GL_R8; |
397 hdr.fGLBaseInternalFormat = GR_GL_RED; | 397 hdr.fGLBaseInternalFormat = GR_GL_RED; |
398 break; | 398 break; |
399 | 399 |
400 case SkBitmap::kRGB_565_Config: | 400 case kRGB_565_SkColorType: |
401 hdr.fGLType = GR_GL_UNSIGNED_SHORT_5_6_5; | 401 hdr.fGLType = GR_GL_UNSIGNED_SHORT_5_6_5; |
402 hdr.fGLTypeSize = 2; | 402 hdr.fGLTypeSize = 2; |
403 hdr.fGLFormat = GR_GL_RGB; | 403 hdr.fGLFormat = GR_GL_RGB; |
404 hdr.fGLInternalFormat = GR_GL_RGB; | 404 hdr.fGLInternalFormat = GR_GL_RGB; |
405 hdr.fGLBaseInternalFormat = GR_GL_RGB; | 405 hdr.fGLBaseInternalFormat = GR_GL_RGB; |
406 break; | 406 break; |
407 | 407 |
408 case SkBitmap::kARGB_4444_Config: | 408 case kARGB_4444_SkColorType: |
409 hdr.fGLType = GR_GL_UNSIGNED_SHORT_4_4_4_4; | 409 hdr.fGLType = GR_GL_UNSIGNED_SHORT_4_4_4_4; |
410 hdr.fGLTypeSize = 2; | 410 hdr.fGLTypeSize = 2; |
411 hdr.fGLFormat = GR_GL_RGBA; | 411 hdr.fGLFormat = GR_GL_RGBA; |
412 hdr.fGLInternalFormat = GR_GL_RGBA4; | 412 hdr.fGLInternalFormat = GR_GL_RGBA4; |
413 hdr.fGLBaseInternalFormat = GR_GL_RGBA; | 413 hdr.fGLBaseInternalFormat = GR_GL_RGBA; |
414 kvPairs.push_back(CreateKeyValue("KTXPremultipliedAlpha", "True")); | 414 kvPairs.push_back(CreateKeyValue("KTXPremultipliedAlpha", "True")); |
415 break; | 415 break; |
416 | 416 |
417 case SkBitmap::kARGB_8888_Config: | 417 case kN32_SkColorType: |
418 hdr.fGLType = GR_GL_UNSIGNED_BYTE; | 418 hdr.fGLType = GR_GL_UNSIGNED_BYTE; |
419 hdr.fGLTypeSize = 1; | 419 hdr.fGLTypeSize = 1; |
420 hdr.fGLFormat = GR_GL_RGBA; | 420 hdr.fGLFormat = GR_GL_RGBA; |
421 hdr.fGLInternalFormat = GR_GL_RGBA8; | 421 hdr.fGLInternalFormat = GR_GL_RGBA8; |
422 hdr.fGLBaseInternalFormat = GR_GL_RGBA; | 422 hdr.fGLBaseInternalFormat = GR_GL_RGBA; |
423 kvPairs.push_back(CreateKeyValue("KTXPremultipliedAlpha", "True")); | 423 kvPairs.push_back(CreateKeyValue("KTXPremultipliedAlpha", "True")); |
424 break; | 424 break; |
425 } | 425 } |
426 | 426 |
427 // Everything else in the header is shared. | 427 // Everything else in the header is shared. |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 return false; | 463 return false; |
464 } | 464 } |
465 | 465 |
466 // Write it into the buffer | 466 // Write it into the buffer |
467 if (!stream->write(&dataSz, 4)) { | 467 if (!stream->write(&dataSz, 4)) { |
468 return false; | 468 return false; |
469 } | 469 } |
470 | 470 |
471 // Write the pixel data... | 471 // Write the pixel data... |
472 const uint8_t* rowPtr = src; | 472 const uint8_t* rowPtr = src; |
473 if (SkBitmap::kARGB_8888_Config == config) { | 473 if (kN32_SkColorType == ct) { |
474 for (int j = 0; j < height; ++j) { | 474 for (int j = 0; j < height; ++j) { |
475 const uint32_t* pixelsPtr = reinterpret_cast<const uint32_t*>(rowPtr
); | 475 const uint32_t* pixelsPtr = reinterpret_cast<const uint32_t*>(rowPtr
); |
476 for (int i = 0; i < width; ++i) { | 476 for (int i = 0; i < width; ++i) { |
477 uint32_t pixel = pixelsPtr[i]; | 477 uint32_t pixel = pixelsPtr[i]; |
478 uint8_t dstPixel[4]; | 478 uint8_t dstPixel[4]; |
479 dstPixel[0] = pixel >> SK_R32_SHIFT; | 479 dstPixel[0] = pixel >> SK_R32_SHIFT; |
480 dstPixel[1] = pixel >> SK_G32_SHIFT; | 480 dstPixel[1] = pixel >> SK_G32_SHIFT; |
481 dstPixel[2] = pixel >> SK_B32_SHIFT; | 481 dstPixel[2] = pixel >> SK_B32_SHIFT; |
482 dstPixel[3] = pixel >> SK_A32_SHIFT; | 482 dstPixel[3] = pixel >> SK_A32_SHIFT; |
483 if (!stream->write(dstPixel, 4)) { | 483 if (!stream->write(dstPixel, 4)) { |
484 return false; | 484 return false; |
485 } | 485 } |
486 } | 486 } |
487 rowPtr += bitmap.rowBytes(); | 487 rowPtr += bitmap.rowBytes(); |
488 } | 488 } |
489 } else { | 489 } else { |
490 for (int i = 0; i < height; ++i) { | 490 for (int i = 0; i < height; ++i) { |
491 if (!stream->write(rowPtr, bpp*width)) { | 491 if (!stream->write(rowPtr, bpp*width)) { |
492 return false; | 492 return false; |
493 } | 493 } |
494 rowPtr += bitmap.rowBytes(); | 494 rowPtr += bitmap.rowBytes(); |
495 } | 495 } |
496 } | 496 } |
497 | 497 |
498 return true; | 498 return true; |
499 } | 499 } |
OLD | NEW |