equal
deleted
inserted
replaced
292 |
292 |
293 switch (src->format.pixelFormat) |
293 switch (src->format.pixelFormat) |
294 { |
294 { |
295 case OWF_IMAGE_ARGB8888: |
295 case OWF_IMAGE_ARGB8888: |
296 { |
296 { |
|
297 #ifdef USE_FLOAT_PIXEL |
297 OWFuint32* srcPtr = (OWFuint32*) srcLinePtr; |
298 OWFuint32* srcPtr = (OWFuint32*) srcLinePtr; |
298 |
299 |
299 while (count > 0) |
300 while (count > 0) |
300 { |
301 { |
301 dstPtr->color.alpha = (OWFsubpixel) |
302 dstPtr->color.alpha = (OWFsubpixel) |
308 OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE; |
309 OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE; |
309 dstPtr ++; |
310 dstPtr ++; |
310 srcPtr ++; |
311 srcPtr ++; |
311 count--; |
312 count--; |
312 } |
313 } |
|
314 #else |
|
315 memcpy(dstLinePtr, srcLinePtr, src->stride); |
|
316 #endif |
313 break; |
317 break; |
314 } |
318 } |
315 |
319 |
316 case OWF_IMAGE_XRGB8888: |
320 case OWF_IMAGE_XRGB8888: |
317 { |
321 { |
318 OWFuint32* srcPtr = (OWFuint32*) srcLinePtr; |
322 OWFuint32* srcPtr = (OWFuint32*) srcLinePtr; |
319 |
323 |
320 while (count > 0) |
324 while (count > 0) |
321 { |
325 { |
|
326 #ifdef USE_FLOAT_PIXEL |
322 dstPtr->color.alpha = OWF_FULLY_OPAQUE; |
327 dstPtr->color.alpha = OWF_FULLY_OPAQUE; |
323 dstPtr->color.red = (OWFsubpixel) |
328 dstPtr->color.red = (OWFsubpixel) |
324 OWF_RED_MAX_VALUE * ((*srcPtr & ARGB8888_RED_MASK) >> ARGB8888_RED_SHIFT) / OWF_BYTE_MAX_VALUE; |
329 OWF_RED_MAX_VALUE * ((*srcPtr & ARGB8888_RED_MASK) >> ARGB8888_RED_SHIFT) / OWF_BYTE_MAX_VALUE; |
325 dstPtr->color.green = (OWFsubpixel) |
330 dstPtr->color.green = (OWFsubpixel) |
326 OWF_GREEN_MAX_VALUE * ((*srcPtr & ARGB8888_GREEN_MASK) >> ARGB8888_GREEN_SHIFT) / OWF_BYTE_MAX_VALUE; |
331 OWF_GREEN_MAX_VALUE * ((*srcPtr & ARGB8888_GREEN_MASK) >> ARGB8888_GREEN_SHIFT) / OWF_BYTE_MAX_VALUE; |
327 dstPtr->color.blue = (OWFsubpixel) |
332 dstPtr->color.blue = (OWFsubpixel) |
328 OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE; |
333 OWF_BLUE_MAX_VALUE * ((*srcPtr & ARGB8888_BLUE_MASK) >> ARGB8888_BLUE_SHIFT) / OWF_BYTE_MAX_VALUE; |
|
334 #else |
|
335 *(OWFuint32*)dstPtr = *srcPtr | ARGB8888_ALPHA_MASK; |
|
336 #endif |
329 dstPtr ++; |
337 dstPtr ++; |
330 srcPtr ++; |
338 srcPtr ++; |
331 count--; |
339 count--; |
332 } |
340 } |
333 break; |
341 break; |
448 OWF_Image_DestinationFormatConversion(OWF_IMAGE* dst, OWF_IMAGE* src) |
456 OWF_Image_DestinationFormatConversion(OWF_IMAGE* dst, OWF_IMAGE* src) |
449 { |
457 { |
450 OWFint countY; |
458 OWFint countY; |
451 OWFuint32* dstPtr; |
459 OWFuint32* dstPtr; |
452 OWFpixel* srcPtr; |
460 OWFpixel* srcPtr; |
|
461 OWFuint8* destination; |
453 |
462 |
454 OWF_ASSERT(dst != 0 && dst->data != NULL); |
463 OWF_ASSERT(dst != 0 && dst->data != NULL); |
455 OWF_ASSERT(src != 0 && src->data != NULL); |
464 OWF_ASSERT(src != 0 && src->data != NULL); |
456 OWF_ASSERT(src->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL); |
465 OWF_ASSERT(src->format.pixelFormat==OWF_IMAGE_ARGB_INTERNAL); |
457 |
466 |
476 else if (!dst->format.premultiplied && src->format.premultiplied) |
485 else if (!dst->format.premultiplied && src->format.premultiplied) |
477 { |
486 { |
478 OWF_Image_UnpremultiplyAlpha(src); |
487 OWF_Image_UnpremultiplyAlpha(src); |
479 } |
488 } |
480 |
489 |
|
490 destination = (OWFuint8*) dst->data; |
481 for (countY = 0; countY < src->height; countY++) |
491 for (countY = 0; countY < src->height; countY++) |
482 { |
492 { |
483 OWFuint8* destination = (OWFuint8*) dst->data; |
|
484 destination += countY*dst->stride; |
|
485 dstPtr = (OWFuint32*) destination; |
493 dstPtr = (OWFuint32*) destination; |
486 |
494 destination += dst->stride; |
|
495 |
487 switch (dst->format.pixelFormat) |
496 switch (dst->format.pixelFormat) |
488 { |
497 { |
489 case OWF_IMAGE_ARGB8888: |
498 case OWF_IMAGE_ARGB8888: |
490 { |
499 { |
|
500 #ifdef USE_FLOAT_PIXEL |
491 OWFint countX; |
501 OWFint countX; |
492 OWFuint32 dstPixel = 0; |
502 OWFuint32 dstPixel = 0; |
493 |
503 |
494 for (countX = 0; countX < src->width; countX++) |
504 for (countX = 0; countX < src->width; countX++) |
495 { |
505 { |
503 ARGB8888_BLUE_SHIFT); |
513 ARGB8888_BLUE_SHIFT); |
504 *dstPtr = dstPixel; |
514 *dstPtr = dstPixel; |
505 dstPtr ++; |
515 dstPtr ++; |
506 srcPtr ++; |
516 srcPtr ++; |
507 } |
517 } |
|
518 #else |
|
519 memcpy(dstPtr, srcPtr, src->stride); |
|
520 srcPtr = (OWFpixel*)((OWFuint8*)srcPtr + src->stride); |
|
521 #endif |
508 break; |
522 break; |
509 } |
523 } |
510 |
524 |
511 case OWF_IMAGE_XRGB8888: |
525 case OWF_IMAGE_XRGB8888: |
512 { |
526 { |
|
527 #ifdef USE_FLOAT_PIXEL |
513 OWFint countX; |
528 OWFint countX; |
514 OWFuint32 dstPixel = 0; |
529 OWFuint32 dstPixel = 0; |
515 |
530 |
516 for (countX = 0; countX < src->width; countX++) |
531 for (countX = 0; countX < src->width; countX++) |
517 { |
532 { |
524 ARGB8888_BLUE_SHIFT); |
539 ARGB8888_BLUE_SHIFT); |
525 *dstPtr = dstPixel; |
540 *dstPtr = dstPixel; |
526 dstPtr ++; |
541 dstPtr ++; |
527 srcPtr ++; |
542 srcPtr ++; |
528 } |
543 } |
|
544 #else |
|
545 memcpy(dstPtr, srcPtr, src->stride); |
|
546 srcPtr = (OWFpixel*)((OWFuint8*)srcPtr + src->stride); |
|
547 #endif |
529 break; |
548 break; |
530 } |
549 } |
531 |
550 |
532 default: |
551 default: |
533 { |
552 { |
1404 #define BLENDER_INNER_LOOP_END \ |
1423 #define BLENDER_INNER_LOOP_END \ |
1405 DA = blend->destinationFullyOpaque ? OWF_FULLY_OPAQUE : DA; \ |
1424 DA = blend->destinationFullyOpaque ? OWF_FULLY_OPAQUE : DA; \ |
1406 } /* end tsColor check */ \ |
1425 } /* end tsColor check */ \ |
1407 srcPtr ++; \ |
1426 srcPtr ++; \ |
1408 dstPtr ++; \ |
1427 dstPtr ++; \ |
|
1428 --colCount; \ |
|
1429 } \ |
|
1430 srcPtr += srcLineDelta; \ |
|
1431 dstPtr += dstLineDelta; \ |
|
1432 --rowCount; \ |
|
1433 } |
|
1434 |
|
1435 #define BLENDER_INNER_LOOP_END_WITH_MASK \ |
|
1436 DA = blend->destinationFullyOpaque ? OWF_FULLY_OPAQUE : DA; \ |
|
1437 } /* end tsColor check */ \ |
|
1438 srcPtr ++; \ |
|
1439 dstPtr ++; \ |
1409 maskPtr++; \ |
1440 maskPtr++; \ |
1410 --colCount; \ |
1441 --colCount; \ |
1411 } \ |
1442 } \ |
1412 srcPtr += srcLineDelta; \ |
1443 srcPtr += srcLineDelta; \ |
1413 dstPtr += dstLineDelta; \ |
1444 dstPtr += dstLineDelta; \ |
1536 maskLineDelta = 0; |
1567 maskLineDelta = 0; |
1537 } |
1568 } |
1538 srcLineDelta = src->width - srect.width; |
1569 srcLineDelta = src->width - srect.width; |
1539 dstLineDelta = dst->width - drect.width; |
1570 dstLineDelta = dst->width - drect.width; |
1540 |
1571 |
|
1572 if ((transparency & OWF_TRANSPARENCY_GLOBAL_ALPHA) && (GA > (OWF_ALPHA_MAX_VALUE - OWF_ALPHA_MIN_STEP_VALUE))) |
|
1573 { |
|
1574 /* Fully opaque, so ignore global alpha */ |
|
1575 transparency &= ~OWF_TRANSPARENCY_GLOBAL_ALPHA; |
|
1576 } |
1541 /* inner loops */ |
1577 /* inner loops */ |
1542 switch (transparency) |
1578 switch (transparency) |
1543 { |
1579 { |
1544 case OWF_TRANSPARENCY_NONE: |
1580 case OWF_TRANSPARENCY_NONE: |
1545 { |
1581 { |
|
1582 #ifdef SLOW_CODE |
1546 /* |
1583 /* |
1547 rgb = src.rgb |
1584 rgb = src.rgb |
1548 alpha = 1 |
1585 alpha = 1 |
1549 */ |
1586 */ |
1550 BLENDER_INNER_LOOP_BEGIN; |
1587 BLENDER_INNER_LOOP_BEGIN; |
1551 DR = SR; |
1588 DR = SR; |
1552 DG = SG; |
1589 DG = SG; |
1553 DB = SB; |
1590 DB = SB; |
1554 DA = OWF_FULLY_OPAQUE; |
1591 DA = OWF_FULLY_OPAQUE; |
1555 BLENDER_INNER_LOOP_END; |
1592 BLENDER_INNER_LOOP_END; |
|
1593 #else |
|
1594 memcpy(dstPtr, srcPtr, drect.height*drect.width*4); |
|
1595 #endif |
1556 break; |
1596 break; |
1557 } |
1597 } |
1558 |
1598 |
1559 case OWF_TRANSPARENCY_GLOBAL_ALPHA: |
1599 case OWF_TRANSPARENCY_GLOBAL_ALPHA: |
1560 { |
1600 { |
1580 /* |
1620 /* |
1581 rgb = src.rgb + dst.rgb * (1 - src.alpha) |
1621 rgb = src.rgb + dst.rgb * (1 - src.alpha) |
1582 alpha = src.alpha + dst.alpha * (1 - src.alpha) |
1622 alpha = src.alpha + dst.alpha * (1 - src.alpha) |
1583 */ |
1623 */ |
1584 BLENDER_INNER_LOOP_BEGIN; |
1624 BLENDER_INNER_LOOP_BEGIN; |
1585 DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; |
1625 if (SA > (OWF_ALPHA_MAX_VALUE - OWF_ALPHA_MIN_STEP_VALUE)) |
1586 DG = SG + (DG * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; |
1626 { |
1587 DB = SB + (DB * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; |
1627 /* Fully opaque source pixel */ |
1588 DA = SA + (DA * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; |
1628 DR = SR; |
|
1629 DG = SG; |
|
1630 DB = SB; |
|
1631 DA = OWF_FULLY_OPAQUE; |
|
1632 } |
|
1633 else |
|
1634 { |
|
1635 if (SA >= OWF_ALPHA_MIN_STEP_VALUE) |
|
1636 { |
|
1637 /* Not fully transparent source pixel */ |
|
1638 /* |
|
1639 * DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) / OWF_ALPHA_MAX_VALUE; |
|
1640 */ |
|
1641 DR = SR + (DR * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8; |
|
1642 DG = SG + (DG * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8; |
|
1643 DB = SB + (DB * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8; |
|
1644 DA = SA + (DA * (OWF_FULLY_OPAQUE - SA) + OWF_BLEND_ROUNDING_VALUE) >> 8; |
|
1645 } |
|
1646 } |
1589 BLENDER_INNER_LOOP_END; |
1647 BLENDER_INNER_LOOP_END; |
1590 break; |
1648 break; |
1591 } |
1649 } |
1592 |
1650 |
1593 case OWF_TRANSPARENCY_MASK: |
1651 case OWF_TRANSPARENCY_MASK: |
1603 OWF_ALPHA_MAX_VALUE; |
1661 OWF_ALPHA_MAX_VALUE; |
1604 DB = (SB * MA + DB * (OWF_FULLY_OPAQUE - MA) + OWF_BLEND_ROUNDING_VALUE) / |
1662 DB = (SB * MA + DB * (OWF_FULLY_OPAQUE - MA) + OWF_BLEND_ROUNDING_VALUE) / |
1605 OWF_ALPHA_MAX_VALUE; |
1663 OWF_ALPHA_MAX_VALUE; |
1606 DA = MA + (DA * (OWF_FULLY_OPAQUE - MA) + OWF_BLEND_ROUNDING_VALUE) / |
1664 DA = MA + (DA * (OWF_FULLY_OPAQUE - MA) + OWF_BLEND_ROUNDING_VALUE) / |
1607 OWF_ALPHA_MAX_VALUE; |
1665 OWF_ALPHA_MAX_VALUE; |
1608 BLENDER_INNER_LOOP_END; |
1666 BLENDER_INNER_LOOP_END_WITH_MASK; |
1609 break; |
1667 break; |
1610 } |
1668 } |
1611 |
1669 |
1612 case OWF_TRANSPARENCY_GLOBAL_ALPHA | OWF_TRANSPARENCY_SOURCE_ALPHA: |
1670 case OWF_TRANSPARENCY_GLOBAL_ALPHA | OWF_TRANSPARENCY_SOURCE_ALPHA: |
1613 { |
1671 { |
1649 OWF_ALPHA_MAX_VALUE; |
1707 OWF_ALPHA_MAX_VALUE; |
1650 DA = MAEA + (DA * (OWF_FULLY_OPAQUE - MAEA) + OWF_BLEND_ROUNDING_VALUE) / |
1708 DA = MAEA + (DA * (OWF_FULLY_OPAQUE - MAEA) + OWF_BLEND_ROUNDING_VALUE) / |
1651 OWF_ALPHA_MAX_VALUE; |
1709 OWF_ALPHA_MAX_VALUE; |
1652 //No need to check with OWF_ALPHA_MIN_VALUE as it is zero |
1710 //No need to check with OWF_ALPHA_MIN_VALUE as it is zero |
1653 OWF_ASSERT(GA <= OWF_ALPHA_MAX_VALUE); |
1711 OWF_ASSERT(GA <= OWF_ALPHA_MAX_VALUE); |
1654 BLENDER_INNER_LOOP_END; |
1712 BLENDER_INNER_LOOP_END_WITH_MASK; |
1655 break; |
1713 break; |
1656 } |
1714 } |
1657 |
1715 |
1658 default: |
1716 default: |
1659 { |
1717 { |