Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Functions
SkSVGDevice.cpp File Reference
#include "src/svg/SkSVGDevice.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkBlendMode.h"
#include "include/core/SkClipOp.h"
#include "include/core/SkColor.h"
#include "include/core/SkColorFilter.h"
#include "include/core/SkData.h"
#include "include/core/SkDataTable.h"
#include "include/core/SkFont.h"
#include "include/core/SkFontStyle.h"
#include "include/core/SkImage.h"
#include "include/core/SkImageInfo.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkPathBuilder.h"
#include "include/core/SkPathEffect.h"
#include "include/core/SkPathTypes.h"
#include "include/core/SkPathUtils.h"
#include "include/core/SkPoint.h"
#include "include/core/SkRRect.h"
#include "include/core/SkRect.h"
#include "include/core/SkScalar.h"
#include "include/core/SkShader.h"
#include "include/core/SkSize.h"
#include "include/core/SkSpan.h"
#include "include/core/SkStream.h"
#include "include/core/SkString.h"
#include "include/core/SkSurfaceProps.h"
#include "include/core/SkTileMode.h"
#include "include/core/SkTypeface.h"
#include "include/encode/SkPngEncoder.h"
#include "include/private/base/SkDebug.h"
#include "include/private/base/SkNoncopyable.h"
#include "include/private/base/SkTPin.h"
#include "include/private/base/SkTemplates.h"
#include "include/private/base/SkTo.h"
#include "include/svg/SkSVGCanvas.h"
#include "src/base/SkBase64.h"
#include "src/base/SkTLazy.h"
#include "src/core/SkAnnotationKeys.h"
#include "src/core/SkClipStack.h"
#include "src/core/SkDevice.h"
#include "src/core/SkFontPriv.h"
#include "src/core/SkTHash.h"
#include "src/image/SkImage_Base.h"
#include "src/shaders/SkColorShader.h"
#include "src/shaders/SkShaderBase.h"
#include "src/text/GlyphRun.h"
#include "src/xml/SkXMLWriter.h"
#include <cstring>
#include <memory>
#include <string>
#include <utility>

Go to the source code of this file.

Classes

class  SkSVGDevice::ResourceBucket
 
struct  SkSVGDevice::MxCp
 
class  SkSVGDevice::AutoElement
 
class  SVGTextBuilder
 

Functions

static bool is_png (const void *bytes, size_t length)
 
static bool is_jpeg (const void *bytes, size_t length)
 
sk_sp< SkDataAsDataUri (SkImage *image)
 
static sk_sp< SkDataencode (const SkBitmap &src)
 

Function Documentation

◆ AsDataUri()

sk_sp< SkData > AsDataUri ( SkImage image)

Definition at line 519 of file SkSVGDevice.cpp.

519 {
520 static constexpr char jpgDataPrefix[] = "data:image/jpeg;base64,";
521 static constexpr char pngDataPrefix[] = "data:image/png;base64,";
522
524
525 const char* selectedPrefix = pngDataPrefix;
526 size_t selectedPrefixLength = sizeof(pngDataPrefix);
527
528 sk_sp<SkData> imageData = image->refEncodedData();
529 if (imageData) { // Already encoded as something
530 if (is_jpeg(imageData->data(), imageData->size())) {
531 selectedPrefix = jpgDataPrefix;
532 selectedPrefixLength = sizeof(jpgDataPrefix);
533 } else if (!is_png(imageData->data(), imageData->size())) {
534 // re-encode the image as a PNG.
535 // GrDirectContext is nullptr because we shouldn't have any texture-based images
536 // passed in.
537 imageData = SkPngEncoder::Encode(nullptr, image, {});
538 if (!imageData) {
539 return nullptr;
540 }
541 }
542 // else, it's already encoded as a PNG - we don't need to do anything.
543 } else {
544 // It was not encoded as something, so we need to encode it as a PNG.
545 imageData = SkPngEncoder::Encode(nullptr, image, {});
546 if (!imageData) {
547 return nullptr;
548 }
549 }
550
551 size_t b64Size = SkBase64::EncodedSize(imageData->size());
552 sk_sp<SkData> dataUri = SkData::MakeUninitialized(selectedPrefixLength + b64Size);
553 char* dest = (char*)dataUri->writable_data();
554 memcpy(dest, selectedPrefix, selectedPrefixLength);
555 SkBase64::Encode(imageData->data(), imageData->size(), dest + selectedPrefixLength - 1);
556 dest[dataUri->size() - 1] = 0;
557 return dataUri;
558}
#define SkASSERT(cond)
Definition SkAssert.h:116
static bool is_png(const void *bytes, size_t length)
static bool is_jpeg(const void *bytes, size_t length)
static sk_sp< SkData > MakeUninitialized(size_t length)
Definition SkData.cpp:116
virtual bool isTextureBacked() const =0
sk_sp< SkData > refEncodedData() const
Definition SkImage.cpp:214
sk_sp< SkImage > image
Definition examples.cpp:29
SK_API bool Encode(SkWStream *dst, const SkPixmap &src, const Options &options)
dest
Definition zip.py:79
static size_t EncodedSize(size_t srcDataLength)
Definition SkBase64.h:40
static size_t Encode(const void *src, size_t length, void *dst, const char *encode=nullptr)
Definition SkBase64.cpp:113

◆ encode()

static sk_sp< SkData > encode ( const SkBitmap src)
static

Definition at line 990 of file SkSVGDevice.cpp.

990 {
992 return SkPngEncoder::Encode(&buf, src.pixmap(), {}) ? buf.detachAsData() : nullptr;
993}
sk_sp< SkData > detachAsData()
Definition SkStream.cpp:707

◆ is_jpeg()

static bool is_jpeg ( const void *  bytes,
size_t  length 
)
static

Definition at line 511 of file SkSVGDevice.cpp.

511 {
512 static constexpr uint8_t jpegSig[] = {0xFF, 0xD8, 0xFF};
513 return length >= sizeof(jpegSig) && !memcmp(bytes, jpegSig, sizeof(jpegSig));
514}
size_t length

◆ is_png()

static bool is_png ( const void *  bytes,
size_t  length 
)
static

Definition at line 506 of file SkSVGDevice.cpp.

506 {
507 static constexpr uint8_t pngSig[] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
508 return length >= sizeof(pngSig) && !memcmp(bytes, pngSig, sizeof(pngSig));
509}