3235 png_uint_32 row_width = row_info->width; |
3234 png_uint_32 row_width = row_info->width; |
3236 int shift; |
3235 int shift; |
3237 |
3236 |
3238 png_debug(1, "in png_do_compose"); |
3237 png_debug(1, "in png_do_compose"); |
3239 |
3238 |
3240 { |
3239 switch (row_info->color_type) |
3241 switch (row_info->color_type) |
3240 { |
3242 { |
3241 case PNG_COLOR_TYPE_GRAY: |
3243 case PNG_COLOR_TYPE_GRAY: |
3242 { |
3244 { |
3243 switch (row_info->bit_depth) |
3245 switch (row_info->bit_depth) |
3244 { |
3246 { |
3245 case 1: |
3247 case 1: |
3246 { |
|
3247 sp = row; |
|
3248 shift = 7; |
|
3249 for (i = 0; i < row_width; i++) |
|
3250 { |
|
3251 if ((png_uint_16)((*sp >> shift) & 0x01) |
|
3252 == png_ptr->trans_color.gray) |
|
3253 { |
|
3254 unsigned int tmp = *sp & (0x7f7f >> (7 - shift)); |
|
3255 tmp |= |
|
3256 (unsigned int)(png_ptr->background.gray << shift); |
|
3257 *sp = (png_byte)(tmp & 0xff); |
|
3258 } |
|
3259 |
|
3260 if (shift == 0) |
|
3261 { |
|
3262 shift = 7; |
|
3263 sp++; |
|
3264 } |
|
3265 |
|
3266 else |
|
3267 shift--; |
|
3268 } |
|
3269 break; |
|
3270 } |
|
3271 |
|
3272 case 2: |
|
3273 { |
|
3274 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3275 if (gamma_table != NULL) |
3248 { |
3276 { |
3249 sp = row; |
3277 sp = row; |
3250 shift = 7; |
3278 shift = 6; |
3251 for (i = 0; i < row_width; i++) |
3279 for (i = 0; i < row_width; i++) |
3252 { |
3280 { |
3253 if ((png_uint_16)((*sp >> shift) & 0x01) |
3281 if ((png_uint_16)((*sp >> shift) & 0x03) |
3254 == png_ptr->trans_color.gray) |
3282 == png_ptr->trans_color.gray) |
3255 { |
3283 { |
3256 unsigned int tmp = *sp & (0x7f7f >> (7 - shift)); |
3284 unsigned int tmp = *sp & (0x3f3f >> (6 - shift)); |
3257 tmp |= |
3285 tmp |= |
3258 (unsigned int)(png_ptr->background.gray << shift); |
3286 (unsigned int)png_ptr->background.gray << shift; |
3259 *sp = (png_byte)(tmp & 0xff); |
3287 *sp = (png_byte)(tmp & 0xff); |
3260 } |
3288 } |
3261 |
3289 |
|
3290 else |
|
3291 { |
|
3292 unsigned int p = (*sp >> shift) & 0x03; |
|
3293 unsigned int g = (gamma_table [p | (p << 2) | |
|
3294 (p << 4) | (p << 6)] >> 6) & 0x03; |
|
3295 unsigned int tmp = *sp & (0x3f3f >> (6 - shift)); |
|
3296 tmp |= (unsigned int)(g << shift); |
|
3297 *sp = (png_byte)(tmp & 0xff); |
|
3298 } |
|
3299 |
3262 if (shift == 0) |
3300 if (shift == 0) |
3263 { |
3301 { |
3264 shift = 7; |
3302 shift = 6; |
3265 sp++; |
3303 sp++; |
3266 } |
3304 } |
3267 |
3305 |
3268 else |
3306 else |
3269 shift--; |
3307 shift -= 2; |
3270 } |
3308 } |
3271 break; |
3309 } |
3272 } |
3310 |
3273 |
3311 else |
3274 case 2: |
3312 #endif |
3275 { |
3313 { |
3276 #ifdef PNG_READ_GAMMA_SUPPORTED |
3314 sp = row; |
3277 if (gamma_table != NULL) |
3315 shift = 6; |
|
3316 for (i = 0; i < row_width; i++) |
3278 { |
3317 { |
3279 sp = row; |
3318 if ((png_uint_16)((*sp >> shift) & 0x03) |
3280 shift = 6; |
3319 == png_ptr->trans_color.gray) |
3281 for (i = 0; i < row_width; i++) |
|
3282 { |
3320 { |
3283 if ((png_uint_16)((*sp >> shift) & 0x03) |
3321 unsigned int tmp = *sp & (0x3f3f >> (6 - shift)); |
3284 == png_ptr->trans_color.gray) |
3322 tmp |= |
3285 { |
3323 (unsigned int)png_ptr->background.gray << shift; |
3286 unsigned int tmp = *sp & (0x3f3f >> (6 - shift)); |
3324 *sp = (png_byte)(tmp & 0xff); |
3287 tmp |= |
|
3288 (unsigned int)png_ptr->background.gray << shift; |
|
3289 *sp = (png_byte)(tmp & 0xff); |
|
3290 } |
|
3291 |
|
3292 else |
|
3293 { |
|
3294 unsigned int p = (*sp >> shift) & 0x03; |
|
3295 unsigned int g = (gamma_table [p | (p << 2) | |
|
3296 (p << 4) | (p << 6)] >> 6) & 0x03; |
|
3297 unsigned int tmp = *sp & (0x3f3f >> (6 - shift)); |
|
3298 tmp |= (unsigned int)(g << shift); |
|
3299 *sp = (png_byte)(tmp & 0xff); |
|
3300 } |
|
3301 |
|
3302 if (shift == 0) |
|
3303 { |
|
3304 shift = 6; |
|
3305 sp++; |
|
3306 } |
|
3307 |
|
3308 else |
|
3309 shift -= 2; |
|
3310 } |
3325 } |
|
3326 |
|
3327 if (shift == 0) |
|
3328 { |
|
3329 shift = 6; |
|
3330 sp++; |
|
3331 } |
|
3332 |
|
3333 else |
|
3334 shift -= 2; |
3311 } |
3335 } |
3312 |
3336 } |
3313 else |
3337 break; |
3314 #endif |
3338 } |
3315 { |
3339 |
3316 sp = row; |
3340 case 4: |
3317 shift = 6; |
|
3318 for (i = 0; i < row_width; i++) |
|
3319 { |
|
3320 if ((png_uint_16)((*sp >> shift) & 0x03) |
|
3321 == png_ptr->trans_color.gray) |
|
3322 { |
|
3323 unsigned int tmp = *sp & (0x3f3f >> (6 - shift)); |
|
3324 tmp |= |
|
3325 (unsigned int)png_ptr->background.gray << shift; |
|
3326 *sp = (png_byte)(tmp & 0xff); |
|
3327 } |
|
3328 |
|
3329 if (shift == 0) |
|
3330 { |
|
3331 shift = 6; |
|
3332 sp++; |
|
3333 } |
|
3334 |
|
3335 else |
|
3336 shift -= 2; |
|
3337 } |
|
3338 } |
|
3339 break; |
|
3340 } |
|
3341 |
|
3342 case 4: |
|
3343 { |
|
3344 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3345 if (gamma_table != NULL) |
|
3346 { |
|
3347 sp = row; |
|
3348 shift = 4; |
|
3349 for (i = 0; i < row_width; i++) |
|
3350 { |
|
3351 if ((png_uint_16)((*sp >> shift) & 0x0f) |
|
3352 == png_ptr->trans_color.gray) |
|
3353 { |
|
3354 unsigned int tmp = *sp & (0x0f0f >> (4 - shift)); |
|
3355 tmp |= |
|
3356 (unsigned int)(png_ptr->background.gray << shift); |
|
3357 *sp = (png_byte)(tmp & 0xff); |
|
3358 } |
|
3359 |
|
3360 else |
|
3361 { |
|
3362 unsigned int p = (*sp >> shift) & 0x0f; |
|
3363 unsigned int g = (gamma_table[p | (p << 4)] >> 4) & |
|
3364 0x0f; |
|
3365 unsigned int tmp = *sp & (0x0f0f >> (4 - shift)); |
|
3366 tmp |= (unsigned int)(g << shift); |
|
3367 *sp = (png_byte)(tmp & 0xff); |
|
3368 } |
|
3369 |
|
3370 if (shift == 0) |
|
3371 { |
|
3372 shift = 4; |
|
3373 sp++; |
|
3374 } |
|
3375 |
|
3376 else |
|
3377 shift -= 4; |
|
3378 } |
|
3379 } |
|
3380 |
|
3381 else |
|
3382 #endif |
|
3383 { |
|
3384 sp = row; |
|
3385 shift = 4; |
|
3386 for (i = 0; i < row_width; i++) |
|
3387 { |
|
3388 if ((png_uint_16)((*sp >> shift) & 0x0f) |
|
3389 == png_ptr->trans_color.gray) |
|
3390 { |
|
3391 unsigned int tmp = *sp & (0x0f0f >> (4 - shift)); |
|
3392 tmp |= |
|
3393 (unsigned int)(png_ptr->background.gray << shift); |
|
3394 *sp = (png_byte)(tmp & 0xff); |
|
3395 } |
|
3396 |
|
3397 if (shift == 0) |
|
3398 { |
|
3399 shift = 4; |
|
3400 sp++; |
|
3401 } |
|
3402 |
|
3403 else |
|
3404 shift -= 4; |
|
3405 } |
|
3406 } |
|
3407 break; |
|
3408 } |
|
3409 |
|
3410 case 8: |
|
3411 { |
|
3412 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3413 if (gamma_table != NULL) |
|
3414 { |
|
3415 sp = row; |
|
3416 for (i = 0; i < row_width; i++, sp++) |
|
3417 { |
|
3418 if (*sp == png_ptr->trans_color.gray) |
|
3419 *sp = (png_byte)png_ptr->background.gray; |
|
3420 |
|
3421 else |
|
3422 *sp = gamma_table[*sp]; |
|
3423 } |
|
3424 } |
|
3425 else |
|
3426 #endif |
|
3427 { |
|
3428 sp = row; |
|
3429 for (i = 0; i < row_width; i++, sp++) |
|
3430 { |
|
3431 if (*sp == png_ptr->trans_color.gray) |
|
3432 *sp = (png_byte)png_ptr->background.gray; |
|
3433 } |
|
3434 } |
|
3435 break; |
|
3436 } |
|
3437 |
|
3438 case 16: |
|
3439 { |
|
3440 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3441 if (gamma_16 != NULL) |
|
3442 { |
|
3443 sp = row; |
|
3444 for (i = 0; i < row_width; i++, sp += 2) |
|
3445 { |
|
3446 png_uint_16 v; |
|
3447 |
|
3448 v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3449 |
|
3450 if (v == png_ptr->trans_color.gray) |
|
3451 { |
|
3452 /* Background is already in screen gamma */ |
|
3453 *sp = (png_byte)((png_ptr->background.gray >> 8) |
|
3454 & 0xff); |
|
3455 *(sp + 1) = (png_byte)(png_ptr->background.gray |
|
3456 & 0xff); |
|
3457 } |
|
3458 |
|
3459 else |
|
3460 { |
|
3461 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; |
|
3462 *sp = (png_byte)((v >> 8) & 0xff); |
|
3463 *(sp + 1) = (png_byte)(v & 0xff); |
|
3464 } |
|
3465 } |
|
3466 } |
|
3467 else |
|
3468 #endif |
|
3469 { |
|
3470 sp = row; |
|
3471 for (i = 0; i < row_width; i++, sp += 2) |
|
3472 { |
|
3473 png_uint_16 v; |
|
3474 |
|
3475 v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3476 |
|
3477 if (v == png_ptr->trans_color.gray) |
|
3478 { |
|
3479 *sp = (png_byte)((png_ptr->background.gray >> 8) |
|
3480 & 0xff); |
|
3481 *(sp + 1) = (png_byte)(png_ptr->background.gray |
|
3482 & 0xff); |
|
3483 } |
|
3484 } |
|
3485 } |
|
3486 break; |
|
3487 } |
|
3488 |
|
3489 default: |
|
3490 break; |
|
3491 } |
|
3492 break; |
|
3493 } |
|
3494 |
|
3495 case PNG_COLOR_TYPE_RGB: |
|
3496 { |
|
3497 if (row_info->bit_depth == 8) |
|
3498 { |
3341 { |
3499 #ifdef PNG_READ_GAMMA_SUPPORTED |
3342 #ifdef PNG_READ_GAMMA_SUPPORTED |
3500 if (gamma_table != NULL) |
3343 if (gamma_table != NULL) |
3501 { |
3344 { |
3502 sp = row; |
3345 sp = row; |
3503 for (i = 0; i < row_width; i++, sp += 3) |
3346 shift = 4; |
|
3347 for (i = 0; i < row_width; i++) |
3504 { |
3348 { |
3505 if (*sp == png_ptr->trans_color.red && |
3349 if ((png_uint_16)((*sp >> shift) & 0x0f) |
3506 *(sp + 1) == png_ptr->trans_color.green && |
3350 == png_ptr->trans_color.gray) |
3507 *(sp + 2) == png_ptr->trans_color.blue) |
|
3508 { |
3351 { |
3509 *sp = (png_byte)png_ptr->background.red; |
3352 unsigned int tmp = *sp & (0x0f0f >> (4 - shift)); |
3510 *(sp + 1) = (png_byte)png_ptr->background.green; |
3353 tmp |= |
3511 *(sp + 2) = (png_byte)png_ptr->background.blue; |
3354 (unsigned int)(png_ptr->background.gray << shift); |
|
3355 *sp = (png_byte)(tmp & 0xff); |
3512 } |
3356 } |
3513 |
3357 |
3514 else |
3358 else |
3515 { |
3359 { |
|
3360 unsigned int p = (*sp >> shift) & 0x0f; |
|
3361 unsigned int g = (gamma_table[p | (p << 4)] >> 4) & |
|
3362 0x0f; |
|
3363 unsigned int tmp = *sp & (0x0f0f >> (4 - shift)); |
|
3364 tmp |= (unsigned int)(g << shift); |
|
3365 *sp = (png_byte)(tmp & 0xff); |
|
3366 } |
|
3367 |
|
3368 if (shift == 0) |
|
3369 { |
|
3370 shift = 4; |
|
3371 sp++; |
|
3372 } |
|
3373 |
|
3374 else |
|
3375 shift -= 4; |
|
3376 } |
|
3377 } |
|
3378 |
|
3379 else |
|
3380 #endif |
|
3381 { |
|
3382 sp = row; |
|
3383 shift = 4; |
|
3384 for (i = 0; i < row_width; i++) |
|
3385 { |
|
3386 if ((png_uint_16)((*sp >> shift) & 0x0f) |
|
3387 == png_ptr->trans_color.gray) |
|
3388 { |
|
3389 unsigned int tmp = *sp & (0x0f0f >> (4 - shift)); |
|
3390 tmp |= |
|
3391 (unsigned int)(png_ptr->background.gray << shift); |
|
3392 *sp = (png_byte)(tmp & 0xff); |
|
3393 } |
|
3394 |
|
3395 if (shift == 0) |
|
3396 { |
|
3397 shift = 4; |
|
3398 sp++; |
|
3399 } |
|
3400 |
|
3401 else |
|
3402 shift -= 4; |
|
3403 } |
|
3404 } |
|
3405 break; |
|
3406 } |
|
3407 |
|
3408 case 8: |
|
3409 { |
|
3410 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3411 if (gamma_table != NULL) |
|
3412 { |
|
3413 sp = row; |
|
3414 for (i = 0; i < row_width; i++, sp++) |
|
3415 { |
|
3416 if (*sp == png_ptr->trans_color.gray) |
|
3417 *sp = (png_byte)png_ptr->background.gray; |
|
3418 |
|
3419 else |
3516 *sp = gamma_table[*sp]; |
3420 *sp = gamma_table[*sp]; |
3517 *(sp + 1) = gamma_table[*(sp + 1)]; |
|
3518 *(sp + 2) = gamma_table[*(sp + 2)]; |
|
3519 } |
|
3520 } |
3421 } |
3521 } |
3422 } |
3522 else |
3423 else |
3523 #endif |
3424 #endif |
3524 { |
3425 { |
3525 sp = row; |
3426 sp = row; |
3526 for (i = 0; i < row_width; i++, sp += 3) |
3427 for (i = 0; i < row_width; i++, sp++) |
3527 { |
3428 { |
3528 if (*sp == png_ptr->trans_color.red && |
3429 if (*sp == png_ptr->trans_color.gray) |
3529 *(sp + 1) == png_ptr->trans_color.green && |
3430 *sp = (png_byte)png_ptr->background.gray; |
3530 *(sp + 2) == png_ptr->trans_color.blue) |
|
3531 { |
|
3532 *sp = (png_byte)png_ptr->background.red; |
|
3533 *(sp + 1) = (png_byte)png_ptr->background.green; |
|
3534 *(sp + 2) = (png_byte)png_ptr->background.blue; |
|
3535 } |
|
3536 } |
3431 } |
3537 } |
3432 } |
3538 } |
3433 break; |
3539 else /* if (row_info->bit_depth == 16) */ |
3434 } |
|
3435 |
|
3436 case 16: |
3540 { |
3437 { |
3541 #ifdef PNG_READ_GAMMA_SUPPORTED |
3438 #ifdef PNG_READ_GAMMA_SUPPORTED |
3542 if (gamma_16 != NULL) |
3439 if (gamma_16 != NULL) |
3543 { |
|
3544 sp = row; |
|
3545 for (i = 0; i < row_width; i++, sp += 6) |
|
3546 { |
|
3547 png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3548 |
|
3549 png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) |
|
3550 + *(sp + 3)); |
|
3551 |
|
3552 png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) |
|
3553 + *(sp + 5)); |
|
3554 |
|
3555 if (r == png_ptr->trans_color.red && |
|
3556 g == png_ptr->trans_color.green && |
|
3557 b == png_ptr->trans_color.blue) |
|
3558 { |
|
3559 /* Background is already in screen gamma */ |
|
3560 *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); |
|
3561 *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); |
|
3562 *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) |
|
3563 & 0xff); |
|
3564 *(sp + 3) = (png_byte)(png_ptr->background.green |
|
3565 & 0xff); |
|
3566 *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) |
|
3567 & 0xff); |
|
3568 *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); |
|
3569 } |
|
3570 |
|
3571 else |
|
3572 { |
|
3573 png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; |
|
3574 *sp = (png_byte)((v >> 8) & 0xff); |
|
3575 *(sp + 1) = (png_byte)(v & 0xff); |
|
3576 |
|
3577 v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; |
|
3578 *(sp + 2) = (png_byte)((v >> 8) & 0xff); |
|
3579 *(sp + 3) = (png_byte)(v & 0xff); |
|
3580 |
|
3581 v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; |
|
3582 *(sp + 4) = (png_byte)((v >> 8) & 0xff); |
|
3583 *(sp + 5) = (png_byte)(v & 0xff); |
|
3584 } |
|
3585 } |
|
3586 } |
|
3587 |
|
3588 else |
|
3589 #endif |
|
3590 { |
|
3591 sp = row; |
|
3592 for (i = 0; i < row_width; i++, sp += 6) |
|
3593 { |
|
3594 png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3595 |
|
3596 png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) |
|
3597 + *(sp + 3)); |
|
3598 |
|
3599 png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) |
|
3600 + *(sp + 5)); |
|
3601 |
|
3602 if (r == png_ptr->trans_color.red && |
|
3603 g == png_ptr->trans_color.green && |
|
3604 b == png_ptr->trans_color.blue) |
|
3605 { |
|
3606 *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); |
|
3607 *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); |
|
3608 *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) |
|
3609 & 0xff); |
|
3610 *(sp + 3) = (png_byte)(png_ptr->background.green |
|
3611 & 0xff); |
|
3612 *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) |
|
3613 & 0xff); |
|
3614 *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); |
|
3615 } |
|
3616 } |
|
3617 } |
|
3618 } |
|
3619 break; |
|
3620 } |
|
3621 |
|
3622 case PNG_COLOR_TYPE_GRAY_ALPHA: |
|
3623 { |
|
3624 if (row_info->bit_depth == 8) |
|
3625 { |
|
3626 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3627 if (gamma_to_1 != NULL && gamma_from_1 != NULL && |
|
3628 gamma_table != NULL) |
|
3629 { |
3440 { |
3630 sp = row; |
3441 sp = row; |
3631 for (i = 0; i < row_width; i++, sp += 2) |
3442 for (i = 0; i < row_width; i++, sp += 2) |
3632 { |
3443 { |
3633 png_uint_16 a = *(sp + 1); |
3444 png_uint_16 v; |
3634 |
3445 |
3635 if (a == 0xff) |
3446 v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
3636 *sp = gamma_table[*sp]; |
3447 |
3637 |
3448 if (v == png_ptr->trans_color.gray) |
3638 else if (a == 0) |
|
3639 { |
3449 { |
3640 /* Background is already in screen gamma */ |
3450 /* Background is already in screen gamma */ |
3641 *sp = (png_byte)png_ptr->background.gray; |
3451 *sp = (png_byte)((png_ptr->background.gray >> 8) |
|
3452 & 0xff); |
|
3453 *(sp + 1) = (png_byte)(png_ptr->background.gray |
|
3454 & 0xff); |
3642 } |
3455 } |
3643 |
3456 |
3644 else |
3457 else |
3645 { |
3458 { |
3646 png_byte v, w; |
|
3647 |
|
3648 v = gamma_to_1[*sp]; |
|
3649 png_composite(w, v, a, png_ptr->background_1.gray); |
|
3650 if (optimize == 0) |
|
3651 w = gamma_from_1[w]; |
|
3652 *sp = w; |
|
3653 } |
|
3654 } |
|
3655 } |
|
3656 else |
|
3657 #endif |
|
3658 { |
|
3659 sp = row; |
|
3660 for (i = 0; i < row_width; i++, sp += 2) |
|
3661 { |
|
3662 png_byte a = *(sp + 1); |
|
3663 |
|
3664 if (a == 0) |
|
3665 *sp = (png_byte)png_ptr->background.gray; |
|
3666 |
|
3667 else if (a < 0xff) |
|
3668 png_composite(*sp, *sp, a, png_ptr->background.gray); |
|
3669 } |
|
3670 } |
|
3671 } |
|
3672 else /* if (png_ptr->bit_depth == 16) */ |
|
3673 { |
|
3674 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3675 if (gamma_16 != NULL && gamma_16_from_1 != NULL && |
|
3676 gamma_16_to_1 != NULL) |
|
3677 { |
|
3678 sp = row; |
|
3679 for (i = 0; i < row_width; i++, sp += 4) |
|
3680 { |
|
3681 png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) |
|
3682 + *(sp + 3)); |
|
3683 |
|
3684 if (a == (png_uint_16)0xffff) |
|
3685 { |
|
3686 png_uint_16 v; |
|
3687 |
|
3688 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; |
3459 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; |
3689 *sp = (png_byte)((v >> 8) & 0xff); |
3460 *sp = (png_byte)((v >> 8) & 0xff); |
3690 *(sp + 1) = (png_byte)(v & 0xff); |
3461 *(sp + 1) = (png_byte)(v & 0xff); |
3691 } |
3462 } |
3692 |
3463 } |
3693 else if (a == 0) |
3464 } |
|
3465 else |
|
3466 #endif |
|
3467 { |
|
3468 sp = row; |
|
3469 for (i = 0; i < row_width; i++, sp += 2) |
|
3470 { |
|
3471 png_uint_16 v; |
|
3472 |
|
3473 v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3474 |
|
3475 if (v == png_ptr->trans_color.gray) |
3694 { |
3476 { |
3695 /* Background is already in screen gamma */ |
|
3696 *sp = (png_byte)((png_ptr->background.gray >> 8) |
3477 *sp = (png_byte)((png_ptr->background.gray >> 8) |
3697 & 0xff); |
3478 & 0xff); |
3698 *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); |
3479 *(sp + 1) = (png_byte)(png_ptr->background.gray |
3699 } |
3480 & 0xff); |
3700 |
|
3701 else |
|
3702 { |
|
3703 png_uint_16 g, v, w; |
|
3704 |
|
3705 g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; |
|
3706 png_composite_16(v, g, a, png_ptr->background_1.gray); |
|
3707 if (optimize != 0) |
|
3708 w = v; |
|
3709 else |
|
3710 w = gamma_16_from_1[(v & 0xff) >> |
|
3711 gamma_shift][v >> 8]; |
|
3712 *sp = (png_byte)((w >> 8) & 0xff); |
|
3713 *(sp + 1) = (png_byte)(w & 0xff); |
|
3714 } |
3481 } |
3715 } |
3482 } |
3716 } |
3483 } |
3717 else |
3484 break; |
3718 #endif |
3485 } |
3719 { |
3486 |
3720 sp = row; |
3487 default: |
3721 for (i = 0; i < row_width; i++, sp += 4) |
3488 break; |
|
3489 } |
|
3490 break; |
|
3491 } |
|
3492 |
|
3493 case PNG_COLOR_TYPE_RGB: |
|
3494 { |
|
3495 if (row_info->bit_depth == 8) |
|
3496 { |
|
3497 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3498 if (gamma_table != NULL) |
|
3499 { |
|
3500 sp = row; |
|
3501 for (i = 0; i < row_width; i++, sp += 3) |
|
3502 { |
|
3503 if (*sp == png_ptr->trans_color.red && |
|
3504 *(sp + 1) == png_ptr->trans_color.green && |
|
3505 *(sp + 2) == png_ptr->trans_color.blue) |
3722 { |
3506 { |
3723 png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) |
3507 *sp = (png_byte)png_ptr->background.red; |
|
3508 *(sp + 1) = (png_byte)png_ptr->background.green; |
|
3509 *(sp + 2) = (png_byte)png_ptr->background.blue; |
|
3510 } |
|
3511 |
|
3512 else |
|
3513 { |
|
3514 *sp = gamma_table[*sp]; |
|
3515 *(sp + 1) = gamma_table[*(sp + 1)]; |
|
3516 *(sp + 2) = gamma_table[*(sp + 2)]; |
|
3517 } |
|
3518 } |
|
3519 } |
|
3520 else |
|
3521 #endif |
|
3522 { |
|
3523 sp = row; |
|
3524 for (i = 0; i < row_width; i++, sp += 3) |
|
3525 { |
|
3526 if (*sp == png_ptr->trans_color.red && |
|
3527 *(sp + 1) == png_ptr->trans_color.green && |
|
3528 *(sp + 2) == png_ptr->trans_color.blue) |
|
3529 { |
|
3530 *sp = (png_byte)png_ptr->background.red; |
|
3531 *(sp + 1) = (png_byte)png_ptr->background.green; |
|
3532 *(sp + 2) = (png_byte)png_ptr->background.blue; |
|
3533 } |
|
3534 } |
|
3535 } |
|
3536 } |
|
3537 else /* if (row_info->bit_depth == 16) */ |
|
3538 { |
|
3539 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3540 if (gamma_16 != NULL) |
|
3541 { |
|
3542 sp = row; |
|
3543 for (i = 0; i < row_width; i++, sp += 6) |
|
3544 { |
|
3545 png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3546 |
|
3547 png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) |
|
3548 + *(sp + 3)); |
|
3549 |
|
3550 png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) |
|
3551 + *(sp + 5)); |
|
3552 |
|
3553 if (r == png_ptr->trans_color.red && |
|
3554 g == png_ptr->trans_color.green && |
|
3555 b == png_ptr->trans_color.blue) |
|
3556 { |
|
3557 /* Background is already in screen gamma */ |
|
3558 *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); |
|
3559 *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); |
|
3560 *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) |
|
3561 & 0xff); |
|
3562 *(sp + 3) = (png_byte)(png_ptr->background.green |
|
3563 & 0xff); |
|
3564 *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) |
|
3565 & 0xff); |
|
3566 *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); |
|
3567 } |
|
3568 |
|
3569 else |
|
3570 { |
|
3571 png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; |
|
3572 *sp = (png_byte)((v >> 8) & 0xff); |
|
3573 *(sp + 1) = (png_byte)(v & 0xff); |
|
3574 |
|
3575 v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; |
|
3576 *(sp + 2) = (png_byte)((v >> 8) & 0xff); |
|
3577 *(sp + 3) = (png_byte)(v & 0xff); |
|
3578 |
|
3579 v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; |
|
3580 *(sp + 4) = (png_byte)((v >> 8) & 0xff); |
|
3581 *(sp + 5) = (png_byte)(v & 0xff); |
|
3582 } |
|
3583 } |
|
3584 } |
|
3585 |
|
3586 else |
|
3587 #endif |
|
3588 { |
|
3589 sp = row; |
|
3590 for (i = 0; i < row_width; i++, sp += 6) |
|
3591 { |
|
3592 png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3593 |
|
3594 png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) |
|
3595 + *(sp + 3)); |
|
3596 |
|
3597 png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) |
|
3598 + *(sp + 5)); |
|
3599 |
|
3600 if (r == png_ptr->trans_color.red && |
|
3601 g == png_ptr->trans_color.green && |
|
3602 b == png_ptr->trans_color.blue) |
|
3603 { |
|
3604 *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); |
|
3605 *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); |
|
3606 *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) |
|
3607 & 0xff); |
|
3608 *(sp + 3) = (png_byte)(png_ptr->background.green |
|
3609 & 0xff); |
|
3610 *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) |
|
3611 & 0xff); |
|
3612 *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); |
|
3613 } |
|
3614 } |
|
3615 } |
|
3616 } |
|
3617 break; |
|
3618 } |
|
3619 |
|
3620 case PNG_COLOR_TYPE_GRAY_ALPHA: |
|
3621 { |
|
3622 if (row_info->bit_depth == 8) |
|
3623 { |
|
3624 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3625 if (gamma_to_1 != NULL && gamma_from_1 != NULL && |
|
3626 gamma_table != NULL) |
|
3627 { |
|
3628 sp = row; |
|
3629 for (i = 0; i < row_width; i++, sp += 2) |
|
3630 { |
|
3631 png_uint_16 a = *(sp + 1); |
|
3632 |
|
3633 if (a == 0xff) |
|
3634 *sp = gamma_table[*sp]; |
|
3635 |
|
3636 else if (a == 0) |
|
3637 { |
|
3638 /* Background is already in screen gamma */ |
|
3639 *sp = (png_byte)png_ptr->background.gray; |
|
3640 } |
|
3641 |
|
3642 else |
|
3643 { |
|
3644 png_byte v, w; |
|
3645 |
|
3646 v = gamma_to_1[*sp]; |
|
3647 png_composite(w, v, a, png_ptr->background_1.gray); |
|
3648 if (optimize == 0) |
|
3649 w = gamma_from_1[w]; |
|
3650 *sp = w; |
|
3651 } |
|
3652 } |
|
3653 } |
|
3654 else |
|
3655 #endif |
|
3656 { |
|
3657 sp = row; |
|
3658 for (i = 0; i < row_width; i++, sp += 2) |
|
3659 { |
|
3660 png_byte a = *(sp + 1); |
|
3661 |
|
3662 if (a == 0) |
|
3663 *sp = (png_byte)png_ptr->background.gray; |
|
3664 |
|
3665 else if (a < 0xff) |
|
3666 png_composite(*sp, *sp, a, png_ptr->background.gray); |
|
3667 } |
|
3668 } |
|
3669 } |
|
3670 else /* if (png_ptr->bit_depth == 16) */ |
|
3671 { |
|
3672 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3673 if (gamma_16 != NULL && gamma_16_from_1 != NULL && |
|
3674 gamma_16_to_1 != NULL) |
|
3675 { |
|
3676 sp = row; |
|
3677 for (i = 0; i < row_width; i++, sp += 4) |
|
3678 { |
|
3679 png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) |
|
3680 + *(sp + 3)); |
|
3681 |
|
3682 if (a == (png_uint_16)0xffff) |
|
3683 { |
|
3684 png_uint_16 v; |
|
3685 |
|
3686 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; |
|
3687 *sp = (png_byte)((v >> 8) & 0xff); |
|
3688 *(sp + 1) = (png_byte)(v & 0xff); |
|
3689 } |
|
3690 |
|
3691 else if (a == 0) |
|
3692 { |
|
3693 /* Background is already in screen gamma */ |
|
3694 *sp = (png_byte)((png_ptr->background.gray >> 8) |
|
3695 & 0xff); |
|
3696 *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); |
|
3697 } |
|
3698 |
|
3699 else |
|
3700 { |
|
3701 png_uint_16 g, v, w; |
|
3702 |
|
3703 g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; |
|
3704 png_composite_16(v, g, a, png_ptr->background_1.gray); |
|
3705 if (optimize != 0) |
|
3706 w = v; |
|
3707 else |
|
3708 w = gamma_16_from_1[(v & 0xff) >> |
|
3709 gamma_shift][v >> 8]; |
|
3710 *sp = (png_byte)((w >> 8) & 0xff); |
|
3711 *(sp + 1) = (png_byte)(w & 0xff); |
|
3712 } |
|
3713 } |
|
3714 } |
|
3715 else |
|
3716 #endif |
|
3717 { |
|
3718 sp = row; |
|
3719 for (i = 0; i < row_width; i++, sp += 4) |
|
3720 { |
|
3721 png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) |
|
3722 + *(sp + 3)); |
|
3723 |
|
3724 if (a == 0) |
|
3725 { |
|
3726 *sp = (png_byte)((png_ptr->background.gray >> 8) |
|
3727 & 0xff); |
|
3728 *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); |
|
3729 } |
|
3730 |
|
3731 else if (a < 0xffff) |
|
3732 { |
|
3733 png_uint_16 g, v; |
|
3734 |
|
3735 g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3736 png_composite_16(v, g, a, png_ptr->background.gray); |
|
3737 *sp = (png_byte)((v >> 8) & 0xff); |
|
3738 *(sp + 1) = (png_byte)(v & 0xff); |
|
3739 } |
|
3740 } |
|
3741 } |
|
3742 } |
|
3743 break; |
|
3744 } |
|
3745 |
|
3746 case PNG_COLOR_TYPE_RGB_ALPHA: |
|
3747 { |
|
3748 if (row_info->bit_depth == 8) |
|
3749 { |
|
3750 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3751 if (gamma_to_1 != NULL && gamma_from_1 != NULL && |
|
3752 gamma_table != NULL) |
|
3753 { |
|
3754 sp = row; |
|
3755 for (i = 0; i < row_width; i++, sp += 4) |
|
3756 { |
|
3757 png_byte a = *(sp + 3); |
|
3758 |
|
3759 if (a == 0xff) |
|
3760 { |
|
3761 *sp = gamma_table[*sp]; |
|
3762 *(sp + 1) = gamma_table[*(sp + 1)]; |
|
3763 *(sp + 2) = gamma_table[*(sp + 2)]; |
|
3764 } |
|
3765 |
|
3766 else if (a == 0) |
|
3767 { |
|
3768 /* Background is already in screen gamma */ |
|
3769 *sp = (png_byte)png_ptr->background.red; |
|
3770 *(sp + 1) = (png_byte)png_ptr->background.green; |
|
3771 *(sp + 2) = (png_byte)png_ptr->background.blue; |
|
3772 } |
|
3773 |
|
3774 else |
|
3775 { |
|
3776 png_byte v, w; |
|
3777 |
|
3778 v = gamma_to_1[*sp]; |
|
3779 png_composite(w, v, a, png_ptr->background_1.red); |
|
3780 if (optimize == 0) w = gamma_from_1[w]; |
|
3781 *sp = w; |
|
3782 |
|
3783 v = gamma_to_1[*(sp + 1)]; |
|
3784 png_composite(w, v, a, png_ptr->background_1.green); |
|
3785 if (optimize == 0) w = gamma_from_1[w]; |
|
3786 *(sp + 1) = w; |
|
3787 |
|
3788 v = gamma_to_1[*(sp + 2)]; |
|
3789 png_composite(w, v, a, png_ptr->background_1.blue); |
|
3790 if (optimize == 0) w = gamma_from_1[w]; |
|
3791 *(sp + 2) = w; |
|
3792 } |
|
3793 } |
|
3794 } |
|
3795 else |
|
3796 #endif |
|
3797 { |
|
3798 sp = row; |
|
3799 for (i = 0; i < row_width; i++, sp += 4) |
|
3800 { |
|
3801 png_byte a = *(sp + 3); |
|
3802 |
|
3803 if (a == 0) |
|
3804 { |
|
3805 *sp = (png_byte)png_ptr->background.red; |
|
3806 *(sp + 1) = (png_byte)png_ptr->background.green; |
|
3807 *(sp + 2) = (png_byte)png_ptr->background.blue; |
|
3808 } |
|
3809 |
|
3810 else if (a < 0xff) |
|
3811 { |
|
3812 png_composite(*sp, *sp, a, png_ptr->background.red); |
|
3813 |
|
3814 png_composite(*(sp + 1), *(sp + 1), a, |
|
3815 png_ptr->background.green); |
|
3816 |
|
3817 png_composite(*(sp + 2), *(sp + 2), a, |
|
3818 png_ptr->background.blue); |
|
3819 } |
|
3820 } |
|
3821 } |
|
3822 } |
|
3823 else /* if (row_info->bit_depth == 16) */ |
|
3824 { |
|
3825 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3826 if (gamma_16 != NULL && gamma_16_from_1 != NULL && |
|
3827 gamma_16_to_1 != NULL) |
|
3828 { |
|
3829 sp = row; |
|
3830 for (i = 0; i < row_width; i++, sp += 8) |
|
3831 { |
|
3832 png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) |
|
3833 << 8) + (png_uint_16)(*(sp + 7))); |
|
3834 |
|
3835 if (a == (png_uint_16)0xffff) |
|
3836 { |
|
3837 png_uint_16 v; |
|
3838 |
|
3839 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; |
|
3840 *sp = (png_byte)((v >> 8) & 0xff); |
|
3841 *(sp + 1) = (png_byte)(v & 0xff); |
|
3842 |
|
3843 v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; |
|
3844 *(sp + 2) = (png_byte)((v >> 8) & 0xff); |
|
3845 *(sp + 3) = (png_byte)(v & 0xff); |
|
3846 |
|
3847 v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; |
|
3848 *(sp + 4) = (png_byte)((v >> 8) & 0xff); |
|
3849 *(sp + 5) = (png_byte)(v & 0xff); |
|
3850 } |
|
3851 |
|
3852 else if (a == 0) |
|
3853 { |
|
3854 /* Background is already in screen gamma */ |
|
3855 *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); |
|
3856 *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); |
|
3857 *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) |
|
3858 & 0xff); |
|
3859 *(sp + 3) = (png_byte)(png_ptr->background.green |
|
3860 & 0xff); |
|
3861 *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) |
|
3862 & 0xff); |
|
3863 *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); |
|
3864 } |
|
3865 |
|
3866 else |
|
3867 { |
|
3868 png_uint_16 v, w; |
|
3869 |
|
3870 v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; |
|
3871 png_composite_16(w, v, a, png_ptr->background_1.red); |
|
3872 if (optimize == 0) |
|
3873 w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >> |
|
3874 8]; |
|
3875 *sp = (png_byte)((w >> 8) & 0xff); |
|
3876 *(sp + 1) = (png_byte)(w & 0xff); |
|
3877 |
|
3878 v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; |
|
3879 png_composite_16(w, v, a, png_ptr->background_1.green); |
|
3880 if (optimize == 0) |
|
3881 w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >> |
|
3882 8]; |
|
3883 |
|
3884 *(sp + 2) = (png_byte)((w >> 8) & 0xff); |
|
3885 *(sp + 3) = (png_byte)(w & 0xff); |
|
3886 |
|
3887 v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; |
|
3888 png_composite_16(w, v, a, png_ptr->background_1.blue); |
|
3889 if (optimize == 0) |
|
3890 w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >> |
|
3891 8]; |
|
3892 |
|
3893 *(sp + 4) = (png_byte)((w >> 8) & 0xff); |
|
3894 *(sp + 5) = (png_byte)(w & 0xff); |
|
3895 } |
|
3896 } |
|
3897 } |
|
3898 |
|
3899 else |
|
3900 #endif |
|
3901 { |
|
3902 sp = row; |
|
3903 for (i = 0; i < row_width; i++, sp += 8) |
|
3904 { |
|
3905 png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) |
|
3906 << 8) + (png_uint_16)(*(sp + 7))); |
|
3907 |
|
3908 if (a == 0) |
|
3909 { |
|
3910 *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); |
|
3911 *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); |
|
3912 *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) |
|
3913 & 0xff); |
|
3914 *(sp + 3) = (png_byte)(png_ptr->background.green |
|
3915 & 0xff); |
|
3916 *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) |
|
3917 & 0xff); |
|
3918 *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); |
|
3919 } |
|
3920 |
|
3921 else if (a < 0xffff) |
|
3922 { |
|
3923 png_uint_16 v; |
|
3924 |
|
3925 png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3926 png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) |
3724 + *(sp + 3)); |
3927 + *(sp + 3)); |
3725 |
3928 png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) |
3726 if (a == 0) |
3929 + *(sp + 5)); |
3727 { |
3930 |
3728 *sp = (png_byte)((png_ptr->background.gray >> 8) |
3931 png_composite_16(v, r, a, png_ptr->background.red); |
3729 & 0xff); |
3932 *sp = (png_byte)((v >> 8) & 0xff); |
3730 *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); |
3933 *(sp + 1) = (png_byte)(v & 0xff); |
3731 } |
3934 |
3732 |
3935 png_composite_16(v, g, a, png_ptr->background.green); |
3733 else if (a < 0xffff) |
3936 *(sp + 2) = (png_byte)((v >> 8) & 0xff); |
3734 { |
3937 *(sp + 3) = (png_byte)(v & 0xff); |
3735 png_uint_16 g, v; |
3938 |
3736 |
3939 png_composite_16(v, b, a, png_ptr->background.blue); |
3737 g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
3940 *(sp + 4) = (png_byte)((v >> 8) & 0xff); |
3738 png_composite_16(v, g, a, png_ptr->background.gray); |
3941 *(sp + 5) = (png_byte)(v & 0xff); |
3739 *sp = (png_byte)((v >> 8) & 0xff); |
|
3740 *(sp + 1) = (png_byte)(v & 0xff); |
|
3741 } |
|
3742 } |
3942 } |
3743 } |
3943 } |
3744 } |
3944 } |
3745 break; |
3945 } |
3746 } |
3946 break; |
3747 |
3947 } |
3748 case PNG_COLOR_TYPE_RGB_ALPHA: |
3948 |
3749 { |
3949 default: |
3750 if (row_info->bit_depth == 8) |
3950 break; |
3751 { |
|
3752 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3753 if (gamma_to_1 != NULL && gamma_from_1 != NULL && |
|
3754 gamma_table != NULL) |
|
3755 { |
|
3756 sp = row; |
|
3757 for (i = 0; i < row_width; i++, sp += 4) |
|
3758 { |
|
3759 png_byte a = *(sp + 3); |
|
3760 |
|
3761 if (a == 0xff) |
|
3762 { |
|
3763 *sp = gamma_table[*sp]; |
|
3764 *(sp + 1) = gamma_table[*(sp + 1)]; |
|
3765 *(sp + 2) = gamma_table[*(sp + 2)]; |
|
3766 } |
|
3767 |
|
3768 else if (a == 0) |
|
3769 { |
|
3770 /* Background is already in screen gamma */ |
|
3771 *sp = (png_byte)png_ptr->background.red; |
|
3772 *(sp + 1) = (png_byte)png_ptr->background.green; |
|
3773 *(sp + 2) = (png_byte)png_ptr->background.blue; |
|
3774 } |
|
3775 |
|
3776 else |
|
3777 { |
|
3778 png_byte v, w; |
|
3779 |
|
3780 v = gamma_to_1[*sp]; |
|
3781 png_composite(w, v, a, png_ptr->background_1.red); |
|
3782 if (optimize == 0) w = gamma_from_1[w]; |
|
3783 *sp = w; |
|
3784 |
|
3785 v = gamma_to_1[*(sp + 1)]; |
|
3786 png_composite(w, v, a, png_ptr->background_1.green); |
|
3787 if (optimize == 0) w = gamma_from_1[w]; |
|
3788 *(sp + 1) = w; |
|
3789 |
|
3790 v = gamma_to_1[*(sp + 2)]; |
|
3791 png_composite(w, v, a, png_ptr->background_1.blue); |
|
3792 if (optimize == 0) w = gamma_from_1[w]; |
|
3793 *(sp + 2) = w; |
|
3794 } |
|
3795 } |
|
3796 } |
|
3797 else |
|
3798 #endif |
|
3799 { |
|
3800 sp = row; |
|
3801 for (i = 0; i < row_width; i++, sp += 4) |
|
3802 { |
|
3803 png_byte a = *(sp + 3); |
|
3804 |
|
3805 if (a == 0) |
|
3806 { |
|
3807 *sp = (png_byte)png_ptr->background.red; |
|
3808 *(sp + 1) = (png_byte)png_ptr->background.green; |
|
3809 *(sp + 2) = (png_byte)png_ptr->background.blue; |
|
3810 } |
|
3811 |
|
3812 else if (a < 0xff) |
|
3813 { |
|
3814 png_composite(*sp, *sp, a, png_ptr->background.red); |
|
3815 |
|
3816 png_composite(*(sp + 1), *(sp + 1), a, |
|
3817 png_ptr->background.green); |
|
3818 |
|
3819 png_composite(*(sp + 2), *(sp + 2), a, |
|
3820 png_ptr->background.blue); |
|
3821 } |
|
3822 } |
|
3823 } |
|
3824 } |
|
3825 else /* if (row_info->bit_depth == 16) */ |
|
3826 { |
|
3827 #ifdef PNG_READ_GAMMA_SUPPORTED |
|
3828 if (gamma_16 != NULL && gamma_16_from_1 != NULL && |
|
3829 gamma_16_to_1 != NULL) |
|
3830 { |
|
3831 sp = row; |
|
3832 for (i = 0; i < row_width; i++, sp += 8) |
|
3833 { |
|
3834 png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) |
|
3835 << 8) + (png_uint_16)(*(sp + 7))); |
|
3836 |
|
3837 if (a == (png_uint_16)0xffff) |
|
3838 { |
|
3839 png_uint_16 v; |
|
3840 |
|
3841 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; |
|
3842 *sp = (png_byte)((v >> 8) & 0xff); |
|
3843 *(sp + 1) = (png_byte)(v & 0xff); |
|
3844 |
|
3845 v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; |
|
3846 *(sp + 2) = (png_byte)((v >> 8) & 0xff); |
|
3847 *(sp + 3) = (png_byte)(v & 0xff); |
|
3848 |
|
3849 v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; |
|
3850 *(sp + 4) = (png_byte)((v >> 8) & 0xff); |
|
3851 *(sp + 5) = (png_byte)(v & 0xff); |
|
3852 } |
|
3853 |
|
3854 else if (a == 0) |
|
3855 { |
|
3856 /* Background is already in screen gamma */ |
|
3857 *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); |
|
3858 *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); |
|
3859 *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) |
|
3860 & 0xff); |
|
3861 *(sp + 3) = (png_byte)(png_ptr->background.green |
|
3862 & 0xff); |
|
3863 *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) |
|
3864 & 0xff); |
|
3865 *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); |
|
3866 } |
|
3867 |
|
3868 else |
|
3869 { |
|
3870 png_uint_16 v, w; |
|
3871 |
|
3872 v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; |
|
3873 png_composite_16(w, v, a, png_ptr->background_1.red); |
|
3874 if (optimize == 0) |
|
3875 w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >> |
|
3876 8]; |
|
3877 *sp = (png_byte)((w >> 8) & 0xff); |
|
3878 *(sp + 1) = (png_byte)(w & 0xff); |
|
3879 |
|
3880 v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; |
|
3881 png_composite_16(w, v, a, png_ptr->background_1.green); |
|
3882 if (optimize == 0) |
|
3883 w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >> |
|
3884 8]; |
|
3885 |
|
3886 *(sp + 2) = (png_byte)((w >> 8) & 0xff); |
|
3887 *(sp + 3) = (png_byte)(w & 0xff); |
|
3888 |
|
3889 v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; |
|
3890 png_composite_16(w, v, a, png_ptr->background_1.blue); |
|
3891 if (optimize == 0) |
|
3892 w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >> |
|
3893 8]; |
|
3894 |
|
3895 *(sp + 4) = (png_byte)((w >> 8) & 0xff); |
|
3896 *(sp + 5) = (png_byte)(w & 0xff); |
|
3897 } |
|
3898 } |
|
3899 } |
|
3900 |
|
3901 else |
|
3902 #endif |
|
3903 { |
|
3904 sp = row; |
|
3905 for (i = 0; i < row_width; i++, sp += 8) |
|
3906 { |
|
3907 png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) |
|
3908 << 8) + (png_uint_16)(*(sp + 7))); |
|
3909 |
|
3910 if (a == 0) |
|
3911 { |
|
3912 *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); |
|
3913 *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); |
|
3914 *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) |
|
3915 & 0xff); |
|
3916 *(sp + 3) = (png_byte)(png_ptr->background.green |
|
3917 & 0xff); |
|
3918 *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) |
|
3919 & 0xff); |
|
3920 *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); |
|
3921 } |
|
3922 |
|
3923 else if (a < 0xffff) |
|
3924 { |
|
3925 png_uint_16 v; |
|
3926 |
|
3927 png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); |
|
3928 png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) |
|
3929 + *(sp + 3)); |
|
3930 png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) |
|
3931 + *(sp + 5)); |
|
3932 |
|
3933 png_composite_16(v, r, a, png_ptr->background.red); |
|
3934 *sp = (png_byte)((v >> 8) & 0xff); |
|
3935 *(sp + 1) = (png_byte)(v & 0xff); |
|
3936 |
|
3937 png_composite_16(v, g, a, png_ptr->background.green); |
|
3938 *(sp + 2) = (png_byte)((v >> 8) & 0xff); |
|
3939 *(sp + 3) = (png_byte)(v & 0xff); |
|
3940 |
|
3941 png_composite_16(v, b, a, png_ptr->background.blue); |
|
3942 *(sp + 4) = (png_byte)((v >> 8) & 0xff); |
|
3943 *(sp + 5) = (png_byte)(v & 0xff); |
|
3944 } |
|
3945 } |
|
3946 } |
|
3947 } |
|
3948 break; |
|
3949 } |
|
3950 |
|
3951 default: |
|
3952 break; |
|
3953 } |
|
3954 } |
3951 } |
3955 } |
3952 } |
3956 #endif /* READ_BACKGROUND || READ_ALPHA_MODE */ |
3953 #endif /* READ_BACKGROUND || READ_ALPHA_MODE */ |
3957 |
3954 |
3958 #ifdef PNG_READ_GAMMA_SUPPORTED |
3955 #ifdef PNG_READ_GAMMA_SUPPORTED |
4391 png_uint_32 i; |
4388 png_uint_32 i; |
4392 png_uint_32 row_width=row_info->width; |
4389 png_uint_32 row_width=row_info->width; |
4393 |
4390 |
4394 png_debug(1, "in png_do_expand"); |
4391 png_debug(1, "in png_do_expand"); |
4395 |
4392 |
4396 { |
4393 if (row_info->color_type == PNG_COLOR_TYPE_GRAY) |
4397 if (row_info->color_type == PNG_COLOR_TYPE_GRAY) |
4394 { |
4398 { |
4395 unsigned int gray = trans_color != NULL ? trans_color->gray : 0; |
4399 unsigned int gray = trans_color != NULL ? trans_color->gray : 0; |
4396 |
4400 |
4397 if (row_info->bit_depth < 8) |
4401 if (row_info->bit_depth < 8) |
4398 { |
4402 { |
4399 switch (row_info->bit_depth) |
4403 switch (row_info->bit_depth) |
4400 { |
4404 { |
4401 case 1: |
4405 case 1: |
4402 { |
4406 { |
4403 gray = (gray & 0x01) * 0xff; |
4407 gray = (gray & 0x01) * 0xff; |
4404 sp = row + (size_t)((row_width - 1) >> 3); |
4408 sp = row + (png_size_t)((row_width - 1) >> 3); |
4405 dp = row + (size_t)row_width - 1; |
4409 dp = row + (png_size_t)row_width - 1; |
4406 shift = 7 - (int)((row_width + 7) & 0x07); |
4410 shift = 7 - (int)((row_width + 7) & 0x07); |
4407 for (i = 0; i < row_width; i++) |
4411 for (i = 0; i < row_width; i++) |
4408 { |
|
4409 if ((*sp >> shift) & 0x01) |
|
4410 *dp = 0xff; |
|
4411 |
|
4412 else |
|
4413 *dp = 0; |
|
4414 |
|
4415 if (shift == 7) |
4412 { |
4416 { |
4413 if ((*sp >> shift) & 0x01) |
4417 shift = 0; |
4414 *dp = 0xff; |
4418 sp--; |
4415 |
|
4416 else |
|
4417 *dp = 0; |
|
4418 |
|
4419 if (shift == 7) |
|
4420 { |
|
4421 shift = 0; |
|
4422 sp--; |
|
4423 } |
|
4424 |
|
4425 else |
|
4426 shift++; |
|
4427 |
|
4428 dp--; |
|
4429 } |
4419 } |
4430 break; |
4420 |
4431 } |
4421 else |
4432 |
4422 shift++; |
4433 case 2: |
4423 |
4434 { |
4424 dp--; |
4435 gray = (gray & 0x03) * 0x55; |
4425 } |
4436 sp = row + (png_size_t)((row_width - 1) >> 2); |
4426 break; |
4437 dp = row + (png_size_t)row_width - 1; |
4427 } |
4438 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); |
4428 |
4439 for (i = 0; i < row_width; i++) |
4429 case 2: |
|
4430 { |
|
4431 gray = (gray & 0x03) * 0x55; |
|
4432 sp = row + (size_t)((row_width - 1) >> 2); |
|
4433 dp = row + (size_t)row_width - 1; |
|
4434 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); |
|
4435 for (i = 0; i < row_width; i++) |
|
4436 { |
|
4437 value = (*sp >> shift) & 0x03; |
|
4438 *dp = (png_byte)(value | (value << 2) | (value << 4) | |
|
4439 (value << 6)); |
|
4440 if (shift == 6) |
4440 { |
4441 { |
4441 value = (*sp >> shift) & 0x03; |
4442 shift = 0; |
4442 *dp = (png_byte)(value | (value << 2) | (value << 4) | |
4443 sp--; |
4443 (value << 6)); |
|
4444 if (shift == 6) |
|
4445 { |
|
4446 shift = 0; |
|
4447 sp--; |
|
4448 } |
|
4449 |
|
4450 else |
|
4451 shift += 2; |
|
4452 |
|
4453 dp--; |
|
4454 } |
4444 } |
4455 break; |
4445 |
4456 } |
4446 else |
4457 |
4447 shift += 2; |
4458 case 4: |
4448 |
4459 { |
4449 dp--; |
4460 gray = (gray & 0x0f) * 0x11; |
4450 } |
4461 sp = row + (png_size_t)((row_width - 1) >> 1); |
4451 break; |
4462 dp = row + (png_size_t)row_width - 1; |
4452 } |
4463 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); |
4453 |
4464 for (i = 0; i < row_width; i++) |
4454 case 4: |
|
4455 { |
|
4456 gray = (gray & 0x0f) * 0x11; |
|
4457 sp = row + (size_t)((row_width - 1) >> 1); |
|
4458 dp = row + (size_t)row_width - 1; |
|
4459 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); |
|
4460 for (i = 0; i < row_width; i++) |
|
4461 { |
|
4462 value = (*sp >> shift) & 0x0f; |
|
4463 *dp = (png_byte)(value | (value << 4)); |
|
4464 if (shift == 4) |
4465 { |
4465 { |
4466 value = (*sp >> shift) & 0x0f; |
4466 shift = 0; |
4467 *dp = (png_byte)(value | (value << 4)); |
4467 sp--; |
4468 if (shift == 4) |
|
4469 { |
|
4470 shift = 0; |
|
4471 sp--; |
|
4472 } |
|
4473 |
|
4474 else |
|
4475 shift = 4; |
|
4476 |
|
4477 dp--; |
|
4478 } |
4468 } |
4479 break; |
|
4480 } |
|
4481 |
|
4482 default: |
|
4483 break; |
|
4484 } |
|
4485 |
|
4486 row_info->bit_depth = 8; |
|
4487 row_info->pixel_depth = 8; |
|
4488 row_info->rowbytes = row_width; |
|
4489 } |
|
4490 |
|
4491 if (trans_color != NULL) |
|
4492 { |
|
4493 if (row_info->bit_depth == 8) |
|
4494 { |
|
4495 gray = gray & 0xff; |
|
4496 sp = row + (png_size_t)row_width - 1; |
|
4497 dp = row + ((png_size_t)row_width << 1) - 1; |
|
4498 |
|
4499 for (i = 0; i < row_width; i++) |
|
4500 { |
|
4501 if ((*sp & 0xffU) == gray) |
|
4502 *dp-- = 0; |
|
4503 |
4469 |
4504 else |
4470 else |
4505 *dp-- = 0xff; |
4471 shift = 4; |
4506 |
4472 |
4507 *dp-- = *sp--; |
4473 dp--; |
4508 } |
4474 } |
4509 } |
4475 break; |
4510 |
4476 } |
4511 else if (row_info->bit_depth == 16) |
4477 |
4512 { |
4478 default: |
4513 unsigned int gray_high = (gray >> 8) & 0xff; |
4479 break; |
4514 unsigned int gray_low = gray & 0xff; |
4480 } |
4515 sp = row + row_info->rowbytes - 1; |
4481 |
4516 dp = row + (row_info->rowbytes << 1) - 1; |
4482 row_info->bit_depth = 8; |
4517 for (i = 0; i < row_width; i++) |
4483 row_info->pixel_depth = 8; |
4518 { |
4484 row_info->rowbytes = row_width; |
4519 if ((*(sp - 1) & 0xffU) == gray_high && |
4485 } |
4520 (*(sp) & 0xffU) == gray_low) |
4486 |
4521 { |
4487 if (trans_color != NULL) |
4522 *dp-- = 0; |
|
4523 *dp-- = 0; |
|
4524 } |
|
4525 |
|
4526 else |
|
4527 { |
|
4528 *dp-- = 0xff; |
|
4529 *dp-- = 0xff; |
|
4530 } |
|
4531 |
|
4532 *dp-- = *sp--; |
|
4533 *dp-- = *sp--; |
|
4534 } |
|
4535 } |
|
4536 |
|
4537 row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; |
|
4538 row_info->channels = 2; |
|
4539 row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1); |
|
4540 row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, |
|
4541 row_width); |
|
4542 } |
|
4543 } |
|
4544 else if (row_info->color_type == PNG_COLOR_TYPE_RGB && |
|
4545 trans_color != NULL) |
|
4546 { |
4488 { |
4547 if (row_info->bit_depth == 8) |
4489 if (row_info->bit_depth == 8) |
4548 { |
4490 { |
4549 png_byte red = (png_byte)(trans_color->red & 0xff); |
4491 gray = gray & 0xff; |
4550 png_byte green = (png_byte)(trans_color->green & 0xff); |
4492 sp = row + (size_t)row_width - 1; |
4551 png_byte blue = (png_byte)(trans_color->blue & 0xff); |
4493 dp = row + ((size_t)row_width << 1) - 1; |
4552 sp = row + (png_size_t)row_info->rowbytes - 1; |
4494 |
4553 dp = row + ((png_size_t)row_width << 2) - 1; |
|
4554 for (i = 0; i < row_width; i++) |
4495 for (i = 0; i < row_width; i++) |
4555 { |
4496 { |
4556 if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue) |
4497 if ((*sp & 0xffU) == gray) |
4557 *dp-- = 0; |
4498 *dp-- = 0; |
4558 |
4499 |
4559 else |
4500 else |
4560 *dp-- = 0xff; |
4501 *dp-- = 0xff; |
4561 |
4502 |
4562 *dp-- = *sp--; |
4503 *dp-- = *sp--; |
|
4504 } |
|
4505 } |
|
4506 |
|
4507 else if (row_info->bit_depth == 16) |
|
4508 { |
|
4509 unsigned int gray_high = (gray >> 8) & 0xff; |
|
4510 unsigned int gray_low = gray & 0xff; |
|
4511 sp = row + row_info->rowbytes - 1; |
|
4512 dp = row + (row_info->rowbytes << 1) - 1; |
|
4513 for (i = 0; i < row_width; i++) |
|
4514 { |
|
4515 if ((*(sp - 1) & 0xffU) == gray_high && |
|
4516 (*(sp) & 0xffU) == gray_low) |
|
4517 { |
|
4518 *dp-- = 0; |
|
4519 *dp-- = 0; |
|
4520 } |
|
4521 |
|
4522 else |
|
4523 { |
|
4524 *dp-- = 0xff; |
|
4525 *dp-- = 0xff; |
|
4526 } |
|
4527 |
4563 *dp-- = *sp--; |
4528 *dp-- = *sp--; |
4564 *dp-- = *sp--; |
4529 *dp-- = *sp--; |
4565 } |
4530 } |
4566 } |
4531 } |
4567 else if (row_info->bit_depth == 16) |
4532 |
4568 { |
4533 row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; |
4569 png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff); |
4534 row_info->channels = 2; |
4570 png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff); |
4535 row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1); |
4571 png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff); |
4536 row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, |
4572 png_byte red_low = (png_byte)(trans_color->red & 0xff); |
4537 row_width); |
4573 png_byte green_low = (png_byte)(trans_color->green & 0xff); |
4538 } |
4574 png_byte blue_low = (png_byte)(trans_color->blue & 0xff); |
4539 } |
4575 sp = row + row_info->rowbytes - 1; |
4540 else if (row_info->color_type == PNG_COLOR_TYPE_RGB && |
4576 dp = row + ((png_size_t)row_width << 3) - 1; |
4541 trans_color != NULL) |
4577 for (i = 0; i < row_width; i++) |
4542 { |
4578 { |
4543 if (row_info->bit_depth == 8) |
4579 if (*(sp - 5) == red_high && |
4544 { |
4580 *(sp - 4) == red_low && |
4545 png_byte red = (png_byte)(trans_color->red & 0xff); |
4581 *(sp - 3) == green_high && |
4546 png_byte green = (png_byte)(trans_color->green & 0xff); |
4582 *(sp - 2) == green_low && |
4547 png_byte blue = (png_byte)(trans_color->blue & 0xff); |
4583 *(sp - 1) == blue_high && |
4548 sp = row + (size_t)row_info->rowbytes - 1; |
4584 *(sp ) == blue_low) |
4549 dp = row + ((size_t)row_width << 2) - 1; |
4585 { |
4550 for (i = 0; i < row_width; i++) |
4586 *dp-- = 0; |
4551 { |
4587 *dp-- = 0; |
4552 if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue) |
4588 } |
4553 *dp-- = 0; |
4589 |
4554 |
4590 else |
4555 else |
4591 { |
4556 *dp-- = 0xff; |
4592 *dp-- = 0xff; |
4557 |
4593 *dp-- = 0xff; |
4558 *dp-- = *sp--; |
4594 } |
4559 *dp-- = *sp--; |
4595 |
4560 *dp-- = *sp--; |
4596 *dp-- = *sp--; |
4561 } |
4597 *dp-- = *sp--; |
4562 } |
4598 *dp-- = *sp--; |
4563 else if (row_info->bit_depth == 16) |
4599 *dp-- = *sp--; |
4564 { |
4600 *dp-- = *sp--; |
4565 png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff); |
4601 *dp-- = *sp--; |
4566 png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff); |
4602 } |
4567 png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff); |
4603 } |
4568 png_byte red_low = (png_byte)(trans_color->red & 0xff); |
4604 row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; |
4569 png_byte green_low = (png_byte)(trans_color->green & 0xff); |
4605 row_info->channels = 4; |
4570 png_byte blue_low = (png_byte)(trans_color->blue & 0xff); |
4606 row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2); |
4571 sp = row + row_info->rowbytes - 1; |
4607 row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); |
4572 dp = row + ((size_t)row_width << 3) - 1; |
4608 } |
4573 for (i = 0; i < row_width; i++) |
|
4574 { |
|
4575 if (*(sp - 5) == red_high && |
|
4576 *(sp - 4) == red_low && |
|
4577 *(sp - 3) == green_high && |
|
4578 *(sp - 2) == green_low && |
|
4579 *(sp - 1) == blue_high && |
|
4580 *(sp ) == blue_low) |
|
4581 { |
|
4582 *dp-- = 0; |
|
4583 *dp-- = 0; |
|
4584 } |
|
4585 |
|
4586 else |
|
4587 { |
|
4588 *dp-- = 0xff; |
|
4589 *dp-- = 0xff; |
|
4590 } |
|
4591 |
|
4592 *dp-- = *sp--; |
|
4593 *dp-- = *sp--; |
|
4594 *dp-- = *sp--; |
|
4595 *dp-- = *sp--; |
|
4596 *dp-- = *sp--; |
|
4597 *dp-- = *sp--; |
|
4598 } |
|
4599 } |
|
4600 row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; |
|
4601 row_info->channels = 4; |
|
4602 row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2); |
|
4603 row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); |
4609 } |
4604 } |
4610 } |
4605 } |
4611 #endif |
4606 #endif |
4612 |
4607 |
4613 #ifdef PNG_READ_EXPAND_16_SUPPORTED |
4608 #ifdef PNG_READ_EXPAND_16_SUPPORTED |