19 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_
20 #define NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_
30 #include "pagespeed/kernel/base/basictypes.h"
31 #include "pagespeed/kernel/base/scoped_ptr.h"
32 #include "pagespeed/kernel/base/string.h"
33 #include "pagespeed/kernel/base/string_util.h"
34 #include "pagespeed/kernel/html/html_element.h"
35 #include "pagespeed/kernel/http/image_types.pb.h"
37 namespace net_instaweb {
42 class ResourceContext;
47 class UrlSegmentEncoder;
54 INLINE_UNSUPPORTED_DEVICE,
58 INLINE_CACHE_SMALL_IMAGES_UNREWRITTEN,
59 INLINE_INTERNAL_ERROR,
69 static const char kImageOngoingRewrites[];
70 static const char kImageResizedUsingRenderedDimensions[];
71 static const char kImageRewriteLatencyFailedMs[];
72 static const char kImageRewriteLatencyOkMs[];
73 static const char kImageRewriteLatencyTotalMs[];
74 static const char kImageRewritesDroppedDecodeFailure[];
75 static const char kImageRewritesDroppedDueToLoad[];
76 static const char kImageRewritesDroppedMIMETypeUnknown[];
77 static const char kImageRewritesDroppedNoSavingNoResize[];
78 static const char kImageRewritesDroppedNoSavingResize[];
79 static const char kImageRewritesDroppedServerWriteFail[];
80 static const char kImageRewritesSquashingForMobileScreen[];
81 static const char kImageRewrites[];
82 static const char kImageWebpRewrites[];
83 static const char kImageWebpFromGifFailureMs[];
84 static const char kImageWebpFromGifSuccessMs[];
85 static const char kImageWebpFromGifTimeouts[];
86 static const char kImageWebpFromJpegFailureMs[];
87 static const char kImageWebpFromJpegSuccessMs[];
88 static const char kImageWebpFromJpegTimeouts[];
89 static const char kImageWebpFromPngFailureMs[];
90 static const char kImageWebpFromPngSuccessMs[];
91 static const char kImageWebpFromPngTimeouts[];
92 static const char kImageWebpOpaqueFailureMs[];
93 static const char kImageWebpOpaqueSuccessMs[];
94 static const char kImageWebpOpaqueTimeouts[];
95 static const char kImageWebpWithAlphaFailureMs[];
96 static const char kImageWebpWithAlphaSuccessMs[];
97 static const char kImageWebpWithAlphaTimeouts[];
105 static const int kRelatedFiltersSize;
109 static void InitStats(Statistics* statistics);
110 static void Initialize();
111 static void Terminate();
112 static void AddRelatedOptions(StringPieceVector* target);
114 virtual void StartElementImpl(HtmlElement* element) {}
115 virtual void EndElementImpl(HtmlElement* element);
116 virtual const char* Name()
const {
return "ImageRewrite"; }
117 virtual const char* id()
const {
return RewriteOptions::kImageCompressionId; }
119 ResourceContext* context)
const;
123 InlineResult
TryInline(
bool is_html,
bool is_critical,
124 int64 image_inline_max_bytes,
const CachedResult* cached_result,
125 ResourceSlot* slot, GoogleString* data_url);
152 int64 css_image_inline_max_bytes,
153 RewriteContext* parent,
154 const ResourceSlotPtr& slot);
159 const ResourceSlotPtr& slot);
164 const ImageDim& image_dim,
const ResourceContext& resource_context,
165 ImageDim* desired_dim);
171 const GoogleString& url,
173 ImageDim* desired_dimensions);
178 const RewriteContext* rewrite_context,
const GoogleString& url,
179 ResourceContext* context, Image* image, CachedResult* cached);
184 const ResourceContext& context,
const ResourcePtr& input_resource,
189 return related_options_;
196 virtual const UrlSegmentEncoder*
encoder()
const;
202 friend class Context;
205 const ContentType* ImageToContentType(
const GoogleString& origin_url,
207 void BeginRewriteImageUrl(HtmlElement* element, HtmlElement::Attribute* src);
210 const ResourcePtr& input_resource,
211 const OutputResourcePtr& result);
214 bool FinishRewriteCssImageUrl(
215 int64 css_image_inline_max_bytes,
217 InlineResult* inline_result);
220 bool FinishRewriteImageUrl(
221 const CachedResult* cached,
const ResourceContext* resource_context,
222 HtmlElement* element, HtmlElement::Attribute* src,
int image_index,
226 void SaveIfInlinable(
const StringPiece& contents,
227 const ImageType image_type,
228 CachedResult* cached);
235 const HtmlElement::Attribute* src,
236 bool* is_resized_using_rendered_dimensions);
240 bool HasAnyDimensions(HtmlElement* element);
244 void ResizeLowQualityImage(
245 Image* low_image,
const ResourcePtr& input_resource,
246 CachedResult* cached);
252 bool IsHtmlCriticalImage(StringPiece image_url)
const;
257 bool StoreUrlInPropertyCache(
const StringPiece& url);
259 bool SquashImagesForMobileScreenEnabled()
const;
261 void SaveDebugMessageToCache(
const GoogleString& message,
262 Context* rewrite_context,
263 CachedResult* cached_result);
265 scoped_ptr<WorkBound> work_bound_;
270 Variable* image_rewrites_;
272 Variable* image_resized_using_rendered_dimensions_;
274 Variable* image_norewrites_high_resolution_;
279 Variable* image_rewrites_dropped_intentionally_;
281 Variable* image_rewrites_dropped_decode_failure_;
283 Variable* image_rewrites_dropped_mime_type_unknown_;
286 Variable* image_rewrites_dropped_server_write_fail_;
289 Variable* image_rewrites_dropped_nosaving_resize_;
292 Variable* image_rewrites_dropped_nosaving_noresize_;
294 TimedVariable* image_rewrites_dropped_due_to_load_;
298 TimedVariable* image_rewrites_squashing_for_mobile_screen_;
302 Variable* image_rewrite_total_bytes_saved_;
306 Variable* image_rewrite_total_original_bytes_;
309 Variable* image_rewrite_uses_;
311 Variable* image_inline_count_;
313 Variable* image_webp_rewrites_;
316 Variable* image_rewrite_latency_total_ms_;
318 Histogram* image_rewrite_latency_ok_ms_;
320 Histogram* image_rewrite_latency_failed_ms_;
331 StringSet inlinable_urls_;
337 static StringPieceVector* related_options_;
RewriteContext * MakeNestedRewriteContextForCss(int64 css_image_inline_max_bytes, RewriteContext *parent, const ResourceSlotPtr &slot)
virtual RewriteContext * MakeRewriteContext()
virtual void EncodeUserAgentIntoResourceContext(ResourceContext *context) const
InlineResult TryInline(bool is_html, bool is_critical, int64 image_inline_max_bytes, const CachedResult *cached_result, ResourceSlot *slot, GoogleString *data_url)
Image::CompressionOptions * ImageOptionsForLoadedResource(const ResourceContext &context, const ResourcePtr &input_resource, bool is_css)
virtual void StartDocumentImpl()
Definition: resource_slot.h:52
bool UpdateDesiredImageDimsIfNecessary(const ImageDim &image_dim, const ResourceContext &resource_context, ImageDim *desired_dim)
static bool ParseDimensionAttribute(const char *position, int *value)
DimensionState GetDimensions(Css::Declarations *decls, int *width, int *height)
Definition: resource_slot.h:213
static void DisableRelatedFilters(RewriteOptions *options)
Disable all filters listed in kRelatedFilters in options.
virtual RewriteContext * MakeNestedRewriteContext(RewriteContext *parent, const ResourceSlotPtr &slot)
bool ResizeImageIfNecessary(const RewriteContext *rewrite_context, const GoogleString &url, ResourceContext *context, Image *image, CachedResult *cached)
Definition: rewrite_filter.h:37
virtual const StringPieceVector * RelatedOptions() const
Definition: image_rewrite_filter.h:188
Filter
Definition: rewrite_options.h:106
Definition: rewrite_driver.h:98
virtual const UrlSegmentEncoder * encoder() const
RewriteResult
Definition: rewrite_result.h:27
virtual const RewriteOptions::Filter * RelatedFilters(int *num_filters) const
Definition: rewrite_context.h:144
static const char kInlinableImageUrlsPropertyName[]
Definition: image_rewrite_filter.h:102
Definition: image_rewrite_filter.h:65
static const char kImageNoRewritesHighResolution[]
Statistic names:
Definition: image_rewrite_filter.h:68
Definition: rewrite_options.h:83
Definition: image_url_encoder.h:62
bool ShouldResize(const ResourceContext &context, const GoogleString &url, Image *image, ImageDim *desired_dimensions)