| Index: core/src/fxge/dib/fx_dib_composite.cpp
 | 
| diff --git a/core/src/fxge/dib/fx_dib_composite.cpp b/core/src/fxge/dib/fx_dib_composite.cpp
 | 
| index e89fdcec990f80ea61e42026f17eb9f81de3114b..e284f62050eb98f73281368eeac5303800986939 100644
 | 
| --- a/core/src/fxge/dib/fx_dib_composite.cpp
 | 
| +++ b/core/src/fxge/dib/fx_dib_composite.cpp
 | 
| @@ -737,8 +737,8 @@ void _CompositeRow_Argb2Argb(uint8_t* dest_scan,
 | 
|                               const uint8_t* src_alpha_scan) {
 | 
|    int blended_colors[3];
 | 
|    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
 | 
| -  if (dest_alpha_scan == NULL) {
 | 
| -    if (src_alpha_scan == NULL) {
 | 
| +  if (!dest_alpha_scan) {
 | 
| +    if (!src_alpha_scan) {
 | 
|        uint8_t back_alpha = 0;
 | 
|        for (int col = 0; col < pixel_count; col++) {
 | 
|          back_alpha = dest_scan[3];
 | 
| @@ -755,10 +755,10 @@ void _CompositeRow_Argb2Argb(uint8_t* dest_scan,
 | 
|            continue;
 | 
|          }
 | 
|          uint8_t src_alpha;
 | 
| -        if (clip_scan == NULL) {
 | 
| -          src_alpha = src_scan[3];
 | 
| -        } else {
 | 
| +        if (clip_scan) {
 | 
|            src_alpha = clip_scan[col] * src_scan[3] / 255;
 | 
| +        } else {
 | 
| +          src_alpha = src_scan[3];
 | 
|          }
 | 
|          if (src_alpha == 0) {
 | 
|            dest_scan += 4;
 | 
| @@ -807,10 +807,10 @@ void _CompositeRow_Argb2Argb(uint8_t* dest_scan,
 | 
|            continue;
 | 
|          }
 | 
|          uint8_t src_alpha;
 | 
| -        if (clip_scan == NULL) {
 | 
| -          src_alpha = *src_alpha_scan++;
 | 
| -        } else {
 | 
| +        if (clip_scan) {
 | 
|            src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
 | 
| +        } else {
 | 
| +          src_alpha = *src_alpha_scan++;
 | 
|          }
 | 
|          if (src_alpha == 0) {
 | 
|            dest_scan += 4;
 | 
| @@ -862,10 +862,10 @@ void _CompositeRow_Argb2Argb(uint8_t* dest_scan,
 | 
|            continue;
 | 
|          }
 | 
|          uint8_t src_alpha;
 | 
| -        if (clip_scan == NULL) {
 | 
| -          src_alpha = *src_alpha_scan++;
 | 
| -        } else {
 | 
| +        if (clip_scan) {
 | 
|            src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
 | 
| +        } else {
 | 
| +          src_alpha = *src_alpha_scan++;
 | 
|          }
 | 
|          if (src_alpha == 0) {
 | 
|            dest_scan += 3;
 | 
| @@ -915,10 +915,10 @@ void _CompositeRow_Argb2Argb(uint8_t* dest_scan,
 | 
|            continue;
 | 
|          }
 | 
|          uint8_t src_alpha;
 | 
| -        if (clip_scan == NULL) {
 | 
| -          src_alpha = src_scan[3];
 | 
| -        } else {
 | 
| +        if (clip_scan) {
 | 
|            src_alpha = clip_scan[col] * src_scan[3] / 255;
 | 
| +        } else {
 | 
| +          src_alpha = src_scan[3];
 | 
|          }
 | 
|          if (src_alpha == 0) {
 | 
|            dest_scan += 3;
 | 
| @@ -960,21 +960,18 @@ void _CompositeRow_Rgb2Argb_Blend_NoClip(uint8_t* dest_scan,
 | 
|    int blended_colors[3];
 | 
|    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
 | 
|    int src_gap = src_Bpp - 3;
 | 
| -  if (dest_alpha_scan == NULL) {
 | 
| +  if (dest_alpha_scan) {
 | 
|      for (int col = 0; col < width; col++) {
 | 
| -      uint8_t back_alpha = dest_scan[3];
 | 
| +      uint8_t back_alpha = *dest_alpha_scan;
 | 
|        if (back_alpha == 0) {
 | 
| -        if (src_Bpp == 4) {
 | 
| -          FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
 | 
| -        } else {
 | 
| -          FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1],
 | 
| -                                               src_scan[0]));
 | 
| -        }
 | 
| -        dest_scan += 4;
 | 
| -        src_scan += src_Bpp;
 | 
| +        *dest_scan++ = *src_scan++;
 | 
| +        *dest_scan++ = *src_scan++;
 | 
| +        *dest_scan++ = *src_scan++;
 | 
| +        *dest_alpha_scan++ = 0xff;
 | 
| +        src_scan += src_gap;
 | 
|          continue;
 | 
|        }
 | 
| -      dest_scan[3] = 0xff;
 | 
| +      *dest_alpha_scan++ = 0xff;
 | 
|        if (bNonseparableBlend) {
 | 
|          _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
 | 
|        }
 | 
| @@ -987,21 +984,23 @@ void _CompositeRow_Rgb2Argb_Blend_NoClip(uint8_t* dest_scan,
 | 
|          dest_scan++;
 | 
|          src_scan++;
 | 
|        }
 | 
| -      dest_scan++;
 | 
|        src_scan += src_gap;
 | 
|      }
 | 
|    } else {
 | 
|      for (int col = 0; col < width; col++) {
 | 
| -      uint8_t back_alpha = *dest_alpha_scan;
 | 
| +      uint8_t back_alpha = dest_scan[3];
 | 
|        if (back_alpha == 0) {
 | 
| -        *dest_scan++ = *src_scan++;
 | 
| -        *dest_scan++ = *src_scan++;
 | 
| -        *dest_scan++ = *src_scan++;
 | 
| -        *dest_alpha_scan++ = 0xff;
 | 
| -        src_scan += src_gap;
 | 
| +        if (src_Bpp == 4) {
 | 
| +          FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
 | 
| +        } else {
 | 
| +          FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1],
 | 
| +                                               src_scan[0]));
 | 
| +        }
 | 
| +        dest_scan += 4;
 | 
| +        src_scan += src_Bpp;
 | 
|          continue;
 | 
|        }
 | 
| -      *dest_alpha_scan++ = 0xff;
 | 
| +      dest_scan[3] = 0xff;
 | 
|        if (bNonseparableBlend) {
 | 
|          _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
 | 
|        }
 | 
| @@ -1014,6 +1013,7 @@ void _CompositeRow_Rgb2Argb_Blend_NoClip(uint8_t* dest_scan,
 | 
|          dest_scan++;
 | 
|          src_scan++;
 | 
|        }
 | 
| +      dest_scan++;
 | 
|        src_scan += src_gap;
 | 
|      }
 | 
|    }
 | 
| @@ -1028,26 +1028,27 @@ inline void _CompositeRow_Rgb2Argb_Blend_Clip(uint8_t* dest_scan,
 | 
|    int blended_colors[3];
 | 
|    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
 | 
|    int src_gap = src_Bpp - 3;
 | 
| -  if (dest_alpha_scan == NULL) {
 | 
| +  if (dest_alpha_scan) {
 | 
|      for (int col = 0; col < width; col++) {
 | 
|        int src_alpha = *clip_scan++;
 | 
| -      uint8_t back_alpha = dest_scan[3];
 | 
| +      uint8_t back_alpha = *dest_alpha_scan;
 | 
|        if (back_alpha == 0) {
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          src_scan += src_gap;
 | 
| -        dest_scan++;
 | 
| +        dest_alpha_scan++;
 | 
|          continue;
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
| -        dest_scan += 4;
 | 
| +        dest_scan += 3;
 | 
| +        dest_alpha_scan++;
 | 
|          src_scan += src_Bpp;
 | 
|          continue;
 | 
|        }
 | 
|        uint8_t dest_alpha =
 | 
|            back_alpha + src_alpha - back_alpha * src_alpha / 255;
 | 
| -      dest_scan[3] = dest_alpha;
 | 
| +      *dest_alpha_scan++ = dest_alpha;
 | 
|        int alpha_ratio = src_alpha * 255 / dest_alpha;
 | 
|        if (bNonseparableBlend) {
 | 
|          _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
 | 
| @@ -1062,30 +1063,28 @@ inline void _CompositeRow_Rgb2Argb_Blend_Clip(uint8_t* dest_scan,
 | 
|          dest_scan++;
 | 
|          src_scan++;
 | 
|        }
 | 
| -      dest_scan++;
 | 
|        src_scan += src_gap;
 | 
|      }
 | 
|    } else {
 | 
|      for (int col = 0; col < width; col++) {
 | 
|        int src_alpha = *clip_scan++;
 | 
| -      uint8_t back_alpha = *dest_alpha_scan;
 | 
| +      uint8_t back_alpha = dest_scan[3];
 | 
|        if (back_alpha == 0) {
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          src_scan += src_gap;
 | 
| -        dest_alpha_scan++;
 | 
| +        dest_scan++;
 | 
|          continue;
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
| -        dest_scan += 3;
 | 
| -        dest_alpha_scan++;
 | 
| +        dest_scan += 4;
 | 
|          src_scan += src_Bpp;
 | 
|          continue;
 | 
|        }
 | 
|        uint8_t dest_alpha =
 | 
|            back_alpha + src_alpha - back_alpha * src_alpha / 255;
 | 
| -      *dest_alpha_scan++ = dest_alpha;
 | 
| +      dest_scan[3] = dest_alpha;
 | 
|        int alpha_ratio = src_alpha * 255 / dest_alpha;
 | 
|        if (bNonseparableBlend) {
 | 
|          _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
 | 
| @@ -1100,6 +1099,7 @@ inline void _CompositeRow_Rgb2Argb_Blend_Clip(uint8_t* dest_scan,
 | 
|          dest_scan++;
 | 
|          src_scan++;
 | 
|        }
 | 
| +      dest_scan++;
 | 
|        src_scan += src_gap;
 | 
|      }
 | 
|    }
 | 
| @@ -1111,33 +1111,33 @@ inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(uint8_t* dest_scan,
 | 
|                                                  const uint8_t* clip_scan,
 | 
|                                                  uint8_t* dest_alpha_scan) {
 | 
|    int src_gap = src_Bpp - 3;
 | 
| -  if (dest_alpha_scan == NULL) {
 | 
| +  if (dest_alpha_scan) {
 | 
|      for (int col = 0; col < width; col++) {
 | 
|        int src_alpha = clip_scan[col];
 | 
|        if (src_alpha == 255) {
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
| -        *dest_scan++ = 255;
 | 
| +        *dest_alpha_scan++ = 255;
 | 
|          src_scan += src_gap;
 | 
|          continue;
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
| -        dest_scan += 4;
 | 
| +        dest_scan += 3;
 | 
| +        dest_alpha_scan++;
 | 
|          src_scan += src_Bpp;
 | 
|          continue;
 | 
|        }
 | 
| -      int back_alpha = dest_scan[3];
 | 
| +      int back_alpha = *dest_alpha_scan;
 | 
|        uint8_t dest_alpha =
 | 
|            back_alpha + src_alpha - back_alpha * src_alpha / 255;
 | 
| -      dest_scan[3] = dest_alpha;
 | 
| +      *dest_alpha_scan++ = dest_alpha;
 | 
|        int alpha_ratio = src_alpha * 255 / dest_alpha;
 | 
|        for (int color = 0; color < 3; color++) {
 | 
|          *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
 | 
|          dest_scan++;
 | 
|          src_scan++;
 | 
|        }
 | 
| -      dest_scan++;
 | 
|        src_scan += src_gap;
 | 
|      }
 | 
|    } else {
 | 
| @@ -1147,26 +1147,26 @@ inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(uint8_t* dest_scan,
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
| -        *dest_alpha_scan++ = 255;
 | 
| +        *dest_scan++ = 255;
 | 
|          src_scan += src_gap;
 | 
|          continue;
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
| -        dest_scan += 3;
 | 
| -        dest_alpha_scan++;
 | 
| +        dest_scan += 4;
 | 
|          src_scan += src_Bpp;
 | 
|          continue;
 | 
|        }
 | 
| -      int back_alpha = *dest_alpha_scan;
 | 
| +      int back_alpha = dest_scan[3];
 | 
|        uint8_t dest_alpha =
 | 
|            back_alpha + src_alpha - back_alpha * src_alpha / 255;
 | 
| -      *dest_alpha_scan++ = dest_alpha;
 | 
| +      dest_scan[3] = dest_alpha;
 | 
|        int alpha_ratio = src_alpha * 255 / dest_alpha;
 | 
|        for (int color = 0; color < 3; color++) {
 | 
|          *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
 | 
|          dest_scan++;
 | 
|          src_scan++;
 | 
|        }
 | 
| +      dest_scan++;
 | 
|        src_scan += src_gap;
 | 
|      }
 | 
|    }
 | 
| @@ -1176,7 +1176,16 @@ inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(uint8_t* dest_scan,
 | 
|                                                    int width,
 | 
|                                                    int src_Bpp,
 | 
|                                                    uint8_t* dest_alpha_scan) {
 | 
| -  if (dest_alpha_scan == NULL) {
 | 
| +  if (dest_alpha_scan) {
 | 
| +    int src_gap = src_Bpp - 3;
 | 
| +    for (int col = 0; col < width; col++) {
 | 
| +      *dest_scan++ = *src_scan++;
 | 
| +      *dest_scan++ = *src_scan++;
 | 
| +      *dest_scan++ = *src_scan++;
 | 
| +      *dest_alpha_scan++ = 0xff;
 | 
| +      src_scan += src_gap;
 | 
| +    }
 | 
| +  } else {
 | 
|      for (int col = 0; col < width; col++) {
 | 
|        if (src_Bpp == 4) {
 | 
|          FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
 | 
| @@ -1187,15 +1196,6 @@ inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(uint8_t* dest_scan,
 | 
|        dest_scan += 4;
 | 
|        src_scan += src_Bpp;
 | 
|      }
 | 
| -  } else {
 | 
| -    int src_gap = src_Bpp - 3;
 | 
| -    for (int col = 0; col < width; col++) {
 | 
| -      *dest_scan++ = *src_scan++;
 | 
| -      *dest_scan++ = *src_scan++;
 | 
| -      *dest_scan++ = *src_scan++;
 | 
| -      *dest_alpha_scan++ = 0xff;
 | 
| -      src_scan += src_gap;
 | 
| -    }
 | 
|    }
 | 
|  }
 | 
|  inline void _CompositeRow_Argb2Rgb_Blend(uint8_t* dest_scan,
 | 
| @@ -1208,17 +1208,17 @@ inline void _CompositeRow_Argb2Rgb_Blend(uint8_t* dest_scan,
 | 
|    int blended_colors[3];
 | 
|    FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
 | 
|    int dest_gap = dest_Bpp - 3;
 | 
| -  if (src_alpha_scan == NULL) {
 | 
| +  if (src_alpha_scan) {
 | 
|      for (int col = 0; col < width; col++) {
 | 
|        uint8_t src_alpha;
 | 
|        if (clip_scan) {
 | 
| -        src_alpha = src_scan[3] * (*clip_scan++) / 255;
 | 
| +        src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
 | 
|        } else {
 | 
| -        src_alpha = src_scan[3];
 | 
| +        src_alpha = *src_alpha_scan++;
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
|          dest_scan += dest_Bpp;
 | 
| -        src_scan += 4;
 | 
| +        src_scan += 3;
 | 
|          continue;
 | 
|        }
 | 
|        if (bNonseparableBlend) {
 | 
| @@ -1234,19 +1234,18 @@ inline void _CompositeRow_Argb2Rgb_Blend(uint8_t* dest_scan,
 | 
|          src_scan++;
 | 
|        }
 | 
|        dest_scan += dest_gap;
 | 
| -      src_scan++;
 | 
|      }
 | 
|    } else {
 | 
|      for (int col = 0; col < width; col++) {
 | 
|        uint8_t src_alpha;
 | 
|        if (clip_scan) {
 | 
| -        src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
 | 
| +        src_alpha = src_scan[3] * (*clip_scan++) / 255;
 | 
|        } else {
 | 
| -        src_alpha = *src_alpha_scan++;
 | 
| +        src_alpha = src_scan[3];
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
|          dest_scan += dest_Bpp;
 | 
| -        src_scan += 3;
 | 
| +        src_scan += 4;
 | 
|          continue;
 | 
|        }
 | 
|        if (bNonseparableBlend) {
 | 
| @@ -1262,6 +1261,7 @@ inline void _CompositeRow_Argb2Rgb_Blend(uint8_t* dest_scan,
 | 
|          src_scan++;
 | 
|        }
 | 
|        dest_scan += dest_gap;
 | 
| +      src_scan++;
 | 
|      }
 | 
|    }
 | 
|  }
 | 
| @@ -1272,25 +1272,24 @@ inline void _CompositeRow_Argb2Rgb_NoBlend(uint8_t* dest_scan,
 | 
|                                             const uint8_t* clip_scan,
 | 
|                                             const uint8_t* src_alpha_scan) {
 | 
|    int dest_gap = dest_Bpp - 3;
 | 
| -  if (src_alpha_scan == NULL) {
 | 
| +  if (src_alpha_scan) {
 | 
|      for (int col = 0; col < width; col++) {
 | 
|        uint8_t src_alpha;
 | 
|        if (clip_scan) {
 | 
| -        src_alpha = src_scan[3] * (*clip_scan++) / 255;
 | 
| +        src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
 | 
|        } else {
 | 
| -        src_alpha = src_scan[3];
 | 
| +        src_alpha = *src_alpha_scan++;
 | 
|        }
 | 
|        if (src_alpha == 255) {
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          dest_scan += dest_gap;
 | 
| -        src_scan++;
 | 
|          continue;
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
|          dest_scan += dest_Bpp;
 | 
| -        src_scan += 4;
 | 
| +        src_scan += 3;
 | 
|          continue;
 | 
|        }
 | 
|        for (int color = 0; color < 3; color++) {
 | 
| @@ -1299,26 +1298,26 @@ inline void _CompositeRow_Argb2Rgb_NoBlend(uint8_t* dest_scan,
 | 
|          src_scan++;
 | 
|        }
 | 
|        dest_scan += dest_gap;
 | 
| -      src_scan++;
 | 
|      }
 | 
|    } else {
 | 
|      for (int col = 0; col < width; col++) {
 | 
|        uint8_t src_alpha;
 | 
|        if (clip_scan) {
 | 
| -        src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
 | 
| +        src_alpha = src_scan[3] * (*clip_scan++) / 255;
 | 
|        } else {
 | 
| -        src_alpha = *src_alpha_scan++;
 | 
| +        src_alpha = src_scan[3];
 | 
|        }
 | 
|        if (src_alpha == 255) {
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          *dest_scan++ = *src_scan++;
 | 
|          dest_scan += dest_gap;
 | 
| +        src_scan++;
 | 
|          continue;
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
|          dest_scan += dest_Bpp;
 | 
| -        src_scan += 3;
 | 
| +        src_scan += 4;
 | 
|          continue;
 | 
|        }
 | 
|        for (int color = 0; color < 3; color++) {
 | 
| @@ -1327,6 +1326,7 @@ inline void _CompositeRow_Argb2Rgb_NoBlend(uint8_t* dest_scan,
 | 
|          src_scan++;
 | 
|        }
 | 
|        dest_scan += dest_gap;
 | 
| +      src_scan++;
 | 
|      }
 | 
|    }
 | 
|  }
 | 
| @@ -1451,7 +1451,9 @@ void _CompositeRow_Argb2Argb_Transform(uint8_t* dest_scan,
 | 
|    ICodec_IccModule* pIccModule =
 | 
|        CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
 | 
|    if (src_alpha_scan) {
 | 
| -    if (dest_alpha_scan == NULL) {
 | 
| +    if (dest_alpha_scan) {
 | 
| +      pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);
 | 
| +    } else {
 | 
|        for (int col = 0; col < pixel_count; col++) {
 | 
|          pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
 | 
|          dp[3] = *src_alpha_scan++;
 | 
| @@ -1459,18 +1461,9 @@ void _CompositeRow_Argb2Argb_Transform(uint8_t* dest_scan,
 | 
|          dp += 4;
 | 
|        }
 | 
|        src_alpha_scan = NULL;
 | 
| -    } else {
 | 
| -      pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);
 | 
|      }
 | 
|    } else {
 | 
| -    if (dest_alpha_scan == NULL) {
 | 
| -      for (int col = 0; col < pixel_count; col++) {
 | 
| -        pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
 | 
| -        dp[3] = src_scan[3];
 | 
| -        src_scan += 4;
 | 
| -        dp += 4;
 | 
| -      }
 | 
| -    } else {
 | 
| +    if (dest_alpha_scan) {
 | 
|        int blended_colors[3];
 | 
|        FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
 | 
|        for (int col = 0; col < pixel_count; col++) {
 | 
| @@ -1495,10 +1488,10 @@ void _CompositeRow_Argb2Argb_Transform(uint8_t* dest_scan,
 | 
|            continue;
 | 
|          }
 | 
|          uint8_t src_alpha;
 | 
| -        if (clip_scan == NULL) {
 | 
| -          src_alpha = src_scan[3];
 | 
| -        } else {
 | 
| +        if (clip_scan) {
 | 
|            src_alpha = clip_scan[col] * src_scan[3] / 255;
 | 
| +        } else {
 | 
| +          src_alpha = src_scan[3];
 | 
|          }
 | 
|          src_scan += 4;
 | 
|          if (src_alpha == 0) {
 | 
| @@ -1531,6 +1524,12 @@ void _CompositeRow_Argb2Argb_Transform(uint8_t* dest_scan,
 | 
|        }
 | 
|        return;
 | 
|      }
 | 
| +    for (int col = 0; col < pixel_count; col++) {
 | 
| +      pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
 | 
| +      dp[3] = src_scan[3];
 | 
| +      src_scan += 4;
 | 
| +      dp += 4;
 | 
| +    }
 | 
|    }
 | 
|    _CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type,
 | 
|                            clip_scan, dest_alpha_scan, src_alpha_scan);
 | 
| @@ -2007,7 +2006,7 @@ inline void _CompositeRow_8bppPal2Graya(uint8_t* dest_scan,
 | 
|        for (int col = 0; col < pixel_count; col++) {
 | 
|          uint8_t gray = pPalette[*src_scan];
 | 
|          src_scan++;
 | 
| -        if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +        if (!clip_scan || clip_scan[col] == 255) {
 | 
|            *dest_scan++ = gray;
 | 
|            *dest_alpha_scan++ = 255;
 | 
|            continue;
 | 
| @@ -2037,7 +2036,7 @@ inline void _CompositeRow_8bppPal2Graya(uint8_t* dest_scan,
 | 
|      for (int col = 0; col < pixel_count; col++) {
 | 
|        uint8_t gray = pPalette[*src_scan];
 | 
|        src_scan++;
 | 
| -      if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +      if (!clip_scan || clip_scan[col] == 255) {
 | 
|          *dest_scan++ = gray;
 | 
|          *dest_alpha_scan++ = 255;
 | 
|          continue;
 | 
| @@ -2121,7 +2120,7 @@ inline void _CompositeRow_1bppPal2Graya(uint8_t* dest_scan,
 | 
|            (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
 | 
|                ? set_gray
 | 
|                : reset_gray;
 | 
| -      if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +      if (!clip_scan || clip_scan[col] == 255) {
 | 
|          *dest_scan++ = gray;
 | 
|          *dest_alpha_scan++ = 255;
 | 
|          continue;
 | 
| @@ -2153,7 +2152,7 @@ inline void _CompositeRow_1bppPal2Graya(uint8_t* dest_scan,
 | 
|          (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8)))
 | 
|              ? set_gray
 | 
|              : reset_gray;
 | 
| -    if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +    if (!clip_scan || clip_scan[col] == 255) {
 | 
|        *dest_scan++ = gray;
 | 
|        *dest_alpha_scan++ = 255;
 | 
|        continue;
 | 
| @@ -2309,10 +2308,10 @@ inline void _CompositeRow_8bppRgb2Argb_NoBlend(uint8_t* dest_scan,
 | 
|          continue;
 | 
|        }
 | 
|        uint8_t src_alpha;
 | 
| -      if (clip_scan == NULL) {
 | 
| -        src_alpha = *src_alpha_scan++;
 | 
| -      } else {
 | 
| +      if (clip_scan) {
 | 
|          src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
 | 
| +      } else {
 | 
| +        src_alpha = *src_alpha_scan++;
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
|          dest_scan += 4;
 | 
| @@ -2336,7 +2335,7 @@ inline void _CompositeRow_8bppRgb2Argb_NoBlend(uint8_t* dest_scan,
 | 
|        int src_r = FXARGB_R(argb);
 | 
|        int src_g = FXARGB_G(argb);
 | 
|        int src_b = FXARGB_B(argb);
 | 
| -      if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +      if (!clip_scan || clip_scan[col] == 255) {
 | 
|          *dest_scan++ = src_b;
 | 
|          *dest_scan++ = src_g;
 | 
|          *dest_scan++ = src_r;
 | 
| @@ -2394,10 +2393,10 @@ void _CompositeRow_8bppRgb2Rgba_NoBlend(uint8_t* dest_scan,
 | 
|          continue;
 | 
|        }
 | 
|        uint8_t src_alpha;
 | 
| -      if (clip_scan == NULL) {
 | 
| -        src_alpha = *src_alpha_scan++;
 | 
| -      } else {
 | 
| +      if (clip_scan) {
 | 
|          src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
 | 
| +      } else {
 | 
| +        src_alpha = *src_alpha_scan++;
 | 
|        }
 | 
|        if (src_alpha == 0) {
 | 
|          dest_scan += 3;
 | 
| @@ -2421,7 +2420,7 @@ void _CompositeRow_8bppRgb2Rgba_NoBlend(uint8_t* dest_scan,
 | 
|        int src_r = FXARGB_R(argb);
 | 
|        int src_g = FXARGB_G(argb);
 | 
|        int src_b = FXARGB_B(argb);
 | 
| -      if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +      if (!clip_scan || clip_scan[col] == 255) {
 | 
|          *dest_scan++ = src_b;
 | 
|          *dest_scan++ = src_g;
 | 
|          *dest_scan++ = src_r;
 | 
| @@ -2475,7 +2474,7 @@ inline void _CompositeRow_1bppRgb2Argb_NoBlend(uint8_t* dest_scan,
 | 
|        src_g = reset_g;
 | 
|        src_b = reset_b;
 | 
|      }
 | 
| -    if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +    if (!clip_scan || clip_scan[col] == 255) {
 | 
|        *dest_scan++ = src_b;
 | 
|        *dest_scan++ = src_g;
 | 
|        *dest_scan++ = src_r;
 | 
| @@ -2526,7 +2525,7 @@ void _CompositeRow_1bppRgb2Rgba_NoBlend(uint8_t* dest_scan,
 | 
|        src_g = reset_g;
 | 
|        src_b = reset_b;
 | 
|      }
 | 
| -    if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +    if (!clip_scan || clip_scan[col] == 255) {
 | 
|        *dest_scan++ = src_b;
 | 
|        *dest_scan++ = src_g;
 | 
|        *dest_scan++ = src_r;
 | 
| @@ -2823,8 +2822,7 @@ void _CompositeRow_BitMask2Argb(uint8_t* dest_scan,
 | 
|                                  int pixel_count,
 | 
|                                  int blend_type,
 | 
|                                  const uint8_t* clip_scan) {
 | 
| -  if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
 | 
| -      mask_alpha == 255) {
 | 
| +  if (blend_type == FXDIB_BLEND_NORMAL && !clip_scan && mask_alpha == 255) {
 | 
|      FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
 | 
|      for (int col = 0; col < pixel_count; col++) {
 | 
|        if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
 | 
| @@ -2902,8 +2900,7 @@ void _CompositeRow_BitMask2Rgba(uint8_t* dest_scan,
 | 
|                                  int blend_type,
 | 
|                                  const uint8_t* clip_scan,
 | 
|                                  uint8_t* dest_alpha_scan) {
 | 
| -  if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
 | 
| -      mask_alpha == 255) {
 | 
| +  if (blend_type == FXDIB_BLEND_NORMAL && !clip_scan && mask_alpha == 255) {
 | 
|      for (int col = 0; col < pixel_count; col++) {
 | 
|        if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
 | 
|          dest_scan[0] = src_b;
 | 
| @@ -2989,8 +2986,7 @@ void _CompositeRow_BitMask2Rgb(uint8_t* dest_scan,
 | 
|                                 int blend_type,
 | 
|                                 int Bpp,
 | 
|                                 const uint8_t* clip_scan) {
 | 
| -  if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
 | 
| -      mask_alpha == 255) {
 | 
| +  if (blend_type == FXDIB_BLEND_NORMAL && !clip_scan && mask_alpha == 255) {
 | 
|      for (int col = 0; col < pixel_count; col++) {
 | 
|        if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
 | 
|          dest_scan[2] = src_r;
 | 
| @@ -3159,10 +3155,10 @@ void _CompositeRow_Argb2Argb_RgbByteOrder(uint8_t* dest_scan,
 | 
|        continue;
 | 
|      }
 | 
|      uint8_t src_alpha;
 | 
| -    if (clip_scan == NULL) {
 | 
| -      src_alpha = src_scan[3];
 | 
| -    } else {
 | 
| +    if (clip_scan) {
 | 
|        src_alpha = clip_scan[col] * src_scan[3] / 255;
 | 
| +    } else {
 | 
| +      src_alpha = src_scan[3];
 | 
|      }
 | 
|      if (src_alpha == 0) {
 | 
|        dest_scan += 4;
 | 
| @@ -3623,7 +3619,7 @@ inline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(
 | 
|      } else {
 | 
|        src_r = src_g = src_b = *src_scan;
 | 
|      }
 | 
| -    if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +    if (!clip_scan || clip_scan[col] == 255) {
 | 
|        dest_scan[2] = FX_GAMMA(src_b);
 | 
|        dest_scan[1] = FX_GAMMA(src_g);
 | 
|        dest_scan[0] = FX_GAMMA(src_r);
 | 
| @@ -3683,7 +3679,7 @@ inline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(
 | 
|        src_g = reset_g;
 | 
|        src_b = reset_b;
 | 
|      }
 | 
| -    if (clip_scan == NULL || clip_scan[col] == 255) {
 | 
| +    if (!clip_scan || clip_scan[col] == 255) {
 | 
|        dest_scan[2] = FX_GAMMA(src_b);
 | 
|        dest_scan[1] = FX_GAMMA(src_g);
 | 
|        dest_scan[0] = FX_GAMMA(src_r);
 | 
| @@ -3837,8 +3833,7 @@ void _CompositeRow_BitMask2Argb_RgbByteOrder(uint8_t* dest_scan,
 | 
|                                               int pixel_count,
 | 
|                                               int blend_type,
 | 
|                                               const uint8_t* clip_scan) {
 | 
| -  if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
 | 
| -      mask_alpha == 255) {
 | 
| +  if (blend_type == FXDIB_BLEND_NORMAL && !clip_scan && mask_alpha == 255) {
 | 
|      FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
 | 
|      for (int col = 0; col < pixel_count; col++) {
 | 
|        if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
 | 
| @@ -3915,8 +3910,7 @@ void _CompositeRow_BitMask2Rgb_RgbByteOrder(uint8_t* dest_scan,
 | 
|                                              int blend_type,
 | 
|                                              int Bpp,
 | 
|                                              const uint8_t* clip_scan) {
 | 
| -  if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL &&
 | 
| -      mask_alpha == 255) {
 | 
| +  if (blend_type == FXDIB_BLEND_NORMAL && !clip_scan && mask_alpha == 255) {
 | 
|      for (int col = 0; col < pixel_count; col++) {
 | 
|        if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
 | 
|          dest_scan[2] = src_b;
 | 
| @@ -4215,7 +4209,7 @@ FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format,
 | 
|    if (CFX_GEModule::Get()->GetCodecModule()) {
 | 
|      pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
 | 
|    }
 | 
| -  if (pIccModule == NULL) {
 | 
| +  if (!pIccModule) {
 | 
|      pIccTransform = NULL;
 | 
|    }
 | 
|    m_pIccTransform = pIccTransform;
 | 
| @@ -4227,8 +4221,7 @@ FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format,
 | 
|          dest_format, alpha_flag, mask_color, m_MaskAlpha, m_MaskRed,
 | 
|          m_MaskGreen, m_MaskBlue, m_MaskBlack, pIccModule, pIccTransform);
 | 
|    }
 | 
| -  if (pIccTransform == NULL && (~src_format & 0x0400) &&
 | 
| -      (dest_format & 0x0400)) {
 | 
| +  if (!pIccTransform && (~src_format & 0x0400) && (dest_format & 0x0400)) {
 | 
|      return FALSE;
 | 
|    }
 | 
|    if ((m_SrcFormat & 0xff) <= 8) {
 | 
| @@ -4662,7 +4655,7 @@ FX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left,
 | 
|                                        const CFX_ClipRgn* pClipRgn,
 | 
|                                        FX_BOOL bRgbByteOrder,
 | 
|                                        void* pIccTransform) {
 | 
| -  if (m_pBuffer == NULL) {
 | 
| +  if (!m_pBuffer) {
 | 
|      return FALSE;
 | 
|    }
 | 
|    ASSERT(!pSrcBitmap->IsAlphaMask());
 | 
| @@ -4735,7 +4728,7 @@ FX_BOOL CFX_DIBitmap::CompositeMask(int dest_left,
 | 
|                                      FX_BOOL bRgbByteOrder,
 | 
|                                      int alpha_flag,
 | 
|                                      void* pIccTransform) {
 | 
| -  if (m_pBuffer == NULL) {
 | 
| +  if (!m_pBuffer) {
 | 
|      return FALSE;
 | 
|    }
 | 
|    ASSERT(pMask->IsAlphaMask());
 | 
| @@ -4799,7 +4792,7 @@ FX_BOOL CFX_DIBitmap::CompositeRect(int left,
 | 
|                                      FX_DWORD color,
 | 
|                                      int alpha_flag,
 | 
|                                      void* pIccTransform) {
 | 
| -  if (m_pBuffer == NULL) {
 | 
| +  if (!m_pBuffer) {
 | 
|      return FALSE;
 | 
|    }
 | 
|    int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
 | 
| @@ -4859,13 +4852,14 @@ FX_BOOL CFX_DIBitmap::CompositeRect(int left,
 | 
|      int right_shift = rect.right % 8;
 | 
|      int width = rect.right / 8 - rect.left / 8;
 | 
|      int index = 0;
 | 
| -    if (m_pPalette == NULL) {
 | 
| -      index = ((uint8_t)color == 0xff) ? 1 : 0;
 | 
| -    } else {
 | 
| -      for (int i = 0; i < 2; i++)
 | 
| +    if (m_pPalette) {
 | 
| +      for (int i = 0; i < 2; i++) {
 | 
|          if (m_pPalette[i] == color) {
 | 
|            index = i;
 | 
|          }
 | 
| +      }
 | 
| +    } else {
 | 
| +      index = ((uint8_t)color == 0xff) ? 1 : 0;
 | 
|      }
 | 
|      for (int row = rect.top; row < rect.bottom; row++) {
 | 
|        uint8_t* dest_scan_top = (uint8_t*)GetScanline(row) + rect.left / 8;
 | 
| 
 |