123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #ifndef mozilla_StyleStructContext_h
- #define mozilla_StyleStructContext_h
- #include "CounterStyleManager.h"
- #include "mozilla/LookAndFeel.h"
- #include "nsPresContext.h"
- class nsDeviceContext;
- /**
- * Construction context for style structs.
- *
- * Certain Gecko style structs have historically taken an nsPresContext
- * argument in their constructor, which is used to compute various things. This
- * makes Gecko style structs document-specific (which Servo style structs are
- * not), and means that the initial values for style-structs cannot be shared
- * across the entire runtime (as is the case in Servo).
- *
- * We'd like to remove this constraint so that Gecko can get the benefits of the
- * Servo model, and so that Gecko aligns better with the Servo style system when
- * using it. Unfortunately, this may require a fair amount of work, especially
- * related to text zoom.
- *
- * So as an intermediate step, we define a reduced API set of "things that are
- * needed when constructing style structs". This just wraps and forwards to an
- * nsPresContext in the Gecko case, and returns some default not-always-correct
- * values in the Servo case. We can then focus on reducing this API surface to
- * zero, at which point this can be removed.
- *
- * We don't put the type in namespace mozilla, since we expect it to be
- * temporary, and the namespacing would clutter up nsStyleStruct.h.
- */
- #ifdef MOZ_STYLO
- #define SERVO_DEFAULT(default_val) { if (!mPresContext) { return default_val; } }
- #else
- #define SERVO_DEFAULT(default_val) { MOZ_ASSERT(mPresContext); }
- #endif
- class StyleStructContext {
- public:
- MOZ_IMPLICIT StyleStructContext(nsPresContext* aPresContext)
- : mPresContext(aPresContext) { MOZ_ASSERT(aPresContext); }
- static StyleStructContext ServoContext() { return StyleStructContext(); }
- // XXXbholley: Need to make text zoom work with stylo. This probably means
- // moving the zoom handling out of computed values and into a post-
- // computation.
- float TextZoom()
- {
- SERVO_DEFAULT(1.0);
- return mPresContext->TextZoom();
- }
- const nsFont* GetDefaultFont(uint8_t aFontID)
- {
- // NB: The servo case only differ from the default case in terms of which
- // font pref cache gets used. The distinction is probably unnecessary.
- SERVO_DEFAULT(mozilla::StaticPresData::Get()->
- GetDefaultFont(aFontID, GetLanguageFromCharset()));
- return mPresContext->GetDefaultFont(aFontID, GetLanguageFromCharset());
- }
- uint32_t GetBidi()
- {
- SERVO_DEFAULT(0);
- return mPresContext->GetBidi();
- }
- int32_t AppUnitsPerDevPixel();
- nscoord DevPixelsToAppUnits(int32_t aPixels)
- {
- return NSIntPixelsToAppUnits(aPixels, AppUnitsPerDevPixel());
- }
- typedef mozilla::LookAndFeel LookAndFeel;
- nscolor DefaultColor()
- {
- SERVO_DEFAULT(LookAndFeel::GetColor(LookAndFeel::eColorID_WindowForeground,
- NS_RGB(0x00, 0x00, 0x00)));
- return mPresContext->DefaultColor();
- }
- mozilla::CounterStyle* BuildCounterStyle(const nsSubstring& aName)
- {
- SERVO_DEFAULT(mozilla::CounterStyleManager::GetBuiltinStyle(NS_STYLE_LIST_STYLE_DISC));
- return mPresContext->CounterStyleManager()->BuildCounterStyle(aName);
- }
- nsIAtom* GetLanguageFromCharset() const
- {
- SERVO_DEFAULT(nsGkAtoms::x_western);
- return mPresContext->GetLanguageFromCharset();
- }
- already_AddRefed<nsIAtom> GetContentLanguage() const
- {
- SERVO_DEFAULT(do_AddRef(nsGkAtoms::x_western));
- return mPresContext->GetContentLanguage();
- }
- private:
- nsDeviceContext* DeviceContext()
- {
- SERVO_DEFAULT(HackilyFindSomeDeviceContext());
- return mPresContext->DeviceContext();
- }
- nsDeviceContext* HackilyFindSomeDeviceContext();
- StyleStructContext() : mPresContext(nullptr) {}
- nsPresContext* mPresContext;
- };
- #undef SERVO_DEFAULT
- #endif // mozilla_StyleStructContext_h
|