*/
explicit SkCanvas(const SkBitmap& bitmap);
+#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
+ enum class ColorBehavior {
+ kLegacy,
+ };
+
+ /**
+ * Android framework only constructor.
+ * Allows the creation of a legacy SkCanvas even though the |bitmap|
+ * and its pixel ref may have an SkColorSpace.
+ */
+ SkCanvas(const SkBitmap& bitmap, ColorBehavior);
+#endif
+
/** Construct a canvas with the specified bitmap to draw into.
@param bitmap Specifies a bitmap for the canvas to draw into. Its
structure are copied to the canvas.
SkCanvas::SkCanvas(const SkBitmap& bitmap) : SkCanvas(bitmap, nullptr, nullptr) {}
+#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
+SkCanvas::SkCanvas(const SkBitmap& bitmap, ColorBehavior)
+ : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage))
+ , fProps(SkSurfaceProps::kLegacyFontHost_InitType)
+ , fAllocator(nullptr)
+{
+ inc_canvas();
+
+ SkBitmap tmp(bitmap);
+ *const_cast<SkImageInfo*>(&tmp.info()) = tmp.info().makeColorSpace(nullptr);
+ sk_sp<SkBaseDevice> device(new SkBitmapDevice(tmp, fProps, nullptr));
+ this->init(device.get(), kDefault_InitFlags);
+}
+#endif
+
SkCanvas::~SkCanvas() {
// free up the contents of our deque
this->restoreToCount(1); // restore everything but the last
SkDynamicMemoryWStream stream;
test_cliptype(SkDocument::MakePDF(&stream)->beginPage(100, 100), r);
}
+
+#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
+DEF_TEST(Canvas_LegacyColorBehavior, r) {
+ sk_sp<SkColorSpace> cs = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
+ SkColorSpace::kAdobeRGB_Gamut);
+
+ // Make a Adobe RGB bitmap.
+ SkBitmap bitmap;
+ bitmap.allocPixels(SkImageInfo::MakeN32(1, 1, kOpaque_SkAlphaType, cs));
+ bitmap.eraseColor(0xFF000000);
+
+ // Wrap it in a legacy canvas. Test that the canvas behaves like a legacy canvas.
+ SkCanvas canvas(bitmap, SkCanvas::ColorBehavior::kLegacy);
+ REPORTER_ASSERT(r, !canvas.imageInfo().colorSpace());
+ SkPaint p;
+ p.setColor(SK_ColorRED);
+ canvas.drawIRect(SkIRect::MakeWH(1, 1), p);
+ REPORTER_ASSERT(r, SK_ColorRED == SkSwizzle_BGRA_to_PMColor(*bitmap.getAddr32(0, 0)));
+}
+#endif