1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "third_party/blink/renderer/platform/image-encoders/image_encoder_utils.h"
6
7 #include "third_party/blink/renderer/platform/instrumentation/histogram.h"
8 #include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h"
9 #include "third_party/blink/renderer/platform/wtf/threading.h"
10
11 namespace blink {
12
13 const ImageEncodingMimeType ImageEncoderUtils::kDefaultEncodingMimeType =
14 kMimeTypePng;
15 const char ImageEncoderUtils::kDefaultRequestedMimeType[] = "image/png";
16
17 namespace {
18 // This enum is used in a UMA histogram; the values should not be changed.
19 enum RequestedImageMimeType {
20 kRequestedImageMimeTypePng = 0,
21 kRequestedImageMimeTypeJpeg = 1,
22 kRequestedImageMimeTypeWebp = 2,
23 kRequestedImageMimeTypeGif = 3,
24 kRequestedImageMimeTypeBmp = 4,
25 kRequestedImageMimeTypeIco = 5,
26 kRequestedImageMimeTypeTiff = 6,
27 kRequestedImageMimeTypeUnknown = 7,
28 kMaxValue = kRequestedImageMimeTypeUnknown,
29 };
30
31 } // namespace
32
ToEncodingMimeType(const String & mime_type_name,const EncodeReason encode_reason)33 ImageEncodingMimeType ImageEncoderUtils::ToEncodingMimeType(
34 const String& mime_type_name,
35 const EncodeReason encode_reason) {
36 String lowercase_mime_type = mime_type_name.LowerASCII();
37
38 RequestedImageMimeType requested_mime_type;
39 if (mime_type_name.IsNull())
40 lowercase_mime_type = kDefaultRequestedMimeType;
41
42 if (lowercase_mime_type == "image/png") {
43 requested_mime_type = kRequestedImageMimeTypePng;
44 } else if (lowercase_mime_type == "image/jpeg") {
45 requested_mime_type = kRequestedImageMimeTypeJpeg;
46 } else if (lowercase_mime_type == "image/webp") {
47 requested_mime_type = kRequestedImageMimeTypeWebp;
48 } else if (lowercase_mime_type == "image/gif") {
49 requested_mime_type = kRequestedImageMimeTypeGif;
50 } else if (lowercase_mime_type == "image/bmp" ||
51 lowercase_mime_type == "image/x-windows-bmp") {
52 requested_mime_type = kRequestedImageMimeTypeBmp;
53 } else if (lowercase_mime_type == "image/x-icon") {
54 requested_mime_type = kRequestedImageMimeTypeIco;
55 } else if (lowercase_mime_type == "image/tiff" ||
56 lowercase_mime_type == "image/x-tiff") {
57 requested_mime_type = kRequestedImageMimeTypeTiff;
58 } else {
59 requested_mime_type = kRequestedImageMimeTypeUnknown;
60 }
61
62 if (encode_reason == kEncodeReasonToDataURL) {
63 UMA_HISTOGRAM_ENUMERATION("Blink.Canvas.RequestedImageMimeTypes_toDataURL",
64 requested_mime_type);
65 } else if (encode_reason == kEncodeReasonToBlobCallback) {
66 UMA_HISTOGRAM_ENUMERATION(
67 "Blink.Canvas.RequestedImageMimeTypes_toBlobCallback",
68 requested_mime_type);
69 } else if (encode_reason == kEncodeReasonConvertToBlobPromise) {
70 UMA_HISTOGRAM_ENUMERATION(
71 "Blink.Canvas.RequestedImageMimeTypes_convertToBlobPromise",
72 requested_mime_type);
73 }
74
75 ImageEncodingMimeType encoding_mime_type = kDefaultEncodingMimeType;
76 // FIXME: Make isSupportedImageMIMETypeForEncoding threadsafe (to allow this
77 // method to be used on a worker thread).
78 if (MIMETypeRegistry::IsSupportedImageMIMETypeForEncoding(
79 lowercase_mime_type))
80 ParseImageEncodingMimeType(lowercase_mime_type, encoding_mime_type);
81 return encoding_mime_type;
82 }
83
84 } // namespace blink
85