blob: 3b65b27722a35a23341037767e8fc4abca9ccb58 [file] [log] [blame]
/*
* Copyright 2014 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Author: Victor Chudnovsky
#ifndef PAGESPEED_KERNEL_IMAGE_FRAME_INTERFACE_OPTIMIZER_H_
#define PAGESPEED_KERNEL_IMAGE_FRAME_INTERFACE_OPTIMIZER_H_
#include <cstddef>
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/scoped_ptr.h"
#include "pagespeed/kernel/image/image_frame_interface.h"
#include "pagespeed/kernel/image/image_util.h"
#include "pagespeed/kernel/image/scanline_status.h"
namespace net_instaweb {
class MessageHandler;
}
namespace pagespeed {
namespace image_compression {
// This class is an adapter that makes the frame size be the same as
// the image size, padding the frame with background color pixels.
class MultipleFramePaddingReader : public MultipleFrameReader {
public:
// Takes ownership of reader.
explicit MultipleFramePaddingReader(MultipleFrameReader* reader);
virtual ~MultipleFramePaddingReader();
virtual ScanlineStatus Reset();
virtual ScanlineStatus Initialize();
virtual bool HasMoreFrames() const;
virtual bool HasMoreScanlines() const;
virtual ScanlineStatus PrepareNextFrame();
virtual ScanlineStatus ReadNextScanline(const void** out_scanline_bytes);
virtual ScanlineStatus GetFrameSpec(FrameSpec* frame_spec) const;
virtual ScanlineStatus GetImageSpec(ImageSpec* image_spec) const;
MessageHandler* message_handler() const;
virtual ScanlineStatus set_quirks_mode(QuirksMode quirks_mode);
virtual QuirksMode quirks_mode() const;
private:
net_instaweb::scoped_ptr<MultipleFrameReader> impl_;
// The ImageSpec as fetched from impl_.
ImageSpec image_spec_;
// The FrameSpec returned by impl_ for the current frame.
FrameSpec impl_frame_spec_;
// The padded FrameSpec we return for the current frame. Its
// dimensions are those of the image.
FrameSpec padded_frame_spec_;
// Whether the frame is as tall as the image.
bool frame_is_full_height_;
// Whether the frame is as wide as the image.
bool frame_is_full_width_;
// Whether the frame has exactly the same dimensions as the
// image. This is simply and frame_is_full_width_ &&
// frame_is_full_height_, and is used to shortcut the expensive
// operations in ReadNextScanline.
bool frame_needs_no_padding_;
// The index of the current scanline being read in the current
// (padded) frame.
size_px current_scanline_idx_;
// The current scanline being read in the current (padded) frame.
net_instaweb::scoped_array<uint8_t> current_scanline_;
// A template scanline consisting of purely the padding background
// color. We copy this to current_scanline_ and overwrite the
// appropriate locations with the contents of the non-padded frame.
net_instaweb::scoped_array<uint8_t> scanline_template_;
// The number of bytes per pixel in the current frame.
size_t bytes_per_pixel_;
// Pointer to the byte in current_scanline_ that marks the start
// location of where the non-padded frame will be copied, in rows
// which contain the frame.
uint8_t* foreground_scanline_start_byte_;
DISALLOW_COPY_AND_ASSIGN(MultipleFramePaddingReader);
};
} // namespace image_compression
} // namespace pagespeed
#endif // PAGESPEED_KERNEL_IMAGE_FRAME_INTERFACE_OPTIMIZER_H_