Index: third_party/icon_family/chromium_icon_family_2.patch |
diff --git a/third_party/icon_family/chromium_icon_family_2.patch b/third_party/icon_family/chromium_icon_family_2.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..65e7096d1a6a015fa83f39a93a906ffb577e0e76 |
--- /dev/null |
+++ b/third_party/icon_family/chromium_icon_family_2.patch |
@@ -0,0 +1,189 @@ |
+diff --git a/third_party/icon_family/IconFamily.m b/third_party/icon_family/IconFamily.m |
+index 439c2de..911ea31 100644 |
+--- a/third_party/icon_family/IconFamily.m |
++++ b/third_party/icon_family/IconFamily.m |
+@@ -1236,6 +1236,43 @@ enum { |
+ return [newImage autorelease]; |
+ } |
+ |
++void GetRGBAFrom32BitSource(unsigned char src1, unsigned char src2, unsigned char src3, unsigned char src4, |
++ unsigned char* redOut, unsigned char* greenOut, unsigned char* blueOut, unsigned char* alphaOut, |
++ bool isAlphaFirst, bool isAlphaPremultiplied) { |
++ unsigned char r, g, b, a; |
++ if (isAlphaFirst) { |
++ a = src1; |
++ r = src2; |
++ g = src3; |
++ b = src4; |
++ } else { |
++ r = src1; |
++ g = src2; |
++ b = src3; |
++ a = src4; |
++ } |
++ |
++ if (isAlphaPremultiplied) { |
++ // The RGB values are premultiplied by the alpha (so that |
++ // Quartz can save time when compositing the bitmap to a |
++ // destination), and we undo this premultiplication (with some |
++ // lossiness unfortunately) when retrieving the bitmap data. |
++ float oneOverAlpha = 255.0f / (float)a; |
++ r = r * oneOverAlpha; |
++ g = g * oneOverAlpha; |
++ b = b * oneOverAlpha; |
++ } |
++ |
++ if (redOut) |
++ *redOut = r; |
++ if (greenOut) |
++ *greenOut = g; |
++ if (blueOut) |
++ *blueOut = b; |
++ if (alphaOut) |
++ *alphaOut = a; |
++} |
++ |
+ + (Handle) get32BitDataFromBitmapImageRep:(NSBitmapImageRep*)bitmapImageRep requiredPixelSize:(int)requiredPixelSize |
+ { |
+ Handle hRawData; |
+@@ -1244,9 +1281,7 @@ enum { |
+ unsigned char* pSrc; |
+ unsigned char* pDest; |
+ int x, y; |
+- unsigned char alphaByte; |
+- float oneOverAlpha; |
+- |
++ |
+ // Get information about the bitmapImageRep. |
+ long pixelsWide = [bitmapImageRep pixelsWide]; |
+ long pixelsHigh = [bitmapImageRep pixelsHigh]; |
+@@ -1256,6 +1291,8 @@ enum { |
+ BOOL isPlanar = [bitmapImageRep isPlanar]; |
+ long bytesPerRow = [bitmapImageRep bytesPerRow]; |
+ unsigned char* bitmapData = [bitmapImageRep bitmapData]; |
++ BOOL isAlphaFirst = [bitmapImageRep bitmapFormat] & NSAlphaFirstBitmapFormat; |
++ BOOL isAlphaPremultiplied = !([bitmapImageRep bitmapFormat] & NSAlphaNonpremultipliedBitmapFormat); |
+ |
+ // Make sure bitmap has the required dimensions. |
+ if (pixelsWide != requiredPixelSize || pixelsHigh != requiredPixelSize) |
+@@ -1289,23 +1326,14 @@ enum { |
+ for (y = 0; y < pixelsHigh; y++) { |
+ pSrc = bitmapData + y * bytesPerRow; |
+ for (x = 0; x < pixelsWide; x++) { |
+- // Each pixel is 3 bytes of RGB data, followed by 1 byte of |
+- // alpha. The RGB values are premultiplied by the alpha (so |
+- // that Quartz can save time when compositing the bitmap to a |
+- // destination), and we undo this premultiplication (with some |
+- // lossiness unfortunately) when retrieving the bitmap data. |
+- *pDest++ = alphaByte = *(pSrc+3); |
+- if (alphaByte) { |
+- oneOverAlpha = 255.0f / (float)alphaByte; |
+- *pDest++ = *(pSrc+0) * oneOverAlpha; |
+- *pDest++ = *(pSrc+1) * oneOverAlpha; |
+- *pDest++ = *(pSrc+2) * oneOverAlpha; |
+- } else { |
+- *pDest++ = 0; |
+- *pDest++ = 0; |
+- *pDest++ = 0; |
+- } |
+- pSrc+=4; |
++ unsigned char r, g, b, a; |
++ GetRGBAFrom32BitSource(pSrc[0], pSrc[1], pSrc[2], pSrc[3], |
++ &r, &g, &b, &a, isAlphaFirst, isAlphaPremultiplied); |
++ *pDest++ = a; |
++ *pDest++ = r; |
++ *pDest++ = g; |
++ *pDest++ = b; |
++ pSrc += 4; |
+ } |
+ } |
+ } else if (bitsPerPixel == 24) { |
+@@ -1347,6 +1375,8 @@ enum { |
+ BOOL isPlanar = [bitmapImageRep isPlanar]; |
+ long bytesPerRow = [bitmapImageRep bytesPerRow]; |
+ unsigned char* bitmapData = [bitmapImageRep bitmapData]; |
++ BOOL isAlphaFirst = [bitmapImageRep bitmapFormat] & NSAlphaFirstBitmapFormat; |
++ BOOL isAlphaPremultiplied = !([bitmapImageRep bitmapFormat] & NSAlphaNonpremultipliedBitmapFormat); |
+ |
+ // Make sure bitmap has the required dimensions. |
+ if (pixelsWide != requiredPixelSize || pixelsHigh != requiredPixelSize) |
+@@ -1383,9 +1413,12 @@ enum { |
+ for (y = 0; y < pixelsHigh; y++) { |
+ pSrc = bitmapData + y * bytesPerRow; |
+ for (x = 0; x < pixelsWide; x++) { |
+- cgCol.red = ((float)*(pSrc)) / 255; |
+- cgCol.green = ((float)*(pSrc+1)) / 255; |
+- cgCol.blue = ((float)*(pSrc+2)) / 255; |
++ unsigned char r, g, b; |
++ GetRGBAFrom32BitSource(pSrc[0], pSrc[1], pSrc[2], pSrc[3], |
++ &r, &g, &b, NULL, isAlphaFirst, isAlphaPremultiplied); |
++ cgCol.red = (float)r / 255; |
++ cgCol.green = (float)g / 255; |
++ cgCol.blue = (float)b / 255; |
+ |
+ *pDest++ = CGPaletteGetIndexForColor(cgPal, cgCol); |
+ |
+@@ -1436,6 +1469,8 @@ enum { |
+ BOOL isPlanar = [bitmapImageRep isPlanar]; |
+ long bytesPerRow = [bitmapImageRep bytesPerRow]; |
+ unsigned char* bitmapData = [bitmapImageRep bitmapData]; |
++ BOOL isAlphaFirst = [bitmapImageRep bitmapFormat] & NSAlphaFirstBitmapFormat; |
++ BOOL isAlphaPremultiplied = !([bitmapImageRep bitmapFormat] & NSAlphaNonpremultipliedBitmapFormat); |
+ |
+ // Make sure bitmap has the required dimensions. |
+ if (pixelsWide != requiredPixelSize || pixelsHigh != requiredPixelSize) |
+@@ -1469,8 +1504,11 @@ enum { |
+ for (y = 0; y < pixelsHigh; y++) { |
+ pSrc = bitmapData + y * bytesPerRow; |
+ for (x = 0; x < pixelsWide; x++) { |
+- pSrc += 3; |
+- *pDest++ = *pSrc++; |
++ unsigned char a; |
++ GetRGBAFrom32BitSource(pSrc[0], pSrc[1], pSrc[2], pSrc[3], |
++ NULL, NULL, NULL, &a, isAlphaFirst, isAlphaPremultiplied); |
++ *pDest++ = a; |
++ pSrc += 4; |
+ } |
+ } |
+ } |
+@@ -1514,6 +1552,8 @@ enum { |
+ BOOL isPlanar = [bitmapImageRep isPlanar]; |
+ long bytesPerRow = [bitmapImageRep bytesPerRow]; |
+ unsigned char* bitmapData = [bitmapImageRep bitmapData]; |
++ BOOL isAlphaFirst = [bitmapImageRep bitmapFormat] & NSAlphaFirstBitmapFormat; |
++ BOOL isAlphaPremultiplied = !([bitmapImageRep bitmapFormat] & NSAlphaNonpremultipliedBitmapFormat); |
+ |
+ // Make sure bitmap has the required dimensions. |
+ if (pixelsWide != requiredPixelSize || pixelsHigh != requiredPixelSize) |
+@@ -1544,14 +1584,14 @@ enum { |
+ pSrc = bitmapData + y * bytesPerRow; |
+ for (x = 0; x < pixelsWide; x += 8) { |
+ maskByte = 0; |
+- maskByte |= (*(unsigned*)pSrc & 0xff) ? 0x80 : 0; pSrc += 4; |
+- maskByte |= (*(unsigned*)pSrc & 0xff) ? 0x40 : 0; pSrc += 4; |
+- maskByte |= (*(unsigned*)pSrc & 0xff) ? 0x20 : 0; pSrc += 4; |
+- maskByte |= (*(unsigned*)pSrc & 0xff) ? 0x10 : 0; pSrc += 4; |
+- maskByte |= (*(unsigned*)pSrc & 0xff) ? 0x08 : 0; pSrc += 4; |
+- maskByte |= (*(unsigned*)pSrc & 0xff) ? 0x04 : 0; pSrc += 4; |
+- maskByte |= (*(unsigned*)pSrc & 0xff) ? 0x02 : 0; pSrc += 4; |
+- maskByte |= (*(unsigned*)pSrc & 0xff) ? 0x01 : 0; pSrc += 4; |
++ for (int i = 7; i >= 0; i--) { |
++ unsigned char a; |
++ GetRGBAFrom32BitSource(pSrc[0], pSrc[1], pSrc[2], pSrc[3], |
++ NULL, NULL, NULL, &a, isAlphaFirst, isAlphaPremultiplied); |
++ if (a) |
++ maskByte |= 1 << i; |
++ pSrc += 4; |
++ } |
+ *pDest++ = maskByte; |
+ } |
+ } |
+diff --git a/third_party/icon_family/README.chromium b/third_party/icon_family/README.chromium |
+index 915d197..bbe5096 100644 |
+--- a/third_party/icon_family/README.chromium |
++++ b/third_party/icon_family/README.chromium |
+@@ -12,3 +12,4 @@ This is an Objective-C wrapper around Mac OS X Icon Services' "IconFamily" data |
+ |
+ Local Modifications: |
+ chromium_icon_family.patch: Fix minor erors and warnings. Put code that the custom icon code behind a DISABLE_CUSTOM_ICON flag. |
++chromium_icon_family_2.patch: Add support for alpha first and non-premultiplied image formats. |