@@ -1482,13 +1482,42 @@ extern "C"
14821482 auto data = SkData::MakeWithoutCopy (reinterpret_cast <const void *>(ptr), size);
14831483 auto codec = SkCodec::MakeFromData (data);
14841484 auto info = codec->getInfo ();
1485- auto row_bytes = info.width () * info. bytesPerPixel ();
1485+ auto row_bytes = info.minRowBytes ();
14861486 auto bitmap = new SkBitmap ();
14871487 bitmap->allocPixels (info);
14881488 codec->getPixels (info, bitmap->getPixels (), row_bytes);
1489- bitmap_info->bitmap = reinterpret_cast <skiac_bitmap *>(bitmap);
1490- bitmap_info->width = info.width ();
1491- bitmap_info->height = info.height ();
1489+ auto dimension = codec->dimensions ();
1490+ auto origin = codec->getOrigin ();
1491+ auto width = dimension.width ();
1492+ auto height = dimension.height ();
1493+ // https://github.com/chromium/chromium/blob/126.0.6423.1/third_party/blink/renderer/platform/graphics/image.cc#L124
1494+ // need to create a new bitmap with the correct orientation
1495+ if (origin != SkEncodedOrigin::kTopLeft_SkEncodedOrigin ) {
1496+ if (
1497+ origin == SkEncodedOrigin::kLeftTop_SkEncodedOrigin ||
1498+ origin == SkEncodedOrigin::kRightTop_SkEncodedOrigin ||
1499+ origin == SkEncodedOrigin::kRightBottom_SkEncodedOrigin ||
1500+ origin == SkEncodedOrigin::kLeftBottom_SkEncodedOrigin
1501+ )
1502+ {
1503+ width = height;
1504+ height = dimension.width ();
1505+ }
1506+ auto oriented_bitmap = new SkBitmap ();
1507+ auto oriented_bitmap_info = SkImageInfo::Make (width, height, info.colorType (), info.alphaType ());
1508+ oriented_bitmap->allocPixels (oriented_bitmap_info);
1509+ auto canvas = new SkCanvas (*oriented_bitmap);
1510+ auto matrix = SkEncodedOriginToMatrix (origin, width, height);
1511+ canvas->setMatrix (matrix);
1512+ auto image = SkImages::RasterFromBitmap (*bitmap);
1513+ canvas->drawImage (image, 0 , 0 );
1514+ bitmap_info->bitmap = reinterpret_cast <skiac_bitmap *>(oriented_bitmap);
1515+ delete bitmap;
1516+ } else {
1517+ bitmap_info->bitmap = reinterpret_cast <skiac_bitmap *>(bitmap);
1518+ }
1519+ bitmap_info->width = width;
1520+ bitmap_info->height = height;
14921521 }
14931522
14941523 void skiac_bitmap_make_from_svg (const uint8_t *data, size_t length, float width, float height, skiac_bitmap_info *bitmap_info, skiac_font_collection *c_collection, uint8_t cs)
0 commit comments