diff options
Diffstat (limited to 'src/core/SkDeviceProperties.h')
-rw-r--r-- | src/core/SkDeviceProperties.h | 107 |
1 files changed, 92 insertions, 15 deletions
diff --git a/src/core/SkDeviceProperties.h b/src/core/SkDeviceProperties.h index 11ecd65157..80e0177650 100644 --- a/src/core/SkDeviceProperties.h +++ b/src/core/SkDeviceProperties.h @@ -1,26 +1,103 @@ -/* - * Copyright 2014 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - #ifndef SkDeviceProperties_DEFINED #define SkDeviceProperties_DEFINED -#include "SkSurfacePriv.h" +//TODO: get everyone to stop using SkFontLCDConfig::SetSubpixel* and remove this import. +#include "SkFontLCDConfig.h" struct SkDeviceProperties { - enum InitType { - kLegacyLCD_InitType + struct Geometry { + /** The orientation of the pixel specifies the interpretation of the + * layout. If the orientation is horizontal, the layout is interpreted as + * left to right. It the orientation is vertical, the layout is + * interpreted top to bottom (rotated 90deg cw from horizontal). + */ + enum Orientation { + kUnknown_Orientation = 0x0, + kKnown_Orientation = 0x2, + + kHorizontal_Orientation = 0x2, //!< this is the default + kVertical_Orientation = 0x3, + + kOrientationMask = 0x3, + }; + + /** The layout of the pixel specifies its subpixel geometry. + * + * kUnknown_Layout means that the subpixel elements are not spatially + * separated in any known or usable fashion. + */ + enum Layout { + kUnknown_Layout = 0x0, + kKnown_Layout = 0x8, + + kRGB_Layout = 0x8, //!< this is the default + kBGR_Layout = 0xC, + + kLayoutMask = 0xC, + }; + + Orientation getOrientation() { + return static_cast<Orientation>(fGeometry & kOrientationMask); + } + Layout getLayout() { + return static_cast<Layout>(fGeometry & kLayoutMask); + } + + bool isOrientationKnown() { + return SkToBool(fGeometry & kKnown_Orientation); + } + bool isLayoutKnown() { + return SkToBool(fGeometry & kKnown_Layout); + } + + private: + //TODO: get everyone to stop using SkFontLCDConfig::SetSubpixel* and replace these calls with constants. + static Orientation fromOldOrientation(SkFontLCDConfig::LCDOrientation orientation) { + switch (orientation) { + case SkFontLCDConfig::kHorizontal_LCDOrientation: return kHorizontal_Orientation; + case SkFontLCDConfig::kVertical_LCDOrientation: return kVertical_Orientation; + default: return kUnknown_Orientation; + } + } + static Layout fromOldLayout(SkFontLCDConfig::LCDOrder order) { + switch (order) { + case SkFontLCDConfig::kRGB_LCDOrder: return kRGB_Layout; + case SkFontLCDConfig::kBGR_LCDOrder: return kBGR_Layout; + default: return kUnknown_Layout; + } + } + public: + static Geometry MakeDefault() { + Orientation orientation = fromOldOrientation(SkFontLCDConfig::GetSubpixelOrientation()); //kHorizontal_Orientation + Layout layout = fromOldLayout(SkFontLCDConfig::GetSubpixelOrder()); //kRGB_Layout + Geometry ret = { SkToU8(orientation | layout) }; + return ret; + } + + static Geometry Make(Orientation orientation, Layout layout) { + Geometry ret = { SkToU8(orientation | layout) }; + return ret; + } + + uint8_t fGeometry; }; - SkDeviceProperties(InitType) : fPixelGeometry(SkSurfacePropsDefaultPixelGeometry()) {} - SkDeviceProperties(SkPixelGeometry geo) : fPixelGeometry(geo) {} - SkPixelGeometry fPixelGeometry; + static SkDeviceProperties MakeDefault() { + SkDeviceProperties ret = { Geometry::MakeDefault(), SK_GAMMA_EXPONENT }; + return ret; + } + + static SkDeviceProperties Make(Geometry geometry, SkScalar gamma) { + SkDeviceProperties ret = { geometry, gamma }; + return ret; + } + + /** Each pixel of an image will have some number of channels. + * Can the layout of those channels be exploited? */ + Geometry fGeometry; - // read-only attribute -- until we actually store a value (future CL) - float getGamma() const { return SK_GAMMA_EXPONENT; } + /** Represents the color space of the image. This is a woefully inadequate beginning. */ + SkScalar fGamma; }; #endif |