Changeset 94591 in webkit


Ignore:
Timestamp:
Sep 6, 2011 12:50:19 PM (13 years ago)
Author:
noel.gordon@gmail.com
Message:

[chromium skia] JPEGImageEncoder: hoist constants out of the encoding loop
https://bugs.webkit.org/show_bug.cgi?id=67589

Reviewed by Kenneth Russell.

Change the row converter function signatures to be the same. Call them via a function
pointer during the encoding loop. Minor webkit style cleanup, remove unused include.

No new tests. Covered by existing canvas 2d and 3d tests.
canvas/philip/tests/toDataURL.jpeg.alpha.html
fast/canvas/webgl/premultiplyalpha-test.html

  • platform/image-encoders/skia/JPEGImageEncoder.cpp: Remove SkUnPreMultiply.h (not used).

(WebCore::preMultipliedBGRAtoRGB): Use unsigned char* instead of void* for pixels.
(WebCore::RGBAtoRGB): pixels & pixelCount to match the preMultipliedBGRAtoRGB() signature.
(WebCore::encodePixels): Move constants out of the encoding loop: use a function pointer
to call preMultipliedBGRAtoRGB or RGBAtoRGB (now they have identical signatures), define
and use pixelRowStride constant.
(WebCore::JPEGImageEncoder::encode):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r94590 r94591  
     12011-09-06  Noel Gordon  <noel.gordon@gmail.com>
     2
     3        [chromium skia] JPEGImageEncoder: hoist constants out of the encoding loop
     4        https://bugs.webkit.org/show_bug.cgi?id=67589
     5
     6        Reviewed by Kenneth Russell.
     7
     8        Change the row converter function signatures to be the same.  Call them via a function
     9        pointer during the encoding loop.  Minor webkit style cleanup, remove unused include.
     10
     11        No new tests.  Covered by existing canvas 2d and 3d tests.
     12        canvas/philip/tests/toDataURL.jpeg.alpha.html
     13        fast/canvas/webgl/premultiplyalpha-test.html
     14
     15        * platform/image-encoders/skia/JPEGImageEncoder.cpp:  Remove SkUnPreMultiply.h (not used).
     16        (WebCore::preMultipliedBGRAtoRGB):  Use unsigned char* instead of void* for pixels.
     17        (WebCore::RGBAtoRGB):  pixels & pixelCount to match the preMultipliedBGRAtoRGB() signature.
     18        (WebCore::encodePixels):  Move constants out of the encoding loop: use a function pointer
     19        to call preMultipliedBGRAtoRGB or RGBAtoRGB (now they have identical signatures), define
     20        and use pixelRowStride constant.
     21        (WebCore::JPEGImageEncoder::encode):
     22
    1232011-09-06  Aaron Colwell  <acolwell@chromium.org>
    224
  • trunk/Source/WebCore/platform/image-encoders/skia/JPEGImageEncoder.cpp

    r94538 r94591  
    3636#include "SkBitmap.h"
    3737#include "SkColorPriv.h"
    38 #include "SkUnPreMultiply.h"
    3938extern "C" {
    4039#include <stdio.h> // jpeglib.h needs stdio.h FILE
     
    8180}
    8281
    83 static void preMultipliedBGRAtoRGB(const void* pixels, unsigned int pixelCount, unsigned char* output)
     82static void preMultipliedBGRAtoRGB(const unsigned char* pixels, unsigned int pixelCount, unsigned char* output)
    8483{
    85     const SkPMColor* input = static_cast<const SkPMColor*>(pixels);
     84    const SkPMColor* input = reinterpret_cast<const SkPMColor*>(pixels);
    8685    for (; pixelCount-- > 0; ++input) {
    8786        *output++ = SkGetPackedR32(*input);
     
    9190}
    9291
    93 static void RGBAtoRGB(const unsigned char* input, unsigned int pixels, unsigned char* output)
     92static void RGBAtoRGB(const unsigned char* pixels, unsigned int pixelCount, unsigned char* output)
    9493{
    95     for (; pixels-- > 0; input += 4) {
    96         *output++ = input[0];
    97         *output++ = input[1];
    98         *output++ = input[2];
     94    for (; pixelCount-- > 0; pixels += 4) {
     95        *output++ = pixels[0];
     96        *output++ = pixels[1];
     97        *output++ = pixels[2];
    9998    }
    10099}
    101100
    102 static bool encodePixels(const IntSize& inputSize, unsigned char* inputPixels,
    103                          bool premultiplied, int quality, Vector<unsigned char>* output)
     101static bool encodePixels(IntSize imageSize, unsigned char* inputPixels, bool premultiplied, int quality, Vector<unsigned char>* output)
    104102{
    105     IntSize imageSize(inputSize);
    106     imageSize.clampNegativeToZero();
    107103    JPEGOutputBuffer destination;
    108104    destination.output = output;
     
    126122    cinfo.dest->empty_output_buffer = writeOutput;
    127123    cinfo.dest->term_destination = finishOutput;
     124
     125    imageSize.clampNegativeToZero();
    128126    cinfo.image_height = imageSize.height();
    129127    cinfo.image_width = imageSize.width();
    130128    cinfo.in_color_space = JCS_RGB;
    131129    cinfo.input_components = 3;
     130
     131    void (*extractRowRGB)(const unsigned char*, unsigned int, unsigned char* output);
     132    extractRowRGB = &RGBAtoRGB;
     133    if (premultiplied)
     134        extractRowRGB = &preMultipliedBGRAtoRGB;
    132135
    133136    jpeg_set_defaults(&cinfo);
     
    137140    unsigned char* pixels = inputPixels;
    138141    row.resize(cinfo.image_width * cinfo.input_components);
     142    const size_t pixelRowStride = cinfo.image_width * 4;
    139143    while (cinfo.next_scanline < cinfo.image_height) {
    140         if (premultiplied)
    141             preMultipliedBGRAtoRGB(pixels, cinfo.image_width, row.data());
    142         else
    143             RGBAtoRGB(pixels, cinfo.image_width, row.data());
     144        extractRowRGB(pixels, cinfo.image_width, row.data());
    144145        jpeg_write_scanlines(&cinfo, row.dataSlot(), 1);
    145         pixels += cinfo.image_width * 4;
     146        pixels += pixelRowStride;
    146147    }
    147148
     
    153154bool JPEGImageEncoder::encode(const SkBitmap& bitmap, int quality, Vector<unsigned char>* output)
    154155{
     156    SkAutoLockPixels bitmapLock(bitmap);
     157
    155158    if (bitmap.config() != SkBitmap::kARGB_8888_Config)
    156         return false; // Only support ARGB 32 bpp skia bitmaps.
     159        return false; // Only support 32 bit/pixel skia bitmaps.
    157160
    158     SkAutoLockPixels bitmapLock(bitmap);
    159     IntSize imageSize(bitmap.width(), bitmap.height());
    160 
    161     return encodePixels(imageSize, static_cast<unsigned char *>(bitmap.getPixels()),
    162                         true, quality, output);
     161    return encodePixels(IntSize(bitmap.width(), bitmap.height()), static_cast<unsigned char *>(bitmap.getPixels()), true, quality, output);
    163162}
    164163
    165164bool JPEGImageEncoder::encode(const ImageData& imageData, int quality, Vector<unsigned char>* output)
    166165{
    167     return encodePixels(imageData.size(), imageData.data()->data()->data(),
    168                         false, quality, output);
     166    return encodePixels(imageData.size(), imageData.data()->data()->data(), false, quality, output);
    169167}
    170168
Note: See TracChangeset for help on using the changeset viewer.