~ubuntu-branches/ubuntu/karmic/gst-plugins-base0.10/karmic-updates

« back to all changes in this revision

Viewing changes to ext/pango/gsttextoverlay.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastian Dröge
  • Date: 2009-10-05 18:10:19 UTC
  • mfrom: (14.3.4 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091005181019-vcb3daxz031og2sh
Tags: 0.10.25-1
* New upstream release, 'Standard disclaimers apply':
  + debian/libgstreamer-plugins-base.symbols:
    - Updated for the new version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1013
1013
    overlay->outline_offset = MINIMUM_OUTLINE_OFFSET;
1014
1014
}
1015
1015
 
 
1016
#define CAIRO_UNPREMULTIPLY(a,r,g,b) G_STMT_START { \
 
1017
  b = (a > 0) ? MIN ((b * 255 + a / 2) / a, 255) : 0; \
 
1018
  g = (a > 0) ? MIN ((g * 255 + a / 2) / a, 255) : 0; \
 
1019
  r = (a > 0) ? MIN ((r * 255 + a / 2) / a, 255) : 0; \
 
1020
} G_STMT_END
 
1021
 
1016
1022
static inline void
1017
1023
gst_text_overlay_blit_1 (GstTextOverlay * overlay, guchar * dest, gint xpos,
1018
1024
    gint ypos, guchar * text_image, guint dest_stride)
1047
1053
      g = pimage[CAIRO_ARGB_G];
1048
1054
      r = pimage[CAIRO_ARGB_R];
1049
1055
      a = pimage[CAIRO_ARGB_A];
 
1056
      CAIRO_UNPREMULTIPLY (a, r, g, b);
 
1057
 
1050
1058
      pimage += 4;
1051
1059
      if (a == 0) {
1052
1060
        py++;
1067
1075
  gint i, j;
1068
1076
  gint x, cb, cr;
1069
1077
  gushort r, g, b, a;
 
1078
  gushort r1, g1, b1, a1;
1070
1079
  guchar *pimage1, *pimage2;
1071
1080
  guchar *pcb, *pcr;
1072
1081
  gint width = overlay->image_width - 2;
1097
1106
      g = pimage1[CAIRO_ARGB_G];
1098
1107
      r = pimage1[CAIRO_ARGB_R];
1099
1108
      a = pimage1[CAIRO_ARGB_A];
1100
 
      pimage1 += 4;
1101
 
 
1102
 
      b += pimage1[CAIRO_ARGB_B];
1103
 
      g += pimage1[CAIRO_ARGB_G];
1104
 
      r += pimage1[CAIRO_ARGB_R];
1105
 
      a += pimage1[CAIRO_ARGB_A];
1106
 
      pimage1 += 4;
1107
 
 
1108
 
      b += pimage2[CAIRO_ARGB_B];
1109
 
      g += pimage2[CAIRO_ARGB_G];
1110
 
      r += pimage2[CAIRO_ARGB_R];
1111
 
      a += pimage2[CAIRO_ARGB_A];
 
1109
      CAIRO_UNPREMULTIPLY (a, r, g, b);
 
1110
      pimage1 += 4;
 
1111
 
 
1112
      b1 = pimage1[CAIRO_ARGB_B];
 
1113
      g1 = pimage1[CAIRO_ARGB_G];
 
1114
      r1 = pimage1[CAIRO_ARGB_R];
 
1115
      a1 = pimage1[CAIRO_ARGB_A];
 
1116
      CAIRO_UNPREMULTIPLY (a1, r1, g1, b1);
 
1117
      b += b1;
 
1118
      g += g1;
 
1119
      r += r1;
 
1120
      a += a1;
 
1121
      pimage1 += 4;
 
1122
 
 
1123
      b1 = pimage2[CAIRO_ARGB_B];
 
1124
      g1 = pimage2[CAIRO_ARGB_G];
 
1125
      r1 = pimage2[CAIRO_ARGB_R];
 
1126
      a1 = pimage2[CAIRO_ARGB_A];
 
1127
      CAIRO_UNPREMULTIPLY (a1, r1, g1, b1);
 
1128
      b += b1;
 
1129
      g += g1;
 
1130
      r += r1;
 
1131
      a += a1;
1112
1132
      pimage2 += 4;
1113
1133
 
1114
1134
      /* + 2 for rounding */
1115
 
      b += pimage2[CAIRO_ARGB_B] + 2;
1116
 
      g += pimage2[CAIRO_ARGB_G] + 2;
1117
 
      r += pimage2[CAIRO_ARGB_R] + 2;
1118
 
      a += pimage2[CAIRO_ARGB_A] + 2;
 
1135
      b1 = pimage2[CAIRO_ARGB_B];
 
1136
      g1 = pimage2[CAIRO_ARGB_G];
 
1137
      r1 = pimage2[CAIRO_ARGB_R];
 
1138
      a1 = pimage2[CAIRO_ARGB_A];
 
1139
      CAIRO_UNPREMULTIPLY (a1, r1, g1, b1);
 
1140
      b += b1 + 2;
 
1141
      g += g1 + 2;
 
1142
      r += r1 + 2;
 
1143
      a += a1 + 2;
1119
1144
      pimage2 += 4;
1120
1145
 
1121
1146
      b /= 4;
1430
1455
      g0 = pimage[CAIRO_ARGB_G];
1431
1456
      r0 = pimage[CAIRO_ARGB_R];
1432
1457
      a0 = pimage[CAIRO_ARGB_A];
 
1458
      CAIRO_UNPREMULTIPLY (a0, r0, g0, b0);
1433
1459
      pimage += 4;
1434
1460
 
1435
1461
      b1 = pimage[CAIRO_ARGB_B];
1436
1462
      g1 = pimage[CAIRO_ARGB_G];
1437
1463
      r1 = pimage[CAIRO_ARGB_R];
1438
1464
      a1 = pimage[CAIRO_ARGB_A];
 
1465
      CAIRO_UNPREMULTIPLY (a1, r1, g1, b1);
1439
1466
      pimage += 4;
1440
1467
 
1441
1468
      a0 += a1 + 2;
1501
1528
    dest = rgb_pixels + (i + ypos) * 4 * overlay->width + xpos * 4; \
1502
1529
    for (j = 0; j < w; j++) { \
1503
1530
      a = pimage[CAIRO_ARGB_A]; \
1504
 
      b = (pimage[CAIRO_ARGB_B] * a + dest[B] * (255-a)) / 255; \
1505
 
      g = (pimage[CAIRO_ARGB_G] * a + dest[G] * (255-a)) / 255; \
1506
 
      r = (pimage[CAIRO_ARGB_R] * a + dest[R] * (255-a)) / 255; \
 
1531
      b = pimage[CAIRO_ARGB_B]; \
 
1532
      g = pimage[CAIRO_ARGB_G]; \
 
1533
      r = pimage[CAIRO_ARGB_R]; \
 
1534
      CAIRO_UNPREMULTIPLY (a, r, g, b); \
 
1535
      b = (b*a + dest[B] * (255-a)) / 255; \
 
1536
      g = (g*a + dest[G] * (255-a)) / 255; \
 
1537
      r = (r*a + dest[R] * (255-a)) / 255; \
1507
1538
      \
1508
1539
      dest[B] = b; \
1509
1540
      dest[G] = g; \